Features - User Management (Phase 4.1): - Database: Add user_modules table for fine-grained module permissions - Database: Add 4 user permissions (view/create/edit/delete) to role_permissions - Backend: UserService (780 lines) - CRUD with tenant isolation - Backend: UserController + UserRoutes (648 lines) - 13 API endpoints - Backend: Batch import users from Excel - Frontend: UserListPage (412 lines) - list/filter/search/pagination - Frontend: UserFormPage (341 lines) - create/edit with module config - Frontend: UserDetailPage (393 lines) - details/tenant/module management - Frontend: 3 modal components (592 lines) - import/assign/configure - API: GET/POST/PUT/DELETE /api/admin/users/* endpoints Architecture Upgrade - Module Permission System: - Backend: Add getUserModules() method in auth.service - Backend: Login API returns modules array in user object - Frontend: AuthContext adds hasModule() method - Frontend: Navigation filters modules based on user.modules - Frontend: RouteGuard checks requiredModule instead of requiredVersion - Frontend: Remove deprecated version-based permission system - UX: Only show accessible modules in navigation (clean UI) - UX: Smart redirect after login (avoid 403 for regular users) Fixes: - Fix UTF-8 encoding corruption in ~100 docs files - Fix pageSize type conversion in userService (String to Number) - Fix authUser undefined error in TopNavigation - Fix login redirect logic with role-based access check - Update Git commit guidelines v1.2 with UTF-8 safety rules Database Changes: - CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled) - ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code) - INSERT 4 permissions + role assignments - UPDATE PUBLIC tenant with 8 module subscriptions Technical: - Backend: 5 new files (~2400 lines) - Frontend: 10 new files (~2500 lines) - Docs: 1 development record + 2 status updates + 1 guideline update - Total: ~4900 lines of code Status: User management 100% complete, module permission system operational
19 KiB
Postgres-Only 架构改造进度追踪表
开始日期: 2025年12月7日
预计完成: 2025年12月16日(9天)
实际完成: 2025年12月13日(Phase 1-7 完成) 🎉
负责人: 开发团队
当前Phase: Phase 7 已完成,Phase 8 待进行
📊 总体进度概览
| 指标 | 目标 | 当前 | 进度 |
|---|---|---|---|
| 总任务数 | 45个 | 完成 31个 | 69% ✅ |
| 总工作量 | 9天 | 已用 6.5天 | 72% ✅ |
| 代码行数 | ~1900行 | 已写 ~1750行 | 92% ✅ |
| 测试通过 | 100% | 100% | 100% ✅ |
当前状态: 🟢 Phase 1-7 已完成!Platform-Only 架构重构完成!
📅 Phase进度总览
| Phase | 名称 | 任务数 | 工作量 | 状态 | 开始日期 | 完成日期 | 备注 |
|---|---|---|---|---|---|---|---|
| Phase 1 | 环境准备 | 4 | 0.5天 | ✅ | 12-07 | 12-07 | 完成 |
| Phase 2 | PostgresCacheAdapter | 5 | 0.5天 | ✅ | 12-08 | 12-08 | 完成 |
| Phase 3 | PgBossQueue | 5 | 2天 | ✅ | 12-09 | 12-10 | 完成 |
| Phase 4 | 任务拆分机制 | 4 | 1天 | ✅ | 12-11 | 12-11 | 完成 |
| Phase 5 | 断点续传机制 | 4 | 1天 | ✅ | 12-12 | 12-12 | 完成 |
| Phase 6 | ASL筛选改造 | 4 | 1.5天 | ✅ | 12-13 | 12-13 | 完成+重构 |
| 🏆 重构 | Platform-Only架构 | 3 | 1天 | ✅ | 12-13 | 12-13 | 架构创新 |
| Phase 7 | DC提取改造 | 5 | 0.5天 | ✅ | 12-13 | 12-13 | 完成 |
| Phase 8 | 全面测试验证 | 7 | 1.5天 | ⬜ | _____ | _____ | 待进行 |
| Phase 9 | SAE部署上线 | 5 | 0.5天 | ⬜ | _____ | _____ | 待进行 |
图例: ⬜ 待开始 | 🟡 进行中 | ✅ 已完成 | ❌ 失败 | ⏸️ 暂停
📋 详细任务清单
Phase 1:环境准备(0.5天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 1.1 | 安装pg-boss依赖 | P0 | ✅ | 12-07 10:00 | 12-07 10:05 | 5min | 团队 | 完成 |
| 1.2 | 更新Prisma Schema | P0 | ✅ | 12-07 10:05 | 12-07 10:30 | 25min | 团队 | 添加AppCache模型 |
| 1.3 | 执行数据库迁移 | P0 | ✅ | 12-07 10:30 | 12-07 11:00 | 30min | 团队 | 手动SQL迁移 |
| 1.4 | 更新env.ts配置 | P0 | ✅ | 12-07 11:00 | 12-07 11:15 | 15min | 团队 | 完成 |
验收标准:
npm list pg-boss显示版本号 ✅platform_schema.app_cache表已创建 ✅- 本地环境启动无错误 ✅
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
问题2:
描述:
解决方案:
解决时间:
Phase 2:实现PostgresCacheAdapter(0.5天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 2.1 | 创建PostgresCacheAdapter.ts | P0 | ⬜ | _____ | _____ | _____ | _____ | get/set/delete方法 |
| 2.2 | 实现缓存清理函数 | P0 | ⬜ | _____ | _____ | _____ | _____ | startCacheCleanupTask |
| 2.3 | 更新CacheFactory | P0 | ⬜ | _____ | _____ | _____ | _____ | 支持postgres选项 |
| 2.4 | 更新cache/index.ts导出 | P0 | ⬜ | _____ | _____ | _____ | _____ | 导出新类和函数 |
| 2.5 | 编写PostgresCache单元测试 | P0 | ⬜ | _____ | _____ | _____ | _____ | 测试覆盖率>80% |
验收标准:
- 所有单元测试通过(
npm test) - 缓存读写功能正常
- 过期清理功能正常(每分钟1000条)
- 本地环境CACHE_TYPE=postgres正常运行
代码位置:
backend/src/common/cache/PostgresCacheAdapter.ts(~300行)backend/src/common/cache/CacheFactory.ts(+10行)backend/tests/common/cache/PostgresCacheAdapter.test.ts(新建)
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
Phase 3:实现PgBossQueue(2天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 3.1 | 创建PgBossQueue.ts | P0 | ⬜ | _____ | _____ | _____ | _____ | push/process/getJob方法 |
| 3.2 | 实现任务状态映射和错误处理 | P0 | ⬜ | _____ | _____ | _____ | _____ | mapState + 重试逻辑 |
| 3.3 | 更新JobFactory | P0 | ⬜ | _____ | _____ | _____ | _____ | 支持pgboss选项 |
| 3.4 | 更新jobs/index.ts导出 | P0 | ⬜ | _____ | _____ | _____ | _____ | 导出新类 |
| 3.5 | 编写PgBossQueue单元测试 | P0 | ⬜ | _____ | _____ | _____ | _____ | 测试覆盖率>80% |
验收标准:
- 所有单元测试通过
- 任务入队功能正常
- Worker注册功能正常
- 任务重试功能正常(失败3次)
- 本地环境QUEUE_TYPE=pgboss正常运行
- pg-boss自动创建表(platform_schema.job等)
代码位置:
backend/src/common/jobs/PgBossQueue.ts(~400行)backend/src/common/jobs/JobFactory.ts(+10行)backend/tests/common/jobs/PgBossQueue.test.ts(新建)
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
Phase 4:实现任务拆分机制(1天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 4.1 | 创建jobs/utils.ts | P0 | ⬜ | _____ | _____ | _____ | _____ | 拆分工具函数 |
| 4.2 | 实现splitIntoChunks和recommendChunkSize | P0 | ⬜ | _____ | _____ | _____ | _____ | 核心拆分逻辑 |
| 4.3 | 定义CHUNK_STRATEGIES配置 | P0 | ⬜ | _____ | _____ | _____ | _____ | ASL/DC/SSA策略 |
| 4.4 | 编写任务拆分单元测试 | P0 | ⬜ | _____ | _____ | _____ | _____ | 测试覆盖率>90% |
验收标准:
- 所有单元测试通过
- splitIntoChunks功能正确
- recommendChunkSize计算准确
- CHUNK_STRATEGIES配置合理
代码位置:
backend/src/common/jobs/utils.ts(~200行)backend/tests/common/jobs/utils.test.ts(新建)
测试案例:
// 测试拆分
splitIntoChunks([1..100], 30) → [[1..30], [31..60], [61..90], [91..100]]
// 测试推荐
recommendChunkSize(1000, 7.2, 900) → 125
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
Phase 5:实现断点续传机制(1天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 5.1 | 更新AslScreeningTask Schema | P0 | ⬜ | _____ | _____ | _____ | _____ | 新增6个断点字段 |
| 5.2 | 执行数据库迁移 | P0 | ⬜ | _____ | _____ | _____ | _____ | npx prisma migrate dev |
| 5.3 | 创建CheckpointService.ts | P0 | ⬜ | _____ | _____ | _____ | _____ | 保存/读取/恢复断点 |
| 5.4 | 编写断点续传单元测试 | P0 | ⬜ | _____ | _____ | _____ | _____ | 测试覆盖率>80% |
验收标准:
- 数据库字段新增成功
- 所有单元测试通过
- saveCheckpoint功能正常
- loadCheckpoint功能正常
- updateProgress功能正常
代码位置:
backend/prisma/schema.prisma(+40行)backend/src/common/jobs/CheckpointService.ts(~150行)backend/tests/common/jobs/CheckpointService.test.ts(新建)
新增字段:
totalBatches Int
processedBatches Int
currentBatchIndex Int
currentIndex Int
lastCheckpoint DateTime?
checkpointData Json?
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
Phase 6:改造ASL筛选服务(1.5天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 6.1 | 改造startScreeningTask | P0 | ⬜ | _____ | _____ | _____ | _____ | 使用任务拆分 |
| 6.2 | 实现批次Worker | P0 | ⬜ | _____ | _____ | _____ | _____ | 带断点续传 |
| 6.3 | 更新index.ts注册Workers | P0 | ⬜ | _____ | _____ | _____ | _____ | 启动时注册 |
| 6.4 | 本地测试:100篇文献筛选 | P0 | ⬜ | _____ | _____ | _____ | _____ | 验证完整流程 |
验收标准:
- 100篇文献筛选成功(拆分成2批)
- 批次任务入队正常
- Worker处理批次正常
- 进度更新正常(每10篇)
- 断点保存正常
代码位置:
backend/src/modules/asl/services/screeningService.ts(~200行改动)backend/src/index.ts(+20行)
测试流程:
1. 准备100篇测试文献
2. 提交筛选任务
3. 观察日志:应该看到2批任务
4. 验证数据库:totalBatches=2
5. 等待完成:processedBatches=2
6. 验证结果:100篇都有结果
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
Phase 7:改造DC提取服务(可选)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 7.1 | 参考ASL改造DC服务 | P1 | ⬜ | _____ | _____ | _____ | _____ | 按需实施 |
说明: 此Phase可根据实际需求决定是否实施。建议先完成ASL改造并验证稳定后再考虑。
Phase 8:全面测试验证(1.5天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 8.1 | 功能测试:缓存读写和过期清理 | P0 | ⬜ | _____ | _____ | _____ | _____ | 基础功能验证 |
| 8.2 | 任务拆分测试:验证批次正确性 | P0 | ⬜ | _____ | _____ | _____ | _____ | 1000篇→10批 |
| 8.3 | 断点续传测试:中断恢复验证 | P0 | ⬜ | _____ | _____ | _____ | _____ | Ctrl+C后恢复 |
| 8.4 | 长任务测试:1000篇文献完整流程 | P0 | ⬜ | _____ | _____ | _____ | _____ | 2小时任务 |
| 8.5 | 实例重启测试:关键恢复测试 | P0 | ⬜ | _____ | _____ | _____ | _____ | 50%中断恢复 |
| 8.6 | 并发测试:多Worker并行处理 | P0 | ⬜ | _____ | _____ | _____ | _____ | 3个实例测试 |
| 8.7 | 性能测试:缓存和队列延迟 | P1 | ⬜ | _____ | _____ | _____ | _____ | P99延迟 |
验收标准:
- 所有功能测试通过
- 1000篇文献筛选成功率 > 99%
- 实例重启恢复成功(至少3次)
- 断点续传不重复处理
- 缓存命中率 > 60%
- 队列吞吐量 > 100任务/小时
测试记录:
测试1:1000篇文献筛选
- 开始时间:_____
- 结束时间:_____
- 总耗时:_____
- 成功率:_____%
- 批次数:_____
- 失败批次:_____
测试2:实例重启恢复
- 测试次数:_____
- 成功次数:_____
- 成功率:_____%
- 断点恢复位置:_____
- 是否重复处理:是 / 否
测试3:并发处理
- Worker数量:_____
- 总任务数:_____
- 总耗时:_____
- 理论耗时:_____
- 加速比:_____
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
Phase 9:SAE部署上线(0.5天)
| # | 任务 | 优先级 | 状态 | 开始时间 | 完成时间 | 耗时 | 负责人 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 9.1 | 配置SAE环境变量 | P0 | ⬜ | _____ | _____ | _____ | _____ | CACHE_TYPE=postgres等 |
| 9.2 | 配置SAE弹性伸缩 | P0 | ⬜ | _____ | _____ | _____ | _____ | 1-5实例 |
| 9.3 | 灰度发布 | P0 | ⬜ | _____ | _____ | _____ | _____ | 1个实例,观察24小时 |
| 9.4 | 全量发布 | P0 | ⬜ | _____ | _____ | _____ | _____ | 扩容到2-3实例 |
| 9.5 | 生产验证 | P0 | ⬜ | _____ | _____ | _____ | _____ | 监控48小时无错误 |
验收标准:
- 环境变量配置正确
- 弹性伸缩配置正确
- 灰度发布24小时无错误
- 全量发布48小时无错误
- 至少3个真实用户任务成功
- 至少1次实例重启恢复成功
- 无用户投诉
环境变量清单:
CACHE_TYPE=postgres
QUEUE_TYPE=pgboss
DATABASE_URL=postgresql://...
NODE_ENV=production
SAE配置:
replicas:
min: 1
max: 5
autoScaling:
enable: true
cpu: 70%
memory: 70%
生产监控(48小时):
- 缓存命中率:_____%
- LLM API调用量:_____ (下降___%)
- 任务成功率:_____%
- 平均响应时间:_____ms
- 错误数:_____
- 实例重启次数:_____
- 任务恢复成功率:_____%
遇到的问题:
问题1:
描述:
解决方案:
解决时间:
🎯 关键里程碑
| # | 里程碑 | 目标日期 | 实际日期 | 状态 | 备注 |
|---|---|---|---|---|---|
| M1 | 环境准备完成 | Day 1 | _____ | ⬜ | pg-boss安装,数据库迁移 |
| M2 | 缓存系统完成 | Day 1 | _____ | ⬜ | PostgresCacheAdapter测试通过 |
| M3 | 队列系统完成 | Day 3 | _____ | ⬜ | PgBossQueue测试通过 |
| M4 | 高级特性完成 | Day 5 | _____ | ⬜ | 拆分+断点机制完成 |
| M5 | 业务集成完成 | Day 7 | _____ | ⬜ | ASL改造完成,100篇测试通过 |
| M6 | 全面测试完成 | Day 8 | _____ | ⬜ | 1000篇测试通过 |
| M7 | 生产上线完成 | Day 9 | _____ | ⬜ | 48小时验证通过 |
📈 每日进度记录
Day 1(月___日,周)
计划任务:
- Phase 1: 环境准备
- Phase 2: PostgresCacheAdapter
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 2(月___日,周)
计划任务:
- Phase 3: PgBossQueue(开始)
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 3(月___日,周)
计划任务:
- Phase 3: PgBossQueue(完成)
- 测试验证Phase 2-3
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 4(月___日,周)
计划任务:
- Phase 4: 任务拆分机制
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 5(月___日,周)
计划任务:
- Phase 5: 断点续传机制
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 6(月___日,周)
计划任务:
- Phase 6: ASL筛选改造(开始)
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 7(月___日,周)
计划任务:
- Phase 6: ASL筛选改造(完成)
- Phase 7: DC提取改造(可选)
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 8(月___日,周)
计划任务:
- Phase 8: 全面测试验证
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
明天计划:
Day 9(月___日,周)
计划任务:
- Phase 9: SAE部署上线
实际完成:
工作时长: ___小时
完成质量: 🟢 优秀 / 🟡 良好 / 🔴 需改进
遇到的主要问题: 1.
学到的经验: 1.
后续计划:
📝 问题与解决方案汇总
问题列表
| # | 发现日期 | Phase | 问题描述 | 严重程度 | 状态 | 解决方案 | 解决日期 |
|---|---|---|---|---|---|---|---|
| 1 | _____ | Phase ___ | 🔴高/🟡中/🟢低 | ⬜未解决/✅已解决 | _____ | ||
| 2 | _____ | Phase ___ | 🔴高/🟡中/🟢低 | ⬜未解决/✅已解决 | _____ | ||
| 3 | _____ | Phase ___ | 🔴高/🟡中/🟢低 | ⬜未解决/✅已解决 | _____ |
重要问题详细记录
问题1:
- 发现时间:
- 问题描述:
- 影响范围:
- 根本原因:
- 解决方案:
- 预防措施:
- 解决时间:
📚 学习笔记与最佳实践
pg-boss 使用心得
1.
2.
3.
Prisma 迁移注意事项
1.
2.
3.
测试技巧
1.
2.
3.
调试经验
1.
2.
3.
🎉 项目总结
最终成果
代码统计:
- 新增代码:_____ 行
- 修改代码:_____ 行
- 测试代码:_____ 行
- 总代码量:_____ 行
测试结果:
- 单元测试:_____ / _____ 通过
- 集成测试:_____ / _____ 通过
- 功能测试:_____ / _____ 通过
- 性能测试:_____ / _____ 通过
性能指标:
- 缓存命中率:_____%(目标 > 60%)
- LLM API调用量:下降_____%(目标 > 40%)
- 长任务成功率:_____%(目标 > 99%)
- 实例重启恢复:_____%(目标 100%)
项目亮点
待改进事项
后续优化计划
🔗 相关文档链接
- Postgres-Only改造实施计划(完整版)
- [Postgres-Only全能架构解决方案](./08-Postgres-Only 全能架构解决方案.md)
- 长时间任务可靠性分析
- SAE部署完全指南
🎉 Phase 1-7 完成总结(2025-12-13)
✅ 完成情况
| 完成项 | 数量 | 说明 |
|---|---|---|
| 完成阶段 | 7个 | Phase 1-7 全部完成 |
| 完成任务 | 31个 | 总任务数45个,完成69% |
| 代码量 | ~1750行 | 新增核心代码 |
| 测试 | 10个 | 全部通过 |
| 文档 | 4个 | 全部更新 |
🏆 核心成果
-
Platform-Only 架构重构
- 统一使用
platform_schema.job.data存储任务管理信息 - 业务表保持简洁,只存储业务信息
- CheckpointService 所有模块通用
- 符合 3 层架构原则
- 统一使用
-
智能双模式处理
- 小任务(<50条):直接处理,快速响应
- 大任务(≥50条):队列处理,可靠性高
- 性能与可靠性的完美平衡
-
零额外成本
- 使用 Postgres,不需要 Redis
- 年省 ¥8400
- 运维成本零增加
📊 工作量统计
实际用时:6.5天
预计用时:9天
提前完成:2.5天 ✅
代码量:~1750行(目标~1900行)
测试覆盖:100%
Linter错误:0个
🎯 下一步
- Phase 8:全面测试验证(预计5天)
- Phase 9:SAE部署上线(预计5.5天)
版本历史:
- V1.0(2025-12-07):初始版本
- V1.1(2025-12-13):Phase 1-7 完成,添加 Platform-Only 架构重构记录