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:
@@ -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. Controllers(3个文件)
|
||||
```
|
||||
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. Services(4个文件)
|
||||
```
|
||||
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. Routes(2个文件)
|
||||
```
|
||||
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锛?
|
||||
鉁?鏂版棫浠g爜瀹屽叏鐙<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>緞鍏ㄩ儴姝g‘
|
||||
✅ 无新增的严重编译错误
|
||||
✅ 导入路径全部正确
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 安全措施
|
||||
|
||||
### 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!** 🚀
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user