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,75 +1,75 @@
# ASL<EFBFBD> Week 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>鞉𥁒<EFBFBD>?
# ASL模块 Week 1 开发完成报告
**日期**: 2025-11-18
**<EFBFBD><EFBFBD>穃𪂹<EFBFBD>?*: Week 1 (Day 1-5)
**<EFBFBD><EFBFBD>?*: <20>?<3F><EFBFBD>摰峕<E691B0>
**开发周期**: Week 1 (Day 1-5)
**状态**: ✅ 全部完成
---
## 📋 任务完成情况
| 隞餃𦛚 | 霈<E99C88> | 摰鮋<E691B0> | <20><EFBFBD>?| 霂湔<E99C82> |
| 任务 | 计划 | 实际 | 状态 | 说明 |
|------|------|------|------|------|
| Prisma Schema霈曇恣 | Day 1 | Day 1 | <EFBFBD>?| 4銝芣芋<EFBFBD><EFBFBD>174銵䔶誨<EFBFBD>?|
| <EFBFBD>唳旿摨栞<EFBFBD>蝘?| Day 1 | Day 1 | <EFBFBD>?| 4撘㰘”<EFBFBD>𥕦遣<EFBFBD>𣂼<EFBFBD> |
| <EFBFBD>𡒊垢<EFBFBD><EFBFBD>蝏𤘪<EFBFBD> | Day 2 | Day 1 | <EFBFBD>?| 5銝芸<EFBFBD><EFBFBD><EFBFBD>嚗?銝芣<E98A9D>隞?|
| 頝舐眏瘜典<EFBFBD> | Day 3 | Day 1 | <EFBFBD>?| 10銝服PI蝡舐<EFBFBD> |
| <EFBFBD><EFBFBD>API摰䂿緵 | Day 4-5 | Day 1 | <EFBFBD>?| 憿寧𤌍+<2B><>讃蝞∠<E89D9E> |
| API瘚贝<EFBFBD> | - | Day 1 | <EFBFBD>?| 7銝芣<EFBFBD>霂訫<EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
| Prisma Schema设计 | Day 1 | Day 1 | | 4个模型174行代码 |
| 数据库迁移 | Day 1 | Day 1 | | 4张表创建成功 |
| 后端目录结构 | Day 2 | Day 1 | | 5个子目录9个文件 |
| 路由注册 | Day 3 | Day 1 | | 10个API端点 |
| 基础API实现 | Day 4-5 | Day 1 | ✅ | 项目+文献管理 |
| API测试 | - | Day 1 | | 7个测试全部通过 |
**摰峕<EFBFBD>摨?*: 6/6 (100%)
**<EFBFBD>𣂼<EFBFBD>摰峕<EFBFBD>**: 4憭?
**完成度**: 6/6 (100%)
**提前完成**: 4
---
## <EFBFBD>㴓 摰䂿緵<E482BF><E7B7B5><EFBFBD><EFBFBD>?
## 🎯 实现的功能
### 1. <EFBFBD>唳旿摨栞挽霈?<3F>?
### 1. 数据库设计 ✅
#### Schema设计
```prisma
// 4銝芣瓲敹<EFBFBD><EFBFBD>?
- AslScreeningProject // 蝑偦<EFBFBD>厰★<EFBFBD>?(19摮埈挾)
// 4个核心模型
- AslScreeningProject // 筛选项目 (19字段)
- AslLiterature // 文献条目 (14字段 + OSS预留)
- AslScreeningResult // 蝑偦<EFBFBD><EFBFBD><EFBFBD>?(40摮埈挾嚗<E68CBE><E59A97><E79285>)
- AslScreeningTask // 蝑偦<EFBFBD>劐遙<EFBFBD>?(14摮埈挾)
- AslScreeningResult // 筛选结果 (40字段双模型)
- AslScreeningTask // 筛选任务 (14字段)
```
#### 数据库表
```sql
asl_schema.screening_projects -- 筛选项目表
asl_schema.literatures -- <EFBFBD><EFBFBD><EFBFBD>∠𤌍銵?
asl_schema.literatures -- 文献条目表
asl_schema.screening_results -- 筛选结果表
asl_schema.screening_tasks -- 筛选任务表
```
#### <EFBFBD><EFBFBD>?
- <EFBFBD>?Schema<EFBFBD>𠉛氖 (`asl_schema`)
- <EFBFBD>?憭㚚睸蝥行<E89DA5> (蝥扯<E89DA5><E689AF>𣳇膄)
- <EFBFBD>?蝝<E89D9D>隡睃<E99AA1> (12銝芰揣撘?
- <EFBFBD>?<3F><EFBFBD>蝥行<E89DA5> (projectId + pmid)
- <EFBFBD>?JSONB摮埈挾 (PICO<EFBFBD><EFBFBD><EFBFBD>)
- <EFBFBD>?OSS摮埈挾憸<EFBFBD><EFBFBD> (pdfUrl, pdfOssKey)
#### 特性
- Schema隔离 (`asl_schema`)
- ✅ 外键约束 (级联删除)
- ✅ 索引优化 (12个索引)
- ✅ 唯一约束 (projectId + pmid)
- JSONB字段 (PICO标准)
- OSS字段预留 (pdfUrl, pdfOssKey)
### 2. <EFBFBD>𡒊垢API <EFBFBD>?
### 2. 后端API
#### 目录结构
```
backend/src/modules/asl/
├── controllers/
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> projectController.ts (224銵?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> literatureController.ts (259銵?
│ ├── projectController.ts (224行)
│ └── literatureController.ts (259行)
├── routes/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> index.ts (47銵?
│ └── index.ts (47行)
├── services/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> llmScreeningService.ts (189銵?
│ └── llmScreeningService.ts (189行)
├── schemas/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> screening.schema.ts (108銵?
│ └── screening.schema.ts (108行)
└── types/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> index.ts (121銵?
└── index.ts (121行)
```
#### API蝡舐<EFBFBD> (10銝?
#### API端点 (10个)
```
POST /api/v1/asl/projects - 创建项目
GET /api/v1/asl/projects - 获取项目列表
@@ -82,34 +82,34 @@ GET /api/v1/asl/projects/:projectId/literatures - 获取文献列表
DELETE /api/v1/asl/literatures/:literatureId - 删除文献
```
### 3. <EFBFBD><EFBFBD><EFBFBD>滚𦛚 <20>?
### 3. 核心服务 ✅
#### LLM蝑偦<EFBFBD><EFBFBD><EFBFBD>?
#### LLM筛选服务
```typescript
class LLMScreeningService {
// <EFBFBD>閙芋<EFBFBD><EFBFBD><EFBFBD>?
// 单模型筛选
async screenWithModel()
// <EFBFBD>峕芋<EFBFBD>见僎銵𣬚<EFBFBD><EFBFBD>?(<28><EFBFBD>)
// 双模型并行筛选 (核心)
async dualModelScreening()
// <EFBFBD><EFBFBD><EFBFBD>瘚?
// 冲突检测
private detectConflict()
// <EFBFBD><EFBFBD>蝑偦<EFBFBD>?
// 批量筛选
async batchScreening()
}
```
#### JSON Schema验证
```typescript
// AJV撉諹<EFBFBD><EFBFBD>?
// AJV验证器
- PicoJudgment Schema
- PicoEvidence Schema
- LLMScreeningOutput Schema
```
#### Prompt<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
#### Prompt生成器
```typescript
// 生成PICO标准筛选Prompt
generateScreeningPrompt(
@@ -124,53 +124,53 @@ generateScreeningPrompt(
### API测试 (7/7通过)
```bash
<EFBFBD>?1. <EFBFBD>亙熒璉<EFBFBD><EFBFBD>? GET /health
<EFBFBD>?2. <EFBFBD>𥕦遣蝑偦<EFBFBD>厰★<EFBFBD>? POST /api/v1/asl/projects
<EFBFBD>?3. <EFBFBD><EFBFBD>憿寧𤌍<EFBFBD>𡑒” GET /api/v1/asl/projects
<EFBFBD>?4. <EFBFBD><EFBFBD>憿寧𤌍霂行<EFBFBD> GET /api/v1/asl/projects/:id
<EFBFBD>?5. 撖澆<EFBFBD><EFBFBD><EFBFBD> POST /api/v1/asl/literatures/import
<EFBFBD>?6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡑒” GET /api/v1/asl/projects/:id/literatures
<EFBFBD>?7. <EFBFBD>湔鰵憿寧𤌍 PUT /api/v1/asl/projects/:id
1. 健康检查 GET /health
2. 创建筛选项目 POST /api/v1/asl/projects
3. 获取项目列表 GET /api/v1/asl/projects
4. 获取项目详情 GET /api/v1/asl/projects/:id
5. 导入文献 POST /api/v1/asl/literatures/import
6. 获取文献列表 GET /api/v1/asl/projects/:id/literatures
7. 更新项目 PUT /api/v1/asl/projects/:id
```
### 测试数据
- **用户**: asl-test-user-001
- **憿寧𤌍**: 1銝?(SGLT2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頂蝏毺遞餈?
- **<EFBFBD><EFBFBD>**: 3蝭?(<28><>鉄PMID<49><44>OI<4F><49><EFBFBD><EFBFBD><EFBFBD>靽⊥<E99DBD>)
- **项目**: 1(SGLT2抑制剂系统综述)
- **文献**: 3篇 (包含PMID、DOI、期刊等信息)
### <EFBFBD>唳旿摨㯄<EFBFBD>霂?
- <EFBFBD>?銵典<E98AB5>撱箸<E692B1><E7AEB8>?
- <EFBFBD>?蝝<E89D9D><EFBCB7>𥕦遣<F0A595A6>𣂼<EFBFBD>
- <EFBFBD>?憭㚚睸蝥行<E89DA5><EFBFBD>
- <EFBFBD>?<3F>唳旿<E594B3><EFBFBD><EFBFBD>
- <EFBFBD>?<3F><EFBFBD><E594BE>亥砭甇<E7A0AD>
### 数据库验证
- ✅ 表创建成功
- ✅ 索引创建成功
- ✅ 外键约束正常
- ✅ 数据插入正常
- ✅ 关联查询正常
---
## 📦 技术栈
### 后端框架
- <EFBFBD>?Fastify (Web<EFBFBD>)
- <EFBFBD>?Prisma (ORM)
- <EFBFBD>?TypeScript (蝐餃<EFBFBD>蝟餌<EFBFBD>)
- Fastify (Web框架)
- Prisma (ORM)
- TypeScript (类型系统)
### 靘肽<EFBFBD><EFBFBD>?(<28><EFBFBD>)
- <EFBFBD>?`xlsx` - Excel<EFBFBD><EFBFBD>辣閫<EFBFBD><EFBFBD>
- <EFBFBD>?`ajv` - JSON Schema撉諹<EFBFBD>
### 依赖包 (新增)
- `xlsx` - Excel文件解析
- `ajv` - JSON Schema验证
### 平台服务集成
- <EFBFBD>?Logger (蝏𤘪<EFBFBD><EFBFBD>𡝗𠯫敹?
- <EFBFBD>?Database Connection Pool
- <EFBFBD>?LLMFactory (<EFBFBD>峕芋<EFBFBD>𧢲𣈲<EFBFBD>?
- <EFBFBD>?StorageFactory (OSS<EFBFBD><EFBFBD>)
- Logger (结构化日志)
- Database Connection Pool
- LLMFactory (双模型支持)
- StorageFactory (OSS预留)
---
## 📊 代码统计
| 蝐餃<EFBFBD> | <20><><EFBFBD>?| 隞<><E99A9E>銵峕㺭 |
| 类别 | 文件数 | 代码行数 |
|------|--------|----------|
| <EFBFBD><EFBFBD><EFBFBD>?| 2 | 483 |
| 控制器 | 2 | 483 |
| 服务 | 1 | 189 |
| 路由 | 1 | 47 |
| 类型定义 | 1 | 121 |
@@ -184,24 +184,24 @@ generateScreeningPrompt(
### 1. Schema隔离架构
```
platform_schema.users <EFBFBD>? asl_schema.screening_projects
<EFBFBD>?
platform_schema.users asl_schema.screening_projects
asl_schema.literatures
<EFBFBD>?
asl_schema.screening_results
```
### 2. <EFBFBD>峕芋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### 2. 双模型验证策略
```
Literature <EFBFBD>?DeepSeek + Qwen (撟嗉<EFBFBD>)
<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD>瘚?
<EFBFBD>?
<EFBFBD><EFBFBD>蝒?<3F>?<3F>芸𢆡<E88AB8><EFBFBD>
<EFBFBD><EFBFBD>蝒?<3F>?鈭箏極摰⊥瓲
Literature DeepSeek + Qwen (并行)
冲突检测
无冲突 → 自动决策
有冲突 → 人工审核
```
### 3. 鈭穃<EFBFBD><EFBFBD>蠘挽霈?
### 3. 云原生设计
```
- 无状态API
- 平台服务集成
@@ -211,49 +211,49 @@ Literature
---
## <EFBFBD><EFBFBD><><E996AB><EFBFBD><EFBFBD>䔮憸?
## 🐛 解决的问题
### 1. Prisma导入错误
**问题**: `getPrisma is not exported`
**<EFBFBD><EFBFBD>**: 靽格㺿銝?`import { prisma } from '...'`
**解决**: 修改为 `import { prisma } from '...'`
### 2. 靘肽<EFBFBD><EFBFBD><EFBFBD>撩憭?
### 2. 依赖包缺失
**问题**: `Cannot find package 'xlsx'`
**解决**: 安装 `npm install xlsx ajv`
### 3. 认证问题
**<EFBFBD><EFBFBD>**: API<EFBFBD><EFBFBD><EFBFBD>serId<EFBFBD><EFBFBD>JWT銝剝𡢿隞?
**问题**: API需要userId但无JWT中间件
**解决**: 添加测试模式默认使用测试用户ID
### 4. 数据库表重复
**<EFBFBD><EFBFBD>**: `prisma db push`<EFBFBD>瘚见<EFBFBD>public schema<EFBFBD><EFBFBD>銵?
**<EFBFBD><EFBFBD>**: <EFBFBD>𥕦遣<EFBFBD>见𢆡SQL<EFBFBD>𡁏𧋦嚗<EFBFBD><EFBFBD>𥕦遣ASL銵?
**问题**: `prisma db push`检测到public schema重复表
**解决**: 创建手动SQL脚本只创建ASL
---
## 📝 文档产出
1. <EFBFBD>?`backend/ASL-API-瘚贝<EFBFBD><EFBFBD><EFBFBD>.md`
2. <EFBFBD>?`docs/03-銝𡁜𦛚璅<EFBFBD>/ASL-AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃/05-撘<><E69298>𤏸扇敶?2025-11-18-Week1摰峕<EFBFBD><EFBFBD><EFBFBD>.md`
3. <EFBFBD>?`scripts/test-asl-api.ts` (API瘚贝<EFBFBD><EFBFBD>𡁏𧋦)
4. <EFBFBD>?`scripts/create-asl-tables.ts` (<EFBFBD>唳旿摨枏<EFBFBD>撱箄<EFBFBD><EFBFBD>?
5. <EFBFBD>?`scripts/create-test-user-for-asl.ts` (瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡁏𧋦)
1. `backend/ASL-API-测试报告.md`
2. `docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-18-Week1完成报告.md`
3. `scripts/test-asl-api.ts` (API测试脚本)
4. `scripts/create-asl-tables.ts` (数据库创建脚本)
5. `scripts/create-test-user-for-asl.ts` (测试用户脚本)
---
## <EFBFBD><EFBFBD> 銝衤<E98A9D>甇亥恣<E4BAA5>?(Week 2)
## 🚀 下一步计划 (Week 2)
### Day 1-2: 筛选任务控制器
- [ ] 创建 `screeningController.ts`
- [ ] 摰䂿緵 `startScreening` (<EFBFBD>臬𢆡蝑偦<EFBFBD>劐遙<EFBFBD>?
- [ ] 实现 `startScreening` (启动筛选任务)
- [ ] 实现 `getProgress` (获取进度)
- [ ] 实现 `getResults` (获取结果)
- [ ] 集成异步任务队列 (JobFactory)
### Day 3-4: LLM蝑偦<EFBFBD><EFBFBD><EFBFBD>?
- [ ] 瘚贝<EFBFBD><EFBFBD>峕芋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### Day 3-4: LLM筛选功能
- [ ] 测试双模型筛选服务
- [ ] 优化Prompt生成
- [ ] 摰䂿緵<EFBFBD><EFBFBD>蝑偦<EFBFBD>?
- [ ] 实现批量筛选
- [ ] 添加进度回调
### Day 5: 冲突审核
@@ -263,42 +263,42 @@ Literature
---
## <EFBFBD>?撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>
## ✅ 验收标准
### Week 1 目标 (全部完成)
- <EFBFBD>?Prisma Schema霈曇恣摰峕<EFBFBD>
- <EFBFBD>?4撘䭾㺭<E4ADBE><EFBFBD>銵典<E98AB5>撱?
- <EFBFBD>?<3F>𡒊垢<F0A1928A><EFBFBD>蝏𤘪<E89D8F><F0A498AA>𥕦遣
- <EFBFBD>?10銝服PI蝡舐<E89DA1>摰䂿緵
- <EFBFBD>?API瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>?撟喳蝱<E596B3>滚𦛚<E6BB9A><F0A69B9A><EFBFBD>
- Prisma Schema设计完成
- ✅ 4张数据库表创建
- ✅ 后端目录结构创建
- ✅ 10个API端点实现
- API测试全部通过
- ✅ 平台服务集成
### 质量标准
- <EFBFBD>?隞<><E99A9E>蝚血<E89D9A>TypeScript<EFBFBD><EFBFBD>
- <EFBFBD>?雿輻鍂撟喳蝱<E596B3><EFBFBD>霈暹鴌<E69AB9>滚𦛚
- <EFBFBD>?Schema<EFBFBD>𠉛氖<EFBFBD><EFBFBD>
- <EFBFBD>?鈭穃<E988AD><E7A983>蠘挽霈<E99C88><E288AA>?
- <EFBFBD>?<3F>躰秤憭<E7A7A4><E686AD><EFBFBD><E691B0>
- <EFBFBD>?<3F><EFBFBD>霈啣<E99C88>摰峕㟲
- ✅ 代码符合TypeScript规范
- ✅ 使用平台基础设施服务
- Schema隔离架构
- ✅ 云原生设计原则
- ✅ 错误处理完善
- ✅ 日志记录完整
---
## 🎉 总结
ASL<EFBFBD>Week 1<EFBFBD><EFBFBD>睲遙<EFBFBD>?*<2A><EFBFBD>摰峕<E691B0>**嚗峕<E59A97><E5B395>?憭拙<E686AD><E68B99>𣂼<EFBFBD>摰?憭拍<E686AD><EFBFBD><E69298>𤏸恣<F0A48FB8><EFBFBD>?
ASL模块Week 1开发任务**全部完成**提前4天完成原定5天的开发计划。
**核心成果**:
- <EFBFBD>?摰峕㟲<E5B395><E39FB2><EFBFBD><EFBFBD>霈曇恣<E69B87>諹”蝏𤘪<E89D8F>
- <EFBFBD>?10銝析ESTful API蝡舐<EFBFBD>
- <EFBFBD>?LLM蝑偦<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD>?100%瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD>?摰<><E691B0><EFBFBD><EFBFBD><EFBFBD><E8AAA8><EFBFBD>獢?
- ✅ 完整的数据库设计和表结构
- ✅ 10个RESTful API端点
- LLM筛选服务框架
- 100%测试通过率
- ✅ 完善的代码文档
**<EFBFBD><EFBFBD><EFBFBD>臭漁<EFBFBD>?*:
**技术亮点**:
- Schema隔离架构
- <EFBFBD>峕芋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 鈭穃<EFBFBD><EFBFBD>蠘挽霈?
- <EFBFBD><EFBFBD>𣇉<EFBFBD><EFBFBD>?
- 双模型验证策略
- 云原生设计
- 模块化结构
为后续LLM筛选功能和前端开发奠定了坚实的基础🚀