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
18 KiB
核心问题解答
创建日期: 2025-11-06
文档目的: 回答用户提出的关键架构问题
📋 您提出的问题
您提出了非常核心的架构问题,这些问题直接影响了整个系统的设计。让我逐一深入解答:
1️⃣ 文档系统重构
您的建议
(1)系统总体架构、总体需求PRD、系统总体设计、系统总体部署等,应该是一个独立的文件夹
(2)7个模块应该是独立的7个文件夹,每个模块有:项目概述、设计文档、业务规则、开发计划、每日进度、部署文档
我的回复
✅ 完全认同!这是非常正确的架构思路!
我已经创建了详细的文档重构方案:
- 📄 文档体系重构方案
新文档结构:
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 模块独立
您的核心问题
哪些是总体的?哪些是通用的技术能力?哪些是各模块独立的?
哪些能力是复用的?哪些技术架构可以复用?
我的回复
这是最核心的架构问题!我已经创建了详细的架构分层设计:
- 📄 系统架构分层设计
三层架构总览:
第一层:平台基础层(Platform Layer)
定义: 所有业务模块的地基,提供通用的基础设施能力
包含模块:
- ✅ 用户与权限中心(UAM) - 用户认证、权限管理、Feature Flag
- ✅ 存储服务 - 文件上传下载、OSS/本地文件系统
- ✅ 通知服务 - 站内消息、邮件、WebSocket推送
- ✅ 监控与日志 - 操作日志、错误日志、审计日志
- ✅ 系统配置 - 系统级配置管理
特征:
- ✅ 全局唯一(整个平台只有一套)
- ✅ 业务无关(不涉及具体业务逻辑)
- ✅ 强依赖性(所有业务模块都必须依赖)
- ✅ 稳定性高(很少变动)
第二层:通用能力层(Capability Layer)
定义: 跨业务模块共享的核心技术能力
包含能力:
1. LLM大模型网关 ⭐⭐⭐⭐⭐ 最核心
职责:
- 统一管理所有LLM调用
- 根据用户版本动态切换模型
- 成本控制与限流
- Token计数与计费
使用模块:
- ✅ AIA(AI智能问答)
- ✅ ASL(AI智能文献)
- ✅ 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(知识库文档)
- ✅ DC(Excel/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的!
当前数据库情况:
// 数据源: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)
- ✅ 两个数据库完全独立
但是存在的问题:
- ❌ 所有表在同一Schema(public)
- ❌ 未来微服务拆分困难
- ❌ 不支持模块独立部署
Schema隔离方案
目标架构:
-- 平台层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天)
- 系统架构分层设计 ✅
- 文档体系重构方案 ✅
- LLM大模型网关设计
- 数据库Schema隔离方案
2. 文档迁移(1-2天)
- 创建新文件夹结构
- 迁移ASL模块文档
- 调整文档结构(按新模板)
下周行动(P1)
3. 关键文档补充(2-3天)
- ASL模块缺失文档
- LLM网关详细设计
- RVW独立系统规划
4. 开始ASL模块开发(启动)
- 数据库表设计(asl_schema)
- API设计
- 前端组件设计
📊 总结
您的想法非常正确!
- ✅ 文档系统重构:总体独立,模块独立
- ✅ 不考虑混合部署:简化技术复杂度
- ✅ 审稿系统独立:极具商业价值
- ✅ 架构分层清晰:平台层、通用能力层、业务模块层
- ✅ Schema隔离必要:支持模块独立和微服务拆分
- ✅ ASL是下一步重点:核心竞争力
当前最关键的工作
P0(本周):
- 完成架构设计文档(LLM网关、Schema隔离)
- 调整文档结构(迁移ASL模块)
P1(下周): 3. 补充关键文档 4. 开始ASL模块开发
我们不着急,先把总体思路沟通清楚
✅ 完全认同您的想法!
架构设计是地基,地基不牢,后面开发会很痛苦。
我们先把架构和文档梳理清楚,再开始开发。
接下来您想讨论什么?
- LLM大模型网关的详细设计?
- 数据库Schema隔离的具体实施?
- ASL模块的开发计划?
- 审稿系统的独立规划?
- 其他架构问题?