Files
AIclinicalresearch/docs/00-系统总体设计/00-核心问题解答.md
HaHafeng 66255368b7 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
2026-01-16 13:42:10 +08:00

711 lines
18 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 核心问题解答
> **创建日期:** 2025-11-06
> **文档目的:** 回答用户提出的关键架构问题
---
## 📋 您提出的问题
您提出了非常核心的架构问题,这些问题直接影响了整个系统的设计。让我逐一深入解答:
---
## 1⃣ 文档系统重构
### 您的建议
> 1系统总体架构、总体需求PRD、系统总体设计、系统总体部署等应该是一个独立的文件夹
> 27个模块应该是独立的7个文件夹每个模块有项目概述、设计文档、业务规则、开发计划、每日进度、部署文档
### 我的回复
**完全认同!这是非常正确的架构思路!**
我已经创建了详细的文档重构方案:
- 📄 [文档体系重构方案](./02-文档体系重构方案.md)
**新文档结构:**
```
docs/
├── 00-系统总体设计/ # ✅ 总体独立
│ ├── 01-系统架构分层设计.md
│ ├── 02-文档体系重构方案.md
│ ├── 03-总体需求文档(PRD).md
│ ├── 04-技术架构白皮书.md
│ └── 05-部署架构设计.md
├── 01-平台基础层/ # 平台层(用户权限、存储、通知等)
├── 02-通用能力层/ # 通用能力LLM网关、文档处理、RAG等
└── 03-业务模块/ # ✅ 7个模块独立
├── AIA-AI智能问答/
├── ASL-AI智能文献/
├── PKB-个人知识库/
├── DC-数据清洗整理/
├── SSA-智能统计分析/
├── ST-统计分析工具/
└── RVW-稿件审查系统/
```
**每个模块的标准结构:**
```
XXX-模块名称/
├── 00-项目概述/ # PRD、功能清单、用户故事
├── 01-设计文档/ # 技术架构、数据库、API、前端组件、UI原型
├── 02-业务规则/ # 业务规则、验证规则
├── 03-开发计划/ # 里程碑、任务分解
├── 04-测试文档/ # 测试计划、测试用例
├── 05-部署文档/ # 部署指南、配置说明
├── 06-开发进度/ # 每日/每周进度(可选)
└── README.md # 模块导航
```
**核心优势:**
- ✅ 总体与模块分离
- ✅ 层次清晰(平台层、通用能力层、业务模块层)
- ✅ 支持模块独立销售(每个模块文档可独立打包)
- ✅ 易于扩展(新增模块复制模板即可)
---
## 2⃣ 不考虑混合部署
### 您的决策
> 只考虑云端、本地化(私有化)、单机版,不考虑混合部署
### 我的回复
**完全赞同!混合部署技术难度极高,需求不明确,应该暂缓。**
**调整后的部署模式:**
| 部署模式 | 目标用户 | 技术难度 | 优先级 |
|---------|---------|---------|-------|
| **云端SaaS版** | 个人用户、小机构 | ⭐⭐⭐ 中等 | P0当前 |
| **私有化部署** | 医院、大机构 | ⭐⭐⭐⭐ 高 | P1阶段二 |
| **单机版Electron** | 个人医生 | ⭐⭐⭐⭐⭐ 很高 | P2阶段二 |
| ~~混合部署~~ | ~~高级客户~~ | ~~⭐⭐⭐⭐⭐ 极高~~ | ❌ 不考虑 |
**简化后的好处:**
- ✅ 降低技术复杂度
- ✅ 聚焦核心场景
- ✅ 加快开发速度
- ✅ 降低维护成本
**阶段规划:**
```
阶段一(当前-6个月云端SaaS版
- 专注云端部署
- 验证市场需求
- 快速迭代
阶段二6-18个月私有化部署
- 触发条件:有客户明确要求
- 引入K8s
- Docker一键部署
阶段三18个月+):单机版(可选)
- 触发条件:有大量单机版需求
- 开发Electron应用
- 本地化运行
```
---
## 3⃣ 审稿系统的独立性
### 您的计划
> 未来还会增加一个审稿系统的开发,目前已经有核心审稿功能了,可能需要独立成一个系统
### 我的回复
**审稿系统非常适合独立!这是一个极具商业价值的决策!**
**为什么审稿系统适合独立?**
**1. 用户群完全不同**
```
主平台用户:临床医生、研究者
审稿系统用户:期刊编辑部、出版社、学会
→ 两类用户没有交集,完全独立
```
**2. 业务逻辑完全独立**
```
主平台:科研全流程(统计分析、文献筛选、数据清洗)
审稿系统:稿件审查流程(投稿、审稿、修改、决策)
→ 业务逻辑无关联
```
**3. 部署场景独立**
```
主平台云端SaaS为主部分私有化
审稿系统:期刊编辑部独立部署
→ 部署需求不同
```
**4. 商业模式独立**
```
主平台:按版本订阅(基础版、高级版、旗舰版)
审稿系统:按期刊订阅,或按稿件数量计费
→ 商业模式完全不同
```
**当前状态:**
- ✅ 核心功能已实现(文档提取、规范性评估、方法学评估)
- ✅ 数据库表已独立review_tasks
- ⚠️ 需要扩展(审稿人管理、审稿流程、多轮审稿)
**建议:**
```
短期(当前):
- 审稿系统作为主平台的一个模块
- 但在架构设计上保持独立独立Schema、独立API
中期6-12个月
- 开发完整审稿系统(审稿人、流程、多轮审稿)
- 验证市场需求
长期12个月+
- 完全独立为单独产品"AI辅助审稿系统"
- 独立部署、独立销售
- 目标客户:期刊编辑部、出版社
```
**独立销售价值:⭐⭐⭐⭐⭐ 极高!**
- 市场空白国内缺乏AI审稿工具
- 刚需:期刊编辑部审稿压力大
- 付费能力强:期刊有预算
---
## 4⃣ 总体 vs 通用 vs 模块独立
### 您的核心问题
> 哪些是总体的?哪些是通用的技术能力?哪些是各模块独立的?
> 哪些能力是复用的?哪些技术架构可以复用?
### 我的回复
这是最核心的架构问题!我已经创建了详细的架构分层设计:
- 📄 [系统架构分层设计](./01-系统架构分层设计.md)
**三层架构总览:**
### 第一层平台基础层Platform Layer
**定义:** 所有业务模块的地基,提供通用的基础设施能力
**包含模块:**
1.**用户与权限中心UAM** - 用户认证、权限管理、Feature Flag
2.**存储服务** - 文件上传下载、OSS/本地文件系统
3.**通知服务** - 站内消息、邮件、WebSocket推送
4.**监控与日志** - 操作日志、错误日志、审计日志
5.**系统配置** - 系统级配置管理
**特征:**
- ✅ 全局唯一(整个平台只有一套)
- ✅ 业务无关(不涉及具体业务逻辑)
- ✅ 强依赖性(所有业务模块都必须依赖)
- ✅ 稳定性高(很少变动)
---
### 第二层通用能力层Capability Layer
**定义:** 跨业务模块共享的核心技术能力
**包含能力:**
#### 1. LLM大模型网关 ⭐⭐⭐⭐⭐ **最核心**
**职责:**
- 统一管理所有LLM调用
- 根据用户版本动态切换模型
- 成本控制与限流
- Token计数与计费
**使用模块:**
- ✅ AIAAI智能问答
- ✅ ASLAI智能文献
- ✅ PKB个人知识库
- ✅ DC数据清洗
- ✅ RVW稿件审查
**复用率:** 5/7 = 71%
**为什么是核心?**
```
这是商业模式的技术保障:
- 基础版只能用DeepSeek-V3¥1/百万tokens
- 高级版可用DeepSeek + Qwen3
- 旗舰版可用DeepSeek + Qwen3 + Qwen-Long + Claude
成本控制:
- 统一监控所有LLM API调用
- 超出配额自动限流
- 按版本计费
```
**当前状态:** ❌ 未实现P0优先级
---
#### 2. 文档处理引擎 ⭐⭐⭐⭐⭐ **最核心**
**职责:**
- 多格式文档提取PDF/Docx/Txt/Excel
- 文本清洗与预处理
- OCR处理
- 表格提取
**使用模块:**
- ✅ ASL文献PDF提取
- ✅ PKB知识库文档
- ✅ DCExcel/Docx导入
- ✅ SSA数据导入
- ✅ ST数据导入
- ✅ RVW稿件提取
**复用率:** 6/7 = 86%
**当前状态:** ✅ 已实现Python微服务
---
#### 3. RAG引擎 ⭐⭐⭐⭐ **核心**
**职责:**
- 向量化存储Embedding
- 语义检索Semantic Search
- 检索增强生成RAG
**使用模块:**
- ✅ PKB个人知识库问答
- ✅ ASL文献内容检索
- ✅ AIA@知识库问答
**复用率:** 3/7 = 43%
**当前状态:** ✅ 已实现基于Dify
---
#### 4. 数据ETL引擎 ⭐⭐⭐ **中等**
**职责:**
- Excel多表JOIN
- 数据清洗
- 数据转换
**使用模块:**
- ✅ DC数据清洗
- ✅ SSA统计分析数据预处理
**复用率:** 2/7 = 29%
**当前状态:** ❌ 未实现P2优先级
---
#### 5. 医学NLP引擎 ⭐⭐⭐ **中等**
**职责:**
- 医学实体识别NER
- 医学术语标准化
**使用模块:**
- ✅ DC病例数据NER提取
**复用率:** 1/7 = 14%
**当前状态:** ❌ 未实现P2优先级
---
### 第三层业务模块层Product Layer
**定义:** 面向用户的产品功能,每个模块都是独立的产品单元
**7个业务模块**
| 模块 | 名称 | 商业价值 | 独立性 | 状态 |
|------|------|---------|-------|------|
| **AIA** | AI智能问答 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 已完成 |
| **ASL** | AI智能文献 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⏳ 下一步重点 |
| **PKB** | 个人知识库 | ⭐⭐⭐ | ⭐⭐⭐ | ✅ 已完成 |
| **DC** | 数据清洗整理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⏳ 规划中 |
| **SSA** | 智能统计分析 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⏳ 规划中 |
| **ST** | 统计分析工具 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⏳ 规划中 |
| **RVW** | 稿件审查系统 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⚡ 独立系统 |
**特征:**
- ✅ 独立部署:可以单独打包部署
- ✅ 独立销售:可以单独售卖
- ✅ 低耦合:模块间不直接依赖
- ✅ 高内聚:模块内功能完整
---
### 可复用能力总结
| 能力 | 使用频率 | 复用模块数 | 优先级 | 状态 |
|------|---------|-----------|--------|------|
| **LLM网关** | 71% | 5/7 | P0 | ❌ 待实现 |
| **文档处理引擎** | 86% | 6/7 | P0 | ✅ 已实现 |
| **RAG引擎** | 43% | 3/7 | P1 | ✅ 已实现 |
| **ETL引擎** | 29% | 2/7 | P2 | ❌ 待实现 |
| **医学NLP** | 14% | 1/7 | P2 | ❌ 待实现 |
---
## 5⃣ 数据库架构
### 您的问题
> 设计多Schema架构是非常必要的。
> 目前当前系统的数据库似乎是DIFY的
> 目前我们有自己独立的数据库吗?
### 我的回复
**我们有自己独立的PostgreSQL数据库不是Dify的**
**当前数据库情况:**
```typescript
// 数据源backend/prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
```
**当前表结构:**
```
当前数据库PostgreSQL独立于Dify
├── users # 用户表
├── projects # 项目表
├── conversations # 对话表AI问答
├── messages # 消息表
├── knowledge_bases # 知识库表
├── documents # 文档表
├── admin_logs # 管理员日志
├── general_conversations # 通用对话
├── general_messages # 通用消息
├── batch_tasks # 批处理任务Phase 3
├── batch_results # 批处理结果
├── task_templates # 任务模板
└── review_tasks # 稿件审查任务
Dify数据库完全独立
├── dify自己的表不在我们的数据库
└── 通过Dify API调用不直接访问
```
**关键澄清:**
- ✅ 我们有自己的PostgreSQL数据库
- ✅ Dify有自己的数据库我们不直接访问
- ✅ 我们通过Dify API调用HTTP REST API
- ✅ 两个数据库完全独立
**但是存在的问题:**
-**所有表在同一Schemapublic**
- ❌ 未来微服务拆分困难
- ❌ 不支持模块独立部署
---
### Schema隔离方案
**目标架构:**
```sql
-- 平台层Schema
CREATE SCHEMA platform_schema;
users
roles
permissions
feature_flags
notifications
admin_logs
-- 通用能力Schema
CREATE SCHEMA capability_schema;
llm_usage_logs
llm_quotas
document_processing_logs
-- 业务模块Schema
CREATE SCHEMA aia_schema; -- AI智能问答
aia_projects
aia_conversations
aia_messages
CREATE SCHEMA asl_schema; -- AI智能文献
asl_projects
asl_literature_items
asl_screening_results
...
CREATE SCHEMA pkb_schema; -- 个人知识库
pkb_knowledge_bases
pkb_documents
CREATE SCHEMA dc_schema; -- 数据清洗
dc_projects
dc_raw_files
dc_cleaned_data
CREATE SCHEMA ssa_schema; -- 智能统计分析
ssa_projects
ssa_analysis_tasks
CREATE SCHEMA st_schema; -- 统计分析工具
st_tool_usage
CREATE SCHEMA review_schema; -- 稿件审查
review_tasks
review_journals
review_reviewers
review_workflows
```
---
### 迁移策略
**阶段一:逻辑隔离(当前阶段,立即实施)**
```
目标在代码层面按Schema组织但数据库还是public
方式Prisma中使用@@map指定表名前缀
例如:
model AiaProject {
id String @id @default(uuid())
// ...
@@map("aia_projects") // 表名前缀标识模块
}
model AslProject {
id String @id @default(uuid())
// ...
@@map("asl_projects")
}
model DcProject {
id String @id @default(uuid())
// ...
@@map("dc_projects")
}
```
**好处:**
- ✅ 立即可实施,无需数据迁移
- ✅ 为未来物理隔离打基础
- ✅ 代码层面已经按模块组织
---
**阶段二:物理隔离(微服务拆分时,阶段二)**
```
目标真正创建独立Schema
时机:当需要拆分某个模块为独立微服务时
步骤:
1. CREATE SCHEMA xxx_schema;
2. CREATE TABLE xxx_schema.table_name ...
3. INSERT INTO xxx_schema.table SELECT * FROM public.old_table;
4. 更新Prisma Schema指定schema
5. 测试验证
6. 切换生产
```
---
## 6⃣ 下一步开发重点
### 您的决策
> 下一步着重开发的功能肯定是AI智能文献模块。
> 当然在总体架构讨论清楚前,我们先不开发。
### 我的回复
**完全赞同AI智能文献是核心竞争力应该是下一步重点。**
**开发顺序建议:**
**第一步架构设计本周1-2天**
```
P0文档必须完成
1. ✅ 系统架构分层设计(已完成)
2. ✅ 文档体系重构方案(已完成)
3. ⚠️ LLM大模型网关设计关键
4. ⚠️ 数据库Schema隔离方案关键
```
**第二步文档整理本周1-2天**
```
1. 调整ASL模块文档结构按新模板
2. 补充缺失的设计文档
3. 明确开发里程碑
```
**第三步关键技术验证下周1-2天**
```
1. ⚠️ R语言技术验证SSA模块需要可延后
2. ⚠️ LLM Gateway原型验证
3. ⚠️ Schema隔离迁移测试
```
**第四步开始ASL模块开发下周开始**
```
优先级:
- P0标题摘要初筛核心功能已有原型
- P1全文复筛核心功能已有原型
- P2全文解析与数据提取
- P3数据分析与报告生成
```
---
## 🎯 总体策略建议
### 核心原则
**1. 架构先行,文档先行**
```
✅ 先把总体架构讨论清楚
✅ 先把文档结构调整好
✅ 然后再开始开发
```
**2. 聚焦核心,逐步扩展**
```
阶段一(当前-6个月
- 云端SaaS版
- 核心模块ASL、DC、AIA优化
- 关键能力LLM网关、Schema隔离
阶段二6-18个月
- 私有化部署
- 扩展模块SSA、ST
- 独立系统RVW审稿系统
阶段三18个月+
- 单机版(可选)
- 全面微服务
```
**3. 模块独立,能力复用**
```
✅ 业务模块独立设计(低耦合)
✅ 通用能力统一提供(高复用)
✅ 支持模块独立销售
```
---
## ✅ 立即行动清单
### 本周行动P0
**1. 架构设计1-2天**
- [x] 系统架构分层设计 ✅
- [x] 文档体系重构方案 ✅
- [ ] LLM大模型网关设计
- [ ] 数据库Schema隔离方案
**2. 文档迁移1-2天**
- [ ] 创建新文件夹结构
- [ ] 迁移ASL模块文档
- [ ] 调整文档结构(按新模板)
---
### 下周行动P1
**3. 关键文档补充2-3天**
- [ ] ASL模块缺失文档
- [ ] LLM网关详细设计
- [ ] RVW独立系统规划
**4. 开始ASL模块开发启动**
- [ ] 数据库表设计asl_schema
- [ ] API设计
- [ ] 前端组件设计
---
## 📊 总结
### 您的想法非常正确!
1.**文档系统重构**:总体独立,模块独立
2.**不考虑混合部署**:简化技术复杂度
3.**审稿系统独立**:极具商业价值
4.**架构分层清晰**:平台层、通用能力层、业务模块层
5.**Schema隔离必要**:支持模块独立和微服务拆分
6.**ASL是下一步重点**:核心竞争力
### 当前最关键的工作
**P0本周**
1. 完成架构设计文档LLM网关、Schema隔离
2. 调整文档结构迁移ASL模块
**P1下周**
3. 补充关键文档
4. 开始ASL模块开发
### 我们不着急,先把总体思路沟通清楚
**完全认同您的想法!**
架构设计是地基,地基不牢,后面开发会很痛苦。
我们先把架构和文档梳理清楚,再开始开发。
---
**接下来您想讨论什么?**
1. LLM大模型网关的详细设计
2. 数据库Schema隔离的具体实施
3. ASL模块的开发计划
4. 审稿系统的独立规划?
5. 其他架构问题?