feat(rvw): deliver tenant portal v4 flow and config foundation
Implement RVW V4.0 tenant-aware backend/frontend flow with tenant routing, config APIs, and full portal UX updates. Sync system/RVW/deployment docs to capture verified upload-review-report workflow and next-step admin configuration work. Made-with: Cursor
This commit is contained in:
442
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/AI审稿V1.html
Normal file
442
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/AI审稿V1.html
Normal file
@@ -0,0 +1,442 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>JTIM - 智能审稿工作台</title>
|
||||
<!-- 引入 Tailwind CSS -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<!-- 引入 Vue 3 -->
|
||||
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
|
||||
<!-- 引入 FontAwesome 图标 -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
brand: {
|
||||
50: '#f0f9ff',
|
||||
100: '#e0f2fe',
|
||||
500: '#0ea5e9',
|
||||
600: '#0284c7',
|
||||
700: '#0369a1',
|
||||
900: '#0c4a6e',
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
/* 隐藏滚动条但保留滚动功能 */
|
||||
.no-scrollbar::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.no-scrollbar {
|
||||
-ms-overflow-style: none;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
.pdf-mockup {
|
||||
background-image: repeating-linear-gradient(0deg, transparent, transparent 27px, #e5e7eb 27px, #e5e7eb 28px);
|
||||
background-size: 100% 28px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-gray-50 text-gray-800 font-sans antialiased">
|
||||
<div id="app" class="h-screen w-full flex flex-col overflow-hidden">
|
||||
|
||||
<!-- ==================== 视图 1: 独立登录页 ==================== -->
|
||||
<div v-if="currentView === 'login'" class="flex h-screen w-full">
|
||||
<!-- 左侧品牌展示 -->
|
||||
<div class="w-1/2 bg-brand-900 flex flex-col justify-center items-center text-white p-12 relative overflow-hidden">
|
||||
<div class="absolute inset-0 opacity-10 bg-[url('https://www.transparenttextures.com/patterns/cubes.png')]"></div>
|
||||
<div class="z-10 text-center">
|
||||
<div class="w-24 h-24 bg-white rounded-full flex items-center justify-center mx-auto mb-6 shadow-xl">
|
||||
<i class="fas fa-book-medical text-brand-700 text-4xl"></i>
|
||||
</div>
|
||||
<h1 class="text-4xl font-bold mb-4">Journal of Translational Internal Medicine</h1>
|
||||
<p class="text-xl text-brand-100 mb-8">AI 智能审稿系统 (Editor Portal)</p>
|
||||
<div class="inline-block px-6 py-2 border border-brand-500 rounded-full text-sm">
|
||||
专属租户入口
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 右侧登录表单 -->
|
||||
<div class="w-1/2 flex items-center justify-center bg-white">
|
||||
<div class="w-96">
|
||||
<h2 class="text-3xl font-bold mb-2 text-gray-800">编辑登录</h2>
|
||||
<p class="text-gray-500 mb-8">欢迎回来,请登录您的责编工作台。</p>
|
||||
|
||||
<form @submit.prevent="login" class="space-y-6">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">工作邮箱</label>
|
||||
<input type="email" value="editor@jtim.com" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-brand-500 focus:border-brand-500 outline-none transition" required>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">密码</label>
|
||||
<input type="password" value="password123" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-brand-500 focus:border-brand-500 outline-none transition" required>
|
||||
</div>
|
||||
<div class="flex items-center justify-between">
|
||||
<label class="flex items-center">
|
||||
<input type="checkbox" class="rounded text-brand-600 focus:ring-brand-500">
|
||||
<span class="ml-2 text-sm text-gray-600">记住我</span>
|
||||
</label>
|
||||
<a href="#" class="text-sm text-brand-600 hover:text-brand-500">忘记密码?</a>
|
||||
</div>
|
||||
<button type="submit" class="w-full bg-brand-600 text-white font-medium py-2.5 rounded-lg hover:bg-brand-700 transition shadow-lg shadow-brand-500/30">
|
||||
进入工作台 <i class="fas fa-arrow-right ml-2"></i>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ==================== 登录后的公共 Header ==================== -->
|
||||
<header v-if="currentView !== 'login'" class="h-16 bg-white border-b border-gray-200 flex items-center justify-between px-6 shrink-0 z-10">
|
||||
<div class="flex items-center space-x-4">
|
||||
<div class="w-8 h-8 bg-brand-700 rounded text-white flex items-center justify-center font-bold">JT</div>
|
||||
<h1 class="text-lg font-bold text-gray-800">JTIM 审稿工作台</h1>
|
||||
</div>
|
||||
<div class="flex items-center space-x-6">
|
||||
<button class="text-gray-500 hover:text-gray-700"><i class="fas fa-bell"></i></button>
|
||||
<div class="flex items-center space-x-2 border-l pl-6 border-gray-200 cursor-pointer" @click="currentView = 'login'">
|
||||
<img src="https://i.pravatar.cc/150?u=a042581f4e29026704d" alt="User" class="w-8 h-8 rounded-full">
|
||||
<span class="text-sm font-medium text-gray-700">责编 李明</span>
|
||||
<i class="fas fa-chevron-down text-xs text-gray-400"></i>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- ==================== 视图 2: 稿件管理池 (Dashboard) ==================== -->
|
||||
<div v-if="currentView === 'dashboard'" class="flex-1 overflow-auto p-6 bg-gray-50">
|
||||
<!-- 统计卡片 -->
|
||||
<div class="grid grid-cols-4 gap-6 mb-6">
|
||||
<div class="bg-white rounded-xl p-5 border border-gray-200 shadow-sm flex items-center">
|
||||
<div class="w-12 h-12 bg-blue-50 text-blue-600 rounded-lg flex items-center justify-center text-xl mr-4"><i class="fas fa-inbox"></i></div>
|
||||
<div><p class="text-sm text-gray-500">待预审稿件</p><p class="text-2xl font-bold">12</p></div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl p-5 border border-gray-200 shadow-sm flex items-center">
|
||||
<div class="w-12 h-12 bg-amber-50 text-amber-600 rounded-lg flex items-center justify-center text-xl mr-4"><i class="fas fa-robot"></i></div>
|
||||
<div><p class="text-sm text-gray-500">AI 审查中</p><p class="text-2xl font-bold">3</p></div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl p-5 border border-gray-200 shadow-sm flex items-center">
|
||||
<div class="w-12 h-12 bg-green-50 text-green-600 rounded-lg flex items-center justify-center text-xl mr-4"><i class="fas fa-clipboard-check"></i></div>
|
||||
<div><p class="text-sm text-gray-500">需人工复核</p><p class="text-2xl font-bold">8</p></div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl p-5 border border-gray-200 shadow-sm flex items-center">
|
||||
<div class="w-12 h-12 bg-purple-50 text-purple-600 rounded-lg flex items-center justify-center text-xl mr-4"><i class="fas fa-paper-plane"></i></div>
|
||||
<div><p class="text-sm text-gray-500">今日已退修</p><p class="text-2xl font-bold">5</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 宽表 -->
|
||||
<div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-gray-200 flex justify-between items-center bg-gray-50/50">
|
||||
<h2 class="text-lg font-bold text-gray-800">最新收稿池 (Manuscripts Pool)</h2>
|
||||
<div class="flex space-x-2">
|
||||
<input type="text" placeholder="搜索稿件编号/作者..." class="px-3 py-1.5 border border-gray-300 rounded-lg text-sm focus:ring-brand-500 focus:border-brand-500 outline-none">
|
||||
<button class="bg-white border border-gray-300 text-gray-700 px-3 py-1.5 rounded-lg text-sm hover:bg-gray-50"><i class="fas fa-filter mr-1"></i> 筛选</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overflow-x-auto">
|
||||
<table class="w-full text-left text-sm">
|
||||
<thead class="bg-gray-50 text-gray-500 border-b border-gray-200">
|
||||
<tr>
|
||||
<th class="px-6 py-3 font-medium">稿件编号</th>
|
||||
<th class="px-6 py-3 font-medium">标题</th>
|
||||
<th class="px-6 py-3 font-medium">通讯作者</th>
|
||||
<th class="px-6 py-3 font-medium">综合评分</th>
|
||||
<th class="px-6 py-3 font-medium text-center">规范性</th>
|
||||
<th class="px-6 py-3 font-medium text-center">方法学</th>
|
||||
<th class="px-6 py-3 font-medium text-center">数据验证</th>
|
||||
<th class="px-6 py-3 font-medium text-center">临床评估</th>
|
||||
<th class="px-6 py-3 font-medium">状态</th>
|
||||
<th class="px-6 py-3 font-medium text-right">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-100">
|
||||
<tr v-for="doc in manuscripts" :key="doc.id" class="hover:bg-blue-50/30 transition">
|
||||
<td class="px-6 py-4 font-mono text-brand-600 font-medium">{{ doc.id }}</td>
|
||||
<td class="px-6 py-4 text-gray-800 max-w-xs truncate" :title="doc.title">{{ doc.title }}</td>
|
||||
<td class="px-6 py-4 text-gray-600">{{ doc.author }}</td>
|
||||
<td class="px-6 py-4">
|
||||
<div class="flex items-center">
|
||||
<div class="w-10 h-10 rounded-full border-4 flex items-center justify-center font-bold text-xs"
|
||||
:class="doc.score >= 80 ? 'border-green-100 text-green-600 bg-green-50' : (doc.score >= 60 ? 'border-amber-100 text-amber-600 bg-amber-50' : 'border-red-100 text-red-600 bg-red-50')">
|
||||
{{ doc.score }}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<!-- 4维状态 -->
|
||||
<td class="px-6 py-4 text-center"><StatusIcon :status="doc.dims.editorial" /></td>
|
||||
<td class="px-6 py-4 text-center"><StatusIcon :status="doc.dims.method" /></td>
|
||||
<td class="px-6 py-4 text-center"><StatusIcon :status="doc.dims.data" /></td>
|
||||
<td class="px-6 py-4 text-center"><StatusIcon :status="doc.dims.clinical" /></td>
|
||||
|
||||
<td class="px-6 py-4">
|
||||
<span class="px-2.5 py-1 text-xs rounded-full font-medium"
|
||||
:class="doc.status === 'AI审查完毕' ? 'bg-blue-100 text-blue-700' : 'bg-gray-100 text-gray-600'">
|
||||
{{ doc.status }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-right">
|
||||
<button v-if="doc.status === 'AI审查完毕'" @click="openDetail(doc)" class="text-brand-600 hover:text-brand-800 font-medium bg-brand-50 px-3 py-1 rounded-md transition">
|
||||
人工复核
|
||||
</button>
|
||||
<button v-else class="text-gray-400 font-medium px-3 py-1 cursor-not-allowed">
|
||||
审查中...
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ==================== 视图 3: 沉浸式 4-Tab 审稿详情页 ==================== -->
|
||||
<div v-if="currentView === 'detail'" class="flex-1 flex flex-col overflow-hidden bg-gray-100">
|
||||
<!-- 详情页工具栏 -->
|
||||
<div class="h-14 bg-white border-b border-gray-200 flex items-center justify-between px-4 shrink-0 shadow-sm z-10">
|
||||
<div class="flex items-center">
|
||||
<button @click="currentView = 'dashboard'" class="text-gray-500 hover:text-gray-800 mr-4 w-8 h-8 rounded-full hover:bg-gray-100 flex items-center justify-center transition">
|
||||
<i class="fas fa-arrow-left"></i>
|
||||
</button>
|
||||
<div>
|
||||
<span class="text-xs text-gray-400 font-mono">{{ activeDoc.id }}</span>
|
||||
<h2 class="text-sm font-bold text-gray-800 truncate max-w-lg">{{ activeDoc.title }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center space-x-3">
|
||||
<button class="px-3 py-1.5 border border-gray-300 text-gray-700 text-sm font-medium rounded hover:bg-gray-50 transition">
|
||||
<i class="fas fa-file-word mr-1 text-blue-600"></i> 导出审稿报告
|
||||
</button>
|
||||
<button class="px-4 py-1.5 bg-red-600 text-white text-sm font-medium rounded hover:bg-red-700 transition shadow-sm">
|
||||
<i class="fas fa-reply mr-1"></i> 发送退修意见函
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 分屏内容区 -->
|
||||
<div class="flex-1 flex overflow-hidden">
|
||||
<!-- 左侧: 原文预览 (模拟) -->
|
||||
<div class="w-3/5 border-r border-gray-300 bg-gray-100 p-4 overflow-auto relative">
|
||||
<!-- 浮动工具栏 -->
|
||||
<div class="absolute top-6 left-1/2 transform -translate-x-1/2 bg-gray-800/80 text-white px-4 py-2 rounded-lg flex space-x-4 text-sm backdrop-blur-sm shadow-lg z-10">
|
||||
<button class="hover:text-brand-300"><i class="fas fa-search-plus"></i></button>
|
||||
<button class="hover:text-brand-300"><i class="fas fa-search-minus"></i></button>
|
||||
<span>第 1 / 15 页</span>
|
||||
</div>
|
||||
|
||||
<!-- 模拟 PDF 纸张 -->
|
||||
<div class="bg-white shadow-lg mx-auto w-full max-w-3xl min-h-[1000px] p-12 pdf-mockup relative">
|
||||
<h1 class="text-2xl font-bold text-center mb-6">{{ activeDoc.title }}</h1>
|
||||
<p class="text-center italic mb-8">Author: {{ activeDoc.author }}, et al.</p>
|
||||
|
||||
<h3 class="font-bold text-lg mt-8 mb-2">Abstract</h3>
|
||||
<p class="text-sm leading-relaxed text-gray-700 mb-6 relative group">
|
||||
<span class="bg-red-200/50 border-b-2 border-red-400 cursor-pointer">Background: Translational medicine aims to... (Here is a very long abstract that exceeds the 200 words limit specified by JTIM guidelines. It goes on to describe the historical context, which is unnecessary for a structured abstract. The methodology is briefly mentioned but lacks statistical details.)</span>
|
||||
<span class="absolute left-full ml-2 top-0 w-48 bg-red-50 border border-red-200 text-red-700 p-2 text-xs rounded shadow-lg hidden group-hover:block z-20">
|
||||
<strong>AI 批注:</strong> 摘要未采用 Structured 格式,且字数可能超标。
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<h3 class="font-bold text-lg mt-8 mb-2">Materials and Methods</h3>
|
||||
<p class="text-sm leading-relaxed text-gray-700 mb-6 relative group">
|
||||
Data were analyzed using SPSS. <span class="bg-amber-200/50 border-b-2 border-amber-400 cursor-pointer">A p-value < 0.05 was considered significant.</span>
|
||||
<span class="absolute left-full ml-2 top-0 w-48 bg-amber-50 border border-amber-200 text-amber-700 p-2 text-xs rounded shadow-lg hidden group-hover:block z-20">
|
||||
<strong>AI 批注:</strong> JTIM 稿约要求 P 值报告具体数值,不可简单写 p < 0.05。
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<p class="text-sm text-gray-400 mt-20 text-center">... 模拟文档内容结束 ...</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧: 4-Tab 审查工作台 -->
|
||||
<div class="w-2/5 bg-white flex flex-col overflow-hidden shadow-xl z-20">
|
||||
<!-- Tabs -->
|
||||
<div class="flex border-b border-gray-200 bg-gray-50/80 shrink-0 px-2 pt-2">
|
||||
<button v-for="tab in tabs" :key="tab.id" @click="activeTab = tab.id"
|
||||
class="flex-1 py-2.5 text-sm font-medium border-b-2 transition-colors duration-200 rounded-t-lg mx-1 flex items-center justify-center space-x-1"
|
||||
:class="activeTab === tab.id ? 'border-brand-600 text-brand-700 bg-white shadow-sm' : 'border-transparent text-gray-500 hover:text-gray-700 hover:bg-gray-100'">
|
||||
<i :class="tab.icon"></i>
|
||||
<span>{{ tab.name }}</span>
|
||||
<!-- 红点提示 -->
|
||||
<span v-if="getIssueCount(tab.id) > 0" class="ml-1 w-4 h-4 rounded-full bg-red-100 text-red-600 text-[10px] flex items-center justify-center font-bold">
|
||||
{{ getIssueCount(tab.id) }}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Tab 内容区 -->
|
||||
<div class="flex-1 overflow-y-auto bg-gray-50 p-4">
|
||||
|
||||
<!-- 统计摘要栏 -->
|
||||
<div class="bg-white rounded-lg p-3 mb-4 shadow-sm border border-gray-100 flex justify-between items-center">
|
||||
<div>
|
||||
<h3 class="text-sm font-bold text-gray-800">{{ currentTabName }}评估结果</h3>
|
||||
<p class="text-xs text-gray-500 mt-0.5">AI 已完成初步筛查,请责编确认。</p>
|
||||
</div>
|
||||
<div class="text-right">
|
||||
<span class="text-xs bg-gray-100 text-gray-600 px-2 py-1 rounded">共发现 {{ currentIssues.length }} 个问题</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 问题列表 -->
|
||||
<div class="space-y-3">
|
||||
<div v-for="issue in currentIssues" :key="issue.id"
|
||||
class="bg-white rounded-lg border shadow-sm p-4 transition-all duration-200 relative overflow-hidden"
|
||||
:class="issue.ignored ? 'border-gray-200 opacity-60' : (issue.severity === 'fatal' ? 'border-red-200' : 'border-amber-200')">
|
||||
|
||||
<!-- 侧边装饰条 -->
|
||||
<div class="absolute left-0 top-0 bottom-0 w-1" :class="getSeverityColor(issue.severity, issue.ignored)"></div>
|
||||
|
||||
<div class="flex justify-between items-start pl-2">
|
||||
<div class="flex-1 pr-4">
|
||||
<div class="flex items-center space-x-2 mb-1.5">
|
||||
<span class="text-[10px] font-bold px-1.5 py-0.5 rounded uppercase" :class="getSeverityBadge(issue.severity)">
|
||||
{{ issue.severity === 'fatal' ? '致命错误' : (issue.severity === 'major' ? '主要缺陷' : '一般建议') }}
|
||||
</span>
|
||||
<span class="text-xs text-gray-500 font-mono">{{ issue.code }}</span>
|
||||
</div>
|
||||
<h4 class="text-sm font-bold text-gray-800 mb-1" :class="{'line-through text-gray-500': issue.ignored}">{{ issue.title }}</h4>
|
||||
<p class="text-xs text-gray-600 leading-relaxed mb-3" :class="{'line-through': issue.ignored}">{{ issue.desc }}</p>
|
||||
|
||||
<div v-if="issue.suggestion" class="bg-blue-50/50 rounded p-2 text-xs text-blue-800 border border-blue-100">
|
||||
<i class="fas fa-lightbulb text-amber-500 mr-1"></i> <strong>建议修改:</strong>{{ issue.suggestion }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Human-in-the-loop 操作区 -->
|
||||
<div class="mt-3 pt-3 border-t border-gray-100 flex items-center justify-between pl-2">
|
||||
<span class="text-xs text-gray-400">人工复核确认:</span>
|
||||
<div class="flex bg-gray-100 p-0.5 rounded-lg">
|
||||
<button @click="issue.ignored = false"
|
||||
class="px-3 py-1 text-xs font-medium rounded-md transition-all"
|
||||
:class="!issue.ignored ? 'bg-white shadow-sm text-brand-700' : 'text-gray-500 hover:text-gray-700'">
|
||||
<i class="fas fa-check-circle mr-1" :class="!issue.ignored ? 'text-green-500' : ''"></i> 采纳此问题
|
||||
</button>
|
||||
<button @click="issue.ignored = true"
|
||||
class="px-3 py-1 text-xs font-medium rounded-md transition-all"
|
||||
:class="issue.ignored ? 'bg-white shadow-sm text-gray-800' : 'text-gray-500 hover:text-gray-700'">
|
||||
<i class="fas fa-times-circle mr-1 text-gray-400"></i> 误报/忽略
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 状态为空时 -->
|
||||
<div v-if="currentIssues.length === 0" class="text-center py-12 bg-white rounded-lg border border-gray-200 border-dashed">
|
||||
<div class="w-16 h-16 bg-green-50 text-green-500 rounded-full flex items-center justify-center mx-auto mb-3 text-2xl">
|
||||
<i class="fas fa-check"></i>
|
||||
</div>
|
||||
<h3 class="text-sm font-bold text-gray-700">未发现明显缺陷</h3>
|
||||
<p class="text-xs text-gray-500 mt-1">该维度通过了 AI 的自动化审查。</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 独立组件模板 -->
|
||||
<script>
|
||||
const { createApp } = Vue;
|
||||
|
||||
// 状态图标组件
|
||||
const StatusIcon = {
|
||||
props: ['status'],
|
||||
template: `
|
||||
<div class="flex justify-center">
|
||||
<i v-if="status === 'pass'" class="fas fa-check-circle text-green-500 text-lg"></i>
|
||||
<i v-else-if="status === 'warn'" class="fas fa-exclamation-triangle text-amber-500 text-lg"></i>
|
||||
<i v-else-if="status === 'error'" class="fas fa-times-circle text-red-500 text-lg"></i>
|
||||
<i v-else class="fas fa-spinner fa-spin text-gray-300 text-lg"></i>
|
||||
</div>
|
||||
`
|
||||
};
|
||||
|
||||
createApp({
|
||||
components: { StatusIcon },
|
||||
data() {
|
||||
return {
|
||||
currentView: 'login', // login, dashboard, detail
|
||||
activeTab: 'editorial',
|
||||
activeDoc: null,
|
||||
tabs: [
|
||||
{ id: 'editorial', name: '稿约规范', icon: 'fas fa-clipboard-list' },
|
||||
{ id: 'method', name: '方法学', icon: 'fas fa-microscope' },
|
||||
{ id: 'data', name: '数据验证', icon: 'fas fa-database' },
|
||||
{ id: 'clinical', name: '临床评估', icon: 'fas fa-stethoscope' }
|
||||
],
|
||||
// 模拟稿件列表数据
|
||||
manuscripts: [
|
||||
{ id: 'JTIM-2026-0881', title: 'Efficacy of novel inhibitor in advanced NSCLC: A retrospective cohort study', author: 'Dr. Zhang Wei', date: '2026-03-13', score: 65, status: 'AI审查完毕', dims: { editorial: 'error', method: 'warn', data: 'pass', clinical: 'pass' } },
|
||||
{ id: 'JTIM-2026-0882', title: 'Translational approaches for targeting tumor microenvironment', author: 'Dr. Sarah Connor', date: '2026-03-12', score: 92, status: 'AI审查完毕', dims: { editorial: 'pass', method: 'pass', data: 'pass', clinical: 'pass' } },
|
||||
{ id: 'JTIM-2026-0883', title: 'Machine learning prediction models in diabetic nephropathy', author: 'Dr. Li Hua', date: '2026-03-12', score: 78, status: 'AI审查完毕', dims: { editorial: 'pass', method: 'error', data: 'warn', clinical: 'warn' } },
|
||||
{ id: 'JTIM-2026-0884', title: 'Long-term cardiovascular outcomes after acute COVID-19', author: 'Dr. Michael Chen', date: '2026-03-11', score: 0, status: '待预审', dims: { editorial: '', method: '', data: '', clinical: '' } },
|
||||
],
|
||||
// 模拟 AI 找出的缺陷数据
|
||||
issuesData: {
|
||||
'JTIM-2026-0881': {
|
||||
editorial: [
|
||||
{ id: 101, code: 'ED-001', severity: 'fatal', title: '知情同意声明缺失', desc: '作为回顾性队列研究,正文及 Title Page 均未找到 Informed Consent 相关声明,违反 ICMJE 基本伦理准则。', suggestion: '请作者补充声明已获取知情同意,或说明伦理委员会已豁免。', ignored: false },
|
||||
{ id: 102, code: 'ED-045', severity: 'major', title: '摘要结构不合规', desc: 'JTIM 规定 Original Research 必须使用 Structured Abstract (包含 Objectives, Methods, Results, Conclusions),当前摘要为纯文本段落。', suggestion: '请按指南要求拆分摘要段落。', ignored: false },
|
||||
{ id: 103, code: 'ED-012', severity: 'minor', title: '统计结果 P 值表述不规范', desc: '发现多处 "p < 0.05" 表述。稿约规定应报告 P 值的确切数值 (如 P = 0.048)。', suggestion: '修改 Methods 和 Results 中的 P 值表述。', ignored: false }
|
||||
],
|
||||
method: [
|
||||
{ id: 201, code: 'ME-033', severity: 'major', title: '回归模型未说明共线性检验', desc: '作者构建了多因素 Cox 比例风险模型,但未提及是否对纳入的自变量进行了多重共线性(VIF)检验。', suggestion: '补充共线性诊断的统计学方法描述。', ignored: false }
|
||||
],
|
||||
data: [], // 模拟通过
|
||||
clinical: [
|
||||
{ id: 401, code: 'CL-005', severity: 'minor', title: '创新性一般', desc: '该靶向药在 NSCLC 中的回顾性研究已有较多报道,增量信息(创新性)评分较低。', suggestion: '', ignored: true } // 默认演示一个被忽略的项
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
currentTabName() {
|
||||
return this.tabs.find(t => t.id === this.activeTab)?.name || '';
|
||||
},
|
||||
currentIssues() {
|
||||
if (!this.activeDoc || !this.issuesData[this.activeDoc.id]) return [];
|
||||
return this.issuesData[this.activeDoc.id][this.activeTab] || [];
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
login() {
|
||||
this.currentView = 'dashboard';
|
||||
},
|
||||
openDetail(doc) {
|
||||
this.activeDoc = doc;
|
||||
this.activeTab = 'editorial';
|
||||
this.currentView = 'detail';
|
||||
},
|
||||
getIssueCount(tabId) {
|
||||
if (!this.activeDoc || !this.issuesData[this.activeDoc.id]) return 0;
|
||||
const issues = this.issuesData[this.activeDoc.id][tabId] || [];
|
||||
// 只计算未被忽略的
|
||||
return issues.filter(i => !i.ignored).length;
|
||||
},
|
||||
getSeverityBadge(severity) {
|
||||
if (severity === 'fatal') return 'bg-red-100 text-red-700 border border-red-200';
|
||||
if (severity === 'major') return 'bg-amber-100 text-amber-700 border border-amber-200';
|
||||
return 'bg-blue-100 text-blue-700 border border-blue-200';
|
||||
},
|
||||
getSeverityColor(severity, ignored) {
|
||||
if (ignored) return 'bg-gray-300';
|
||||
if (severity === 'fatal') return 'bg-red-500';
|
||||
if (severity === 'major') return 'bg-amber-500';
|
||||
return 'bg-blue-500';
|
||||
}
|
||||
}
|
||||
}).mount('#app')
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
125
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/AI智能审稿域名与多租户技术指南.md
Normal file
125
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/AI智能审稿域名与多租户技术指南.md
Normal file
@@ -0,0 +1,125 @@
|
||||
# **AI智能审稿系统 (期刊SaaS版) 域名架构与多租户落地技术指南**
|
||||
|
||||
**文档受众:** 架构师、前端研发、后端研发、运维工程师
|
||||
|
||||
**文档目的:** 明确期刊 SaaS 业务的域名规范,规范单点登录(SSO)及多租户鉴权的开发标准,排查并规避泛域名 SSL 证书与第三方回调等运维/安全隐患。
|
||||
|
||||
## **🏗️ 一、 核心架构决策:三级子域名隔离方案**
|
||||
|
||||
经过商业定位与工程复杂度的综合评估,系统采用**基于功能属性的三级子域名方案**:
|
||||
|
||||
**\[tenantId\].review.xunzhengyixue.com** (例如:jtim.review.xunzhengyixue.com)
|
||||
|
||||
### **为什么选择这个方案?**
|
||||
|
||||
1. **商业心智精准**:使用 review 明确了我们是“AI 辅助审稿工具”,而非沉重的全流程投审稿系统,降低客户防备心。
|
||||
2. **品牌与视觉隔离**:彻底抛弃 URL路径隔离,为每个期刊提供独立的门户网址。
|
||||
3. **架构解耦**:与现有的临床研究主站(.yanjiu. 或主域)及临床试验项目(.iit.)在命名空间上完美平行,为未来的 SaaS 矩阵拓展留足空间。
|
||||
|
||||
## **🛠️ 二、 运维团队 (DevOps) 执行清单**
|
||||
|
||||
运维团队需在阿里云环境中完成以下配置,**该方案无需为每个新增期刊重新发布或修改配置**。
|
||||
|
||||
### **1\. DNS 云解析配置 (阿里云)**
|
||||
|
||||
无需每次新增期刊都修改 DNS。请添加一条**泛解析**记录:
|
||||
|
||||
* **主机记录**:\*.review
|
||||
* **记录类型**:A 或 CNAME
|
||||
* **记录值**:指向 SAE 现有的前端 CLB 负载均衡公网 IP(目前为 8.140.53.236)。
|
||||
|
||||
### **2\. ⚠️ 致命避坑:SSL 证书采购与挂载**
|
||||
|
||||
* **红线提醒**:现有的 \*.xunzhengyixue.com 泛域名证书**绝对无法覆盖**四级域名(即无法覆盖 jtim.review.xunzhengyixue.com),直接使用会导致浏览器报红。
|
||||
* **执行动作**:必须重新申请/购买一张专门针对 **\*.review.xunzhengyixue.com** 的泛域名 SSL 证书,并挂载到网关或 CLB 上。
|
||||
|
||||
### **3\. Nginx 路由代理配置**
|
||||
|
||||
前端 frontend-v2 镜像的 nginx.conf 需要配置匹配规则,将所有子域名的请求导向同一个 SPA(单页应用)入口,API 请求依然打向 Node.js 后端。
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
\# 匹配所有的 review 子域名
|
||||
server\_name \~^(?\<tenant\>.+)\\.review\\.xunzhengyixue\\.com$;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
\# 将所有未匹配静态资源的路由回退给 index.html,交由 React Router 处理
|
||||
try\_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
\# 后端 API 转发保持现有配置不变
|
||||
location /api/ {
|
||||
proxy\_pass \[http://172.17.173.73:3001\](http://172.17.173.73:3001);
|
||||
\# ...
|
||||
}
|
||||
}
|
||||
|
||||
## **💻 三、 前端研发 (FE) 执行清单**
|
||||
|
||||
前端代码库保持同一套,依靠初始化时截取 window.location.hostname 来实现“千刊千面”。
|
||||
|
||||
### **1\. 动态截取 TenantID**
|
||||
|
||||
在应用挂载层(如 App.tsx 或路由初始化钩子中)注入租户识别逻辑:
|
||||
|
||||
const host \= window.location.hostname; // e.g., jtim.review.xunzhengyixue.com
|
||||
let currentTenantId \= 'default';
|
||||
|
||||
// 严格判断当前是否处于期刊审查工作台环境
|
||||
if (host.endsWith('.review.xunzhengyixue.com')) {
|
||||
// 提取第一个分段作为 tenantId
|
||||
currentTenantId \= host.split('.')\[0\];
|
||||
}
|
||||
|
||||
// 拿到 currentTenantId (如 'jtim') 后:
|
||||
// 1\. 发起请求:GET /api/v1/tenants/public-info/jtim 获取 Logo、主题色
|
||||
// 2\. 存入全局状态 (Zustand/Redux),应用定制化 UI
|
||||
|
||||
### **2\. 模块级路由屏蔽**
|
||||
|
||||
利用现有的 moduleRegistry.ts,如果当前 tenantId 为期刊客户,隐藏顶部导航中的 AIA、DC、PKB 模块,仅暴露 RVW 模块视图。
|
||||
|
||||
## **⚙️ 四、 后端研发 (BE) 执行清单**
|
||||
|
||||
后端核心挑战在于**跨域资源共享 (CORS)** 以及 **防范多租户架构下的数据越权**。
|
||||
|
||||
### **1\. CORS 动态白名单**
|
||||
|
||||
禁止写死 Origin,在 Fastify / Express 的 CORS 插件中启用正则匹配:
|
||||
|
||||
// 允许主站以及所有的 review 泛域名跨域访问
|
||||
cors: {
|
||||
origin: \[
|
||||
/^https?:\\/\\/(\[a-zA-Z0-9-\]+\\.)?xunzhengyixue\\.com$/,
|
||||
/^https?:\\/\\/(\[a-zA-Z0-9-\]+\\.)?review\\.xunzhengyixue\\.com$/
|
||||
\],
|
||||
credentials: true
|
||||
}
|
||||
|
||||
### **2\. ⚠️ 致命避坑:SSO 单点登录与防越权 (IDOR 防护)**
|
||||
|
||||
由于我们采用底层复用 platform\_schema.users 的机制,JWT Cookie 会在主域下共享。这带来极大的越权风险。
|
||||
|
||||
* **SSO 签发**:登录时,后端校验用户身份后,必须将当前所在的 tenantId 压入 JWT Payload。
|
||||
* **双重校验防线 (必须写进中间件 auth.middleware.ts)**:
|
||||
当一个请求打到 /api/v2/rvw/tasks 时,中间件必须校验两件事:
|
||||
1. Token 解析出的 userId 是否有效。
|
||||
2. **跨域校验**:该用户是否有权限访问当前 HTTP 请求 Header 中声明的 x-tenant-id(或者通过请求域名解析出的 tenant)。如果张医生是 iit 的用户,但拿着 Token 试图请求 jtim 租户的数据,**必须直接拦截并返回 403 Forbidden**。
|
||||
* **ORM 级隔离**:所有针对 RVW 模块的 Prisma 查询,必须强制附带 where: { tenantId: request.tenantId },严禁“裸查”。
|
||||
|
||||
## **🔮 五、 未来架构扩展预警:第三方登录限制**
|
||||
|
||||
**【风险说明】**
|
||||
|
||||
如果您未来计划在 jtim.review... 等域名上引入“微信扫码登录”或微信支付。微信开放平台的安全机制通常要求配置**绝对精准的回调域名**,往往不支持通配符(\*.review...),且回调域名数量有严格上限。
|
||||
|
||||
**【架构预案:统一认证网关】**
|
||||
|
||||
为了应对该问题,平台在未来演进时,应规划统一的 Auth Center:
|
||||
|
||||
1. 任何期刊页面点击“微信登录”,统一 302 Redirect 跳转至主站网关(如 login.xunzhengyixue.com/wechat)。
|
||||
2. 主站统一处理微信回调,生成系统内部的 JWT SSO Token。
|
||||
3. 主站将 Token 携带在参数或安全 Cookie 中,再次 302 Redirect 飞回 jtim.review.xunzhengyixue.com/callback,完成身份同步。
|
||||
(目前 MVP 阶段账号密码登录不受此限制,仅作未来规划记录)。
|
||||
@@ -0,0 +1,141 @@
|
||||
# **智能审稿系统 (期刊SaaS版) V4.0 产品需求文档 (PRD)**
|
||||
|
||||
**文档版本:** V1.6 (新增统一通行证 SSO 与动态租户登录架构)
|
||||
|
||||
**制定日期:** 2026-03-14
|
||||
|
||||
**产品名称:** RVW 智能审稿系统 (Journal AI Review SaaS)
|
||||
|
||||
**目标用户:** 医学期刊编辑部(主编/责编)、期刊外审专家、投稿作者
|
||||
|
||||
**核心定位:** 为医学期刊量身定制的、支持高度个性化配置的独立 AI 预审稿 SaaS 平台。
|
||||
|
||||
**💡 MVP 阶段战略提示:** 为降低初期开发成本并把控质量,系统初期采用 **Managed SaaS(代运营/配置)模式**。复杂的底层规则配置由内部运营/实施团队通过现有的 ADMIN 管理端完成。外部期刊客户只需“开箱即用”业务端。
|
||||
|
||||
## **1\. 产品背景与目标**
|
||||
|
||||
### **1.1 演进背景**
|
||||
|
||||
当前 RVW 模块(V3.0.1)具备了强大的 4 维审查能力。但与临床科研人员共用平台存在品牌混杂、审查标准缺乏弹性、管理权限缺失等痛点。不同期刊(如英文 SCI 期刊 JTIM vs 中文核心期刊)的稿约规范、重点审查维度截然不同,系统亟需多租户的个性化配置能力。
|
||||
|
||||
### **1.2 产品目标**
|
||||
|
||||
1. **SaaS 化业务端升级**:引入“租户(Tenant)”隔离,每个期刊作为一个独立租户,拥有独立的子域名、独立登录页、独立品牌标识的业务端工作台。
|
||||
2. **建立完整的期刊工作流**:涵盖“作者投递预审 \-\> 责编复核 \-\> 勾选重组 \-\> 导出内部报告/发送作者退修信”。
|
||||
3. **架构收敛的内部配置中枢 (核心)**:**不另起炉灶开发独立配置中心**,而是深度扩展现有的 ADMIN 运营管理端。利用现有的租户管理体系(Tenant),实现跨期刊的审稿流水线无缝配置。
|
||||
4. **统一通行证 (SSO)**:期刊用户与现有临床研究平台用户底层互通,实现跨域无缝漫游,沉淀统一的医生/专家账号体系。
|
||||
|
||||
## **2\. 角色与权限体系**
|
||||
|
||||
| 角色类型 | 典型用户 | 核心权限清单 |
|
||||
| :---- | :---- | :---- |
|
||||
| **内部实施/超管** | 壹证循运营团队 | **MVP 阶段的核心主导者**。拥有 ops:user-ops 及 SUPER\_ADMIN 权限。在现有的 ADMIN 端 TenantDetailPage 中,为不同期刊租户编排 Skills 规则、配置动态 Prompt 及 Handlebars 模板。 |
|
||||
| **期刊主编/管理员** | 期刊编辑部主任 | 纯业务视角。查看本刊数据仪表盘、管理责编账号、查阅本刊所有稿件审查进度。**MVP 阶段无需登录底层 ADMIN 端**。 |
|
||||
| **期刊责编** | 期刊审稿编辑 | 登录期刊专属 URL,接收稿件、触发 AI 审查、人工复核确认缺陷项、导出内部报告与给作者的退修信。 |
|
||||
|
||||
## **3\. 核心功能需求 (Functional Requirements)**
|
||||
|
||||
### **3.1 期刊专属门户与统一通行证 (Business Portal & SSO)**
|
||||
|
||||
交付给外部期刊责编的核心业务模块。该模块在底层与临床研究主站共用同一套用户体系(platform\_schema.users),实现“统一通行证”体验,在表层依靠以下机制实现业务硬隔离:
|
||||
|
||||
* **子域名路由区分 (Domain Routing)**:支持按拼音或缩写生成独立 URL(例:jtim.xunzhengyixue.com)。前端应用初始化时,通过解析 window.location.hostname 自动切入“期刊工作台模式”。
|
||||
* **动态定制化登录页 (Dynamic Login UI)**:用户访问子域名时,前端在未登录态下请求该租户的公开配置(公开接口)。据此渲染完全定制化的期刊专属登录页(独立的期刊 Logo、专属品牌色、独立背景图),在视觉上打造完全独立的系统心智。
|
||||
* **沉浸式 4-Tab 审稿详情页**:优先渲染大模型生成的 expert\_report\_markdown (由内部团队在配置中心编写的 Handlebars 模板渲染而成)。
|
||||
* **退修信自动生成与双轨导出**:基于责编在 AI 找出的“缺陷列表”中的勾选确认项,一键生成语气委婉专业、条理清晰的 Letter to Authors。
|
||||
|
||||
### **3.2 租户审查配置扩展 (ADMIN 模块深度集成) ——**
|
||||
|
||||
![][image1]**定位说明**:直接在现有的运营管理端(ADMIN)的**租户详情页 (TenantDetailPage)** 中进行能力扩展,实现“千刊千面”。
|
||||
|
||||
#### **3.2.1 UI 集成方案:新增“智能审稿配置” Tab**
|
||||
|
||||
在现有的 TenantDetailPage(目前包含“基础信息”、“模块配置”、“配额管理”等)中,新增一个名为 **【智能审稿配置 (RVW Skills)】** 的 Tab。内部人员在此进行以下 4 大 Skills 的个性化编排:
|
||||
|
||||
1. **稿约规范评估 (Editorial Skill) 配置**:
|
||||
* **提取规则维护**:列表化维护该期刊的特有规则(如:AI署名检测、摘要字数限制)。
|
||||
* **一票否决 (Fatal) 设定**:勾选致命错误项,触发时直接高亮拦截。
|
||||
2. **方法学评估 (Methodology Skill) 动静分离配置**:
|
||||
* **评判标准配置 (Business Criteria Prompt)**:自然语言文本框,交代该期刊的特殊审查要求(如:“必须提供 P 值的精确值”)。
|
||||
* **报告展示模板 (Handlebars Template)**:利用 ADMIN 现有的模板渲染引擎,配置该期刊最终审查报告的排版样式(如 1、2、3 点列表,或特定专家语气)。
|
||||
3. **数据验证 (Data Forensics Skill) 配置**:
|
||||
* 验证深度下拉选项(L1 算术验证 / L2 统计学验证 / L3 双通道核查)。
|
||||
4. **临床专业评估 (Clinical Skill) 配置**:
|
||||
* FINER 权重配置(5 个输入框控制总和为 100% 的打分权重)。
|
||||
* 专科特色补充文本。
|
||||
|
||||
## **4\. 技术架构影响与底层升级指南**
|
||||
|
||||
此次升级完美契合平台现有的 Postgres-Only 架构与 ADMIN 模块基建。
|
||||
|
||||
### **4.1 数据模型扩展 (Database Schema)**
|
||||
|
||||
在 platform\_schema 中保持现有的 tenants 表作为核心,新增 1 对 1 扩展表:
|
||||
|
||||
* **新增表 tenant\_rvw\_configs**:
|
||||
* tenant\_id (外键,关联 tenants.id)
|
||||
* editorial\_rules (JSONB: 存储稿约规则数组及 fatal 标记)
|
||||
* methodology\_expert\_prompt (Text: 专家的业务评判标准)
|
||||
* methodology\_handlebars\_template (Text: 报告渲染模板)
|
||||
* data\_forensics\_level (Enum: L1/L2/L3)
|
||||
* finer\_weights (JSONB: 临床评估的五维权重)
|
||||
|
||||
### **4.2 Prompt “动静分离” 与双轨输出落地**
|
||||
|
||||
针对 PromptService 进行架构升级,彻底解决 JSON 崩溃问题:
|
||||
|
||||
* **静态协议层 (系统级,不可更改)**:
|
||||
* 在 capability\_schema.prompt\_templates 表中,固化一条名为 RVW\_METHODOLOGY\_SYSTEM\_BASE 的记录。
|
||||
* 内容写死:强制开启 Structured Output (或 JSON Schema),必须返回 system\_metrics (含 20 项检查点状态) 和 expert\_report\_markdown 两个节点。
|
||||
* **动态业务层 (租户级,内部运营可调)**:
|
||||
* 内容来源于新增的 tenant\_rvw\_configs 表的 methodology\_expert\_prompt 字段。
|
||||
* **运行时拼装 (Runtime Concat)**:
|
||||
* SkillExecutor 执行时,先通过 promptService.get('RVW\_METHODOLOGY\_SYSTEM\_BASE') 获取底层系统约束。
|
||||
* 再拉取当前 tenantId 的动态业务评判标准。
|
||||
* **内存拼接后发送给 LLM**。大模型会根据专家的排版要求,将纯净的格式化文本填充至 expert\_report\_markdown 字段中。
|
||||
* **展示层渲染 (Handlebars)**:
|
||||
* 结合现有的 Handlebars 渲染器与租户存储的 methodology\_handlebars\_template,在前端/导出时直接渲染,实现“专家零感知 JSON”。
|
||||
|
||||
### **4.3 接口权限中间件复用**
|
||||
|
||||
* **内部配置权限**:复用现有的 ops:user-ops 与 requireModule 中间件,控制内部人员进入 TenantDetailPage 修改审稿配置。
|
||||
* **外部业务权限**:所有 RVW 业务 API (/api/v2/rvw/\*) 复用租户边界校验,确保稿件数据硬隔离。
|
||||
|
||||
### **4.4 统一账号与鉴权体系 (SSO)**
|
||||
|
||||
为了实现医生专家在“临床科研平台”与“各期刊 SaaS 门户”之间的无缝漫游,架构需遵守以下设计:
|
||||
|
||||
* **绝对底层复用**:禁止为期刊 SaaS 业务新建独立的用户库,全面复用现有的 platform\_schema.users。同一个账号密码,既可登录主站做数据清洗(DC),也可登录 jtim. 子域名进行审稿。
|
||||
* **JWT 会话隔离 (Session Isolation)**:身份认证层 auth.service.ts 需升级。在签发 JWT 时,后端必须根据登录请求携带的租户上下文(tenantId),将其压入 Payload。系统的 auth.middleware.ts 提取该 tenantId 实现全局请求的行级数据隔离。
|
||||
* **模块动态过滤 (Module Filtering)**:依托平台现有的 user\_modules 体系,当识别到用户登录在某期刊租户(如 JTIM)下,由于该租户仅订阅了 RVW 模块,系统会自动隐藏左侧/顶部的 AIA、DC、PKB 等所有无关入口,为编辑提供纯粹的沉浸式工作台。
|
||||
|
||||
## **5\. 迭代演进路线图 (Roadmap)**
|
||||
|
||||
通过复用现有的 ADMIN 模块,Phase 2 的前端开发工作量将缩减 50% 以上。
|
||||
|
||||
### **Phase 1: 统一账号隔离与扩展表 (预计 1 周)**
|
||||
|
||||
* 创建 Prisma 模型 tenant\_rvw\_configs 并执行迁移。
|
||||
* 开发基于域名的动态路由拦截器,实现子域名加载特定的登录 UI。
|
||||
* 升级 JWT 签发逻辑,确保 Token Payload 中正确注入租户上下文。
|
||||
|
||||
### **Phase 2: ADMIN 运营端深度集成 (预计 1.5 周)**
|
||||
|
||||
* **UI 扩展**:在 frontend-v2 的 TenantDetailPage.tsx 中新增 【智能审稿配置】Tab 页及对应的表单组件。
|
||||
* **后端 API**:新增 /api/admin/tenants/:id/rvw-config 的 CRUD 接口。
|
||||
* **引擎改造**:重构 SkillExecutor,读取扩展表配置,并落实 Prompt 的“静态系统层 \+ 动态租户层”拼装逻辑(Hybrid Schema)。
|
||||
|
||||
### **Phase 3: 面向外部的业务端重构及双轨导出 (预计 2 周)**
|
||||
|
||||
* 沉淀通用英文审稿规范(如 ICJME/COPE 标准)至底层预制规则库。
|
||||
* 上线 **作者退修信 (Author Reply Letter)** 一键生成功能。
|
||||
* 全面跑通独立工作台上的全流程,交付给首批期刊客户(如 JTIM, CMJ)进行 Beta 测试。
|
||||
|
||||
## **6\. 验收标准**
|
||||
|
||||
1. **统一账号漫游**:用户在主站注册账号后,无需重新注册即可用相同账密登录专属的期刊入口(如 JTIM子域名)。
|
||||
2. **架构收敛**:没有开发新的独立配置后台,所有配置均在现有的 ADMIN \-\> TenantDetailPage 中顺滑完成,权限体系(ops:user-ops)复用良好。
|
||||
3. **极速生效与不冲突**:内部实施人员在 TenantDetailPage 修改某期刊的 Handlebars 模板文本。点击保存后,即刻影响客户新上传稿件的最终报告显示排版,且底层的 JSON 解析 100% 成功,系统零崩溃。
|
||||
4. **双轨导出功能**:外部责编能够在查阅完全部 AI 评估后,在弹出的窗口中勾选 3 个致命错误,点击“生成退修信”,系统随即利用专属信函模板生成一封精准的专业邮件/Word。
|
||||
|
||||
[image1]: <data:image/png;base64,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>
|
||||
131
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/RVW V4.0 期刊租户配置中心开发需求.md
Normal file
131
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/RVW V4.0 期刊租户配置中心开发需求.md
Normal file
@@ -0,0 +1,131 @@
|
||||
# **RVW V4.0 期刊租户配置中心开发需求**
|
||||
|
||||
**模块定位:** 依托现有 ADMIN 运营端 TenantDetailPage,为每个期刊客户建立独立的配置中枢。
|
||||
|
||||
**核心目标:** 实现期刊 SaaS 的“千刊千面”,包括基础品牌信息定制与底层 AI 审稿 Skills 规则的动态编排。
|
||||
|
||||
## **🎯 一、 前端 UI 与功能分区要求**
|
||||
|
||||
在现有的 ADMIN 租户详情页(TenantDetailPage)中,构建两大核心配置区块(可作为独立的 Tab 或折叠面板):
|
||||
|
||||
### **区块 1:期刊基础信息与门户配置 (Basic Info & Portal)**
|
||||
|
||||
用于定义该期刊的对外面貌和访问入口。
|
||||
|
||||
| 配置项名称 | 字段类型 | UI 组件 | 功能说明 |
|
||||
| :---- | :---- | :---- | :---- |
|
||||
| **期刊全称** | String | 文本输入框 | 如:*Journal of Translational Internal Medicine*。显示在登录页及工作台顶部。 |
|
||||
| **访问路径 (URL Slug)** | String | 文本输入框 (需正则校验) | **极重要**:用于生成 review.xunzhengyixue.com/{slug}。仅允许小写字母、数字和连字符。 |
|
||||
| **期刊 Logo** | String | 图片上传组件 | 上传至 OSS 后保存 URL。用于替换默认的系统 Logo。 |
|
||||
| **品牌主色调** | String | 颜色拾取器 (Color Picker) | 支持 HEX 色值(如 \#0284c7)。用于动态渲染按钮和高亮文字。 |
|
||||
| **专属登录页背景图** | String | 图片上传组件 | (可选) 替换登录页的默认背景,增强品牌沉浸感。 |
|
||||
|
||||
### **区块 2:智能审稿配置 (RVW Skills Config)**
|
||||
|
||||
这是该模块的核心,分为 4 个独立的配置面板(Panel):
|
||||
|
||||
#### **Panel A: 稿约规范评估 (Editorial)**
|
||||
|
||||
* **规则列表维护**:支持增删改查。每条规则需包含 规则编号 (Code) 和 规则描述 (Description)。
|
||||
* **致命错误开关 (Fatal Flag)**:每条规则后跟随一个 Switch 开关。开启后,该项缺陷将作为“一票否决”项在前端红底高亮。
|
||||
|
||||
#### **Panel B: 方法学评估 (Methodology) \- 【需支持动静分离与预览】**
|
||||
|
||||
* **专家评判标准 (Prompt)**:大文本框。供运营人员输入该期刊特有的统计学和方法学要求(大模型读取)。
|
||||
* **报告展示模板 (Handlebars)**:大文本框。用于配置最终输出给责编的 Markdown 格式。
|
||||
* ⚠️ **强依赖功能:测试渲染 (Test Render)**:**必须**在模板编辑区提供一个“预览”按钮。点击后,使用系统内置的假 JSON 数据(Mock Data)与当前模板进行结合,在右侧弹出抽屉实时渲染出 Markdown 结果,以防止语法错误。
|
||||
|
||||
#### **Panel C: 数据验证 (Data Forensics)**
|
||||
|
||||
* **验证深度 (Level)**:提供三个单选按钮(Radio):
|
||||
* L1 算术验证:仅核对行列加总、百分比。
|
||||
* L2 统计验证:包含 L1,增加 CI↔P 一致性逆向验证(推荐)。
|
||||
* L3 双通道核查:包含 L2,增加大模型智能深度核查(耗时较长)。
|
||||
|
||||
#### **Panel D: 临床专业评估 (Clinical)**
|
||||
|
||||
* **FINER 权重占比**:提供 5 个数字输入框(或滑块),分别对应 Feasibility, Innovation, Novelty, Ethical, Relevant。前端需实时校验总和是否等于 100%。
|
||||
* **专科特色要求**:文本区,填写该期刊的专科倾向性偏好(如:心血管领域的特殊要求)。
|
||||
|
||||
## **💾 二、 数据库 Schema 设计 (Prisma)**
|
||||
|
||||
本模块涉及两部分数据的存储:基础信息存入已有的 Tenants 表,审稿配置存入新增的 TenantRvwConfig 表。
|
||||
|
||||
### **1\. 基础信息存储 (platform\_schema.tenants)**
|
||||
|
||||
利用现有的租户表。假设现有表结构已有 code (即 URL Slug) 和 name (期刊名称)。对于 Logo、颜色等品牌视觉资产,建议统一存入 config JSON 字段中。
|
||||
|
||||
// 无需新建表,在原 Tenants 表中合理利用字段
|
||||
model Tenant {
|
||||
id String @id @default(uuid())
|
||||
code String @unique // 对应 URL Slug,如 'jtim'
|
||||
name String // 期刊全称
|
||||
|
||||
// 品牌视觉信息存入此 JSON 字段,避免频繁改表结构
|
||||
config Json? // 格式:{ logoUrl: "...", brandColor: "\#...", bgImgUrl: "..." }
|
||||
|
||||
rvwConfig TenantRvwConfig? // 关联 RVW 配置表
|
||||
}
|
||||
|
||||
### **2\. RVW Skills 配置存储 (新增表)**
|
||||
|
||||
执行 prisma migrate dev 创建以下 1对1 扩展表:
|
||||
|
||||
model TenantRvwConfig {
|
||||
id String @id @default(uuid())
|
||||
tenantId String @unique
|
||||
tenant Tenant @relation(fields: \[tenantId\], references: \[id\])
|
||||
|
||||
// Panel A: 稿约规范 (存为 JSON 数组)
|
||||
// 结构: \[{ code: 'ED-01', desc: '摘要需控制在250字内', isFatal: true }\]
|
||||
editorialRules Json?
|
||||
|
||||
// Panel B: 方法学评估
|
||||
methodologyExpertPrompt String? @db.Text
|
||||
methodologyHandlebarsTemplate String? @db.Text
|
||||
|
||||
// Panel C: 数据验证
|
||||
dataForensicsLevel String @default("L2") // 'L1', 'L2', 'L3'
|
||||
|
||||
// Panel D: 临床评估 (存为 JSON)
|
||||
// 结构: { f: 20, i: 20, n: 20, e: 20, r: 20 }
|
||||
finerWeights Json?
|
||||
clinicalExpertPrompt String? @db.Text
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@schema("platform\_schema")
|
||||
}
|
||||
|
||||
## **🔌 三、 后端 API 接口设计**
|
||||
|
||||
新增统一的租户管理与 RVW 配置接口:
|
||||
|
||||
### **1\. 内部 ADMIN 配置接口 (需要 ops:user-ops 权限)**
|
||||
|
||||
* PUT /api/admin/tenants/:id/basic-info:更新期刊名称、Slug、品牌 Logo 等信息。
|
||||
* GET /api/admin/tenants/:id/rvw-config:获取指定期刊的 Skills 配置。
|
||||
* PUT /api/admin/tenants/:id/rvw-config:UPSERT (更新或创建) 期刊 Skills 配置。
|
||||
|
||||
### **2\. 公开业务接口 (无 Auth,用于动态登录页渲染)**
|
||||
|
||||
* GET /api/v1/tenants/public-info/:slug
|
||||
* **参数**:slug (例如 'jtim')
|
||||
* **返回**:{ name, logoUrl, brandColor, bgImgUrl }
|
||||
* **限流要求**:必须添加 Rate Limiting (防刷防爬)。
|
||||
|
||||
## **👥 四、 实施 SOP:用户与期刊绑定(无需开发)**
|
||||
|
||||
**给开发团队的提示**:业务上,客户(责编)登录 /jtim 后能看到 JTIM 的稿件,依赖于正确的账号绑定。这部分**不需要开发新功能**,但需要通知实施团队遵循以下 SOP:
|
||||
|
||||
1. 客户在主站注册账号(或由超管分配账号)。
|
||||
2. 内部超管在 ADMIN 端的 **【用户管理 \-\> 租户成员管理】** 页面,将该用户的账号添加到目标期刊租户(如 JTIM)下。
|
||||
3. 确保该用户拥有 RVW 模块的使用权限。
|
||||
4. **验证**:此后该用户访问 review.xunzhengyixue.com/jtim 时,JWT 中会自动带上该租户身份,接口方可放行。
|
||||
|
||||
## **✅ 五、 验收标准 (Definition of Done)**
|
||||
|
||||
1. 运营人员可在后台顺滑配置 JTIM 和 CMJ 两套截然不同的方法学 Prompt 和 Handlebars 模板。
|
||||
2. 在 Handlebars 编辑器中点击“预览”,能立刻看到正确渲染的 Markdown 格式报告,不报错。
|
||||
3. 未登录用户访问 review.xunzhengyixue.com/jtim 时,登录页自动变更为 JTIM 的名称、Logo 和主色调。
|
||||
73
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/核心技术难点与防范指南.md
Normal file
73
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/核心技术难点与防范指南.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# **RVW V4.0 智能审稿 SaaS:核心技术难点与稳定性防范指南**
|
||||
|
||||
**文档受众:** 后端研发、前端研发、AI 算法工程师
|
||||
|
||||
**文档目的:** 针对 RVW V4.0 (期刊SaaS版) 引入的“混合 Schema 双轨输出”与“SSO 统一通行证”架构,提前识别系统稳定性风险,并确立工程防范底线。
|
||||
|
||||
## **⚠️ 难点一:Hybrid Schema 模式下的 JSON 转义风暴**
|
||||
|
||||
**【风险描述】**
|
||||
|
||||
我们在架构中设计了“混合 Schema”模式,要求 LLM 在输出结构化 system\_metrics 的同时,在一个名为 expert\_report\_markdown 的 JSON 字段内输出几千字的自然语言长文本。
|
||||
|
||||
大模型在生成含有大量回车换行(\\n)、双引号(")、特殊反斜杠(\\)的医学长文本时,极易发生**转义字符遗漏**。几千字的文本中只要漏掉一个转义符,后端的 JSON.parse() 就会发生致命崩溃。
|
||||
|
||||
**【开发防范方案】**
|
||||
|
||||
1. **API 层强约束 (Structured Outputs)**:
|
||||
* 彻底摒弃在 Prompt 中软性要求 JSON。必须在调用 DeepSeek-V3 / GPT-4o 时,在 API 传参层强制开启 response\_format: { type: "json\_object" } 或直接传入严格的 JSON Schema。
|
||||
2. **容错解析器 (Robust Parser)**:
|
||||
* 不要直接使用原生的 JSON.parse。建议引入容错率更高的解析库(如 jsonrepair 或通过正则预处理),在解析失败时能自动修复常见的截断或转义错误。
|
||||
3. **拥抱 Partial 容灾**:
|
||||
* 即使 JSON 彻底损坏,**决不允许让整个审稿流程(4个 Skill 并行)全部挂掉**。必须复用 V3.0 中已成熟的 Promise.allSettled 和 partial\_completed 机制,将解析失败的 Skill 优雅降级并记录至 error\_details。
|
||||
|
||||
## **⚠️ 难点二:Prompt 与 Handlebars 模板的隐性强耦合**
|
||||
|
||||
**【风险描述】**
|
||||
|
||||
内部实施人员在 ADMIN 端配置时,需要手写“评判标准 (Prompt)”和“展示模板 (Handlebars)”。
|
||||
|
||||
* **问题 A (变量错位)**:Prompt 要求大模型输出 5 个字段,但 Handlebars 模板里写了接收 6 个字段的占位符(如 {{missing\_field}})。
|
||||
* **问题 B (AI 幻觉断层)**:Handlebars 模板严格依赖循环 {{\#each checkpoints}},期望渲染 20 项。但由于大模型“注意力稀释”,只输出了 18 项,导致生成的报告在视觉排版上出现错位或断层。
|
||||
|
||||
**【开发防范方案】**
|
||||
|
||||
1. **数据 Schema 校验防线 (Zod)**:
|
||||
* 在 LLM 返回数据交由 Handlebars 渲染之前,必须经过 Zod 进行 Schema 强校验。对于缺失的非致命字段,给予默认值(Fallback value)填充。
|
||||
2. **防御性模板渲染 (Defensive Templating)**:
|
||||
* 在向运营人员开放的 Handlebars 模板规范中,强制推行防御性语法。例如,大量使用 {{\#if field}} ... {{else}} ... {{/if}},避免因字段缺失导致渲染报错或出现大片空白。
|
||||
|
||||
## **⚠️ 难点三:长上下文与重度推理导致的超时灾难 (Timeout)**
|
||||
|
||||
**【风险描述】**
|
||||
|
||||
审稿业务是典型的“长上下文(数十页医学 PDF,可能超 2 万 Token)+ 复杂推理(20项方法学规则)”场景。
|
||||
|
||||
结合现有的云原生架构(阿里云 SAE 部署),Serverless 网关通常存在 60 秒的请求超时限制。LLM 在处理超长文献和生成千字报告时,单次请求耗时极易突破 60\~120 秒,导致前端直接报 504 Gateway Timeout。
|
||||
|
||||
**【开发防范方案】**
|
||||
|
||||
1. **异步队列为王 (Platform-Only 架构复用)**:
|
||||
* 严禁在 HTTP 请求的生命周期内同步等待大模型返回。必须将审稿任务投递至平台层的 pg-boss 队列 (platform\_schema.job)。
|
||||
2. **状态轮询与 SSE 进度流**:
|
||||
* 前端通过发起 GET /api/v2/rvw/tasks/:id/status 进行轮询,或直接接入 SSE (Server-Sent Events) 接收后台 reviewWorker 实时推流的执行进度。
|
||||
3. **Skill 内部并发 (Map-Reduce)**:
|
||||
* 针对最耗时的 MethodologySkill,后端可考虑将其拆分为“科研设计”、“统计学描述”、“结果评估”三个子请求,向 LLM 发起内部并发,并在汇总后一起喂给 Handlebars 渲染,以空间(Token 成本)换取时间。
|
||||
|
||||
## **⚠️ 难点四:SSO 统一账号下的多租户越权风险**
|
||||
|
||||
**【风险描述】**
|
||||
|
||||
为了实现医生与专家在“主站”与“期刊 SaaS 子域名”间的无缝漫游,我们采取了“统一底层 users 表”的架构。
|
||||
|
||||
这种架构最大的安全隐患是**数据越权(Data Leakage)**。如果 API 接口没有严格限制上下文,A 期刊(JTIM)的责编可能会通过修改请求参数,查看到 B 期刊(CMJ)的待审稿件库。
|
||||
|
||||
**【开发防范方案】**
|
||||
|
||||
1. **JWT 强制注入上下文**:
|
||||
* 登录签发 Token 时,必须将当前的 tenantId 压入 JWT Payload。
|
||||
2. **Prisma 拦截器 / RLS (Row-Level Security)**:
|
||||
* 在后端的 auth.middleware.ts 中提取 tenantId 后,**所有**涉及 RVW 模块的 Prisma 查询(findMany, update, delete 等),必须在 where 子句中强制挂载 tenantId: request.tenantId 的条件。
|
||||
* 建议在开发规范中明确:禁止任何跳过 tenantId 校验的业务端裸查(除非是带有 ops:user-ops 权限的内部实施端操作)。
|
||||
3. **路由鉴权守护**:
|
||||
* 依赖现有的 requireModule 中间件,严格确保只有订阅了 RVW 模块的租户用户,才能访问对应的审稿数据。
|
||||
86
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/通用英文医学期刊稿约审查标准.md
Normal file
86
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/V3.0/通用英文医学期刊稿约审查标准.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# **通用英文医学期刊稿约审查标准 (Universal Submission Guidelines)**
|
||||
|
||||
**文档说明:** \> 本文档基于国际医学期刊编辑委员会(ICMJE)规范及主流 SCI/英文医学期刊的共性要求提炼。适用于英文医学论文在投稿前的全面自查及预审工作。
|
||||
|
||||
**核心逻辑:** 英文期刊审查采取\*\*“伦理一票否决制”**与**“体例严格限制制”\*\*。
|
||||
|
||||
## **🛑 第一部分:一票否决项(致命拒稿点)**
|
||||
|
||||
发生以下任何一种情况,稿件通常会被编辑部直接拒稿(Desk Rejection),甚至可能引发学术不端调查:
|
||||
|
||||
* \[ \] **AI 署名违规**:作者名单中绝对不能包含 ChatGPT、LLM、AI 或任何人工智能工具的名称。AI 无法对研究负责,不具备署名资格。
|
||||
* \[ \] **盲审违规(若期刊要求双盲)**:正文(Main Text / Blinded Article)中绝对不能出现作者姓名、机构名称、致谢以及能够明显暴露作者身份的资助编号或伦理批号。此类信息必须分离至首页(Title Page)。
|
||||
* \[ \] **一稿多投 / 重复发表声明缺失**:必须明确声明该稿件未在其他地方发表,也未同时投递给其他期刊。
|
||||
* \[ \] **伦理与知情同意缺失**:涉及人类或动物的实验,未提供伦理委员会(IRB/IACUC)批准说明;涉及人类受试者(含病例报告),未提供知情同意书(Informed Consent)获取声明。
|
||||
|
||||
## **📝 第二部分:结构化预审清单 (Submission Checklist)**
|
||||
|
||||
### **1\. 首页与元数据 (Title Page & Metadata)**
|
||||
|
||||
英文期刊通常要求将作者信息与正文分离,以满足盲审需求。
|
||||
|
||||
* \[ \] **文章标题 (Title)**:简明扼要,注意期刊要求的是 Title case(实词首字母大写)还是 Sentence case(仅句首首字母大写)。
|
||||
* \[ \] **短标题 (Running Head/Short Title)**:通常限制在 **50\~75个字符** 以内(含空格)。
|
||||
* \[ \] **作者信息 (Authorship)**:
|
||||
* 必须明确标注 **通讯作者 (Corresponding author)**(提供完整机构地址、邮编及有效邮箱)。
|
||||
* 强烈建议/强制提供主要作者的 **ORCID**。
|
||||
* 检查作者总数限制(部分期刊对病例报告或综述有严格的作者人数上限,如不超过4人)。
|
||||
* \[ \] **统计声明 (Counts)**:必须在首页明确列出:总字数(分摘要和正文)、表格数、图片数。
|
||||
|
||||
### **2\. 声明与合规模块 (Declarations & Compliance) —— 【英文核心考点】**
|
||||
|
||||
所有英文医学期刊均要求在正文末尾或独立填写包含以下内容的声明章节:
|
||||
|
||||
* \[ \] **利益冲突声明 (Conflict of Interest)**:必须提供。即使没有利益冲突,也必须明确写出 "The authors declare no conflict of interest." 或 "None declared."。
|
||||
* \[ \] **资金资助声明 (Funding/Support)**:写明资助机构全称及项目批准号。若无资助,也需明确声明。
|
||||
* \[ \] **作者贡献声明 (Author Contributions)**:清晰列出每位作者的具体贡献(如:概念设计、数据采集、统计分析、论文撰写等)。
|
||||
* \[ \] **AI 辅助声明 (AI Statement)**:如果在数据分析、大纲生成或语言润色中使用了 AI 工具,必须声明使用了何种工具及具体用途。
|
||||
* \[ \] **数据可用性声明 (Data Availability)**:说明支撑研究结果的数据在哪里可以获取(如:公开数据库、按需向通讯作者索取等)。
|
||||
* \[ \] **临床试验注册 (Trial Registration)**:若为临床干预试验,必须提供 WHO 认可的注册机构名称及注册号(如 UTN, NCT number)。
|
||||
|
||||
### **3\. 摘要与关键词 (Abstract & Keywords)**
|
||||
|
||||
* \[ \] **摘要格式匹配**:
|
||||
* **原创论著 (Original Research)**:强制要求 **结构化摘要 (Structured Abstract)**。必须包含如 Background/Objectives, Methods, Results, Conclusions 的明确小标题。字数通常严格限制在 **200 \- 250 words**。
|
||||
* **综述/病例报告 (Review/Case Report)**:通常为 **非结构化摘要 (Unstructured)**。字数限制在 **150 \- 200 words**。
|
||||
* \[ \] **关键词 (Keywords)**:通常提供 **3-6个** 或 **3-8个** 关键词。多用分号 (;) 隔开。必须与 MeSH 词表尽量对齐。
|
||||
|
||||
### **4\. 正文结构要求 (Main Text Structure)**
|
||||
|
||||
* \[ \] **IMRAD 结构检查(针对论著)**:
|
||||
* 标准章节结构必须为:Introduction (引言), Methods/Materials and Methods (方法), Results (结果), Discussion (讨论)。部分期刊可能要求 Conclusions (结论) 单列。
|
||||
* \[ \] **方法学 (Methods) 细节**:
|
||||
* 必须详细说明所用的**统计学软件**(含版本和公司名称位置,如 SPSS version 26.0, IBM, NY, USA)。
|
||||
* P 值的报告需精确(如 ![][image1]),而非简单写 ![][image2]。
|
||||
* \[ \] **引言 (Introduction) 限制**:部分期刊严格限制引言的篇幅(如仅需交代研究背景、目的和假设,不可长篇大论)。
|
||||
|
||||
### **5\. 图表规范 (Figures & Tables)**
|
||||
|
||||
* \[ \] **编号与引用**:使用 **阿拉伯数字** 连续编号(如 Table 1, Figure 1),严禁使用罗马数字(Table I)。所有图表必须在正文中被按顺序交叉引用(Cross-referenced)。
|
||||
* \[ \] **格式与独立性**:
|
||||
* 表格必须是可编辑的文本格式(如 Word 表格),**严禁插入图片格式的表格**。
|
||||
* 采用标准的**三线表**(去除垂直线,仅保留必要的水平线)。
|
||||
* 图表必须具备“自明性(Self-explanatory)”,即读者不看正文也能看懂图表含义。缩写词必须在脚注(Footnotes)中展开。
|
||||
* \[ \] **图例 (Figure Legends)**:不能直接放在图片上,需集中放在文章末尾或图片下方。
|
||||
|
||||
### **6\. 参考文献 (References)**
|
||||
|
||||
* \[ \] **引文格式**:明确期刊要求的是温哥华格式(Vancouver style,多为数字上标/方括号)还是哈佛格式(Harvard style,作者-年份)。
|
||||
* \[ \] **数量与时效限制**:
|
||||
* 原创论著:通常 30 \- 50 篇。
|
||||
* 综述:通常 50 \- 100 篇不等。
|
||||
* 病例报告/短篇:通常 10 \- 15 篇以内。
|
||||
* \[ \] **作者缩写规则**:仔细核对期刊对于多作者列举的规定(例如:列出前 3 位或前 6 位,之后的用 et al.)。
|
||||
|
||||
### **7\. 学术语言与排版细节 (Language & Style)**
|
||||
|
||||
* \[ \] **英文一致性**:全篇必须统一使用 **美式英语 (American English)** 或 **英式英语 (British English)**,不可混用。
|
||||
* \[ \] **斜体字使用 (Italics)**:**属种名称**(如 *Escherichia coli*,第二次提及时缩写为 *E. coli*)、基因符号、非英语的外来拉丁词汇必须使用斜体。
|
||||
* \[ \] **国际单位制 (SI Units)**:所有度量衡必须使用标准的国际单位。数字与单位之间通常需要留一个空格(如 5 mg,而不是 5mg),但摄氏度(°C)和百分号(%)各期刊要求可能不同。
|
||||
* \[ \] **数字拼写规则**:
|
||||
* 句首的数字必须拼写成英文单词(如 "Fifteen patients...",严禁 "15 patients...")。
|
||||
* 一般情况下,1\~10 的数字用英文单词拼写(one to ten),11及以上的数字使用阿拉伯数字。带有度量衡单位的数字直接用阿拉伯数字(如 3 kg)。
|
||||
|
||||
[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAAYCAYAAACLM7HoAAADN0lEQVR4Xu1YPWhUQRC+oILiH6Ln4f28ffdDjqhocWohgo2NRWwsIsRCbLRSEESIjWgfxFJiIWJjZWNlimDAInY2gmJhSM4iaLDIQZR4fvPe7DE3t++SFJc7cD8Y7u03szOz8/bvXSrl4eHh4eHh8R/DGPMwCIJ5/DZZ6tRm7jdzi7rfVqFQKJwSuTUqlco+bZME2N+3fcMwnAM1pG0k8vn8LrLVPAH9Xwlf77TeCdtB8zYQ5IvW9RqIeZlziopRKpX2UzuXy+WVaQdgN42J8Vm0ra9EQL/ksgG3jEKGtg2/F8CtCZNOpNPpPVy4Ga0jsK4jWK9BMTGWG4qbgSxITqNcLh+mvtls9pDk2d8DyVmAvwn5qMeJ9ghkVnLML1BxNd8CDC6SMyy1S1qHjgf6UVQeTBPxa4qf4FwSlzL0T1z5UiEgK5qv1Wo7wH9FrHu6H7hRVzzyBd05ybUBBtPUkWasQ/eIdPQmta6XQMw7FLdYLJ6UvB14ty2ACqSLw/y3BL5OhXUVFfEzxJFAf5Q5NNdZ/raTg49mC+SF1vUaeInPOfYRyduBd5sl0K8kjMcWdbvlEGcMvq7Ss6uoBHBPOReSBvlPdVkpqUwms1t00NLAjDio+7gA20kTB9+ojGsfEhso6qjkJcw6RbUrkpd93eqTikoA/5bziQT5ndc2LdA+ykZtB0K/sRVFxfMnut1YfUJRhziPs9RAXnPcpq3pjLKNYeLTtOOk7DdE8UoJfNsBJmGL142nyaTPCVdRuT5TksPVbpgL+0PyLbCyI4HNwmx++V/XPiQw6NOUly6e4dOfti3JS0D/kmwcPJ3+EY/fyYA/cqyAW+OY83S9YrsmZKTdUzRjr7hipKrV6l7u9EHrBgDRstPbkolvKn8lhyLcNmKbwAs5Tn316uOxvpGchOFVq7g/geM+yi/9u+ap2tdciQ8KwvjTcElQUaHlfZpmMhdLF2MVuse2DV8h2biujRbQz3I9dloOz2PsW99Tl+H/mCSmbCJS6DNQ9BsIIK/3Jl6WzzjPuw6bXxjgLUVvM/F/F4vQvebxDSubCGKflttA6yOBfHPsnyx0SJ2QPjw8PDw8PAYa/wDkFmFg1EgcgQAAAABJRU5ErkJggg==>
|
||||
|
||||
[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAAAYCAYAAACyVACzAAAC+UlEQVR4Xu1XO4gUQRDd5TQQf4juLbe/mf3g4gcNVjMDUxE1MDEUDDRSEFRQA9FITA4jEUVETIxMTOSCRUHBSwVBuUC5Mzgjgzs4Qc/3dquX2poZ93tn0g+a3X716aqa7uqZVMrDw8PDw8NDIQiC26VS6Rt+V2V851y4X8ItWLv1QrFYPKRiW67VatusThKgf8PZhmH4AVRay5Fjg7lBdjSTyWzB/ylwD/Db1HoROKeWLxQKm0T2xcrWGljztMTUSrJSqWznPJ/PF4xqBNCbQeKf1dz56kCK1cpbjR9aJwKpKhWbVkY4R5YfFghyb8o85ThwTTz184ZrYsxrzqJarU7SNpfL7dK8+Lvl5iwW5q/B38c412g0Nir1eEDxGB1hy5+0MjjcMa5iIbAzEvApK7OA3h7qMiHDX5dYEostyUfiBTePseTmUqynWqcn4GCGzrnDYmR3JMELVtYvYHuXPsrl8gErSwL0L4vNQc0jwWvk/3UUIZ9LKNZXzQ9brNUE562ni/HMyvoBgnkC298YZSvrBSYha09p3hULv0c0rwH5UkI+rlgbOJeeNcsY8f+qyJN7Vjab3SxBxY1lPMGd1qYH0rB7T9tBbi6LPop1QvMaQY9iuRMkO+uN0VnBmNNcB+xTdGAb6RCYgJ9PDIg3qBUOivUoVhwgf04dHP+slVHYpNDeHEPAFWtxHMVSRakk8F2NX8MVpQ9+IhV990p+GBTEOR4B6bB9HY90DLHjD8cVJZDbkO1D8xqB7I4Ynreh49kuIrlj/ii2WPV6fasYzHYJxoTSCA0+JcnY9hC0b+4/msM6lwJ1XFHo/bS1p0VyfWXmH43OW/KR04FAzsYFNG5gjZtcZ5BXBwJxvQi6b6dWAfX7IHeeJG13yApk024OXyF1dL/iCYDOPjfnS6n4eui4zlazg58THaU1QCgvpRjHrSwJ0H0XtHfnY7G9EqPzE0lfNDR7KL9tFyB7KfntNjq0ZZ+l/0Xxf8/q/FeU+vzc8fDw8PAYDH8Bhm8pp1+h1UAAAAAASUVORK5CYII=>
|
||||
Reference in New Issue
Block a user