## 1. 数据模型与迁移 - [x] 1.1 Prisma:`User` 新增 `mustChangePassword`(Boolean,非空,默认 false,snake_case 映射 `must_change_password`) - [x] 1.2 生成并部署 migration(`migrate dev --create-only` + `migrate deploy`) ## 2. 认证核心(标志 + 门禁) - [x] 2.1 `checkUserActive` 改为返回 `{ active, mustChangePassword }`,user-state 缓存对象加 `mustChangePassword` - [x] 2.2 `JwtAuthGuard` 加待改密门禁:待改密且非 `PATCH /auth/me/password` → 403「请先修改初始密码」 - [x] 2.3 `loginTenant` 与自动探测登录响应返回 `mustChangePassword` - [x] 2.4 `changePassword` 成功时清 `must_change_password` ## 3. 触发置标记 - [x] 3.1 `CreateUserDto` 新增可选 `mustChangePassword`(默认 true),`users.createUser` 按入参落库 - [x] 3.2 `users.resetPassword` 置 `mustChangePassword=true` - [x] 3.3 `initTenant` 新增 `forcePasswordChange` 选项;`createTenant` 传 true、`seed` 传 false ## 4. 前端强制流程 - [x] 4.1 `auth` store 新增 `mustChangePassword` 状态并持久化(sessionStorage) - [x] 4.2 `api/auth.ts` 的 `LoginResult` 类型扩展 `mustChangePassword` - [x] 4.3 路由守卫拦截:待改密且目标非改密页/登出时重定向改密页 - [x] 4.4 新增独立改密页(不进布局),改密成功后 `reset()` + 跳登录页 - [x] 4.5 用户创建表单新增「首登强制改密」开关(默认勾选),`api/user.ts` 的 `UserUpsertData` 扩展 `mustChangePassword` 并在提交时传参 ## 5. 验证 - [x] 5.1 后端 build + 单测 + e2e 通过 - [x] 5.2 前端 type-check 通过 - [x] 5.3 冒烟测试:创建用户(待改密)→ 登录返回 mustChangePassword=true → 其它接口 403 → 改密成功 → 重新登录正常