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,37 +1,37 @@
# Day 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>?
# Day 2 开发完成总结 ✅
> **日期**: 2025-11-27
> **<EFBFBD><EFBFBD>煾𧫴畾?*: DC璅<E79285> - 撌亙<E6928C>B - Day 2
> **<EFBFBD><EFBFBD>?*: <20>?<3F><EFBFBD>摰峕<E691B0>
> **开发阶段**: DC模块 - 工具B - Day 2
> **状态**: ✅ 全部完成
---
## 📋 任务完成清单
### <EFBFBD>?1. Prisma Schema霈曇恣嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
### 1. Prisma Schema设计(上午)
**<EFBFBD>𥕦遣<EFBFBD><EFBFBD>”**嚗?
- <EFBFBD>?`dc_health_checks` - <EFBFBD>亙熒璉<EFBFBD><EFBFBD><EFBFBD>摮䁅”
- <EFBFBD>?`dc_extraction_tasks` - <EFBFBD>𣂼<EFBFBD>隞餃𦛚銵?
- <EFBFBD>?`dc_extraction_items` - <EFBFBD>閙辺<EFBFBD>𣂼<EFBFBD>霈啣<EFBFBD>銵?
- <EFBFBD>?`dc_templates` - <EFBFBD>挽璅⊥踎銵?
**创建的表**
- `dc_health_checks` - 健康检查缓存表
- `dc_extraction_tasks` - 提取任务表
- `dc_extraction_items` - 单条提取记录表
- `dc_templates` - 预设模板表
**<EFBFBD><EFBFBD><EFBFBD>辣**嚗?
**迁移文件**
```
prisma/migrations/20251127_add_dc_tool_b_tables/migration.sql
```
**撉諹<EFBFBD>**嚗?
**验证**
```bash
npx prisma migrate deploy # <EFBFBD>?<3F>𣂼<EFBFBD>
npx prisma generate # <EFBFBD>?<3F>𣂼<EFBFBD>
npx prisma migrate deploy # ✅ 成功
npx prisma generate # ✅ 成功
```
---
### <EFBFBD>?2. <EFBFBD>𥕦遣Service撉冽沲嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
### 2. 创建Service骨架(下午)
**<EFBFBD>𥕦遣<EFBFBD><EFBFBD><EFBFBD>隞?*嚗?
**创建的文件**
#### HealthCheckService.ts
```typescript
@@ -60,27 +60,27 @@ src/modules/dc/tool-b/services/TemplateService.ts
---
### <EFBFBD>?3. <EFBFBD>𥕦遣Controller<EFBFBD>諹楝<EFBFBD>?
### 3. 创建Controller和路由
**Controller**嚗?
**Controller**
```typescript
src/modules/dc/tool-b/controllers/ExtractionController.ts
```
**<EFBFBD><EFBFBD><EFBFBD>𡑒”**嚗?
- `healthCheck()` - <EFBFBD>亙熒璉<EFBFBD><EFBFBD>?
**方法列表**
- `healthCheck()` - 健康检查
- `getTemplates()` - 获取模板列表
- `createTask()` - 创建任务
- `getTaskProgress()` - 查询任务进度
- `getTaskItems()` - 获取验证网格数据
- `resolveItem()` - 裁决冲突
**頝舐眏<EFBFBD>滨蔭**嚗?
**路由配置**
```typescript
src/modules/dc/tool-b/routes/index.ts
```
**瘜典<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗?
**注册的端点**
- `POST /api/v1/dc/tool-b/health-check`
- `GET /api/v1/dc/tool-b/templates`
- `POST /api/v1/dc/tool-b/tasks`
@@ -88,25 +88,25 @@ src/modules/dc/tool-b/routes/index.ts
- `GET /api/v1/dc/tool-b/tasks/:taskId/items`
- `POST /api/v1/dc/tool-b/items/:itemId/resolve`
**銝餉楝<EFBFBD>望釣<EFBFBD>?*嚗?
**主路由注册**
```typescript
// src/index.ts
await fastify.register(toolBRoutes, { prefix: '/api/v1/dc/tool-b' });
logger.info('<EFBFBD>?DC<44>唳旿皜<E697BF><E79A9C>-撌亙<E6928C>B頝舐眏撌脫釣<E884AB>? /api/v1/dc/tool-b');
logger.info('✅ DC数据清洗-工具B路由已注册: /api/v1/dc/tool-b');
```
---
### <EFBFBD>?4. LLMFactory瘚贝<EFBFBD>
### 4. LLMFactory测试
**瘚贝<EFBFBD><EFBFBD>𡁏𧋦**嚗?
**测试脚本**
```
src/scripts/test-llm-factory.ts
```
**瘚贝<EFBFBD>蝏𤘪<EFBFBD>**嚗?
**测试结果**
#### <EFBFBD>?DeepSeek-V3瘚贝<EFBFBD>
#### DeepSeek-V3测试
```json
{
"status": "ok",
@@ -115,7 +115,7 @@ src/scripts/test-llm-factory.ts
Tokens: 45
```
#### <EFBFBD>?Qwen3-72B瘚贝<EFBFBD>
#### Qwen3-72B测试
```json
{
"status": "ok",
@@ -124,19 +124,19 @@ Tokens: 45
Tokens: 83
```
#### <EFBFBD>?撟嗅<E6929F><EFBFBD>鍂瘚贝<E7989A><EFBFBD><E59A97><EFBFBD><EFBFBD>嚗?
- **<EFBFBD>埈𧒄**: 3343ms (蝥?.3蝘?
- **<EFBFBD>箸艶**: <EFBFBD>峕芋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡝗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
#### ✅ 并发调用测试(关键!)
- **耗时**: 3343ms (约3.3秒)
- **场景**: 双模型同时提取患者信息
- **结果**: 两个模型都成功返回结构化JSON
**<EFBFBD>喲睸<EFBFBD>𤑳緵**嚗?
- <EFBFBD>?DeepSeek餈𥪜<EFBFBD>撟脣<EFBFBD>JSON嚗屸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>?Qwen餈𥪜<EFBFBD><EFBFBD>erbose嚗屸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD>?**撟嗅<E6929F><EFBFBD><EFBFBD><EFBFBD>隡条<E99AA1>**嚗㇄ay 6<EFBFBD><EFBFBD>orker<EFBFBD><EFBFBD>靘肽<EFBFBD>嚗?
**关键发现**
- DeepSeek返回干净JSON适合解析
- Qwen返回较verbose,需要提取
- **并发调用性能优秀**Day 6的Worker核心依赖)
---
### <EFBFBD>?5. API蝡舐<EFBFBD>撉諹<EFBFBD>
### 5. API端点验证
#### 测试1模板列表API
```bash
@@ -144,7 +144,7 @@ GET http://localhost:3001/api/v1/dc/tool-b/templates
Response: 200 OK
Body: {"templates":[]}
```
<EFBFBD>?頝舐眏甇<E79C8F>虜撌乩<E6928C>
✅ 路由正常工作
#### 测试2健康检查API
```bash
@@ -152,7 +152,7 @@ POST http://localhost:3001/api/v1/dc/tool-b/health-check
Response: 200 OK
Body: {"message":"Health check endpoint - to be implemented"}
```
<EFBFBD>?POST霂瑟<EFBFBD><EFBFBD>虜嚗龦ontroller<EFBFBD><EFBFBD><EFBFBD>
POST请求正常Controller正常响应
---
@@ -162,33 +162,33 @@ Body: {"message":"Health check endpoint - to be implemented"}
|------|------|------|
| **数据库表** | 4 | dc_health_checks, dc_extraction_tasks, dc_extraction_items, dc_templates |
| **Service文件** | 4 | HealthCheck, DualModel, Conflict, Template |
| **Controller<EFBFBD><EFBFBD>** | 1 | ExtractionController (6銝芣䲮瘜? |
| **頝舐眏<EFBFBD><EFBFBD>** | 1 | index.ts (6銝芰垢<EFBFBD>? |
| **Controller文件** | 1 | ExtractionController (6个方法) |
| **路由文件** | 1 | index.ts (6个端点) |
| **测试脚本** | 1 | test-llm-factory.ts |
| **迁移文件** | 1 | 20251127_add_dc_tool_b_tables |
**<EFBFBD>颱誨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*: 蝥?00銵?
**总代码行数**: 约400行
---
## 🎯 架构验证
### <EFBFBD>?撟喳蝱<E596B3><EFBFBD>憭滨鍂
- <EFBFBD>?`LLMFactory.getAdapter('deepseek-v3')` - <EFBFBD>𣂼<EFBFBD><EFBFBD>
- <EFBFBD>?`LLMFactory.getAdapter('qwen3-72b')` - <EFBFBD>𣂼<EFBFBD><EFBFBD>
- <EFBFBD>?`logger.info()` - <EFBFBD><EFBFBD>蝟餌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>?`prisma` - <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>交迤撣?
### ✅ 平台能力复用
- `LLMFactory.getAdapter('deepseek-v3')` - 成功调用
- `LLMFactory.getAdapter('qwen3-72b')` - 成功调用
- `logger.info()` - 日志系统集成
- `prisma` - 数据库连接正常
### <EFBFBD>?<3F>峕芋<E5B395>见僎<E8A781>烐沲<E78390>?
### ✅ 双模型并发架构
```typescript
const [responseA, responseB] = await Promise.all([
deepseek.chat(...),
qwen.chat(...)
]);
// <EFBFBD>埈𧒄: 3.3蝘?<3F>?
// 耗时: 3.3秒 ✅
```
### <EFBFBD>?頝舐眏<E88890><EFBFBD>
### ✅ 路由架构
```
/api/v1/dc/tool-b/
├── POST /health-check
@@ -203,20 +203,20 @@ const [responseA, responseB] = await Promise.all([
## 📝 Day 3 预告
<EFBFBD>𤾸予嚗㇄ay 3嚗厩<E59A97>隞餃𦛚嚗?
明天Day 3的任务
### 上午HealthCheckService实现
- [ ] Excel解析前100行
- [ ] 空值率计算
- [ ] 平均长度统计
- [ ] Token预估
- [ ] <EFBFBD>行⏛蝑𣇉裦嚗<EFBFBD><EFBFBD><EFBFBD>>80%<25><><EFBFBD><E5838F>鵭摨?10嚗?
- [ ] 拦截策略(空值率>80%、平均长度<10
### 下午TemplateService实现
- [ ] 3个预设模板初始化
- 肺癌病理报告
- 蝟硋倏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>扇敶?
- 擃䁅<EFBFBD><EFBFBD>钅秄霂羓<EFBFBD><EFBFBD>?
- 糖尿病入院记录
- 高血压门诊病历
- [ ] `getAllTemplates()` 实现
- [ ] `seedTemplates()` 脚本
- [ ] 测试模板API
@@ -225,23 +225,23 @@ const [responseA, responseB] = await Promise.all([
## 🎉 Day 2 总结
**摰峕<EFBFBD>摨?*: 100% <EFBFBD>?
**完成度**: 100%
**质量**: 优秀
**<EFBFBD>園𡢿**: <EFBFBD>㕑恣<EFBFBD><EFBFBD><EFBFBD>?
**时间**: 按计划完成
**<EFBFBD>喲睸<EFBFBD><EFBFBD>**嚗?
1. <EFBFBD>?<3F>唳旿摨廍chema摰峕㟲<E5B395>𥕦遣撟嗉<E6929F>蝘餅<E89D98><E9A485>?
2. <EFBFBD>?4銝杵ervice撉冽沲皜<EFBFBD>苊嚗諹<EFBFBD><EFBFBD><EFBFBD>蝖?
3. <EFBFBD>?Controller<EFBFBD>諹楝<EFBFBD>望沲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
4. <EFBFBD>?LLMFactory<EFBFBD>峕芋<EFBFBD>见僎<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?.3蝘𡜐<EFBFBD>
5. <EFBFBD>?API蝡舐<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD><EFBFBD><EFBFBD>
**关键成果**
1. ✅ 数据库Schema完整创建并迁移成功
2. ✅ 4个Service骨架清晰,职责明确
3. Controller和路由架构完整
4. LLMFactory双模型并发验证通过3.3秒)
5. API端点全部测试通过
**<EFBFBD><EFBFBD><EFBFBD>臭漁<EFBFBD>?*嚗?
- <EFBFBD><EFBFBD>憭滨鍂撟喳蝱LLM<EFBFBD><EFBFBD>嚗峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
**技术亮点**
- 完全复用平台LLM能力无需重复开发
- 双模型并发性能优秀为工具B高效处理奠定基础
- <EFBFBD><EFBFBD>蝏𤘪<EFBFBD><EFBFBD>苊嚗峕<EFBFBD>鈭𥟠ay 3-10蝏抒賒撘<E8B392><E69298>?
- 代码结构清晰易于Day 3-10继续开发
---
**銝衤<EFBFBD>甇?*: Day 3 - <EFBFBD>亙熒璉<EFBFBD><EFBFBD>?+ 璅⊥踎蝞∠<E89D9E> <20><>
**下一步**: Day 3 - 健康检查 + 模板管理 🚀