同步包路径与路由,去掉 SPA 构建步骤,对齐 Gitea 式 LICENSE,并更新规格/规则与占位 SSR。 Co-authored-by: Cursor <cursoragent@cursor.com>
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// APIAdminMedia 列出媒体资源
|
|
func (h *Handlers) APIAdminMedia(c *gin.Context) {
|
|
if h.Store == nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "上传存储未初始化"})
|
|
return
|
|
}
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
size, _ := strconv.Atoi(c.DefaultQuery("size", "24"))
|
|
category := c.DefaultQuery("category", "all")
|
|
query := c.Query("q")
|
|
result, err := h.Store.ListMedia(category, query, page, size)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// APIAdminDeleteMedia 批量删除媒体
|
|
func (h *Handlers) APIAdminDeleteMedia(c *gin.Context) {
|
|
if h.Store == nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "上传存储未初始化"})
|
|
return
|
|
}
|
|
var req struct {
|
|
URLs []string `json:"urls"`
|
|
URL string `json:"url"`
|
|
}
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
|
|
return
|
|
}
|
|
urls := make([]string, 0, len(req.URLs)+1)
|
|
for _, u := range req.URLs {
|
|
u = strings.TrimSpace(u)
|
|
if u != "" {
|
|
urls = append(urls, u)
|
|
}
|
|
}
|
|
if u := strings.TrimSpace(req.URL); u != "" {
|
|
urls = append(urls, u)
|
|
}
|
|
if len(urls) == 0 {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "请选择要删除的文件"})
|
|
return
|
|
}
|
|
if len(urls) > 100 {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "单次最多删除 100 个文件"})
|
|
return
|
|
}
|
|
n, err := h.Store.DeleteMedia(urls)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "已删除 " + strconv.Itoa(n) + " 项媒体",
|
|
"deleted": n,
|
|
})
|
|
}
|