spec.md 2.9 KB

040 用户注销翻悔期

用户确认的规则

  • 仅用户端普通用户(user_type=0):注销时设置 del_flag=1,记录截止时间,默认申请时刻起 7 天。
  • 只有截止时间严格大于服务端当前时间,且该账号未被平台停用,身份认证成功后才恢复 del_flag=0 并清空截止时间。历史删除账号无截止时间,不能恢复。
  • 期限到达或超过后保持删除状态;刷新 token、旧会话和静默请求不能恢复账号。
  • 其他商家和骑手账号不进入此流程,保留原有行为。

必须覆盖的边界

  • 注销沿用未完成订单检查;注销须校验有效会话并使现有用户端会话失效。用户确认旧 token 已淘汰,所有 @Auth 接口一律要求有效 Redis 会话;不再兼容旧 JWT 放行。
  • 手机号登录、已绑定第三方登录、第三方绑定手机号和设备信任确认各入口需在身份验证成功后统一调用恢复;恢复条件通过数据库原子更新再次验证,避免截止时间竞争、禁用账号被恢复和历史删除账号误恢复。
  • 手机号和第三方身份的查询仅将有未来截止时间的用户纳入候选,不能影响同手机号商家、骑手;多条候选须安全拒绝,避免误恢复或误创建账号。
  • 删除状态与截止时间同时写入同一事务;原会话撤销和新会话签发不得使注销并发登录时绕过注销状态。
  • 现有第三方绑定唯一索引保留;过期后的旧绑定如何解除和重新注册是独立问题,本期不能擅自删除身份绑定或历史业务资料。
  • 数据库调整写入 updatesql/sql.md,由开发者手动执行;补充用户 App 接入文档及相关代码注释。

实现边界

  • 新字段为 info_user.cancellation_deadline_at,仅由注销/恢复专用 SQL 写入;通用实体写入不接收此字段。
  • 每次注销申请读取字典 user_cancellation_grace_days 的首条正常状态数据的 dict_value,支持整数 1–365 天;字典缺失、停用、空值、非整数、越界或读取异常均回退 7 天。移除原 user.cancellation.grace-days 启动配置。
  • 数据库行锁覆盖用户登录签发会话与注销;原子恢复 SQL 再校验角色、停用状态、删除状态及截止时间。
  • 平台直接删除会清空截止时间,不能被当成主动注销恢复。
  • 不物理删除账号、历史订单、钱包或第三方绑定;不新增定时清理任务。
  • 未完成订单检查沿用已有逻辑,本期不扩展订单业务;原有短信及设备信任认证策略保持现状。

2026-10-30 字典管理增量

管理员通过现有字典管理修改天数,保存刷新字典缓存后对下一次注销申请生效,无须重启。配置只决定新申请的截止时间;已有申请的截止时间不重算,恢复登录不读取新配置。App 继续使用接口返回的 graceDays 与 cancellationDeadlineAt,无请求参数变更。