diff --git a/internal/controller/admin/audit_controller.go b/internal/controller/admin/audit_controller.go index d3bad63..c837258 100644 --- a/internal/controller/admin/audit_controller.go +++ b/internal/controller/admin/audit_controller.go @@ -50,17 +50,17 @@ func (ac *AuditController) ListAudits(c *gin.Context) { return } - // 为每个审核记录附加提交者的用户名 + // 为每个审核记录附加提交者的当前用户名 type auditItem struct { model.AuditSubmission - SubmitterUsername string `json:"submitter_username"` + CurrentUsername string `json:"current_username"` } items := make([]auditItem, 0, len(result.Items)) for _, a := range result.Items { item := auditItem{AuditSubmission: a} if user, err := ac.userRepo.FindByID(a.UserID); err == nil { - item.SubmitterUsername = user.Username + item.CurrentUsername = user.Username } items = append(items, item) } diff --git a/internal/controller/settings_controller.go b/internal/controller/settings_controller.go index 59f78cb..3484906 100644 --- a/internal/controller/settings_controller.go +++ b/internal/controller/settings_controller.go @@ -58,15 +58,23 @@ func (sc *SettingsController) SettingsPage(c *gin.Context) { // 查询待审核类型(用于前端显示审核提示) pendingTypes, _ := sc.auditService.GetPendingTypes(uid) + // 是否已完成首次改名(用于前端确认弹窗显示消耗提示) + hasCompletedRename := false + if sc.levelSvc != nil { + completed, _ := sc.levelSvc.HasCompletedTask(uid, "username") + hasCompletedRename = completed + } + data := gin.H{ - "Title": "个人设置", - "ExtraCSS": "/static/css/settings.css", - "ActiveTab": tab, - "User": user, - "RoleName": model.RoleDisplayNames[user.Role], - "StatusName": model.StatusDisplayNames[user.Status], - "PendingTypes": pendingTypes, - "AuditTypes": model.AuditTypeNames, + "Title": "个人设置", + "ExtraCSS": "/static/css/settings.css", + "ActiveTab": tab, + "User": user, + "RoleName": model.RoleDisplayNames[user.Role], + "StatusName": model.StatusDisplayNames[user.Status], + "PendingTypes": pendingTypes, + "AuditTypes": model.AuditTypeNames, + "HasCompletedRename": hasCompletedRename, } // 登录管理 tab 需要额外数据 diff --git a/internal/service/audit_review.go b/internal/service/audit_review.go index 66bef82..2fe3564 100644 --- a/internal/service/audit_review.go +++ b/internal/service/audit_review.go @@ -45,18 +45,28 @@ func (s *AuditService) review(reviewerID uint, submissionID uint, approved bool, } else { submission.Status = model.AuditStatusRejected submission.RejectReason = &reason - // 通知用户审核被拒(改名审核追加域能返还提示) + + // 改名审核被拒 → 仅非首次改名(已扣费)才退还域能 + // 首次改名免费,被拒不退还 + shouldRefund := false + if submission.AuditType == model.AuditTypeUsername && s.energyRefundSvc != nil { + if s.levelSvc != nil { + hasCompleted, _ := s.levelSvc.HasCompletedTask(submission.UserID, "username") + shouldRefund = hasCompleted + } + if shouldRefund { + _ = s.energyRefundSvc.RefundOnRenameReject(submission.UserID) + } + } + + // 通知用户审核被拒(仅实际退款时追加域能返还提示) if s.notifier != nil { reasonMsg := reason - if submission.AuditType == model.AuditTypeUsername { + if shouldRefund { reasonMsg += "。扣除的域能已被返还" } s.notifier.NotifyAuditRejected(submission.UserID, submission.AuditType, reasonMsg, submission.ID) } - // 改名审核被拒 → 返还域能 - if submission.AuditType == model.AuditTypeUsername && s.energyRefundSvc != nil { - _ = s.energyRefundSvc.RefundOnRenameReject(submission.UserID) - } } return s.auditRepo.Update(submission) } diff --git a/internal/service/audit_service.go b/internal/service/audit_service.go index 7d5e226..c49d4c0 100644 --- a/internal/service/audit_service.go +++ b/internal/service/audit_service.go @@ -40,6 +40,7 @@ type auditNotifier interface { // auditTaskCompleter 审核通过时触发首次任务奖励的接口 type auditTaskCompleter interface { CompleteTask(userID uint, taskType string) (newExp int, levelUp bool, err error) + HasCompletedTask(userID uint, taskType string) (bool, error) } // energyRenameRefunder 改名审核被拒时返还域能的接口(ISP) diff --git a/templates/MetaLab-2026/html/settings/index.html b/templates/MetaLab-2026/html/settings/index.html index c61193a..a366ac9 100644 --- a/templates/MetaLab-2026/html/settings/index.html +++ b/templates/MetaLab-2026/html/settings/index.html @@ -79,7 +79,7 @@