feat(admin): Add user management and upgrade to module permission system

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
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,14 +1,14 @@
# DC妯″潡鏁版嵁搴撻獙璇佹姤鍛?
# DC模块数据库验证报告
> **日期**: 2025-12-02
> **楠岃瘉浜?*: 寮€鍙戝洟闃?
> **验证人**: 开发团队
> **目的**: 验证DC模块数据库表是否已创建避免重复创建
---
## 📋 背景
鐢变簬DC妯″潡浠爜鍦?025-11-27涓㈠け鍚庨噸寤猴紝闇€瑕佺璁ゆ暟鎹<E69A9F>簱琛ㄧ殑鍒涘缓鐘舵€侊紝浠ュ厤閲嶅<E996B2>鍒涘缓鎴栬<E98EB4>鐩栫幇鏈夋暟鎹<E69A9F>€?
由于DC模块代码在2025-11-27丢失后重建需要确认数据库表的创建状态以免重复创建或覆盖现有数据。
---
@@ -21,43 +21,43 @@ backend/scripts/check-dc-tables.mjs
```
### 验证内容
1. 鉁?妫€鏌<E282AC>dc_schema`<EFBFBD>惁瀛樺湪
2. 鉁?妫€鏌?涓<>〃鏄<E38083>惁瀛樺湪
3. 鉁?妫€鏌ユ瘡涓<E798A1>〃鐨勮<E990A8>褰曟暟
4. 鉁?妫€鏌ラ<E98F8C>璁炬ā鏉挎槸鍚﹀垵濮嬪寲
1. ✅ 检查`dc_schema`是否存在
2. ✅ 检查4个表是否存在
3. ✅ 检查每个表的记录数
4. ✅ 检查预设模板是否初始化
---
## 鉁?楠岃瘉缁撴灉
## ✅ 验证结果
### 1. Schema鐘舵€?
- **dc_schema**: 鉁?瀛樺湪
### 1. Schema状态
- **dc_schema**: ✅ 存在
### 2. 琛ㄥ垱寤虹姸鎬?
### 2. 表创建状态
| 琛ㄥ悕 | 鐘舵€?| 璁板綍鏁?| 璇存槑 |
| 表名 | 状态 | 记录数 | 说明 |
|------|------|--------|------|
| **dc_health_checks** | 鉁?宸插垱寤?| 2鏉?| 鍋ュ悍妫€鏌ョ紦瀛?|
| **dc_templates** | 鉁?宸插垱寤?| **3鏉?* | **棰勮<EFBFBD>妯℃澘宸插垵濮嬪寲** |
| **dc_extraction_tasks** | 鉁?宸插垱寤?| 1鏉?| 鎻愬彇浠诲姟璁板綍 |
| **dc_extraction_items** | 鉁?宸插垱寤?| 4鏉?| 鎻愬彇鏄庣粏璁板綍 |
| **dc_health_checks** | ✅ 已创建 | 2条 | 健康检查缓存 |
| **dc_templates** | ✅ 已创建 | **3条** | **预设模板已初始化** |
| **dc_extraction_tasks** | ✅ 已创建 | 1条 | 提取任务记录 |
| **dc_extraction_items** | ✅ 已创建 | 4条 | 提取明细记录 |
### 3. 预设模板列表
鉁?3涓<33><E6B693>璁炬ā鏉垮凡瀹屾暣鍒濆<E98D92>鍖栵細
✅ 3个预设模板已完整初始化
1. **肺癌病理报告** (`lung_cancer/pathology`)
2. **绯栧翱鐥呭叆闄㈣<EFBFBD>褰?* (`diabetes/admission`)
3. **楂樿<EFBFBD>鍘嬮棬璇婄梾鍘?* (`hypertension/outpatient`)
2. **糖尿病入院记录** (`diabetes/admission`)
3. **高血压门诊病历** (`hypertension/outpatient`)
### 4. 测试数据
鏁版嵁搴撲腑瀛樺湪娴嬭瘯鏁版嵁锛?
- 1<EFBFBD>彁鍙栦换鍔?
- 4鏉℃彁鍙栨槑缁?
- 2鏉″仴搴锋<EFBFBD>鏌ヨ<EFBFBD>褰?
数据库中存在测试数据:
- 1个提取任务
- 4条提取明细
- 2条健康检查记录
**璇存槑**锛氳繖浜涙祴璇曟暟鎹<E69A9F>瘉鏄庡悗绔<E68297>唬鐮佸湪浠爜涓㈠け鍓嶅凡缁忔垚鍔熻繍琛岃繃銆?
**说明**:这些测试数据证明后端代码在代码丢失前已经成功运行过。
---
@@ -67,32 +67,32 @@ backend/scripts/check-dc-tables.mjs
$ node scripts/check-dc-tables.mjs
============================================================
[DC妯″潡] 鏁版嵁搴撹〃妫€鏌?
[DC模块] 数据库表检查
============================================================
鉁?Prisma杩炴帴鍒濆<EFBFBD>鍖栨垚鍔?
Prisma连接初始化成功
馃搵 妫€鏌?: dc_schema<EFBFBD>惁瀛樺湪锛?
鉁?dc_schema 瀛樺湪
📋 检查1: dc_schema是否存在?
dc_schema 存在
馃搵 妫€鏌?: DC妯″潡鐨?涓<>〃鏄<E38083>惁瀛樺湪锛?
📋 检查2: DC模块的4个表是否存在
鉁?鍋ュ悍妫€鏌ヨ〃 (dc_health_checks)
璁板綍鏁? 2 鏉?
鉁?棰勮<E6A3B0>妯℃澘琛?(dc_templates)
璁板綍鏁? 3 鏉?
鉁?鎻愬彇浠诲姟琛?(dc_extraction_tasks)
璁板綍鏁? 1 鏉?
鉁?鎻愬彇鏄庣粏琛?(dc_extraction_items)
璁板綍鏁? 4 鏉?
✅ 健康检查表 (dc_health_checks)
记录数: 2
✅ 预设模板表 (dc_templates)
记录数: 3
✅ 提取任务表 (dc_extraction_tasks)
记录数: 1
✅ 提取明细表 (dc_extraction_items)
记录数: 4
馃搵 妫€鏌?: dc_templates棰勮<EFBFBD>妯℃澘鏄<EFBFBD>惁瀛樺湪锛?
鉁?dc_templates宸叉湁 3 <EFBFBD><EFBFBD>璁炬ā鏉?
📋 检查3: dc_templates预设模板是否存在?
dc_templates已有 3 个预设模板
棰勮<EFBFBD>妯℃澘鍒楄〃锛?
预设模板列表:
1. 肺癌病理报告 (lung_cancer/pathology)
2. 绯栧翱鐥呭叆闄㈣<EFBFBD>褰?(diabetes/admission)
3. 楂樿<EFBFBD>鍘嬮棬璇婄梾鍘?(hypertension/outpatient)
2. 糖尿病入院记录 (diabetes/admission)
3. 高血压门诊病历 (hypertension/outpatient)
============================================================
[总结]
@@ -100,17 +100,17 @@ $ node scripts/check-dc-tables.mjs
🎉 恭喜DC模块数据库表已全部创建
鉁?dc_schema: 瀛樺湪
鉁?4涓<34>暟鎹<E69A9F>〃: 鍏ㄩ儴瀛樺湪
dc_schema: 存在
✅ 4个数据表: 全部存在
馃搳 鏁版嵁缁熻<E7BC81>锛?
- dc_health_checks: 2 鏉?
- dc_templates: 3 鏉?
- dc_extraction_tasks: 1 鏉?
- dc_extraction_items: 4 鏉?
📊 数据统计:
- dc_health_checks: 2
- dc_templates: 3
- dc_extraction_tasks: 1
- dc_extraction_items: 4
📌 下一步:
鉁?鍙<>互寮€濮嬪墠绔<E5A2A0>紑鍙戜簡锛?
✅ 可以开始前端开发了!
```
---
@@ -118,57 +118,57 @@ $ node scripts/check-dc-tables.mjs
## 💡 重要发现
### 1. 数据库已完全准备就绪
- 鉁?Schema鍜岃〃宸插垱寤?
- 鉁?棰勮<E6A3B0>妯℃澘宸插垵濮嬪寲
- 鉁?鏈夋祴璇曟暟鎹<E69A9F>彲鐢?
- Schema和表已创建
- ✅ 预设模板已初始化
- ✅ 有测试数据可用
### 2. 后端初始化已成功执行
鏍规嵁棰勮<EFBFBD>妯℃澘鐨勫瓨鍦<EFBFBD>紝鍙<EFBFBD>互纭<EFBFBD><EFBFBD>锛?
- 鍚庣<EFBFBD>鏈嶅姟鏇剧粡鎴愬姛鍚<EFBFBD>姩杩?
- `initDCModule()`鍑芥暟宸叉墽琛?
- 妯℃澘绉嶅瓙鏁版嵁宸叉彃鍏?
根据预设模板的存在,可以确认:
- 后端服务曾经成功启动过
- `initDCModule()`函数已执行
- 模板种子数据已插入
### 3. 涓嶉渶瑕侀噸澶嶅垱寤?
- 鉁?**鏃犻渶鎵ц<E98EB5>** `npx prisma db push`
- 鉁?**鏃犻渶鎷呭績**閲嶅<E996B2>鍒涘缓鎴栬<E98EB4>鐩栨暟鎹?
- 鉁?鍙<>互鐩存帴寮€濮嬪墠绔<E5A2A0>紑鍙?
### 3. 不需要重复创建
- **无需执行** `npx prisma db push`
- ✅ **无需担心**重复创建或覆盖数据
- ✅ 可以直接开始前端开发
---
## 📝 已更新的文档
鍩轰簬楠岃瘉缁撴灉锛屽凡鏇存柊浠ヤ笅鏂囨。锛?
基于验证结果,已更新以下文档:
1. 鉁?**寮€鍙戣<E98D99>鍒掓枃妗?*
- 鏂囦欢锛歚04-寮€鍙戣<E98D99>鍒?DC妯″潡Tool-B寮€鍙戣<E98D99>鍒?md`
- 鏇存柊锛氱<EFBFBD>1.2鑺?鏁版嵁搴撶姸鎬?
1. **开发计划文档**
- 文件:`04-开发计划/DC模块Tool-B开发计划.md`
- 更新第1.2节 数据库状态
2. 鉁?**妯″潡褰撳墠鐘舵€佹枃妗?*
- 鏂囦欢锛歚00-妯″潡褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md`
- 鏇存柊锛氭暟鎹<EFBFBD>簱鐘舵€侀儴鍒嗭紝绉婚櫎"鏃犳硶纭<E7A1B6><E7BAAD>"鐨勮<E990A8>鍛?
2. **模块当前状态文档**
- 文件:`00-模块当前状态与开发指南.md`
- 更新:数据库状态部分,移除"无法确认"的警告
3. 鉁?**鏁版嵁搴撹<E690B4>璁℃枃妗?*
- 鏂囦欢锛歚02-鎶€鏈<E282AC><E98F88>璁?鏁版嵁搴撹<E690B4>璁℃枃妗?DC妯″潡锛堝畬鏁寸増锛?md`
- 鏇存柊锛氭坊鍔犻獙璇佺姸鎬佹爣璁?
3. **数据库设计文档**
- 文件:`02-技术设计/数据库设计文档-DC模块完整版.md`
- 更新:添加验证状态标记
4. 鉁?**API璁捐<EFBFBD>鏂囨。**
- 鏂囦欢锛歚02-鎶€鏈<E282AC><E98F88>璁?API璁捐<E79281>鏂囨。-DC妯″潡锛堝畬鏁寸増锛?md`
- 鏇存柊锛氭坊鍔犲悗绔<EFBFBD>畬鎴愮姸鎬?
4. **API设计文档**
- 文件:`02-技术设计/API设计文档-DC模块完整版.md`
- 更新:添加后端完成状态
---
## 🎯 结论
### 鉁?楠岃瘉缁撹<E7BC81>
**DC妯″潡鏁版嵁搴撳凡瀹屽叏鍑嗗<EFBFBD>灏辩华锛屽彲浠ュ畨鍏ㄥ湴寮€濮嬪墠绔<EFBFBD>紑鍙戯紝鏃犻渶浠讳綍棰濆<EFBFBD>鐨勬暟鎹<EFBFBD>簱鎿嶄綔銆?*
### ✅ 验证结论
**DC模块数据库已完全准备就绪,可以安全地开始前端开发,无需任何额外的数据库操作。**
### 馃搶 涓嬩竴姝ヨ<E5A79D>鍔?
### 📌 下一步行动
1. **绔嬪嵆鍙<EFBFBD>墽琛?*锛?
- 鉁?寮€濮嬪墠绔<E5A2A0>紑鍙戯紙Phase 1: Portal宸ヤ綔鍙帮級
- 鉁?娴嬭瘯鍚庣<E98D9A>API锛堝彲閫夛紝寤鸿<E5AFA4>鍏堟祴璇曪級
1. **立即可执行**
- ✅ 开始前端开发(Phase 1: Portal工作台)
- ✅ 测试后端API可选建议先测试
2. **寤鸿<EFBFBD>鎿嶄綔**锛堝彲閫夛級锛?
2. **建议操作**(可选):
```bash
# 测试后端API
cd backend
@@ -176,22 +176,22 @@ $ node scripts/check-dc-tables.mjs
# 浏览器访问:
# GET http://localhost:3001/api/v1/dc/tool-b/templates
# 搴旇繑鍥?涓<><E6B693>璁炬ā鏉?
# 应返回3个预设模板
```
3. **寮€鍙戞祦绋?*锛?
- Phase 1: Portal宸ヤ綔鍙帮紙4-6灏忔椂锛?
- Phase 2: Tool B Step 1&2锛?灏忔椂锛?
- Phase 3: Tool B Step 3锛?灏忔椂锛?
- Phase 4: Tool B Step 4锛?灏忔椂锛屾牳蹇冿級
- Phase 5: Tool B Step 5锛?灏忔椂锛?
- Phase 6: 闆嗘垚娴嬭瘯锛?灏忔椂锛?
3. **开发流程**
- Phase 1: Portal工作台4-6小时
- Phase 2: Tool B Step 1&26小时
- Phase 3: Tool B Step 33小时
- Phase 4: Tool B Step 49小时核心
- Phase 5: Tool B Step 53小时
- Phase 6: 集成测试4小时
---
## 🙏 致谢
鎰熻阿缁嗗績鐨勯獙璇佹祦绋嬶紝閬垮厤浜嗗彲鑳界殑鏁版嵁瑕嗙洊椋庨櫓锛?
感谢细心的验证流程,避免了可能的数据覆盖风险!
---
@@ -252,6 +252,5 @@ $ node scripts/check-dc-tables.mjs