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,68 +1,68 @@
# PKB后端代码迁移 - 阶段1完成报告
> **瀹屾垚鏃ユ湡锛?* 2026-01-06
> **鎵ц<EFBFBD>浜哄憳锛?* AI鍔╂墜
> **鐘舵€侊細** 鉁?瀹屾垚
> **完成日期:** 2026-01-06
> **执行人员:** AI助手
> **状态:** ✅ 完成
---
## 📋 执行摘要
**闃舵<EFBFBD>1锛氬悗绔<EFBFBD>唬鐮佸<EFBFBD>鍒?*宸叉垚鍔熷畬鎴愶紒鎵€鏈塒KB鐩稿叧鐨勫悗绔<E68297>唬鐮佸凡浠巂src/legacy`澶嶅埗鍒癭src/modules/pkb`锛屽苟鏇存柊浜嗗<EFBFBD>鍏ヨ矾寰勩€?
**阶段1后端代码复制**已成功完成所有PKB相关的后端代码已从`src/legacy`复制到`src/modules/pkb`,并更新了导入路径。
### 核心成果
- 鉁?鏂扮洰褰曠粨鏋勫凡鍒涘缓
- 鉁?鎵€鏈塁ontroller銆丼ervice銆丷outes鏂囦欢宸插<EFBFBD>鍒?
- 鉁?瀵煎叆璺<E58F86>緞宸叉洿鏂?
- 鉁?鏃т唬鐮佸畬鍏ㄦ湭鍔<E6B9AD>紝100%鍙<>洖婊?
- ✅ 新目录结构已创建
- ✅ 所有Controller、Service、Routes文件已复制
- ✅ 导入路径已更新
- ✅ 旧代码完全未动100%可回滚
---
## 📂 已复制的文件
### 1. Controllers锛?涓<>枃浠讹級
### 1. Controllers3个文件
```
src/modules/pkb/controllers/
鈹溾攢 knowledgeBaseController.ts (342琛? - 鐭ヨ瘑搴揅RUD
鈹溾攢 documentController.ts (315琛? - 鏂囨。涓婁紶绠$悊
鈹斺攢 batchController.ts (430琛? - 鎵瑰<EFBFBD>鐞嗕换鍔?
├─ knowledgeBaseController.ts (342行) - 知识库CRUD
├─ documentController.ts (315行) - 文档上传管理
└─ batchController.ts (430行) - 批处理任务
```
### 2. Services锛?涓<>枃浠讹級
### 2. Services4个文件
```
src/modules/pkb/services/
鈹溾攢 knowledgeBaseService.ts (365琛? - 鐭ヨ瘑搴撲笟鍔¢€昏緫
鈹溾攢 documentService.ts (361琛? - 鏂囨。澶勭悊鏈嶅姟
鈹溾攢 batchService.ts (421琛? - 鎵瑰<EFBFBD>鐞嗘湇鍔?
鈹斺攢 tokenService.ts (150琛? - Token璁$畻
├─ knowledgeBaseService.ts (365行) - 知识库业务逻辑
├─ documentService.ts (361行) - 文档处理服务
├─ batchService.ts (421行) - 批处理服务
└─ tokenService.ts (150行) - Token计算
```
### 3. Routes锛?涓<>枃浠讹級
### 3. Routes2个文件
```
src/modules/pkb/routes/
鈹溾攢 knowledgeBases.ts - 鐭ヨ瘑搴撹矾鐢?
鈹溾攢 batchRoutes.ts - 鎵瑰<EFBFBD>鐞嗚矾鐢?
鈹斺攢 index.ts - <EFBFBD>敱鍏ュ彛锛堟柊鍒涘缓锛?
├─ knowledgeBases.ts - 知识库路由
├─ batchRoutes.ts - 批处理路由
└─ index.ts - 路由入口(新创建)
```
### 4. 入口文件
```
src/modules/pkb/
鈹斺攢 index.ts - 妯″潡瀵煎嚭鍏ュ彛锛堟柊鍒涘缓锛?
└─ index.ts - 模块导出入口(新创建)
```
---
## 🔧 已修复的导入路径
### <EFBFBD>敼鍓嶏紙legacy浣嶇疆锛?
### 修改前(legacy位置)
```typescript
import { prisma } from '../../config/database.js';
import { difyClient } from '../../common/rag/DifyClient.js';
import { LLMFactory } from '../../common/llm/adapters/LLMFactory.js';
```
### <EFBFBD>敼鍚庯紙modules/pkb浣嶇疆锛?
### 修改后(modules/pkb位置)
```typescript
import { prisma } from '../../../config/database.js';
import { difyClient } from '../../../common/rag/DifyClient.js';
@@ -70,75 +70,75 @@ import { LLMFactory } from '../../../common/llm/adapters/LLMFactory.js';
```
### 关键修复
- 鉁?prisma<EFBFBD>緞锛歚../../../config/database.js`
- 鉁?difyClient<EFBFBD>緞锛歚../../../common/rag/DifyClient.js`
- 鉁?extractionClient<EFBFBD>緞锛歚../../../common/document/ExtractionClient.js`
- 鉁?LLMFactory<EFBFBD>緞锛歚../../../common/llm/adapters/LLMFactory.js`
- 鉁?templates<EFBFBD>緞锛歚../../../legacy/templates/clinicalResearch.js`
- 鉁?batchRoutes鏀逛负default export
- prisma路径:`../../../config/database.js`
- difyClient路径:`../../../common/rag/DifyClient.js`
- extractionClient路径:`../../../common/document/ExtractionClient.js`
- LLMFactory路径:`../../../common/llm/adapters/LLMFactory.js`
- templates路径:`../../../legacy/templates/clinicalResearch.js`
- batchRoutes改为default export
---
## 鉁?楠岃瘉缁撴灉
## ✅ 验证结果
### 1. 鏂囦欢瀹屾暣鎬ч獙璇?
### 1. 文件完整性验证
```bash
鉁?鎵€鏈夋枃浠跺凡鎴愬姛澶嶅埗锛?涓<>枃浠讹級
鉁?鏃ф枃浠朵粛鐒跺瓨鍦<E793A8>Test-Path杩斿洖True锛?
鉁?鏂版棫浠爜瀹屽叏鐙<E58F8F>珛锛屼簰涓嶅奖鍝?
✅ 所有文件已成功复制9个文件
✅ 旧文件仍然存在(Test-Path返回True
✅ 新旧代码完全独立,互不影响
```
### 2. 目录结构验证
```
D:\MyCursor\AIclinicalresearch\backend\src\modules\pkb
├───controllers/
鈹? 鈹溾攢 batchController.ts
鈹? 鈹溾攢 documentController.ts
鈹? 鈹斺攢 knowledgeBaseController.ts
│ ├─ batchController.ts
│ ├─ documentController.ts
│ └─ knowledgeBaseController.ts
├───routes/
鈹? 鈹溾攢 batchRoutes.ts
鈹? 鈹溾攢 knowledgeBases.ts
鈹? 鈹斺攢 index.ts
│ ├─ batchRoutes.ts
│ ├─ knowledgeBases.ts
│ └─ index.ts
├───services/
鈹? 鈹溾攢 batchService.ts
鈹? 鈹溾攢 documentService.ts
鈹? 鈹溾攢 knowledgeBaseService.ts
鈹? 鈹斺攢 tokenService.ts
│ ├─ batchService.ts
│ ├─ documentService.ts
│ ├─ knowledgeBaseService.ts
│ └─ tokenService.ts
├───types/
├───utils/
└─ index.ts
```
### 3. 缂栬瘧鐘舵€?
### 3. 编译状态
```bash
⚠️ 有少量TypeScript类型错误非致命
- 'any' type warnings锛堝凡瀛樺湪浜庢棫浠g爜锛?
- 'any' type warnings(已存在于旧代码)
- 可以在后续优化中修复
鉁?鏃犳柊澧炵殑涓ラ噸缂栬瘧閿欒<E996BF>
鉁?瀵煎叆璺<E58F86>緞鍏ㄩ儴姝
✅ 无新增的严重编译错误
✅ 导入路径全部正确
```
---
## 🔒 安全措施
### 1. 鏃т唬鐮佸畬鍏ㄤ繚鐣?
### 1. 旧代码完全保留
```bash
鉁?src/legacy/controllers/ - <EFBFBD>慨鏀?
鉁?src/legacy/services/ - <EFBFBD>慨鏀?
鉁?src/legacy/routes/ - <EFBFBD>慨鏀?
src/legacy/controllers/ - 未修改
src/legacy/services/ - 未修改
src/legacy/routes/ - 未修改
```
### 2. 鍥炴粴鏂规<EFBFBD>锛?1鍒嗛挓锛?
### 2. 回滚方案(<1分钟
```bash
# 如果新代码有问题,直接删除新目录即可
rm -rf src/modules/pkb
# 鏃т唬鐮佺户缁?00%宸ヤ綔
# 旧代码继续100%工作
```
### 3. 双轨并行
```bash
鉁?鏃ц矾鐢憋細/api/v1/knowledge/* - 缁х画宸ヤ綔
✅ 旧路由:/api/v1/knowledge/* - 继续工作
🆕 新路由:准备就绪,待下一阶段注册
```
@@ -146,68 +146,67 @@ rm -rf src/modules/pkb
## 📊 代码行数统计
| 绫诲瀷 | 鏂囦欢鏁?| 浠g爜琛屾暟 | 璇存槑 |
| 类型 | 文件数 | 代码行数 | 说明 |
|------|--------|---------|------|
| **Controllers** | 3 | ~1,087琛?| API<EFBFBD>偣澶勭悊 |
| **Services** | 4 | ~1,297琛?| 涓氬姟閫昏緫 |
| **Routes** | 2 | ~85琛?| 璺<>敱瀹氫箟 |
| **鏂板缓鏂囦欢** | 2 | ~35琛?| index.ts鍏ュ彛 |
| **鎬昏<EFBFBD>** | 11 | ~2,504琛?| 瀹屾暣PKB鍚庣<E98D9A> |
| **Controllers** | 3 | ~1,087| API端点处理 |
| **Services** | 4 | ~1,297行 | 业务逻辑 |
| **Routes** | 2 | ~85行 | 路由定义 |
| **新建文件** | 2 | ~35| index.ts入口 |
| **总计** | 11 | ~2,504行 | 完整PKB后端 |
---
## 🎯 下一步阶段2
**闃舵<EFBFBD>2鐩<EFBFBD>爣锛氬悗绔疉PI璺<EFBFBD>敱娉ㄥ唽锛堝弻璺<EFBFBD>敱鍏卞瓨锛?*
**阶段2目标后端API路由注册双路由共存**
棰勪及鏃堕棿锛?.5澶?
预估时间0.5天
### 任务清单
1. 鉁?闃舵<E99783>1瀹屾垚
2. <EFBFBD>笍 鍦ㄤ富璺<E5AF8C>敱涓<E695B1>敞鍐屾柊PKB璺<42>敱锛?api/v2/pkb锛?
3. <EFBFBD>笍 閰嶇疆鍙岃矾鐢卞叡瀛橈紙v1鍜寁2锛?
4. <EFBFBD>笍 娣诲姞鍋ュ悍妫€鏌ョ<E98F8C>鐐?
5. <EFBFBD>笍 娴嬭瘯鏂拌矾鐢卞彲璁块棶鎬?
1. ✅ 阶段1完成
2. ⏭️ 在主路由中注册新PKB路由/api/v2/pkb
3. ⏭️ 配置双路由共存v1和v2
4. ⏭️ 添加健康检查端点
5. ⏭️ 测试新路由可访问性
6. ⏭️ 确认旧路由仍正常工作
---
## 📝 经验总结
### 鉁?鍋氬緱濂界殑鍦版柟
### ✅ 做得好的地方
1. **保守策略**:只复制,不删除,确保可回滚
2. **绯荤粺鎬ф<EFBFBD>鏌?*锛氶獙璇佹棫鏂囦欢瀛樺湪
3. **娓呮櫚鏂囨。**锛氬畬鏁磋<E98F81>褰曟墍鏈変慨鏀?
2. **系统性检查**:验证旧文件存在
3. **清晰文档**:完整记录所有修改
4. **分步执行**:每个子任务独立完成
### 📚 遇到的问题及解决
1. **<EFBFBD><EFBFBD>**锛氱洰褰曡矾寰勫垱寤洪敊璇<E6958A>紙璺<E7B499>緞閲嶅<E996B2>锛?
1. **问题**:目录路径创建错误(路径重复)
**解决**:使用相对路径而非绝对路径
2. **问题**prisma导入路径不对
**瑙e喅**锛氭煡鎵炬<E98EB5><EFBFBD>殑瀵煎嚭浣嶇疆锛坈onfig/database.js锛?
**解决**查找正确的导出位置config/database.js
3. **问题**batchRoutes没有default export
**解决**修改为default export
4. **问题**index.ts重复导出
**瑙e喅**锛氱畝鍖栧<E98D96>鍑猴紝鍙<E7B49D><E98D99>鍑鸿矾鐢卞叆鍙?
**解决**:简化导出,只导出路由入口
---
## 🎉 成功标准达成
- 鉁?**鏂囦欢瀹屾暣鎬?*锛氭墍鏈夋枃浠跺凡澶嶅埗
- 鉁?**鏃т唬鐮佷繚鎶?*锛氭湭淇<E6B9AD>敼浠讳綍鏃т唬鐮?
- 鉁?**瀵煎叆姝g‘鎬?*锛氭墍鏈夊<E98F88>鍏ヨ矾寰勫凡鏇存柊
- 鉁?**缂栬瘧閫氳繃**锛氭棤鏂板<E98F82>涓ラ噸閿欒<E996BF>
- 鉁?**鍙<>洖婊氭€?*锛氬彲鍦?鍒嗛挓鍐呭洖婊?
- 鉁?**鏂囨。瀹屾暣**锛氬畬鏁磋<E98F81>褰曟墍鏈夋搷浣?
- **文件完整性**:所有文件已复制
- **旧代码保护**:未修改任何旧代码
- **导入正确性**:所有导入路径已更新
- **编译通过**:无新增严重错误
- **可回滚性**可在1分钟内回滚
- **文档完整**:完整记录所有操作
---
**闃舵<EFBFBD>1璇勪及锛氣渽 鎴愬姛瀹屾垚锛屽彲浠ヨ繘鍏ラ樁娈?锛?* 馃殌
**阶段1评估✅ 成功完成可以进入阶段2** 🚀