- 创建统一的下载错误处理模块 (lib/download-errors.ts) - 实现13种错误类型分类和中文错误消息 - 后端统一使用 createDownloadError 创建标准化错误响应 - 前端统一使用 parseDownloadError 解析错误并显示 - 修复正式系统数据库Schema,添加产品全案相关字段和表 - 执行数据库迁移:添加 task_no, task_status, task_fetched_at 字段 - 创建 material_assets, api_keys, api_call_logs 表
13 KiB
13 KiB
组织架构与用户管理 - 实现情况评估报告
评估日期: 2025-12-27
评估范围: 对比设计方案与实际代码实现
📊 总体评估
| 模块 | 设计方案 | 当前实现 | 完成度 | 优先级 |
|---|---|---|---|---|
| 用户状态管理 | ✅ 完整设计 | ⚠️ 部分实现(文档有,代码未应用) | 30% | 🔴 高 |
| 用户表结构 | ✅ 完整设计 | ⚠️ 基础实现(缺少外键) | 40% | 🔴 高 |
| 部门层级结构 | ✅ 完整设计 | ❌ 未实现 | 0% | 🟡 中 |
| 角色权限体系 | ✅ 完整设计 | ⚠️ 基础实现(只有2种角色) | 30% | 🟡 中 |
| 权限继承机制 | ✅ 完整设计 | ⚠️ 部分实现(关联部门) | 50% | 🟡 中 |
| 用户操作日志 | ✅ 完整设计 | ❌ 未实现 | 0% | 🟢 低 |
| 用户搜索功能 | ✅ 完整设计 | ⚠️ 基础实现 | 40% | 🟡 中 |
🔍 详细对比分析
一、用户表结构 (User Model)
设计方案要求
model User {
// 组织架构
departmentId String? // 所属部门ID(外键关联)
department Department? @relation(...)
// 角色权限
role Role @default(USER) // USER/DEPT_ADMIN/SYSTEM_ADMIN/SUPER_ADMIN
isSuperAdmin Boolean @default(false)
// 用户状态
status String @default("pending") // pending/active/suspended/archived
isActive Boolean @default(false) // 向后兼容
canDownload Boolean @default(true)
// 审计字段
lastLoginAt DateTime?
lastLoginIp String?
loginCount Int @default(0)
archivedAt DateTime?
// 关联
operationLogs UserOperationLog[]
}
当前实现
model User {
department String @default("") // ❌ 字符串,非外键
managedDepartment String? // ✅ 管理员负责的部门
role Role @default(USER) // ❌ 只有 USER/ADMIN
isActive Boolean @default(false) // ✅ 已实现
canDownload Boolean @default(true) // ✅ 已实现
isSuperAdmin Boolean @default(false) // ✅ 已实现
// ❌ 缺少 status 字段
// ❌ 缺少审计字段(lastLoginAt, lastLoginIp, loginCount, archivedAt)
// ❌ 缺少 operationLogs 关联
}
差距分析
- ❌ 部门关联: 使用字符串
department而非外键departmentId - ❌ 用户状态: 缺少
status字段(虽然有文档,但代码未应用) - ❌ 审计字段: 缺少登录审计和归档时间字段
- ❌ 角色枚举: 只有
USER和ADMIN,缺少DEPT_ADMIN和SYSTEM_ADMIN - ⚠️ 向后兼容:
isActive字段存在,但需要与status字段配合使用
二、部门表结构 (Department Model)
设计方案要求
model Department {
id String @id @default(uuid())
code String @unique // 部门编码
name String
parentId String? // 父部门ID(层级结构)
parent Department? @relation("DepartmentHierarchy", ...)
children Department[] @relation("DepartmentHierarchy")
level Int @default(1) // 层级:1/2/3
managerId String? // 部门负责人ID
manager User? @relation("DepartmentManager", ...)
status String @default("active") // active/disabled/archived
description String?
sortOrder Int @default(0)
users User[]
permissions DepartmentMaterialPermission[]
}
当前实现
model Department {
id String @id @default(uuid())
name String @unique
createdAt DateTime @default(now())
// ❌ 缺少所有层级结构字段
// ❌ 缺少部门编码
// ❌ 缺少状态管理
// ❌ 缺少部门负责人
}
差距分析
- ❌ 层级结构: 完全未实现,无法支持多级部门
- ❌ 部门编码: 缺少唯一编码系统
- ❌ 状态管理: 无法禁用或归档部门
- ❌ 部门负责人: 无法设置部门管理员
- ❌ 排序: 缺少排序字段
三、角色权限体系 (Role Enum)
设计方案要求
enum Role {
USER // 普通用户
DEPT_ADMIN // 部门管理员
SYSTEM_ADMIN // 系统管理员
SUPER_ADMIN // 超级管理员(保留 isSuperAdmin 字段作为额外标识)
}
当前实现
enum Role {
USER
ADMIN // ❌ 只有一个管理员角色,无法区分部门管理员和系统管理员
}
差距分析
- ❌ 角色细分: 只有2种角色,无法实现权限矩阵
- ⚠️ 超级管理员: 通过
isSuperAdmin字段实现,但角色枚举不完整 - ❌ 权限控制: 无法区分部门管理员和系统管理员的权限范围
四、权限管理 (DepartmentMaterialPermission)
设计方案要求
model DepartmentMaterialPermission {
departmentId String // 部门ID(外键)
department Department @relation(...)
canView Boolean @default(false)
canDownload Boolean @default(false)
canShare Boolean @default(true)
canUpload Boolean @default(true) // 新增:是否允许上传
// 权限继承
inheritFromParent Boolean @default(true)
parentPermissionId String?
isOverride Boolean @default(false)
}
当前实现
model DepartmentMaterialPermission {
department String // ❌ 字符串,非外键
materialType String
canView Boolean @default(false) // ✅
canDownload Boolean @default(false) // ✅
canShare Boolean @default(true) // ✅
linkedToDepartment String? // ⚠️ 关联部门(类似继承,但实现方式不同)
// ❌ 缺少 canUpload 字段
// ❌ 缺少权限继承机制(inheritFromParent, parentPermissionId, isOverride)
}
差距分析
- ❌ 外键关联: 使用字符串
department而非外键 - ❌ 上传权限: 缺少
canUpload字段 - ⚠️ 权限继承: 通过
linkedToDepartment实现类似功能,但不够灵活 - ❌ 权限覆盖: 无法实现子部门覆盖父部门权限
五、用户操作日志 (UserOperationLog)
设计方案要求
model UserOperationLog {
id String @id @default(uuid())
userId String
user User @relation(...)
action String // LOGIN/LOGOUT/CREATE_USER/UPDATE_USER/...
targetType String? // USER/MATERIAL/DEPARTMENT/...
targetId String?
details Json? // 操作详情(变更前后数据)
ipAddress String?
userAgent String?
createdAt DateTime @default(now())
}
当前实现
// ❌ 完全未实现
// 只有 MaterialLog(素材操作日志),没有用户操作日志
差距分析
- ❌ 审计能力: 无法记录用户管理、部门管理、权限变更等操作
- ⚠️ 素材日志: 已有
MaterialLog,但缺少用户操作日志 - ❌ 安全审计: 无法追踪敏感操作(如删除用户、修改权限)
六、用户搜索与查询
设计方案要求
- 多字段搜索:用户名、真实姓名、邮箱、手机号、部门名称、钉钉用户ID
- 多维度筛选:角色、状态、是否激活、部门、注册时间范围、最后登录时间范围
- 树形结构展示:按部门分组,显示管理员和普通用户
当前实现
// app/api/admin/users/route.ts
const users = await prisma.user.findMany({
select: {
id: true,
email: true,
username: true,
realName: true, // ✅ 有真实姓名
role: true,
isActive: true,
canDownload: true,
department: true, // ⚠️ 字符串部门
managedDepartment: true,
createdAt: true,
},
orderBy: { createdAt: 'desc' },
});
差距分析
- ⚠️ 搜索功能: 基础实现,但缺少多字段搜索和多维度筛选
- ❌ 状态筛选: 无法按
status筛选(因为字段不存在) - ❌ 登录时间筛选: 无法按最后登录时间筛选(字段不存在)
- ⚠️ 树形展示: 前端可能有实现,但后端数据不支持层级结构
🎯 实施优先级建议
🔴 高优先级(第一阶段:基础优化)
-
用户状态管理 ⚠️
- 添加
status字段(pending/active/suspended/archived) - 添加审计字段(lastLoginAt, lastLoginIp, loginCount, archivedAt)
- 更新登录和用户管理API
- 状态: 文档已写好,需要应用到代码
- 添加
-
用户表外键关联 🔴
- 将
User.department(字符串)改为User.departmentId(外键) - 数据迁移:将现有部门名称转换为部门ID
- 更新所有相关代码(权限检查、用户查询等)
- 将
-
用户搜索增强 🟡
- 实现多字段搜索(用户名、真实姓名、邮箱、手机号)
- 实现多维度筛选(角色、状态、部门、时间范围)
- 优化查询性能(添加索引)
🟡 中优先级(第二阶段:组织架构升级)
-
部门层级结构 🔴
- 添加
parentId、level、code、status字段 - 实现部门树形查询
- 更新部门管理UI
- 添加
-
角色枚举扩展 🟡
- 添加
DEPT_ADMIN和SYSTEM_ADMIN角色 - 更新权限检查逻辑
- 更新管理员界面
- 添加
-
权限继承机制 🟡
- 实现父子部门权限继承
- 添加
inheritFromParent、isOverride字段 - 更新权限查询逻辑
🟢 低优先级(第三阶段:完善功能)
-
用户操作日志 🟢
- 创建
UserOperationLog表 - 实现日志记录功能
- 添加日志查询API
- 创建
-
部门负责人 🟢
- 添加
managerId字段 - 实现部门管理员自动权限分配
- 添加
📝 实施建议
阶段一:基础优化(1-2周)
目标: 完善用户状态管理和外键关联
-
应用用户状态字段
- 更新
prisma/schema.prisma,添加status和审计字段 - 运行数据库迁移
- 运行数据迁移脚本(
scripts/migrate-user-status.ts) - 更新所有API和前端代码
- 更新
-
用户表外键关联
- 更新
prisma/schema.prisma,将department改为departmentId - 创建数据迁移脚本,将部门名称转换为部门ID
- 更新所有使用
department字段的代码 - 更新权限检查逻辑(
lib/department-permission.ts)
- 更新
-
用户搜索增强
- 更新用户列表API,支持多字段搜索和多维度筛选
- 添加必要的数据库索引
- 更新前端搜索UI
阶段二:组织架构升级(2-3周)
目标: 实现部门层级结构和权限继承
-
部门层级结构
- 更新
prisma/schema.prisma,添加层级字段 - 创建数据迁移脚本,为现有部门设置层级
- 实现部门树形查询API
- 更新部门管理UI
- 更新
-
角色枚举扩展
- 更新
Role枚举,添加新角色 - 更新权限检查逻辑
- 更新管理员界面,支持角色选择
- 更新
-
权限继承机制
- 更新权限表结构,添加继承字段
- 实现权限继承查询逻辑
- 更新权限管理UI
阶段三:完善功能(1-2周)
目标: 添加操作日志和部门负责人功能
-
用户操作日志
- 创建
UserOperationLog表 - 实现日志记录功能
- 添加日志查询API和UI
- 创建
-
部门负责人
- 添加
managerId字段 - 实现部门管理员自动权限分配
- 更新部门管理UI
- 添加
⚠️ 注意事项
数据迁移风险
-
部门字符串转外键
- 风险:如果部门名称不一致,可能导致数据丢失
- 建议:先创建部门数据,再迁移用户数据
- 验证:迁移后检查所有用户都有有效的
departmentId
-
用户状态迁移
- 风险:如果
isActive和status不一致,可能导致用户无法登录 - 建议:迁移脚本要同时更新两个字段
- 验证:检查所有用户的
status字段都已设置
- 风险:如果
向后兼容性
-
过渡期支持
- 保留
isActive字段,同时支持status字段 - 保留
department字符串字段,同时支持departmentId外键 - 逐步迁移,不要一次性删除旧字段
- 保留
-
API兼容
- 新旧API并存,逐步切换
- 前端代码逐步迁移到新字段
性能考虑
-
索引优化
- 为
departmentId、status、lastLoginAt等字段添加索引 - 为权限查询添加复合索引
- 为
-
查询优化
- 部门树形查询使用递归CTE或应用层构建
- 权限继承查询使用缓存机制
📊 完成度统计
| 模块 | 完成度 | 预计工作量 |
|---|---|---|
| 用户状态管理 | 30% | 3天 |
| 用户表外键关联 | 40% | 5天 |
| 部门层级结构 | 0% | 7天 |
| 角色权限体系 | 30% | 5天 |
| 权限继承机制 | 50% | 5天 |
| 用户操作日志 | 0% | 3天 |
| 用户搜索功能 | 40% | 3天 |
| 总计 | 约30% | 约31天(6周) |
报告生成时间: 2025-12-27
下一步: 与开发团队讨论实施优先级和时间安排