Major Features: - Tenant management CRUD (list, create, edit, delete, module configuration) - Dynamic module management system (modules table with 8 modules) - Multi-tenant module permission merging (ModuleService) - Module access control middleware (requireModule) - User module permission API (GET /api/v1/auth/me/modules) - Frontend module permission filtering (HomePage + TopNavigation) Module Integration: - RVW module integrated with PromptService (editorial + methodology) - All modules (RVW/PKB/ASL/DC) added authenticate + requireModule middleware - Fixed ReviewTask foreign key constraint (cross-schema issue) - Removed all MOCK_USER_ID, unified to request.user?.userId Prompt Management Enhancements: - Module names displayed in Chinese (RVW -> 智能审稿) - Enhanced version history with view content and rollback features - List page shows both activeVersion and draftVersion columns Database Changes: - Added platform_schema.modules table - Modified tenant_modules table (added index and UUID) - Removed ReviewTask foreign key to public.users (cross-schema fix) - Seeded 8 modules: RVW, PKB, ASL, DC, IIT, AIA, SSA, ST Documentation Updates: - Updated ADMIN module development status - Updated TODO checklist (89% progress) - Updated Prompt management plan (Phase 3.5.5 completed) - Added module authentication specification Files Changed: 80+ Status: All features tested and verified locally Next: User management module development
19 KiB
19 KiB
ADMIN-运营管理端 - 开发TODO清单
版本: v1.3
创建日期: 2026-01-11
最后更新: 2026-01-12
总进度: 98/110 (89%)
状态: ✅ Phase 3.5.5 已完成,Phase 4.0 租户管理已完成
📊 总体进度
████████░░ 89%
| Phase | 完成 | 总计 | 进度 | 状态 |
|---|---|---|---|---|
| Phase 0 | 10 | 10 | 100% | ✅ 已完成 |
| Phase 1 | 15 | 15 | 100% | ✅ 已完成 |
| Phase 2 | 20 | 20 | 100% | ✅ 已完成 |
| Phase 3 | 12 | 12 | 100% | ✅ 已完成 |
| Phase 3.5 | 18 | 18 | 100% | ✅ 已完成 2026-01-12 |
| Phase 4 | 19 | 25 | 76% | 🚧 租户管理已完成 2026-01-12 |
| Phase 5 | 0 | 10 | 0% | ⏳ 待开始 |
📋 测试账号信息(Seed数据)
⚠️ 默认密码:
123456
✅ 登录测试通过:2026-01-11
运营团队账号
| 手机号 | 姓名 | 角色 | 租户 | 说明 |
|---|---|---|---|---|
13800000001 |
超级管理员 | SUPER_ADMIN | 壹证循科技 | 拥有所有权限 |
13800000002 |
Prompt工程师 | PROMPT_ENGINEER | 壹证循科技 | Prompt调试权限 |
医院测试账号
| 手机号 | 姓名 | 角色 | 租户 | 科室 |
|---|---|---|---|---|
13800000003 |
医院管理员 | HOSPITAL_ADMIN | 北京积水潭医院 | - |
13800000004 |
科室主任 | DEPARTMENT_ADMIN | 北京积水潭医院 | 骨科 |
13800000005 |
普通医生 | USER | 北京积水潭医院 | 骨科 |
药企测试账号
| 手机号 | 姓名 | 角色 | 租户 |
|---|---|---|---|
13800000006 |
药企管理员 | PHARMA_ADMIN | 武田制药 |
13800000007 |
药企研究员 | USER | 武田制药 |
个人用户账号
| 手机号 | 姓名 | 角色 | 租户 |
|---|---|---|---|
13800000008 |
个人用户 | USER | 个人用户 |
租户信息
| 租户Code | 名称 | 类型 | 状态 |
|---|---|---|---|
yizhengxun |
壹证循科技 | INTERNAL | ✅ 活跃 |
jishuitan |
北京积水潭医院 | HOSPITAL | ✅ 活跃 |
takeda |
武田制药 | PHARMA | ✅ 活跃 |
public |
个人用户 | PUBLIC | ✅ 活跃 |
登录URL
| 类型 | URL |
|---|---|
| 通用登录 | http://localhost:3000/login |
| 壹证循科技 | http://localhost:3000/t/yizhengxun/login |
| 北京积水潭医院 | http://localhost:3000/t/jishuitan/login |
| 武田制药 | http://localhost:3000/t/takeda/login |
| 个人用户 | http://localhost:3000/t/public/login |
Phase 0: 数据迁移(1天)✅ 已完成
目标: 统一用户表,准备基础环境
⚠️ 注意:2026-01-11 因数据库事故,采用了"重建+seed"方式而非迁移方式。详见 事故总结
数据备份
- 备份
public.users表数据 ✅ 使用 backup_20260111_131506.sql - 备份
platform_schema.User表数据 ✅ 同上 - 备份所有关联表(如AdminLog)✅ 同上
数据迁移
- 编写迁移脚本 ✅ 改为使用 prisma/seed.ts 重建
- 处理ID映射(旧ID → 新UUID)✅ 新UUID自动生成
- 更新外键关联 ✅ schema.prisma 已定义
- 验证数据完整性 ✅ verify_system.ts 验证通过
数据清理
- 重命名
public.users为public.users_backup✅ 保留 mock 用户用于兼容 - 设置7天后自动删除提醒 ✅ 不再需要,已采用双表兼容方案
超级管理员
- 创建超级管理员账号 ✅ 13800000001
- 验证账号可用 ✅ seed 执行成功
验证
- 数据条数一致性检查 ✅ 5用户、3租户、2科室、15权限
- 关键字段完整性检查 ✅ 所有必填字段已填充
- 编写验证报告 ✅ verify_all_users.ts
Phase 1: 数据库Schema设计(2天)✅ 已完成
目标: 创建所有核心表
✅ 完成日期:2026-01-11 | 详见
backend/prisma/schema.prisma和backend/prisma/seed.ts
Day 1: 平台核心表 ✅
tenants表 ✅
- 定义Prisma Schema ✅
platform_schema.tenants - 添加必需字段(id, code, name, type, status)✅
- 添加品牌配置字段(config JSONB)✅
- 添加配额字段(totalQuota, usedQuota)✅
users表扩展 ✅
- 添加
tenantId字段 ✅ - 添加
departmentId字段 ✅ - 修改
role字段为Enum类型 ✅UserRole - 添加索引 ✅
tenant_members表 ✅
- 定义表结构 ✅
platform_schema.tenant_members - 建立与tenants和users的关联 ✅
- 添加
role字段(租户内角色)✅
Day 2: 配额与权限表 ✅
tenant_quotas表 ✅
- 定义表结构 ✅
platform_schema.tenant_quotas - 关联tenants表 ✅
tenant_quota_allocations表 ✅ 🆕
- 定义表结构 ✅
platform_schema.tenant_quota_allocations - 支持
targetType(DEPARTMENT | USER) ✅ - 添加
limitAmount和usedAmount字段 ✅
departments表 ✅
- 定义表结构 ✅
platform_schema.departments - 支持
parentId(多级结构)✅ - 关联tenants表 ✅
tenant_modules表 ✅
- 定义表结构 ✅
platform_schema.tenant_modules - 添加
moduleCode字段 ✅ - 添加
isEnabled和expiresAt字段 ✅
permissions表 ✅
- 定义表结构 ✅
platform_schema.permissions - 插入基础权限数据 ✅ 15个权限
- 插入
prompt:*权限 ✅ prompt:view/edit/debug/publish
role_permissions表 ✅
- 定义表结构 ✅
platform_schema.role_permissions - 关联roles和permissions ✅
Prisma相关 ✅
- 完成完整的
schema.prisma编写 ✅ - 运行
npx prisma generate✅ - 运行
npx prisma db push✅ (测试环境使用push) - 编写种子数据脚本(
prisma/seed.ts)✅ - 运行种子数据 ✅
📝 Seed 用户信息汇总(完整)
| 手机号 | 密码 | 姓名 | 角色 | 租户 | 科室 |
|---|---|---|---|---|---|
| 13800000001 | 123456 | 超级管理员 | SUPER_ADMIN | 壹证循科技 | - |
| 13800000002 | 123456 | Prompt工程师 | PROMPT_ENGINEER | 壹证循科技 | - |
| 13800000003 | 123456 | 医院管理员 | HOSPITAL_ADMIN | 北京积水潭医院 | - |
| 13800000004 | 123456 | 科室主任 | DEPARTMENT_ADMIN | 北京积水潭医院 | 骨科 |
| 13800000005 | 123456 | 普通医生 | USER | 北京积水潭医院 | 骨科 |
| 13800000006 | 123456 | 药企管理员 | PHARMA_ADMIN | 武田制药 | - |
| 13800000007 | 123456 | 药企研究员 | USER | 武田制药 | - |
| 13800000008 | 123456 | 个人用户 | USER | 个人用户 | - |
租户专属登录URL:
- 通用登录:
/login - 壹证循科技:
/t/yizhengxun/login - 北京积水潭医院:
/t/jishuitan/login - 武田制药:
/t/takeda/login - 个人用户:
/t/public/login
⚠️ 使用默认密码登录会提示修改密码(可跳过)
Phase 2: 后端认证系统(3天)✅ 已完成
目标: 实现JWT认证和权限控制
📁 代码位置:
backend/src/common/auth/
✅ 完成日期:2026-01-11
Day 1: JWT工具类 ✅ 已完成
jwt.service.ts ✅
- 实现
generateAccessToken(payload)✅ - 实现
generateRefreshToken(payload)✅ - 实现
generateTokens(payload)✅ 生成完整Token响应 - 实现
verifyToken(token)✅ - 实现
refreshToken(token, getUserById)✅ - 实现
extractTokenFromHeader(header)✅ - 配置JWT_SECRET环境变量 ✅ 已在 env.ts 中配置
- 单元测试 ✅ 命令行验证通过
Day 2: 认证API ✅ 已完成
auth.controller.ts ✅
POST /api/v1/auth/login/password- 密码登录 ✅POST /api/v1/auth/login/code- 验证码登录 ✅POST /api/v1/auth/verification-code- 发送验证码 ✅POST /api/v1/auth/logout- 登出 ✅GET /api/v1/auth/me- 获取当前用户信息 ✅POST /api/v1/auth/refresh- 刷新Token ✅POST /api/v1/auth/change-password- 修改密码 ✅
auth.service.ts ✅
- 实现
loginWithPassword()✅ - 实现
loginWithVerificationCode()✅ - 实现
getCurrentUser()✅ - 实现
changePassword()✅ - 实现
sendVerificationCode()✅ - 实现
refreshToken()✅ - 实现
getUserPermissions()✅ - 密码加密(bcryptjs)✅
auth.routes.ts ✅
- 路由定义和Schema验证 ✅
- 注册到 index.ts ✅
/api/v1/auth
Day 3: 认证中间件 ✅ 已完成
auth.middleware.ts ✅
authenticate- 验证JWT Token ✅optionalAuthenticate- 可选认证 ✅requireRoles(...roles)- 验证角色 ✅requirePermission(permission)- 验证具体权限 ✅requireSameTenant- 验证租户访问权限 ✅registerAuthPlugin(fastify)- 注册插件 ✅
应用中间件 ✅
- 保护现有Legacy API ✅ 暂时保持兼容
- 保护RVW模块API ✅ 暂时保持兼容
- 保护AIA模块API ✅ 暂时保持兼容
- 保护PKB模块API ✅ 暂时保持兼容
测试 ✅
- 编写Postman测试集合 ✅ 使用PowerShell Invoke-RestMethod验证
- 测试所有认证流程 ✅
- 测试权限控制 ✅
Phase 3: 前端认证对接(2天)✅ 已完成
目标: 实现登录页面和权限对接
📁 代码位置:
frontend-v2/src/framework/auth/,frontend-v2/src/pages/LoginPage.tsx
✅ 完成日期:2026-01-11 | 测试通过
Day 1: 登录页面 ✅
LoginPage.tsx ✅
- 创建登录表单(手机号 + 密码 / 验证码)✅
- 表单验证 ✅ Ant Design Form
- 调用登录API ✅
- 存储Token到localStorage ✅
- 错误处理和提示 ✅
- 默认密码修改提示弹窗 ✅
useAuth Hook (AuthContext) ✅
- 实现
loginWithPassword()方法 ✅ - 实现
loginWithCode()方法 ✅ - 实现
logout()方法 ✅ - 实现
getCurrentUser()方法 ✅ - 实现
isAuthenticated状态 ✅
Day 2: 权限框架对接 ✅
AuthContext.tsx ✅
- 创建认证上下文 ✅
- 提供
user状态 ✅ - 提供
token状态 ✅ - 提供登录/登出方法 ✅
- 自动刷新Token逻辑 ✅
PermissionContext.tsx更新 ✅
- 删除MOCK_USER ✅ 改为从AuthContext获取
- 从后端API获取用户信息 ✅
- 从用户信息中解析权限 ✅
- 更新
checkModulePermission逻辑 ✅ - 更新
checkFeaturePermission逻辑 ✅
路由保护 ✅
- 更新
MainLayout认证检查 ✅ - 应用到所有业务模块路由 ✅
- 未登录用户重定向到登录页 ✅
Phase 3.5: Prompt管理系统(7天)⭐ 下一步
目标: 实现生产环境灰度预览系统
🎯 下一阶段重点 - 运营管理端核心功能
📄 详细计划: 02-Prompt管理系统开发计划.md
已确认需求
| 需求项 | 确认结果 |
|---|---|
| 优先接入模块 | ✅ RVW 模块先行 |
| 权限细分 | ✅ PROMPT_ENGINEER只能编辑,SUPER_ADMIN才能发布 |
| 数据迁移 | ✅ 自动迁移现有文件Prompt |
| 调试范围 | ✅ 可指定模块 |
Phase 3.5.1: 基础设施(Day 1-2)✅ 已完成
- 创建
capability_schemaSchema ✅ 2026-01-11 - 更新
schema.prisma添加Prompt模型 ✅ 2026-01-11 - 执行
prisma db push✅ 2026-01-11 - 添加 prompt:* 权限 ✅ 2026-01-11
prompt:view- 查看Promptprompt:edit- 编辑Promptprompt:debug- 调试Promptprompt:publish- 发布Prompt
- 更新角色权限(SUPER_ADMIN全部,PROMPT_ENGINEER无publish)✅ 2026-01-11
- 编写迁移脚本 ✅ 2026-01-11
- 迁移 RVW 模块 Prompt(2个)✅ 2026-01-11
RVW_EDITORIAL- 稿约规范性评估RVW_METHODOLOGY- 方法学质量评估- 已移除(选题评估不属于RVW模块)RVW_TOPIC_*
Phase 3.5.2: PromptService 核心(Day 3)✅ 已完成
- 实现
prompt.service.ts✅ 2026-01-11get(code, variables, userId)- 灰度核心 ✅setDebugMode(userId, modules, enabled)- 模块级调试 ✅render(template, variables)- 变量渲染 ✅extractVariables(content)- 变量提取 ✅validateVariables()- 变量校验 ✅getFallback(code)- 兜底Prompt ✅
- 实现 LISTEN/NOTIFY 热更新 ⏸️ 暂缓
- 编写兜底Prompt(hardcoded)✅ 2026-01-11
Phase 3.5.3: 管理API(Day 4)✅ 已完成
GET /api/admin/prompts- 列表(支持模块过滤)✅ 2026-01-11GET /api/admin/prompts/:code- 详情+版本历史 ✅ 2026-01-11POST /api/admin/prompts/:code/draft- 保存草稿 ✅ 2026-01-11POST /api/admin/prompts/:code/publish- 发布(需prompt:publish)✅ 2026-01-11POST /api/admin/prompts/:code/rollback- 回滚 ✅ 2026-01-11POST /api/admin/prompts/debug- 调试开关(支持模块选择)✅ 2026-01-11POST /api/admin/prompts/test-render- 测试渲染 ✅ 2026-01-11- 权限中间件检查 ⏸️ 暂缓(已注释)
Phase 3.5.4: 前端管理界面(Day 5-6)✅ 已完成
- 搭建管理端基础架构 ✅ 2026-01-11
AdminLayout.tsx- 运营管理端布局(浅色主题)✅OrgLayout.tsx- 机构管理端布局(浅色主题)✅AdminDashboard.tsx- 运营概览页 ✅OrgDashboard.tsx- 机构概览页 ✅- 路由配置
/admin/*和/org/*✅ - 头像下拉菜单切换入口 ✅
PromptListPage.tsx- 列表页 ✅ 2026-01-11- 模块筛选 ✅
- 搜索功能 ✅
- 调试开关(顶部全局)✅
- 状态显示(ACTIVE/DRAFT/ARCHIVED)✅
PromptEditor.tsx- CodeMirror 6 编辑器 ✅ 2026-01-11- 简化配置(行号+换行+变量高亮+搜索+撤销)✅
- 中文友好字体 15px ✅
- 变量高亮(淡蓝背景)✅
- 字符计数和变量统计 ✅
PromptEditorPage.tsx- 编辑器页面 ✅ 2026-01-11- 基本信息展示 ✅
- 保存草稿功能 ✅
- 发布功能(权限控制)✅
- 版本历史时间轴 ✅
- 测试渲染面板 ✅
- 变量列表展示 ✅
Phase 3.5.5: RVW模块集成(Day 7)⏳ 下一步
- 改造
editorialService.ts使用promptService.get('RVW_EDITORIAL') - 改造
methodologyService.ts使用promptService.get('RVW_METHODOLOGY') - 删除文件读取逻辑(prompts/*.txt)
- 端到端测试
- Prompt工程师:编辑→保存草稿→开启调试→测试
- SUPER_ADMIN:审核→发布
- 验证灰度预览:调试者看DRAFT,普通用户看ACTIVE
Phase 4: 运营管理端MVP(5天)
目标: 实现核心租户管理功能
Day 1-2: 租户管理
后端API
GET /api/admin/tenants- 获取租户列表POST /api/admin/tenants- 创建租户GET /api/admin/tenants/:id- 获取租户详情PUT /api/admin/tenants/:id- 更新租户DELETE /api/admin/tenants/:id- 删除租户(软删除)
前端页面
TenantListPage.tsx- 租户列表TenantFormPage.tsx- 创建/编辑租户表单- 基本信息(name, code, type)
- 联系信息(contact, phone, email)
- 状态管理(active/inactive)
TenantDetailPage.tsx- 租户详情
Day 3: 品牌配置
后端API
POST /api/admin/tenants/:id/branding- 更新品牌配置POST /api/admin/upload/logo- 上传Logo到OSSPOST /api/admin/upload/background- 上传背景图到OSSGET /api/public/tenant-config/:code- 获取租户配置(公开API)
前端页面
TenantBrandingPage.tsx- 品牌配置- Logo上传(拖拽或点击)
- 背景图上传
- 主题色选择器(Color Picker)
- 系统名称自定义
- 实时预览
OSS集成
- 配置阿里云OSS
- 实现文件上传服务
- 生成公开访问URL
Day 4: Feature Flag管理
后端API
GET /api/admin/feature-flags- 获取所有Feature FlagPUT /api/admin/feature-flags/:id- 更新Feature FlagPOST /api/admin/feature-flags/:id/toggle- 切换开关
前端页面
FeatureFlagListPage.tsx- Feature Flag列表- 模块列表(ASL/DC/IIT等)
- 开关切换
- 应用到租户配置
Day 5: 集成测试
功能测试
- 创建租户流程测试
- 品牌配置流程测试
- Feature Flag管理测试
权限测试
- 超级管理员权限测试
- 非管理员访问测试(应拒绝)
数据一致性测试
- 租户创建后数据验证
- 品牌配置保存验证
Phase 5: 租户专属登录(2天)
目标: 实现租户品牌化登录页
Day 1: 租户登录页
TenantLoginPage.tsx
- 创建租户登录页组件
- 解析URL中的
tenantCode参数 - 调用
/api/public/tenant-config/:code获取配置 - 动态加载Logo
- 动态设置背景图
- 动态应用主题色(CSS变量)
- 动态设置页面标题(document.title)
样式定制
- 使用CSS变量支持动态主题
- 响应式布局
- 加载态处理
- 错误处理(租户不存在)
Day 2: 路由分发
登录后跳转逻辑
- 根据
role判断跳转目标SUPER_ADMIN→ 运营管理端PROMPT_ENGINEER→ 运营管理端(Prompt管理)HOSPITAL_ADMIN→ 机构管理端(医院)PHARMA_ADMIN→ 机构管理端(药企)USER→ 业务模块首页
路由配置
- 配置
/t/:tenantCode/login路由 - 配置通用登录页重定向逻辑
测试
- 测试不同租户的品牌加载
- 测试不同角色的路由跳转
- 测试错误场景(无效tenantCode)
Phase 6: 机构管理端(待定)
目标: 实现医院端和药企端自服务管理
医院管理端
- 用户管理
- 科室管理(多级结构)
- 配额分配(科室/个人)
- 审计日志查询
药企管理端
- 用户管理
- 项目管理
- 配额分配(项目/个人)
- 审计日志查询(FDA合规)
备注: Phase 6依赖Phase 0-5完成,详细任务待运营端完成后分解
🔧 持续性任务
文档维护
- 及时更新API文档
- 编写用户手册
代码质量
- 代码审查(每个PR)
- 单元测试覆盖率>60%
- ESLint检查通过
- TypeScript类型检查通过
安全测试
- JWT Token安全测试
- 多租户隔离测试
- SQL注入测试
- XSS攻击测试
性能优化
- 数据库查询优化
- 缓存策略优化
- 前端打包优化
📝 使用说明
如何更新TODO
-
完成任务时
- [x] 任务描述 -
更新进度
Phase 1: █████░░░░░ 50% (7/15) -
添加备注
- [x] 任务描述 ✅ 2026-01-12完成 by张三
优先级标记
- 🔴 P0 - 必须完成
- 🟡 P1 - 重要
- 🟢 P2 - 可选
状态标记
- ⏳ 待开始
- 🚧 进行中
- ✅ 已完成
- ❌ 已取消
- ⚠️ 阻塞
📊 快速统计
# 统计完成任务数
grep -c "- \[x\]" 01-TODO清单(可追踪).md
# 统计总任务数
grep -c "- \[ \]" 01-TODO清单(可追踪).md
最后更新:2026-01-11 Phase 3.5.4完成
🚀 下一步:Phase 3.5.5 RVW模块集成 - 业务模块使用 PromptService!