gongxiangp2/docs/stage1-user-status-migration.md
chenpei ea9076df45 feat: 实现统一的下载错误处理系统并修复产品全案数据库Schema
- 创建统一的下载错误处理模块 (lib/download-errors.ts)
- 实现13种错误类型分类和中文错误消息
- 后端统一使用 createDownloadError 创建标准化错误响应
- 前端统一使用 parseDownloadError 解析错误并显示
- 修复正式系统数据库Schema,添加产品全案相关字段和表
- 执行数据库迁移:添加 task_no, task_status, task_fetched_at 字段
- 创建 material_assets, api_keys, api_call_logs 表
2026-01-05 17:52:42 +08:00

4.6 KiB
Raw Blame History

阶段一:用户状态管理优化 - 实施总结

📋 实施目标

将用户状态管理从简单的 isActive 布尔值升级为更完善的 status 枚举字段,并添加审计字段。

✅ 已完成的工作

1. 数据库Schema更新

文件: prisma/schema.prisma

新增字段:

  • status: String,默认值 "pending",可选值:pending | active | suspended | archived
  • archivedAt: DateTime?,归档时间(软删除标记)
  • lastLoginAt: DateTime?,最后登录时间
  • lastLoginIp: String?,最后登录IP
  • loginCount: Int,登录次数,默认0

保留字段(向后兼容):

  • isActive: Boolean,保留以便过渡期兼容,标记为已废弃

索引:

  • 添加了 status、isActive、archivedAt 索引以优化查询性能

2. 数据迁移脚本

文件: scripts/migrate-user-status.ts

功能:

  • 将现有 isActive = true 的用户迁移为 status = 'active'
  • isActive = false 的用户保持 status = 'pending'(默认值)
  • 提供迁移统计和验证

使用方法:

npx tsx scripts/migrate-user-status.ts

3. API更新

3.1 登录认证 (lib/auth.ts)

  • ✅ 使用 status 字段检查用户状态(兼容 isActive)
  • ✅ 支持 suspended 和 archived 状态检查
  • ✅ 更新登录时间和登录次数(审计字段)

3.2 用户状态切换API (app/api/admin/users/toggle-active/route.ts)

  • ✅ 支持新API:使用 status 参数(pending | active | suspended | archived)
  • ✅ 兼容旧API:仍支持 isActive 参数
  • ✅ 自动设置/清除 archivedAt 字段
  • ✅ 同时更新 isActive 以保持兼容

3.3 钉钉登录API (app/api/dingtalk/login/route.ts)

  • ✅ 新用户创建时设置 status = 'pending'
  • ✅ 检查用户状态(使用 status 字段,兼容 isActive)
  • ✅ 记录登录审计信息(时间、IP、次数)

3.4 用户列表API (app/api/admin/users/route.ts)

  • ✅ 返回 status 字段
  • ✅ 返回 lastLoginAt、loginCount、archivedAt 字段
  • ✅ 保持 isActive 字段以兼容前端

3.5 完善资料API (app/api/dingtalk/complete-profile/route.ts)

  • ✅ 返回 status 字段

📊 用户状态说明

状态 说明 可登录 可操作 数据保留
pending 待激活(新注册) ❌ ❌ ✅
active 正常使用 ✅ ✅ ✅
suspended 暂停使用 ❌ ❌ ✅
archived 已归档(离职) ❌ ❌ ✅(只读)

🔄 迁移流程

步骤1: 应用数据库变更

# 开发环境(会创建迁移文件)
npx prisma migrate dev --name add_user_status_fields

# 或直接推送(生产环境推荐)
npx prisma db push

步骤2: 运行数据迁移脚本

npx tsx scripts/migrate-user-status.ts

步骤3: 验证迁移结果

检查迁移脚本输出的统计信息,确认:

  • 所有用户的 status 字段都已设置
  • isActive = true 的用户 status = 'active'
  • isActive = false 的用户 status = 'pending'

步骤4: 测试功能

  1. ✅ 测试用户登录(正常用户、待激活用户)
  2. ✅ 测试管理员切换用户状态
  3. ✅ 测试钉钉登录和用户创建
  4. ✅ 验证登录审计信息记录

⚠️ 注意事项

向后兼容性

  • 过渡期:所有API同时支持 isActive 和 status 字段
  • 前端兼容:前端仍可使用 isActive 字段,但建议逐步迁移到 status
  • 数据库:isActive 字段保留,后续版本可考虑移除

IP地址记录

  • NextAuth的 authorize 函数中无法直接获取IP地址
  • IP地址记录在登录API(如钉钉登录)中处理
  • 普通邮箱密码登录的IP地址需要后续通过中间件补充

生产环境部署

  1. 备份数据库:部署前必须备份
  2. 测试环境验证:先在测试/影子环境验证
  3. 分步部署:
    • 先应用Schema变更
    • 再运行迁移脚本
    • 最后部署代码更新

📝 后续工作

阶段二:部门外键关联

  • 将 User.department(字符串)改为 User.departmentId(外键)
  • 更新权限管理相关代码

前端UI更新(可选)

  • 更新管理员界面,显示和操作 status 字段
  • 添加状态筛选和显示
  • 显示登录审计信息

🎯 完成度

  • Schema设计
  • 迁移脚本
  • API更新
  • 向后兼容
  • 数据库迁移(待执行)
  • 测试验证(待执行)
  • 前端UI更新(可选)

实施日期: 2025-12-27
阶段: 阶段一完成
下一步: 执行数据库迁移并测试