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
10 KiB
RVW V4.0 期刊租户配置中心开发需求
模块定位: 依托现有 ADMIN 运营端 TenantDetailPage,为每个期刊客户建立独立的配置中枢。
核心目标: 实现期刊 SaaS 的“千刊千面”。
架构原则:
- 配置继承模式 (Config Inheritance):系统提供【标准默认配置】。期刊默认继承系统标准;需要个性化时,可开启【自定义覆盖】。
- 中英双轨基线 (Dual-Baseline):针对稿约规范,系统提供“英文期刊”与“中文期刊”两套底层标准,供租户自主选择绑定。
- 全面 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-config:UPSERT 期刊 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:用户与期刊绑定(无需开发)
- 客户在主站注册账号(或由超管分配账号)。
- 内部超管在 ADMIN 端的 【用户管理 -> 租户成员管理】 页面,将该用户的账号添加到目标期刊租户(如 JTIM)下。
- 确保该用户拥有 RVW 模块的使用权限。
- 验证:此后该用户访问 review.xunzhengyixue.com/jtim 时,JWT 中会自动带上该租户身份,接口方可放行。
✅ 五、 验收标准 (Definition of Done - P0 阶段)
- ADMIN 后台成功渲染出只包含大文本框(Textarea)的极简配置界面。
- 中英基线验证:
- 将 JTIM 的【稿约规范】设置为“继承系统默认”并选择**【标准版英文期刊规范】**,上传稿件时,系统严格核查伦理声明等英文规则。
- 将 CMJ 设置为“继承系统默认”并选择**【标准版中文稿约规范】**,系统重点核查中英文摘要对应等中文规则。
- 当某期刊在【临床专业评估】开启自定义后,运营人员在大文本框中修改提示词并保存,新上传的稿件严格按该设定执行评估。
🚀 六、 分阶段实施与 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 端权限开发。
- 登录页背景图定制:暂不开发,统一使用系统默认干净纯色底即可。