fix: 修复等级升级后NAV仍显示旧等级的问题
- CompleteTask等非签到路径触发升级后,session Exp未同步,导致下次页面渲染NAV仍用旧Exp计算等级 - tryAutoCheckIn改为始终对比session Exp与DB Exp并同步,不再仅限签到成功时 - 使用 newExp > s.Exp 确保Exp只增不减,防止异常返回0或主从延迟等场景导致积分回退
This commit is contained in:
@ -83,14 +83,16 @@ func (am *AuthMiddleware) Optional() gin.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tryAutoCheckIn 尝试自动签到(静默失败,不影响主流程)
|
// tryAutoCheckIn 尝试自动签到,并同步 session Exp 与 DB(静默失败,不影响主流程)
|
||||||
// 若签到成功,同步更新 gin context 中的 exp,确保页面渲染获取最新等级
|
// CheckIn 即使已签到也会返回 DB 中最新的 Exp,这里始终与 session 比较,
|
||||||
|
// 确保 CompleteTask 等非签到路径的 Exp 变化也能同步到 session,避免 NAV 显示旧等级
|
||||||
func (am *AuthMiddleware) tryAutoCheckIn(c *gin.Context, s *session.Session) {
|
func (am *AuthMiddleware) tryAutoCheckIn(c *gin.Context, s *session.Session) {
|
||||||
if am.levelSvc == nil || s == nil {
|
if am.levelSvc == nil || s == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
checkedIn, newExp, _, _ := am.levelSvc.CheckIn(s.UserID)
|
_, newExp, _, _ := am.levelSvc.CheckIn(s.UserID)
|
||||||
if checkedIn {
|
// 只允许 Exp 只增不减:DB 异常返回 0 或主从延迟读到旧值时不会回退
|
||||||
|
if newExp > s.Exp {
|
||||||
s.Exp = newExp
|
s.Exp = newExp
|
||||||
_ = am.sessionManager.UpdateSession(s)
|
_ = am.sessionManager.UpdateSession(s)
|
||||||
c.Set("exp", newExp)
|
c.Set("exp", newExp)
|
||||||
|
|||||||
Reference in New Issue
Block a user