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,18 +1,18 @@
# 测试计划
> **鏂囨。鐗堟湰锛?* v1.0
> **鍒涘缓鏃ユ湡锛?* 2025-10-29
> **缁存姢鑰咃細** AI鏅鸿兘鏂囩尞寮€鍙戝洟闃?
> **文档版本:** v1.0
> **创建日期:** 2025-10-29
> **维护者:** AI智能文献开发团队
---
## 鈴?寰呭畬鍠?
## ⏳ 待完善
<EFBFBD>枃妗唴瀹瑰緟瑙勫垝瀹屽杽锛岀洰鍓嶄粎浣滀负鍗犱綅鏂囨。銆?
本文档内容待规划完善,目前仅作为占位文档。
---
**鏂囨。鐗堟湰锛?* v1.0
**文档版本:** v1.0
**最后更新:** 2025-10-29

View File

@@ -1,18 +1,18 @@
# 标题摘要初筛测试用例
> **鏂囨。鐗堟湰锛?* v1.0
> **鍒涘缓鏃ユ湡锛?* 2025-10-29
> **缁存姢鑰咃細** AI鏅鸿兘鏂囩尞寮€鍙戝洟闃?
> **文档版本:** v1.0
> **创建日期:** 2025-10-29
> **维护者:** AI智能文献开发团队
---
## 鈴?寰呭畬鍠?
## ⏳ 待完善
<EFBFBD>枃妗唴瀹瑰緟瑙勫垝瀹屽杽锛岀洰鍓嶄粎浣滀负鍗犱綅鏂囨。銆?
本文档内容待规划完善,目前仅作为占位文档。
---
**鏂囨。鐗堟湰锛?* v1.0
**文档版本:** v1.0
**最后更新:** 2025-10-29

View File

@@ -1,40 +1,40 @@
# ASL 娴嬭瘯鏁版嵁闆?
# ASL 测试数据集
> **鍒涘缓鏃ユ湡锛?* 2025-11-15
> **缁存姢浜猴細** ASL 寮€鍙戝洟闃?
> **鐢ㄩ€旓細** 鐢ㄤ簬娴嬭瘯 AI 鏅鸿兘鏂囩尞妯″潡鐨勫噯纭<E599AF>巼鍜岃川閲?
> **创建日期:** 2025-11-15
> **维护人:** ASL 开发团队
> **用途:** 用于测试 AI 智能文献模块的准确率和质量
---
## 馃搵 鏁版嵁闆嗘<E99786>瑙?
## 📋 数据集概览
<EFBFBD>洰褰曞寘鍚<EFBFBD>敤浜庢祴璇?ASL 妯″潡鍚勯」鍔熻兘鐨勬祴璇曟暟鎹<E69A9F>泦锛屽寘鎷<E5AF98>
本目录包含用于测试 ASL 模块各项功能的测试数据集,包括:
| 娴嬭瘯绫诲瀷 | 鏂囦欢澶?| 鏁版嵁閲?| 鐘舵€?|
| 测试类型 | 文件夹 | 数据量 | 状态 |
|---------|--------|--------|------|
| **鏍囬<EFBFBD>鎽樿<EFBFBD>鍒濈瓫** | `screening/` | 199 绡?| 鉁?寰呭<E5AFB0>鍏?|
| **PDF 鍏ㄦ枃鎻愬彇** | `pdf-extraction/` | 寰呰ˉ鍏?| 鈴?寰呰ˉ鍏?|
| **标题摘要初筛** | `screening/` | 199 篇 | ✅ 待导入 |
| **PDF 全文提取** | `pdf-extraction/` | 待补充 | ⏳ 待补充 |
---
## 馃搧 鏂囦欢澶圭粨鏋?
## 📁 文件夹结构
```
03-测试数据/
鈹溾攢鈹€ README.md 鈫?褰撳墠鏂囦欢
鈹?
鈹溾攢鈹€ screening/ 鈫?鏍囬<E98F8D>鎽樿<E98EBD>鍒濈瓫娴嬭瘯鏁版嵁
鈹? 鈹溾攢鈹€ literature-list-199.xlsx 鈫?199 绡囨枃鐚<EFBFBD>垪琛<EFBFBD>紙鏍囬<EFBFBD>+鎽樿<E98EBD>锛?
鈹? 鈹溾攢鈹€ picos-criteria.txt 鈫?PICOS 鏍囧噯瀹氫箟
鈹? 鈹溾攢鈹€ inclusion-criteria.txt 鈫?绾冲叆鏍囧噯
鈹? 鈹溾攢鈹€ exclusion-criteria.txt 鈫?鎺掗櫎鏍囧噯
鈹? 鈹斺攢鈹€ gold-standard.json 鈫?浜哄伐鏍囨敞鐨勬<E990A8><EFBFBD>粨鏋滐紙閲戞爣鍑嗭級
鈹?
鈹斺攢鈹€ pdf-extraction/ 鈫?PDF 鍏ㄦ枃鎻愬彇娴嬭瘯鏁版嵁
鈹溾攢鈹€ sample-01-rct.pdf 鈫?RCT 鐮旂┒鏍锋湰
鈹溾攢鈹€ sample-02-cohort.pdf 鈫?闃熷垪鐮旂┒鏍锋湰
鈹溾攢鈹€ sample-03-with-tables.pdf 鈫?鍖呭惈澶嶆潅琛ㄦ牸鐨勬牱鏈?
鈹溾攢鈹€ sample-04-chinese.pdf 鈫?涓<>枃鏂囩尞鏍锋湰
├── README.md ← 当前文件
├── screening/ ← 标题摘要初筛测试数据
│ ├── literature-list-199.xlsx 199 篇文献列表(标题+摘要)
│ ├── picos-criteria.txt PICOS 标准定义
│ ├── inclusion-criteria.txt ← 纳入标准
│ ├── exclusion-criteria.txt ← 排除标准
│ └── gold-standard.json ← 人工标注的正确结果(金标准)
└── pdf-extraction/ PDF 全文提取测试数据
├── sample-01-rct.pdf RCT 研究样本
├── sample-02-cohort.pdf ← 队列研究样本
├── sample-03-with-tables.pdf ← 包含复杂表格的样本
├── sample-04-chinese.pdf ← 中文文献样本
└── README.md
```
@@ -44,18 +44,18 @@
### 1. 导入测试数据
**璇锋寜浠ヤ笅姝ラ<EFBFBD>瀵煎叆鎮ㄧ殑娴嬭瘯鏁版嵁锛?*
**请按以下步骤导入您的测试数据:**
#### 锛?锛夋爣棰樻憳瑕佸垵绛涙祴璇曟暟鎹?
#### 1标题摘要初筛测试数据
**鏂囦欢娓呭崟锛?*
- `literature-list-199.xlsx`锛?99 绡囪嫳鏂囨枃鐚<EFBFBD>垪琛?
- `picos-criteria.txt`锛歅ICOS 鏍囧噯锛圥opulation, Intervention, Comparison, Outcome, Study Design锛?
**文件清单:**
- `literature-list-199.xlsx`199 篇英文文献列表
- `picos-criteria.txt`PICOS 标准Population, Intervention, Comparison, Outcome, Study Design
- `gold-standard.json`:人工标注的正确结果
**Excel 鏂囦欢鏍煎紡瑕佹眰锛?*
**Excel 文件格式要求:**
```
鍒楀悕锛堝繀椤伙級锛?
列名(必须):
- Title标题
- Abstract摘要
- DOI可选
@@ -63,33 +63,33 @@
- Year年份可选
- Journal期刊可选
绀轰緥锛?
示例:
| Title | Abstract | DOI | Authors | Year | Journal |
|--------------------------------|---------------------------|---------------|--------------|------|---------|
| Effect of aspirin on ... | Background: ... | 10.1038/... | Smith J, ... | 2020 | NEJM |
```
**PICOS 鏍囧噯鏍煎紡锛?*
**PICOS 标准格式:**
```txt
# PICOS 标准
## Population人群
- 鎴愬勾楂樿<EFBFBD>鍘嬫偅鑰咃紙骞撮緞 鈮?18 宀侊級
- 成年高血压患者(年龄 ≥ 18 岁)
- 无心血管疾病史
## Intervention干预
- 每日服用阿司匹林 100mg
## Comparison对照
- 瀹夋叞鍓傛垨鏃犳不鐤?
- 安慰剂或无治疗
## Outcome锛堢粨灞€锛?
## Outcome(结局)
- 主要结局:心血管事件发生率
- 次要结局:全因死亡率
## Study Design研究设计
- 闅忔満瀵圭収璇曢獙锛圧CT锛?
- 闃熷垪鐮旂┒锛圕ohort Study锛?
- 随机对照试验RCT
- 队列研究Cohort Study
```
**金标准格式JSON**
@@ -107,33 +107,33 @@
"doi": "10.1038/nature12373",
"title": "...",
"decision": "include",
"reason": "绗﹀悎 PICO 鏍囧噯锛氫汉缇や负鎴愬勾楂樿<EFBFBD>鍘嬫偅鑰咃紝骞查<EFBFBD>涓洪樋鍙稿尮鏋?..",
"reason": "符合 PICO 标准:人群为成年高血压患者,干预为阿司匹林...",
"confidence": 1.0
},
{
"id": 2,
"decision": "exclude",
"reason": "涓嶇<EFBFBD>鍚堢撼鍏ユ爣鍑嗭細浜虹兢涓哄効绔ユ偅鑰?,
"reason": "不符合纳入标准:人群为儿童患者",
"confidence": 0.95
}
]
}
```
#### 锛?锛塒DF 鍏ㄦ枃鎻愬彇娴嬭瘯鏁版嵁
#### 2PDF 全文提取测试数据
**建议准备的样本类型:**
- RCT 研究(随机对照试验)
- 闃熷垪鐮旂┒锛圕ohort Study锛?
- 鍖呭惈澶嶆潅琛ㄦ牸鐨勬枃鐚?
- 鍖呭惈鏁板<EFBFBD><EFBFBD>紡鐨勬枃鐚?
- 队列研究Cohort Study
- 包含复杂表格的文献
- 包含数学公式的文献
- 中文医学文献(测试语言检测)
**鏍锋湰鏁伴噺寤鸿<EFBFBD>锛?* 5-10 绡?
**样本数量建议:** 5-10
### 2. 运行测试
#### 锛?锛夋爣棰樻憳瑕佸垵绛涙祴璇?
#### 1标题摘要初筛测试
```bash
# 进入后端目录
@@ -147,22 +147,22 @@ npm run test:asl:screening
npm run dev
# 2. 通过前端上传 literature-list-199.xlsx
# 3. 閰嶇疆 PICOS 鏍囧噯锛堝<EFBFBD>鍒?picos-criteria.txt 鍐呭<EFBFBD>锛?
# 4. 杩愯<EFBFBD>鎵归噺绛涢€?
# 3. 配置 PICOS 标准(复制 picos-criteria.txt 内容)
# 4. 运行批量筛选
# 5. 导出结果,与 gold-standard.json 对比
```
#### 锛?锛夎瘎浼板噯纭<E599AF>
#### 2评估准确率
```bash
# <EFBFBD>姩璇勪及鍑嗙鐜囷紙涓庨噾鏍囧噯瀵规瘮锛?
# 自动评估准确率(与金标准对比)
npm run test:asl:evaluate -- \
--result ./screening-result.json \
--gold-standard ./gold-standard.json
# 杈撳嚭绀轰緥锛?
# 鉁?鍑嗙‘鐜? 92.5%
# 鉁?涓€鑷寸巼: 88.9%
# 输出示例:
# ✅ 准确率: 92.5%
# ✅ 一致率: 88.9%
# ⚠️ 假阳性率: 5.2%
# ⚠️ 假阴性率: 2.3%
```
@@ -171,43 +171,43 @@ npm run test:asl:evaluate -- \
| 指标 | MVP 目标 | V1.0 目标 | V2.0 目标 |
|------|---------|----------|----------|
| **鍑嗙‘鐜?* | 鈮?85% | 鈮?90% | 鈮?95% |
| **涓€鑷寸巼**锛堝弻妯″瀷锛?| 鈮?80% | 鈮?85% | 鈮?90% |
| **鍋囬槼鎬х巼** | 鈮?10% | 鈮?5% | 鈮?3% |
| **鍋囬槾鎬х巼** | 鈮?5% | 鈮?3% | 鈮?2% |
| **准确率** | 85% | 90% | 95% |
| **一致率**(双模型) | ≥ 80% | 85% | 90% |
| **假阳性率** | 10% | 5% | 3% |
| **假阴性率** | 5% | 3% | 2% |
---
## 📊 测试数据统计
### 鏍囬<EFBFBD>鎽樿<EFBFBD>鍒濈瓫鏁版嵁闆?
### 标题摘要初筛数据集
**鍩烘湰淇℃伅锛?*
- **鎬绘暟閲?*: 199 绡?
**基本信息:**
- **总数量**: 199
- **数据来源**: [请填写数据来源]
- **领域**: 医学/临床研究
- **语言**: 英文
- **年份范围**: [请填写]
**棰勬湡鍒嗗竷锛?*
**预期分布:**
```
绾冲叆锛圛nclude锛? ~45 绡囷紙23%锛?
鎺掗櫎锛圗xclude锛? ~132 绡囷紙66%锛?
涓嶇‘瀹氾紙Uncertain锛? ~22 绡囷紙11%锛?
纳入Include: ~45 篇(23%
排除Exclude: ~132 篇(66%
不确定(Uncertain: ~22 篇(11%
```
**鐮旂┒绫诲瀷鍒嗗竷锛堥<EFBFBD>浼帮級锛?*
**研究类型分布(预估):**
```
RCT: ~60 绡囷紙30%锛?
闃熷垪鐮旂┒: ~50 绡囷紙25%锛?
鐥呬緥瀵圭収: ~30 绡囷紙15%锛?
<EFBFBD>柇闈㈢爺绌? ~30 绡囷紙15%锛?
鍏朵粬: ~29 绡囷紙15%锛?
RCT: ~60 篇(30%
队列研究: ~50 篇(25%
病例对照: ~30 篇(15%
横断面研究: ~30 篇(15%
其他: ~29 篇(15%
```
### PDF 鍏ㄦ枃鎻愬彇鏁版嵁闆?
### PDF 全文提取数据集
**寰呰ˉ鍏?*
**待补充**
---
@@ -215,40 +215,40 @@ RCT: ~60 篇30%
### 1. 版权声明
- <EFBFBD>祴璇曟暟鎹<EFBFBD>泦浠呯敤浜?ASL 妯″潡寮€鍙戝拰娴嬭瘯
- 涓嶅緱鐢ㄤ簬鍟嗕笟鐢ㄩ€?
- 涓嶅緱鍏<EFBFBD>紑鍒嗗彂鎴栦紶鎾?
- 璇烽伒瀹堝師鏂囩尞鐨勭増鏉冭<EFBFBD>鍙?
- 本测试数据集仅用于 ASL 模块开发和测试
- 不得用于商业用途
- 不得公开分发或传播
- 请遵守原文献的版权许可
### 2. 数据隐私
- <EFBFBD>繚娴嬭瘯鏁版嵁涓嶅寘鍚<EFBFBD>晱鎰熶俊鎭?
- 濡傚寘鍚<EFBFBD>偅鑰呮暟鎹<EFBFBD>紝蹇呴』宸茶劚鏁忓<EFBFBD>鐞?
- 閬靛畧 GDPR銆丠IPAA 绛夋暟鎹<EFBFBD>繚鎶ゆ硶瑙?
- 确保测试数据不包含敏感信息
- 如包含患者数据,必须已脱敏处理
- 遵守 GDPR、HIPAA 等数据保护法规
### 3. 质量要求
- **金标准必须由医学专家标注**
- 标注人需具备相关领域专业知识
- 鏍囨敞杩囩▼闇€鏈夎川閲忔帶鍒舵満鍒?
- 寤鸿<EFBFBD>鍙屼汉鐙<EFBFBD>珛鏍囨敞锛屽啿绐侀渶绗<EFBFBD>笁鏂逛徊瑁?
- 标注过程需有质量控制机制
- 建议双人独立标注,冲突需第三方仲裁
---
## 🔄 数据更新记录
| 鏃ユ湡 | 鏇存柊鍐呭<E98D90> | 鏇存柊浜?|
| 日期 | 更新内容 | 更新人 |
|------|---------|--------|
| 2025-11-15 | 创建测试数据目录结构 | ASL 团队 |
| 寰呮洿鏂?| 瀵煎叆 199 绡囨枃鐚<E69E83>祴璇曟暟鎹?| - |
| 寰呮洿鏂?| 娣诲姞 PDF 鏍锋湰鏁版嵁 | - |
| 待更新 | 导入 199 篇文献测试数据 | - |
| 待更新 | 添加 PDF 样本数据 | - |
---
## 📞 联系方式
濡傛湁闂<EFBFBD><EFBFBD>锛岃<EFBFBD>鑱旂郴锛?
- **椤圭洰璐熻矗浜?*: [濮撳悕]
如有问题,请联系:
- **项目负责人**: [姓名]
- **邮箱**: [邮箱]
- **文档维护**: [文档路径]
@@ -258,15 +258,15 @@ RCT: ~60 篇30%
- [标题摘要初筛测试用例](../02-标题摘要初筛测试用例.md)
- [测试计划](../01-测试计划.md)
- [鏂囩尞澶勭悊鎶€鏈<EFBFBD>€夊瀷](../../02-鎶€鏈<E282AC><E98F88>璁?07-鏂囩尞澶勭悊鎶€鏈<E282AC>€夊瀷.md)
- [璐ㄩ噺淇濋殰涓庡彲杩芥函绛栫暐](../../02-鎶€鏈<E282AC><E98F88>璁?06-璐ㄩ噺淇濋殰涓庡彲杩芥函绛栫暐.md)
- [文献处理技术选型](../../02-技术设计/07-文献处理技术选型.md)
- [质量保障与可追溯策略](../../02-技术设计/06-质量保障与可追溯策略.md)
---
**下一步行动:**
1. 鉁?鍒涘缓娴嬭瘯鏁版嵁鐩<E5B581>綍缁撴瀯
2. 鈴?瀵煎叆鎮ㄧ殑 199 绡囨枃鐚<E69E83>祴璇曟暟鎹<E69A9F>`literature-list-199.xlsx`锛?
3. 鈴?鍒涘缓 PICOS 鏍囧噯鏂囦欢锛坄picos-criteria.txt`锛?
4. 鈴?鍑嗗<E98D91>閲戞爣鍑嗘爣娉<E788A3>`gold-standard.json`锛?
5. 鈴?琛ュ厖 PDF 鏍锋湰鏁版嵁
1. ✅ 创建测试数据目录结构
2. ⏳ 导入您的 199 篇文献测试数据(`literature-list-199.xlsx`
3. ⏳ 创建 PICOS 标准文件(`picos-criteria.txt`
4. ⏳ 准备金标准标注(`gold-standard.json`
5. ⏳ 补充 PDF 样本数据