From a84fa5da614a754302ec27d041952366c2425ade Mon Sep 17 00:00:00 2001 From: Victor_Jay Date: Sun, 31 May 2026 21:08:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AD=89=E7=BA=A7?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=90=8ENAV=E4=BB=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=97=A7=E7=AD=89=E7=BA=A7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CompleteTask等非签到路径触发升级后,session Exp未同步,导致下次页面渲染NAV仍用旧Exp计算等级 - tryAutoCheckIn改为始终对比session Exp与DB Exp并同步,不再仅限签到成功时 - 使用 newExp > s.Exp 确保Exp只增不减,防止异常返回0或主从延迟等场景导致积分回退 --- internal/middleware/auth.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/middleware/auth.go b/internal/middleware/auth.go index b9c02f3..9fe17f0 100644 --- a/internal/middleware/auth.go +++ b/internal/middleware/auth.go @@ -83,14 +83,16 @@ func (am *AuthMiddleware) Optional() gin.HandlerFunc { } } -// tryAutoCheckIn 尝试自动签到(静默失败,不影响主流程) -// 若签到成功,同步更新 gin context 中的 exp,确保页面渲染获取最新等级 +// tryAutoCheckIn 尝试自动签到,并同步 session Exp 与 DB(静默失败,不影响主流程) +// CheckIn 即使已签到也会返回 DB 中最新的 Exp,这里始终与 session 比较, +// 确保 CompleteTask 等非签到路径的 Exp 变化也能同步到 session,避免 NAV 显示旧等级 func (am *AuthMiddleware) tryAutoCheckIn(c *gin.Context, s *session.Session) { if am.levelSvc == nil || s == nil { return } - checkedIn, newExp, _, _ := am.levelSvc.CheckIn(s.UserID) - if checkedIn { + _, newExp, _, _ := am.levelSvc.CheckIn(s.UserID) + // 只允许 Exp 只增不减:DB 异常返回 0 或主从延迟读到旧值时不会回退 + if newExp > s.Exp { s.Exp = newExp _ = am.sessionManager.UpdateSession(s) c.Set("exp", newExp)