feat(rvw): complete journal config center MVP and tenant login routing

Deliver the RVW V4.0 journal configuration center across backend, frontend, migration, and docs with zh/en editorial baseline support and tenant-level prompt/template overrides. Unify tenant login to /:tenantCode/login and auto-enable RVW module when tenant type is JOURNAL to prevent post-login access gaps.

Made-with: Cursor
This commit is contained in:
2026-03-15 11:51:35 +08:00
parent 16179e16ca
commit 83e395824b
44 changed files with 2555 additions and 312 deletions

View File

@@ -0,0 +1,161 @@
# **RVW V4.0 期刊租户配置中心开发需求**
**模块定位:** 依托现有 ADMIN 运营端 TenantDetailPage为每个期刊客户建立独立的配置中枢。
**核心目标:** 实现期刊 SaaS 的“千刊千面”。
**架构原则:**
1. **配置继承模式 (Config Inheritance)**:系统提供【标准默认配置】。期刊默认继承系统标准;需要个性化时,可开启【自定义覆盖】。
2. **中英双轨基线 (Dual-Baseline)**:针对稿约规范,系统提供“英文期刊”与“中文期刊”两套底层标准,供租户自主选择绑定。
3. **全面 Prompt 化 (All-in-Prompt)**:取消细颗粒度表单,采用“专家评判标准 (Prompt) \+ 报告展示模板 (Handlebars)”的开放式极简架构。
## **🎯 一、 前端 UI 与功能分区要求**
在现有的 ADMIN 租户详情页TenantDetailPage构建两大核心配置区块
### **区块 1期刊基础信息与门户配置 (Basic Info & Portal)**
用于定义该期刊的对外面貌和访问入口。
| 配置项名称 | 阶段 | 字段类型 | UI 组件 | 功能说明 |
| :---- | :---- | :---- | :---- | :---- |
| **期刊全称** | \[P0\] | String | 文本输入框 | 如:*Journal of Translational Internal Medicine*。显示在登录页及工作台顶部。 |
| **访问路径(Slug)** | \[P0\] | String | 文本输入框(需正则) | **极重要**:用于生成 review.xunzhengyixue.com/{slug}。仅允许小写字母、数字和连字符。 |
| **期刊 Logo** | \[P1\] | String | 图片上传组件 | 上传至 OSS 后保存 URL。用于替换默认的系统 Logo。 |
| **品牌主色调** | \[P1\] | String | 颜色拾取器 | 支持 HEX 色值。用于动态渲染按钮和高亮文字。 |
| **登录页背景图** | \[P2\] | String | 图片上传组件 | (暂不开发) 替换登录页的默认背景。 |
### **区块 2智能审稿配置 (RVW Skills Config) —— 【全维度 Prompt 架构】**
这是该模块的核心。对于 4 个配置面板,顶部必须增加一个全局切换组件:
* 🔘 **选项 A: 继承系统默认配置 (Inherit System Default)** \[P0\] —— 选中时,下方大文本框置灰只读。
* 🔘 **选项 B: 启用个性化自定义 (Custom Override)** \[P0\] —— 选中时,解锁下方大文本框,允许大面积修改。
#### **Panel A: 稿约规范评估 (Editorial) —— 【支持中英标准选择】**
作为特殊的规范模块,当选择 **“继承系统默认配置”** 时,必须提供一个**下拉单选框**供运营人员选择:
* 🔘 **标准版英文期刊规范 (English Standard)** \[P0\]:自动绑定英文 SCI 级审查标准(严查伦理声明等)。
* 🔘 **标准版中文稿约规范 (Chinese Standard)** \[P0\]:自动绑定中文核心期刊审查标准(查中英文摘要对照等)。
当选择 **“启用个性化自定义”** 时,展示下方的通用组件。
#### **统一的面板配置项(适用于 Panel B / C / D 及自定义状态下的 Panel A**
* **1\. 专家评判标准 (Expert Prompt)** \[P0\]:大文本框。自由输入该期刊特有的审查要求(大模型读取)。
* **2\. 报告展示模板 (Handlebars Template)** \[P0\]:大文本框。用于配置最终输出给责编的 Markdown 格式。
* ⚠️ **3\. 测试渲染 (Test Render)** \[P1\]:在模板编辑区提供“预览”按钮。使用假 JSON 数据在右侧实时渲染 Markdown 结果,防语法写错导致线上白屏。(MVP 阶段若来不及,可由运营人员去前台真实传 PDF 测试兜底)。
## **💾 二、 数据库 Schema 设计 (Prisma) \[P0\]**
**DB 要求**:即便 UI 是分阶段开发,数据库字段必须在 \[P0\] 阶段一次性建好,避免后续频繁 Migrate。
利用数据库的 null 语义表达“继承”。取消原有的 JSON 数组,统一为 Text 类型的 Prompt 和 Template 字段。
重点新增 editorialBaseStandard 字段,用于持久化期刊的中英文基线选择。
model TenantRvwConfig {
id String @id @default(uuid())
tenantId String @unique
tenant Tenant @relation(fields: \[tenantId\], references: \[id\])
// Panel A: 稿约规范评估
// 'en' 代表选用标准英文规范,'zh' 代表选用标准中文规范。
editorialBaseStandard String @default("en")
editorialExpertPrompt String? @db.Text
editorialHandlebarsTemplate String? @db.Text
// Panel B: 方法学评估
methodologyExpertPrompt String? @db.Text
methodologyHandlebarsTemplate String? @db.Text
// Panel C: 数据验证评估
dataForensicsExpertPrompt String? @db.Text
dataForensicsHandlebarsTemplate String? @db.Text
// Panel D: 临床专业评估
clinicalExpertPrompt String? @db.Text
clinicalHandlebarsTemplate String? @db.Text
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@schema("platform\_schema")
}
## **🔌 三、 后端 API 与底层引擎继承逻辑 (核心)**
### **1\. 内部 ADMIN 配置接口 (需要 ops:user-ops 权限) \[P0\]**
* PUT /api/admin/tenants/:id/basic-info更新期刊名称、Slug (P1阶段再接 Logo 等)。
* GET /api/admin/tenants/:id/rvw-config获取指定期刊的 Skills 配置(若不存在,返回 {})。
* PUT /api/admin/tenants/:id/rvw-configUPSERT 期刊 Skills 配置。**若前端选择“继承系统默认”,对应的 ExpertPrompt 和 Template 传 null但 editorialBaseStandard 必须传选中的值('en'或'zh'**。
### **2\. 底层引擎运行时的“降级合并 (Fallback Merge)”逻辑 \[P0\]**
后端重构 SkillExecutor 时,实施深度合并策略。以 **稿约规范 (EditorialSkill)** 为例:
async function executeEditorialSkill(manuscript, tenantConfig) {
let promptToApply;
// 1\. 如果租户自定义了稿约 Prompt直接使用租户的开放式配置 (优先级最高)
if (tenantConfig && tenantConfig.editorialExpertPrompt) {
promptToApply \= tenantConfig.editorialExpertPrompt;
}
// 2\. 租户未自定义(为 null触发系统默认降级逻辑
else {
// 2.1 读取该期刊在后台配置的“标准语言基线”
const baseStandard \= tenantConfig?.editorialBaseStandard || 'en';
// 2.2 根据基线拉取对应的【系统标准版规范】Prompt
if (baseStandard \=== 'en') {
promptToApply \= await promptService.get('SYSTEM\_DEFAULT\_EDITORIAL\_EN');
} else if (baseStandard \=== 'zh') {
promptToApply \= await promptService.get('SYSTEM\_DEFAULT\_EDITORIAL\_ZH');
}
}
// 3\. 将 promptToApply 喂给 LLM 执行,并使用对应 Handlebars 模板渲染...
}
方法学、数据验证和临床评估的逻辑同理:最终提示词 \= 租户自定义 Prompt ?? 系统默认 Prompt。
## **👥 四、 实施 SOP用户与期刊绑定无需开发**
1. 客户在主站注册账号(或由超管分配账号)。
2. 内部超管在 ADMIN 端的 **【用户管理 \-\> 租户成员管理】** 页面,将该用户的账号添加到目标期刊租户(如 JTIM下。
3. 确保该用户拥有 RVW 模块的使用权限。
4. **验证**:此后该用户访问 review.xunzhengyixue.com/jtim 时JWT 中会自动带上该租户身份,接口方可放行。
## **✅ 五、 验收标准 (Definition of Done \- P0 阶段)**
1. ADMIN 后台成功渲染出只包含大文本框Textarea的极简配置界面。
2. **中英基线验证**
* 将 JTIM 的【稿约规范】设置为“继承系统默认”并选择\*\*【标准版英文期刊规范】\*\*,上传稿件时,系统严格核查伦理声明等英文规则。
* 将 CMJ 设置为“继承系统默认”并选择\*\*【标准版中文稿约规范】\*\*,系统重点核查中英文摘要对应等中文规则。
3. 当某期刊在【临床专业评估】开启自定义后,运营人员在大文本框中修改提示词并保存,新上传的稿件严格按该设定执行评估。
## **🚀 六、 分阶段实施与 MVP 裁剪指南 (给 PM 与研发团队)**
为了保证项目快速上线,坚决执行 Managed SaaS (代运营) 和 All-in-Prompt 的裁剪策略。
### **🔴 第一阶段MVP 必做清单 (P0) —— 目标:系统能跑通双语及个性化**
* **数据库**:一次性建好所有 Schema 字段(包含全部 Text 和 BaseStandard 字段)。
* **核心引擎**:必须完成 SkillExecutor 的降级合并逻辑(?? 合并)和中英文 Prompt 的自动路由。
* **ADMIN 前端**:只要最基础、最“丑”的表单输入框。实现“继承/自定义”的单选切换,并暴露 Textarea。不做任何复杂的花哨控件。
* **业务前端**:根据 URL 中的 /:tenantId 成功拦截并获取对应的【期刊名称】(纯文本展示即可)。
### **🟡 第二阶段:视觉与防呆增强 (P1) —— 目标:上线后 1-2 周内快反**
* **模板预览 (Test Render)**:复用底层 PromptService 补齐预览按钮,防止运营在纯文本框写错 Handlebars 语法导致线上白屏。
* **品牌视觉提升**:补齐期刊 Logo、主色调配置并在客户端动态渲染提升 SaaS 专属感。
* **接口安全**:为公开的品牌信息拉取接口增加 Redis 缓存与 Rate Limiting 限流防刷。
### **🟢 第三阶段:暂缓或砍掉的伪需求 (P2) —— 目标:避免过度工程**
* **细颗粒度表单控件**:既然已经全面 Prompt 化,坚决不再开发滑块(如权重分配)、下拉枚举(如验证级别)等细分 UI 控件。全部用 Prompt 解决。
* **客户自助配置后台**:坚决不做。坚持代运营模式,期刊主编提需求,内部运营人员在 ADMIN 端修改,规避复杂的 B 端权限开发。
* **登录页背景图定制**:暂不开发,统一使用系统默认干净纯色底即可。