feat: update template

This commit is contained in:
2026-08-19 22:05:49 +08:00
parent 0e674e9d56
commit 5a71093b0c
67 changed files with 2070 additions and 585 deletions

View File

@@ -1,24 +1,37 @@
package admin
import (
"context"
"log/slog"
"net/http"
"path/filepath"
"server/internal/config"
"server/internal/model/common"
"server/internal/model/request"
"server/internal/pkg/errs"
"server/internal/pkg/httputil"
"server/internal/pkg/safego"
"server/internal/pkg/validator"
"server/internal/router"
"server/internal/service/admin"
"strings"
"github.com/go-chi/chi/v5"
)
type FileHandler struct {
service *admin.FileService
logger *slog.Logger
cfg *config.Config
}
var _ router.Registrar = (*FileHandler)(nil)
func NewFileHandler(service *admin.FileService) *FileHandler {
func NewFileHandler(service *admin.FileService, logger *slog.Logger, cfg *config.Config) *FileHandler {
return &FileHandler{
service: service,
logger: logger,
cfg: cfg,
}
}
@@ -26,6 +39,7 @@ func (h *FileHandler) Register(r chi.Router) {
r.Route("/files", func(r chi.Router) {
r.Get("/", h.List)
r.Post("/", h.Upload)
r.Post("/sync-metadata", h.SyncMetadata)
})
}
@@ -49,9 +63,18 @@ func (h *FileHandler) List(w http.ResponseWriter, r *http.Request) {
}
func (h *FileHandler) Upload(w http.ResponseWriter, r *http.Request) {
// 限制上传大小(默认 10MB
maxSize := h.cfg.File.MaxUploadSize
if maxSize <= 0 {
maxSize = 10 << 20 // 10MB
}
r.Body = http.MaxBytesReader(w, r.Body, maxSize)
folder := r.FormValue("folder")
if folder == "" {
folder = "/"
req := request.UploadFileRequest{Folder: folder}
if err := validator.Struct(&req); err != nil {
httputil.Fail(w, err)
return
}
_, header, err := r.FormFile("file")
@@ -60,6 +83,13 @@ func (h *FileHandler) Upload(w http.ResponseWriter, r *http.Request) {
return
}
// 扩展名白名单
ext := strings.ToLower(filepath.Ext(header.Filename))
if !request.IsAllowedUploadExt(ext) {
httputil.Fail(w, errs.ErrFileTypeNotAllowed)
return
}
file, err := h.service.Upload(r.Context(), folder, header)
if err != nil {
httputil.Fail(w, err)
@@ -68,3 +98,13 @@ func (h *FileHandler) Upload(w http.ResponseWriter, r *http.Request) {
httputil.Ok(w, file)
}
func (h *FileHandler) SyncMetadata(w http.ResponseWriter, r *http.Request) {
safego.Go(func() {
if err := h.service.SyncMetadata(context.Background()); err != nil {
h.logger.Error("sync metadata failed", "error", err)
}
})
httputil.Ok(w)
}