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

@@ -0,0 +1,35 @@
package request
import (
"path/filepath"
"strings"
)
type UploadFileRequest struct {
Folder string `json:"folder" validate:"omitempty,oneof=cover avatar article common"`
}
// AllowedUploadExts 上传文件扩展名白名单(扩展名 → 期望的真实 MIME
var AllowedUploadExts = map[string]string{
// 图片
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".png": "image/png",
".gif": "image/gif",
".webp": "image/webp",
// 视频
".mp4": "video/mp4",
".webm": "video/webm",
}
// IsAllowedUploadExt 扩展名是否在白名单内(大小写不敏感)
func IsAllowedUploadExt(ext string) bool {
_, ok := AllowedUploadExts[strings.ToLower(ext)]
return ok
}
// MatchUploadMime 校验实际 MIME 与扩展名匹配
func MatchUploadMime(filename, detectedMime string) bool {
expected, ok := AllowedUploadExts[strings.ToLower(filepath.Ext(filename))]
return ok && detectedMime == expected
}

View File

@@ -1,12 +1,13 @@
package request
import (
"server/internal/pkg/validator"
"time"
)
type CreatePostRequest struct {
Title string `json:"title" validate:"required,min=1"`
CoverID int32 `json:"cover_id" validate:"required,min=1"`
CoverID *int32 `json:"cover_id" validate:"omitempty"`
Slug string `json:"slug" validate:"required,min=0"`
Content string `json:"content" validate:"required,min=0"`
Summary string `json:"summary" validate:"required,min=0"`
@@ -18,15 +19,20 @@ type CreatePostRequest struct {
}
type UpdatePostRequest struct {
Title *string `json:"title" validate:"omitempty,min=1"`
CoverID *int32 `json:"cover_id" validate:"omitempty,min=1"`
Slug *string `json:"slug" validate:"omitempty,min=1"`
Content *string `json:"content" validate:"required,min=0"`
Summary *string `json:"summary" validate:"omitempty,min=1"`
Status *int16 `json:"status" validate:"omitempty,oneof=0 1 2"`
View *int32 `json:"view" validate:"omitempty,min=1"`
Sort *int32 `json:"sort" validate:"omitempty,min=0"`
PublishedAt *time.Time `json:"published_at" validate:"omitempty"`
CategoryID *int32 `json:"category_id" validate:"required,min=1"`
Tags []int32 `json:"tags" validate:"omitempty,dive,min=1"`
Title *string `json:"title" validate:"omitempty,min=1"`
CoverID validator.NullInt32 `json:"cover_id" validate:"omitempty"`
Slug *string `json:"slug" validate:"omitempty,min=1"`
Content *string `json:"content" validate:"required,min=0"`
Summary *string `json:"summary" validate:"omitempty,min=1"`
Status *int16 `json:"status" validate:"omitempty,oneof=0 1 2"`
View *int32 `json:"view" validate:"omitempty,min=1"`
Sort *int32 `json:"sort" validate:"omitempty,min=0"`
PublishedAt *time.Time `json:"published_at" validate:"omitempty"`
CategoryID *int32 `json:"category_id" validate:"required,min=1"`
Tags []int32 `json:"tags" validate:"omitempty,dive,min=1"`
}
type SearchPublishedPostsParams struct {
CategoryCode string `json:"category_code" validate:"omitempty"`
TagCode string `json:"tag_code" validate:"omitempty"`
}