fix: 域能系统全量检查 — 修复 5 个逻辑/交互 Gap

- 修复 Admin 改名路径未扣域能(非审核路径补充 HasCompletedTask + DeductOnRename)
- 赋能按钮改为 Modal 弹窗(轻赋/重赋选择 + 每日上限提示)
- EnergyInfo API 增加 daily_energize_exp/daily_exp_cap_reached 返回值
- "我的域能" TAB 增加经验值和等级展示
- Energize 事务修复:导出 EnergyStore + WithTx 方法确保 DB 操作原子性
- Studio 写文章页新增 LV0 锁止横幅 + 禁用提交按钮
This commit is contained in:
2026-06-01 12:10:16 +08:00
parent e1d7c318ab
commit 6542d1e055
10 changed files with 325 additions and 44 deletions

View File

@ -78,16 +78,19 @@ func (ec *EnergyController) GetEnergyInfo(c *gin.Context) {
return
}
energy, err := ec.energySvc.GetEnergyInfo(uid)
info, err := ec.energySvc.GetEnergyInfo(uid)
if err != nil {
common.Error(c, http.StatusInternalServerError, "获取域能信息失败")
return
}
energyDisplay := float64(energy) / 10
energyDisplay := float64(info.Energy) / 10
common.Ok(c, gin.H{
"energy": energy,
"energy_display": energyDisplay,
"energy": info.Energy,
"energy_display": energyDisplay,
"daily_energize_exp": info.DailyEnergizeExp,
"daily_exp_cap": info.DailyExpCap,
"daily_exp_cap_reached": info.DailyExpCapReached,
})
}

View File

@ -72,7 +72,7 @@ type levelUseCase interface {
// energyUseCase EnergyController 对 EnergyService 的最小依赖ISP3 个方法)
type energyUseCase interface {
Energize(energizerID uint, postID uint, amount int) (int, error)
GetEnergyInfo(userID uint) (int, error)
GetEnergyInfo(userID uint) (*service.EnergyInfo, error)
GetEnergyLogs(userID uint, days, page, pageSize int) ([]model.EnergyLog, int64, error)
}

View File

@ -69,6 +69,29 @@ func (sc *SettingsController) UpdateProfile(c *gin.Context) {
}
// 管理员及以上直接更新
// 先获取当前用户信息,判断是否改名
currentUser, err := sc.authService.GetProfile(userID)
if err != nil {
common.Error(c, http.StatusInternalServerError, "操作失败")
return
}
// 改名:首次免费,非首次扣 6 域能
if req.Username != "" && req.Username != currentUser.Username && sc.energySvc != nil {
hasCompleted, _ := sc.levelSvc.HasCompletedTask(userID, "username")
if hasCompleted {
if err := sc.energySvc.DeductOnRename(userID); err != nil {
switch err {
case common.ErrInsufficientEnergy:
common.Error(c, http.StatusBadRequest, "域能不足,无法改名。可通过每日签到或创作被赋能获取")
default:
common.Error(c, http.StatusInternalServerError, "操作失败")
}
return
}
}
}
if err := sc.authService.UpdateProfile(userID, req.Username, req.Bio); err != nil {
handleSettingsError(c, err)
return