- 创建统一的下载错误处理模块 (lib/download-errors.ts) - 实现13种错误类型分类和中文错误消息 - 后端统一使用 createDownloadError 创建标准化错误响应 - 前端统一使用 parseDownloadError 解析错误并显示 - 修复正式系统数据库Schema,添加产品全案相关字段和表 - 执行数据库迁移:添加 task_no, task_status, task_fetched_at 字段 - 创建 material_assets, api_keys, api_call_logs 表
4.6 KiB
4.6 KiB
阶段一:用户状态管理优化 - 实施总结
📋 实施目标
将用户状态管理从简单的 isActive 布尔值升级为更完善的 status 枚举字段,并添加审计字段。
✅ 已完成的工作
1. 数据库Schema更新
文件: prisma/schema.prisma
新增字段:
status: String,默认值"pending",可选值:pending|active|suspended|archivedarchivedAt: DateTime?,归档时间(软删除标记)lastLoginAt: DateTime?,最后登录时间lastLoginIp: String?,最后登录IPloginCount: 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: 测试功能
- ✅ 测试用户登录(正常用户、待激活用户)
- ✅ 测试管理员切换用户状态
- ✅ 测试钉钉登录和用户创建
- ✅ 验证登录审计信息记录
⚠️ 注意事项
向后兼容性
- 过渡期:所有API同时支持
isActive和status字段 - 前端兼容:前端仍可使用
isActive字段,但建议逐步迁移到status - 数据库:
isActive字段保留,后续版本可考虑移除
IP地址记录
- NextAuth的
authorize函数中无法直接获取IP地址 - IP地址记录在登录API(如钉钉登录)中处理
- 普通邮箱密码登录的IP地址需要后续通过中间件补充
生产环境部署
- 备份数据库:部署前必须备份
- 测试环境验证:先在测试/影子环境验证
- 分步部署:
- 先应用Schema变更
- 再运行迁移脚本
- 最后部署代码更新
📝 后续工作
阶段二:部门外键关联
- 将
User.department(字符串)改为User.departmentId(外键) - 更新权限管理相关代码
前端UI更新(可选)
- 更新管理员界面,显示和操作
status字段 - 添加状态筛选和显示
- 显示登录审计信息
🎯 完成度
- Schema设计
- 迁移脚本
- API更新
- 向后兼容
- 数据库迁移(待执行)
- 测试验证(待执行)
- 前端UI更新(可选)
实施日期: 2025-12-27
阶段: 阶段一完成
下一步: 执行数据库迁移并测试