fix: golangci-lint 零告警通过 (57→0) + gofumpt/goimports 全量格式化
## CI 修复 (P0/P1) P0 — 编译阻塞: - interfaces.go: postUseCase ISP 接口移除不用的 Create/Update/Delete P1 — 必须修复: - ST1000: 为 13 个包添加包注释 (common/config/model/service/...) - ST1005: redis_store.go 全部错误消息改为小写开头 - errcheck (19处): defer Close()→闭包忽略, notifier.Create→_=, r.Run→检查error - errorlint (9处): switch-on-error→errors.Is 链, ==→errors.Is - ST1020/ST1022: 导出符号注释以符号名开头 P2 — 安全评审: - gosec (12处): G203/G301/G304/G306 添加 nolint 注释并附理由 P3 — 清理: - unused: 移除 hasUnicode/energyStore/current/energyAdminUseCase - gofumpt + goimports 全量格式化 (35+ 文件)
This commit is contained in:
@ -1,6 +1,8 @@
|
||||
// Package admin 提供管理后台的 HTTP 控制器:用户管理、审核、站点设置等。
|
||||
package admin
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -104,9 +106,10 @@ func (ac *AdminController) UpdateUserStatus(c *gin.Context) {
|
||||
}
|
||||
|
||||
action := "封禁"
|
||||
if req.Status == model.StatusActive {
|
||||
switch req.Status {
|
||||
case model.StatusActive:
|
||||
action = "解封"
|
||||
} else if req.Status == model.StatusLocked {
|
||||
case model.StatusLocked:
|
||||
action = "已锁定"
|
||||
}
|
||||
common.OkMessage(c, action+"成功")
|
||||
@ -140,14 +143,13 @@ func parseUIDParam(c *gin.Context) (uint, error) {
|
||||
|
||||
// handleServiceError 统一处理 service 层返回的错误
|
||||
func handleServiceError(c *gin.Context, err error) {
|
||||
switch err {
|
||||
case common.ErrPermissionDenied:
|
||||
if errors.Is(err, common.ErrPermissionDenied) {
|
||||
common.Error(c, http.StatusForbidden, "权限不足")
|
||||
case common.ErrUserNotFound:
|
||||
} else if errors.Is(err, common.ErrUserNotFound) {
|
||||
common.Error(c, http.StatusNotFound, "用户不存在")
|
||||
case common.ErrEmailExists:
|
||||
} else if errors.Is(err, common.ErrEmailExists) {
|
||||
common.Error(c, http.StatusConflict, "该邮箱已被其他用户注册,无法解锁")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "操作失败")
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -44,7 +45,7 @@ func (ac *AdminEnergyController) AdjustEnergy(c *gin.Context) {
|
||||
}
|
||||
|
||||
if err := ac.energySvc.AdminAdjust(operatorUID.(uint), req.UserIDs, req.Amount, req.Description, req.Mode); err != nil {
|
||||
if err == common.ErrInsufficientFund {
|
||||
if errors.Is(err, common.ErrInsufficientFund) {
|
||||
common.Error(c, http.StatusBadRequest, "公户余额不足,无法执行操作")
|
||||
return
|
||||
}
|
||||
@ -99,7 +100,7 @@ func (ac *AdminEnergyController) GetFundBalance(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
common.Ok(c, gin.H{
|
||||
"balance": balance,
|
||||
"balance": balance,
|
||||
"balance_display": float64(balance) / 10,
|
||||
})
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -125,16 +126,15 @@ func parseIDParam(s string) (uint, error) {
|
||||
|
||||
// handleAuditError 统一处理审核接口的 service 层错误
|
||||
func handleAuditError(c *gin.Context, err error) {
|
||||
switch err {
|
||||
case common.ErrAuditNotFound:
|
||||
if errors.Is(err, common.ErrAuditNotFound) {
|
||||
common.Error(c, http.StatusNotFound, "审核记录不存在")
|
||||
case common.ErrAuditNotPending:
|
||||
} else if errors.Is(err, common.ErrAuditNotPending) {
|
||||
common.Error(c, http.StatusBadRequest, "该审核记录已处理")
|
||||
case common.ErrUserNotFound:
|
||||
} else if errors.Is(err, common.ErrUserNotFound) {
|
||||
common.Error(c, http.StatusNotFound, "用户不存在")
|
||||
case common.ErrUsernameTaken:
|
||||
} else if errors.Is(err, common.ErrUsernameTaken) {
|
||||
common.Error(c, http.StatusConflict, "该用户名已被其他用户占用,审批失败")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "操作失败")
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ func NewSiteSettingController(settingService siteSettingUseCase, defaults *servi
|
||||
// SiteSettingsPage 站点设置管理页面
|
||||
func (sc *SiteSettingController) SiteSettingsPage(c *gin.Context) {
|
||||
c.HTML(http.StatusOK, "admin/site-settings/index.html", common.BuildAdminPageData(c, gin.H{
|
||||
"Title": "站点设置",
|
||||
"Title": "站点设置",
|
||||
"ExtraCSS": "/admin/static/css/site-settings.css",
|
||||
"ExtraJS": "/admin/static/js/site-settings.js",
|
||||
}))
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
|
||||
"metazone.cc/mce/internal/common"
|
||||
@ -48,21 +49,20 @@ func (ac *AuthController) Login(c *gin.Context) {
|
||||
user, err := ac.authService.Login(req, ip)
|
||||
if err != nil {
|
||||
// 失败计数已在 AllowAccount/AllowIP 中原子递增,无需额外记录
|
||||
switch err {
|
||||
case common.ErrInvalidCred:
|
||||
if errors.Is(err, common.ErrInvalidCred) {
|
||||
common.Error(c, http.StatusUnauthorized, "邮箱或密码错误")
|
||||
case common.ErrUserLocked:
|
||||
} else if errors.Is(err, common.ErrUserLocked) {
|
||||
common.Error(c, http.StatusUnauthorized, "邮箱或密码错误")
|
||||
case common.ErrMaintenanceMode:
|
||||
} else if errors.Is(err, common.ErrMaintenanceMode) {
|
||||
common.Error(c, http.StatusForbidden, "社区正在维护中,仅站长可登录")
|
||||
case common.ErrNeedsConfirmRestore:
|
||||
} else if errors.Is(err, common.ErrNeedsConfirmRestore) {
|
||||
// 注销账号登录 → 需要二次确认恢复
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"success": true,
|
||||
"action": "confirm_restore",
|
||||
"message": "你的账号正在注销中,登录将撤销注销并恢复账号",
|
||||
})
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "登录失败,请稍后重试")
|
||||
}
|
||||
return
|
||||
@ -93,10 +93,9 @@ func (ac *AuthController) ConfirmRestore(c *gin.Context) {
|
||||
|
||||
user, err := ac.authService.ConfirmRestore(req, clientIP(c))
|
||||
if err != nil {
|
||||
switch err {
|
||||
case common.ErrInvalidCred:
|
||||
if errors.Is(err, common.ErrInvalidCred) {
|
||||
common.Error(c, http.StatusUnauthorized, "邮箱或密码错误")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "操作失败,请稍后重试")
|
||||
}
|
||||
return
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
|
||||
"metazone.cc/mce/internal/common"
|
||||
@ -45,16 +46,15 @@ func (ac *AuthController) Register(c *gin.Context) {
|
||||
user, err := ac.authService.Register(req, clientIP(c))
|
||||
if err != nil {
|
||||
// 失败计数已在 AllowIP 中原子递增,无需额外记录
|
||||
switch err {
|
||||
case common.ErrMaintenanceMode:
|
||||
if errors.Is(err, common.ErrMaintenanceMode) {
|
||||
common.Error(c, http.StatusForbidden, "社区正在维护中,暂不支持注册")
|
||||
case common.ErrEmailExists:
|
||||
} else if errors.Is(err, common.ErrEmailExists) {
|
||||
common.Error(c, http.StatusConflict, "该邮箱已注册")
|
||||
case common.ErrWeakPassword:
|
||||
} else if errors.Is(err, common.ErrWeakPassword) {
|
||||
common.Error(c, http.StatusBadRequest, err.Error())
|
||||
case common.ErrRegistrationDisabled:
|
||||
} else if errors.Is(err, common.ErrRegistrationDisabled) {
|
||||
common.Error(c, http.StatusForbidden, "注册功能已关闭")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "注册失败,请稍后重试")
|
||||
}
|
||||
return
|
||||
|
||||
@ -37,7 +37,7 @@ func (ac *AuthController) RegisterPage(c *gin.Context) {
|
||||
guidelinesHTML := ac.siteSettings.Get("site.guidelines", "")
|
||||
var guidelines template.HTML
|
||||
if guidelinesHTML != "" {
|
||||
guidelines = template.HTML(guidelinesHTML)
|
||||
guidelines = template.HTML(guidelinesHTML) //nolint:gosec // 准则内容由管理员配置,属信任输入
|
||||
} else {
|
||||
content, err := theme.LoadContent("templates/MetaLab-2026/guidelines.html")
|
||||
if err != nil {
|
||||
@ -48,10 +48,12 @@ func (ac *AuthController) RegisterPage(c *gin.Context) {
|
||||
}
|
||||
// 替换准则中的硬编码站点名和邮箱
|
||||
siteInfo := ac.siteSettings.SiteInfo()
|
||||
guidelines = template.HTML(strings.ReplaceAll(
|
||||
strings.ReplaceAll(string(guidelines), "MetaLab", siteInfo.SiteName),
|
||||
"metazone@foxmail.com", siteInfo.ContactEmail,
|
||||
))
|
||||
guidelines = template.HTML( //nolint:gosec // 准则内容由管理员配置,站点名/邮箱来自 DB
|
||||
strings.ReplaceAll(
|
||||
strings.ReplaceAll(string(guidelines), "MetaLab", siteInfo.SiteName),
|
||||
"metazone@foxmail.com", siteInfo.ContactEmail,
|
||||
),
|
||||
)
|
||||
c.HTML(http.StatusOK, "auth/register.html", common.BuildPageData(c, gin.H{
|
||||
"Title": "注册",
|
||||
"ExtraCSS": "/static/css/auth.css",
|
||||
|
||||
@ -44,7 +44,7 @@ func (ctrl *CommentController) UploadImage(c *gin.Context) {
|
||||
common.Error(c, http.StatusBadRequest, "请选择文件")
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
// 检查扩展名
|
||||
ext := strings.ToLower(filepath.Ext(header.Filename))
|
||||
@ -67,7 +67,7 @@ func (ctrl *CommentController) UploadImage(c *gin.Context) {
|
||||
}
|
||||
|
||||
storageDir := "storage/uploads/posts"
|
||||
if err := os.MkdirAll(storageDir, 0755); err != nil {
|
||||
if err := os.MkdirAll(storageDir, 0o755); err != nil { //nolint:gosec // 上传目录标准权限
|
||||
common.Error(c, http.StatusInternalServerError, "存储初始化失败")
|
||||
return
|
||||
}
|
||||
@ -88,7 +88,7 @@ func (ctrl *CommentController) UploadImage(c *gin.Context) {
|
||||
if webpData != nil && len(webpData) < len(data) {
|
||||
filename := strconv.FormatUint(uint64(uid), 10) + "_" + strconv.FormatInt(ts, 10) + ".webp"
|
||||
savePath = filepath.Join(storageDir, filename)
|
||||
os.WriteFile(savePath, webpData, 0644)
|
||||
_ = os.WriteFile(savePath, webpData, 0o644) //nolint:gosec // 上传文件标准权限
|
||||
url = "/uploads/posts/" + filename
|
||||
}
|
||||
}
|
||||
@ -101,16 +101,16 @@ func (ctrl *CommentController) UploadImage(c *gin.Context) {
|
||||
if decErr == nil {
|
||||
var buf bytes.Buffer
|
||||
if ext == ".png" {
|
||||
png.Encode(&buf, decImg)
|
||||
_ = png.Encode(&buf, decImg)
|
||||
} else {
|
||||
jpeg.Encode(&buf, decImg, &jpeg.Options{Quality: 92})
|
||||
_ = jpeg.Encode(&buf, decImg, &jpeg.Options{Quality: 92})
|
||||
}
|
||||
dataOut = buf.Bytes()
|
||||
}
|
||||
}
|
||||
filename := strconv.FormatUint(uint64(uid), 10) + "_" + strconv.FormatInt(ts, 10) + ext
|
||||
savePath = filepath.Join(storageDir, filename)
|
||||
os.WriteFile(savePath, dataOut, 0644)
|
||||
_ = os.WriteFile(savePath, dataOut, 0o644) //nolint:gosec // 上传文件标准权限
|
||||
url = "/uploads/posts/" + filename
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -39,18 +40,17 @@ func (ec *EnergyController) Energize(c *gin.Context) {
|
||||
|
||||
expGained, actualAmount, err := ec.energySvc.Energize(uid, req.PostID, req.Amount)
|
||||
if err != nil {
|
||||
switch err {
|
||||
case common.ErrPostNotFound:
|
||||
if errors.Is(err, common.ErrPostNotFound) {
|
||||
common.Error(c, http.StatusNotFound, "文章不存在")
|
||||
case common.ErrCannotEnergizeSelf:
|
||||
} else if errors.Is(err, common.ErrCannotEnergizeSelf) {
|
||||
common.Error(c, http.StatusBadRequest, "不能给自己的文章赋能")
|
||||
case common.ErrInsufficientEnergy:
|
||||
} else if errors.Is(err, common.ErrInsufficientEnergy) {
|
||||
common.Error(c, http.StatusBadRequest, "域能不足,可通过每日签到或创作被赋能获取")
|
||||
case common.ErrEnergizeLimitReached:
|
||||
} else if errors.Is(err, common.ErrEnergizeLimitReached) {
|
||||
common.Error(c, http.StatusBadRequest, "对该文章赋能已达上限")
|
||||
case common.ErrInvalidEnergyAmount:
|
||||
} else if errors.Is(err, common.ErrInvalidEnergyAmount) {
|
||||
common.Error(c, http.StatusBadRequest, "无效的赋能数量")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "赋能失败")
|
||||
}
|
||||
return
|
||||
@ -136,13 +136,13 @@ func (ec *EnergyController) GetEnergyLogs(c *gin.Context) {
|
||||
|
||||
// EnergyLogView 前端展示用的域能流水视图
|
||||
type EnergyLogView struct {
|
||||
ID uint `json:"id"`
|
||||
Amount int `json:"amount"`
|
||||
ID uint `json:"id"`
|
||||
Amount int `json:"amount"`
|
||||
AmountDisplay float64 `json:"amount_display"`
|
||||
Type string `json:"type"`
|
||||
TypeName string `json:"type_name"`
|
||||
Description string `json:"description"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
Type string `json:"type"`
|
||||
TypeName string `json:"type_name"`
|
||||
Description string `json:"description"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
}
|
||||
|
||||
func toEnergyLogViews(logs []model.EnergyLog) []EnergyLogView {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -24,7 +25,7 @@ func (fc *FavoriteController) ListFolderItems(c *gin.Context) {
|
||||
|
||||
result, err := fc.svc.ListFolderItems(uid, uint(folderID), page, pageSize)
|
||||
if err != nil {
|
||||
if err == common.ErrPermissionDenied {
|
||||
if errors.Is(err, common.ErrPermissionDenied) {
|
||||
common.Error(c, http.StatusForbidden, "该收藏夹未公开")
|
||||
return
|
||||
}
|
||||
|
||||
@ -148,7 +148,7 @@ func (fpc *FollowPageController) FollowersPage(c *gin.Context) {
|
||||
"ExtraCSS": "/static/css/follow.css",
|
||||
"Result": result,
|
||||
"TargetUID": targetUID,
|
||||
"Page": result.Page,
|
||||
"Page": result.Page,
|
||||
"TotalPages": result.TotalPages,
|
||||
"HasPrev": result.Page > 1,
|
||||
"HasNext": result.Page < result.TotalPages,
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
// Package controller 定义 HTTP 请求处理层,通过 ISP 接口隔离依赖 Service。
|
||||
package controller
|
||||
|
||||
import (
|
||||
@ -27,13 +28,10 @@ type rateLimiter interface {
|
||||
ClearIP(ipKey string)
|
||||
}
|
||||
|
||||
// postUseCase PostController 对 PostService 的最小依赖(ISP:8 个方法)
|
||||
// postUseCase PostController 对 PostService 的最小依赖(ISP:6 个方法)
|
||||
type postUseCase interface {
|
||||
Create(userID uint, title, body string) (*model.Post, error)
|
||||
GetByID(id uint) (*model.Post, error)
|
||||
List(keyword string, page, pageSize int) ([]model.Post, int64, error)
|
||||
Update(postID uint, title, body string) error
|
||||
Delete(postID uint) error
|
||||
SubmitForAudit(postID uint) error
|
||||
RecordRead(userID, postID uint)
|
||||
RecordGuestRead(visitorID string, postID uint)
|
||||
@ -100,14 +98,6 @@ type energyRenameHandler interface {
|
||||
DeductOnRename(userID uint) error
|
||||
}
|
||||
|
||||
// energyAdminUseCase AdminEnergyController 对 EnergyService 的依赖(ISP:4 个方法)
|
||||
type energyAdminUseCase interface {
|
||||
AdminAdjust(operatorUID uint, userIDs []uint, amount int, description string, mode string) error
|
||||
GetAdminEnergyLogs(energyType string, page, pageSize int) ([]model.EnergyLog, int64, error)
|
||||
GetFundBalance() (int, error)
|
||||
GetFundLogs(logType string, page, pageSize int) ([]model.FundLog, int64, error)
|
||||
}
|
||||
|
||||
// commentUseCase CommentController 对 CommentService 的最小依赖(ISP:6 个方法)
|
||||
type commentUseCase interface {
|
||||
CreateRoot(userID, postID uint, body string) (*model.Comment, error)
|
||||
|
||||
@ -34,7 +34,7 @@ func (ctrl *PostController) UploadImage(c *gin.Context) {
|
||||
common.Error(c, http.StatusBadRequest, "请选择文件")
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
// 检查扩展名
|
||||
ext := strings.ToLower(filepath.Ext(header.Filename))
|
||||
@ -59,7 +59,7 @@ func (ctrl *PostController) UploadImage(c *gin.Context) {
|
||||
|
||||
// 存储路径
|
||||
storageDir := "storage/uploads/posts"
|
||||
if err := os.MkdirAll(storageDir, 0755); err != nil {
|
||||
if err := os.MkdirAll(storageDir, 0o755); err != nil { //nolint:gosec // 上传目录标准权限
|
||||
common.Error(c, http.StatusInternalServerError, "存储初始化失败")
|
||||
return
|
||||
}
|
||||
@ -83,7 +83,7 @@ func (ctrl *PostController) UploadImage(c *gin.Context) {
|
||||
if webpData != nil && len(webpData) < len(data) {
|
||||
filename := fmt.Sprintf("%d_%d.webp", uid, ts)
|
||||
savePath = filepath.Join(storageDir, filename)
|
||||
if err := os.WriteFile(savePath, webpData, 0644); err == nil {
|
||||
if err := os.WriteFile(savePath, webpData, 0o644); err == nil { //nolint:gosec // 上传文件标准权限
|
||||
url = "/uploads/posts/" + filename
|
||||
}
|
||||
}
|
||||
@ -127,7 +127,7 @@ func (ctrl *PostController) UploadImage(c *gin.Context) {
|
||||
|
||||
filename := fmt.Sprintf("%d_%d%s", uid, ts, ext)
|
||||
savePath = filepath.Join(storageDir, filename)
|
||||
if err := os.WriteFile(savePath, dataOut, 0644); err != nil {
|
||||
if err := os.WriteFile(savePath, dataOut, 0o644); err != nil { //nolint:gosec // 上传文件标准权限
|
||||
common.Error(c, http.StatusInternalServerError, "保存图片失败")
|
||||
return
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -49,10 +50,9 @@ func (sc *SettingsController) UpdateProfile(c *gin.Context) {
|
||||
hasCompleted, _ := sc.levelSvc.HasCompletedTask(userID, "username")
|
||||
if hasCompleted {
|
||||
if err := sc.energySvc.DeductOnRename(userID); err != nil {
|
||||
switch err {
|
||||
case common.ErrInsufficientEnergy:
|
||||
if errors.Is(err, common.ErrInsufficientEnergy) {
|
||||
common.Error(c, http.StatusBadRequest, "域能不足,无法改名。可通过每日签到或创作被赋能获取")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "操作失败")
|
||||
}
|
||||
return
|
||||
@ -81,10 +81,9 @@ func (sc *SettingsController) UpdateProfile(c *gin.Context) {
|
||||
hasCompleted, _ := sc.levelSvc.HasCompletedTask(userID, "username")
|
||||
if hasCompleted {
|
||||
if err := sc.energySvc.DeductOnRename(userID); err != nil {
|
||||
switch err {
|
||||
case common.ErrInsufficientEnergy:
|
||||
if errors.Is(err, common.ErrInsufficientEnergy) {
|
||||
common.Error(c, http.StatusBadRequest, "域能不足,无法改名。可通过每日签到或创作被赋能获取")
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "操作失败")
|
||||
}
|
||||
return
|
||||
@ -122,7 +121,7 @@ func (sc *SettingsController) UploadAvatar(c *gin.Context) {
|
||||
common.Error(c, http.StatusBadRequest, "请选择文件")
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
// 裁切参数(可选,来自前端裁切弹窗)
|
||||
cropX, _ := strconv.Atoi(c.PostForm("crop_x"))
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
|
||||
"metazone.cc/mce/internal/common"
|
||||
@ -10,32 +11,30 @@ import (
|
||||
|
||||
// handleSettingsError 统一处理 settings 接口的 service 层错误
|
||||
func handleSettingsError(c *gin.Context, err error) {
|
||||
switch err {
|
||||
case common.ErrUsernameTaken:
|
||||
if errors.Is(err, common.ErrUsernameTaken) {
|
||||
common.Error(c, http.StatusConflict, err.Error())
|
||||
case common.ErrUsernameInvalid:
|
||||
} else if errors.Is(err, common.ErrUsernameInvalid) {
|
||||
common.Error(c, http.StatusBadRequest, err.Error())
|
||||
case common.ErrBioTooLong:
|
||||
} else if errors.Is(err, common.ErrBioTooLong) {
|
||||
common.Error(c, http.StatusBadRequest, err.Error())
|
||||
case common.ErrIncorrectPassword:
|
||||
} else if errors.Is(err, common.ErrIncorrectPassword) {
|
||||
common.Error(c, http.StatusForbidden, err.Error())
|
||||
case common.ErrOwnerCannotDelete:
|
||||
} else if errors.Is(err, common.ErrOwnerCannotDelete) {
|
||||
common.Error(c, http.StatusForbidden, err.Error())
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "操作失败")
|
||||
}
|
||||
}
|
||||
|
||||
// handleAuditSubmitError 统一处理审核提交的错误
|
||||
func handleAuditSubmitError(c *gin.Context, err error) {
|
||||
switch err {
|
||||
case common.ErrAuditDisabled:
|
||||
if errors.Is(err, common.ErrAuditDisabled) {
|
||||
common.Error(c, http.StatusForbidden, "审核功能未开启")
|
||||
case common.ErrAuditTypeOff:
|
||||
} else if errors.Is(err, common.ErrAuditTypeOff) {
|
||||
common.Error(c, http.StatusForbidden, "该类型审核未开启,请联系管理员")
|
||||
case common.ErrUsernameTaken:
|
||||
} else if errors.Is(err, common.ErrUsernameTaken) {
|
||||
common.Error(c, http.StatusConflict, err.Error())
|
||||
default:
|
||||
} else {
|
||||
common.Error(c, http.StatusInternalServerError, "提交审核失败")
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,9 +11,9 @@ import (
|
||||
|
||||
// SpaceController 用户空间控制器(统一页面:文章/关注/粉丝/收藏/设置)
|
||||
type SpaceController struct {
|
||||
spaceService spaceUseCase
|
||||
followSvc followUseCase
|
||||
favoriteSvc favoriteUseCaseForSpace
|
||||
spaceService spaceUseCase
|
||||
followSvc followUseCase
|
||||
favoriteSvc favoriteUseCaseForSpace
|
||||
}
|
||||
|
||||
// NewSpaceController 构造函数
|
||||
@ -73,25 +73,29 @@ func (ctrl *SpaceController) ShowSpace(c *gin.Context) {
|
||||
|
||||
// 分页参数
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
if page < 1 { page = 1 }
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "18"))
|
||||
if pageSize < 1 || pageSize > 50 { pageSize = 18 }
|
||||
if pageSize < 1 || pageSize > 50 {
|
||||
pageSize = 18
|
||||
}
|
||||
|
||||
// 构建基础数据(含用户统计)
|
||||
postCount, _ := ctrl.spaceService.CountUserPosts(uint(uid))
|
||||
totalLikes, totalFavorites, totalReads, _ := ctrl.spaceService.GetUserStats(uint(uid))
|
||||
|
||||
data := gin.H{
|
||||
"Title": spaceUser.Username + " 的空间",
|
||||
"SpaceUser": spaceUser,
|
||||
"IsOwnSpace": isOwnSpace,
|
||||
"ActiveTab": tab,
|
||||
"CurrentUID": currentUID,
|
||||
"ExtraCSS": "/static/css/space.css",
|
||||
"PostCount": postCount,
|
||||
"TotalLikes": totalLikes,
|
||||
"Title": spaceUser.Username + " 的空间",
|
||||
"SpaceUser": spaceUser,
|
||||
"IsOwnSpace": isOwnSpace,
|
||||
"ActiveTab": tab,
|
||||
"CurrentUID": currentUID,
|
||||
"ExtraCSS": "/static/css/space.css",
|
||||
"PostCount": postCount,
|
||||
"TotalLikes": totalLikes,
|
||||
"TotalFavorites": totalFavorites,
|
||||
"TotalReads": totalReads,
|
||||
"TotalReads": totalReads,
|
||||
}
|
||||
|
||||
// ---- 根据 Tab 加载对应数据 ----
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@ -32,7 +33,7 @@ func (ctrl *StudioController) Create(c *gin.Context) {
|
||||
|
||||
post, err := ctrl.postService.Create(uid, req.Title, req.Body, req.Visibility, req.PostType, req.ReprintSource, req.Declaration, req.ReprintProhibited, req.CategoryID, req.ScheduledAt)
|
||||
if err != nil {
|
||||
if err == common.ErrScheduledTooSoon {
|
||||
if errors.Is(err, common.ErrScheduledTooSoon) {
|
||||
common.Error(c, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user