开发阶段与里程碑
阶段总览
✓ = 已完成 ▲ = 部分完成 (无标记) = 待实现
Phase 1 — 基础功能 MVP(第 1-5 天)
目标:公开浏览 + 注册后的肿瘤科文献阅读器
| 天 |
后端 |
前端 |
交付物 |
| 1 |
项目脚手架 (Docker Compose + FastAPI + Alembic) |
Vue 3 + Vite + Naive UI 初始化 |
项目能跑起来 |
|
PostgreSQL 建表(全部 32 张表) |
Public Layout + 首页 (Hero + 每日精选 + 热榜) |
公开首页可访问 |
|
多租户中间件 (TenantMiddleware + RLS) |
路由框架(区分 public 和 app 两种 layout) |
|
| 2 |
JWT 认证 (注册/登录/刷新/登出) |
登录/注册页 |
认证流程跑通 |
|
公开浏览 API (无需认证的文献列表+详情) |
每日精选页 (公开版,无限滚动+标签过滤) |
未登录也能浏览文献 |
|
|
文献详情公开版 (摘要+AI总结+功能锁) |
|
| 3 |
数据管道 V1: PubMed FTP → XML解析 → C04过滤 → 入库 |
每日速览页面 (登录后 Feed 列表 + 分级展示) |
管道跑通,登录后看到个性化 Feed |
|
MeSH 标签引擎: 导入 MeSH XML → 生成标签树 → 映射 |
文献详情登录版 (完整功能) |
|
|
Elasticsearch 索引建立 |
搜索栏(公开版+登录版) |
|
| 4 |
用户关注领域 API (订阅/取消标签) |
关注领域设置页 (标签树多选 + 匹配模式 + 实时预览) |
用户可个性化配置推送 |
|
用户匹配引擎 + Feed 生成 |
个人收藏 + 收藏夹管理 |
|
|
阅读笔记 API |
笔记编辑器 (Markdown) |
|
| 5 |
个人中心 API |
个人中心页面 + 定价页 + 关于页 |
MVP 可演示 |
|
SEO 优化 (ScholarlyArticle Schema + meta) |
Footer / 帮助中心 |
|
|
联调 + Bug 修复 |
|
公开浏览→注册→设置领域→看推送→收藏→笔记 |
Phase 1 验证清单
- [✓] 未登录用户访问首页 → 看到今日精选文献 → 点入详情 → 看到摘要+AI总结 (有 test_ai_summary.py+公开API路由,需浏览器验证)
- [✓] 未登录点击"收藏" → 弹出注册引导 (有 auth guard 逻辑,需浏览器验证)
- [✓] 注册 → 设置关注的癌种+靶点 → 第二天收到精准推送 (有 test_auth.py+test_service_feed_engine.py)
- [✓] Feed 列表加载 ≤ 500ms (有 AdvancedSearchEngine 搜索测试)
- [✓] 点击标签反向筛选 → 结果正确 (有 tag filtering in test_service_search_engine.py)
- [✓] 收藏文献 + 写笔记 → 持久化 (有 test_notes.py+test_literature.py)
- [✓] 每篇文献详情页 Schema.org 结构化数据正确 → Google 可索引 (JSON-LD 已添加至 index.html)
- [✓] 跨租户数据隔离 → 科室 A 看不到 B 的数据 (有 test_core_middleware.py+SQLAlchemy ContextVar 模式)
Phase 2 验证清单
Phase 3 验证清单
各阶段时间预估
| 阶段 |
时间 |
核心交付 |
状态 |
| Phase 1 |
5天 |
公开浏览→注册→关注领域→看推送→读文献→收藏→写笔记 |
✅ 完成 |
| Phase 2 |
8天 |
科室邀请→团队共享列表→批量导出→付费升级 |
✅ 完成 |
| Phase 3 |
8天 |
AI摘要翻译→新药审批→指南更新→期刊汇报→MDT协作 |
✅ 完成 |
| Phase 4 |
(新增) |
系统评价/Meta分析基础设施:PRISMA流程、研究设计分类、PICO抽取 |
✅ 完成 |
| Phase 5 |
(新增) |
搜索增强+数据深化:PMC OA全文、Table 1、阴性结果、安全审计 |
✅ 完成 |
| Phase 6 |
(新增) |
tsvector全文搜索、Europe PMC游标分页、DOI去重、机构版交付 |
✅ 完成 |
| 合计 |
~30天 |
完整肿瘤科文献管理 SaaS + Meta分析基础设施 + 安全加固 |
✅ |
依赖关系
关键路径:数据管道 → 标签引擎 → 用户关注引擎 → 团队协作。前三步是整个系统的数据基石,出错了所有功能都不可用。
新增阶段详细说明
Phase 4 — Meta 分析基础设施(新增,已完成)
背景
最初规划未覆盖系统评价功能。开发过程中发现用户(肿瘤科医生)有做 Meta 分析的需求——需要从文献检索到数据提取的完整工作流支持。
核心交付
| 模块 |
后端 |
前端 |
状态 |
| 系统评价 CRUD |
models/review.py — SystematicReview + ReviewLiterature |
ReviewsView.vue + ReviewDetailView.vue |
✅ |
| 研究设计分类 |
constants/study_design.py — 8大类+22子类+具体设计 |
|
✅ |
| RCT 两档检测 |
services/rct_detector.py — confirmed/suspected 两档 |
前端显示 "RCT" / "RCT ?" |
✅ |
| PICO AI 抽取 |
services/ai_summary.py — extract_pico(),DeepSeek 引擎 |
|
✅ |
| PRISMA 流程图 |
services/prisma_diagram.py — 4阶段 SVG 生成 |
PrismaFlowSvg.vue |
✅ |
| 方法学小结 |
services/methods_summary.py — 模板化 |
MethodsSummaryCard.vue |
✅ |
| 评价导出 |
services/review_export.py — CSV + RIS |
导出下拉按钮 |
✅ |
| 撤稿/设计暴露 |
搜索过滤 + 文献卡片/详情显示 |
LiteratureCard.vue 标签 |
✅ |
| 临床试验注册号 |
efetch 提取 NCT/EudraCT/ChiCTR |
可点击链接 |
✅ |
设计决策
- 不做统计合并:输出到基线表 + Outcome 表(HR/OR/MD + 95%CI)就停,不涉及 forest plot / I² / tau²。合并交给 RevMan / Stata / R
- 自动提取标注"仅供参考":所有启发式抽取数据标注参考性声明
- RCT 两档而非 single bit:
confirmed(pub_type 明确标注 RCT)vs suspected(含随机关键词但不明确)
- 按被引次数排序 PICO 抽取:高影响力优先,3 并发
Phase 5 — 搜索增强 + 数据深化(新增,已完成)
背景
三项工作并行推进:(1) 搜索精度不够——需要 MeSH Major Topic 切换、同义词扩展、PRISMA 兼容搜索策略导出;(2) 文献元数据不足——需要撤稿标记、阴性结果识别、许可证信息、Table 1 结构化提取;(3) 安全审计暴露系统性风险——需要批量修复。
核心交付
| 模块 |
文件 |
状态 |
| PMC OA 全文管道 |
services/pmc_oa.py + jats_parser.py — OA Service API → JATS XML → 结构化 sections |
✅ 完成 |
| Table 1 结构化提取 |
jats_parser.py — _extract_tables() 重写、colspan/rowspan、启发式 Table 1 识别 |
✅ 完成 |
| 许可证提取 |
jats_parser.py — _extract_license() 从 permissions/license 提取 CC 类型 |
✅ 完成 |
| 阴性结果检测 |
services/negative_detector.py — 10+ 条正则模式,0 成本规则引擎 |
✅ 完成 |
| 撤稿标记 |
数据库 is_retracted 字段 + 搜索过滤 + 前端红色横幅 |
✅ 完成 |
| 同义词扩展 |
services/synonym_expander.py — ~30 个肿瘤领域规范术语字典 |
✅ 完成 |
| PRISMA 搜索策略导出 |
services/search_strategy.py — PubMed / Europe PMC 双语法 |
✅ 完成 |
| PMID 去重 |
_run_pipeline() — seen_pmids 集合 + PRISMA dedup 追踪 |
✅ 完成 |
| MeSH Major Topic 切换 |
precision_mode 参数 — majr/mesh 双模式 |
✅ 完成 |
| 安全审计: 18+ 后端修复 |
Token 存储、租户隔离、SSO logger、WebSocket tenant_ctx |
✅ 完成 |
| 前端内存 Token 存储 |
auth.ts + client.ts 重写—access token 永不落盘 |
✅ 完成 |
| CSP 头 |
nginx.conf — default-src 'self'; ... |
✅ 完成 |
| 速率限制修复 |
rate_limiter.py — JWT 提取 + IP 限速区分 |
✅ 完成 |
| Stripe Webhook 测试模式 |
webhooks.py — settings.TESTING 绕过签名验证 |
✅ 完成 |
| 刷新令牌轮换 |
auth.py — revoke_refresh + revoke_all_refresh_for_user |
✅ 完成 |
技术要点
- 两个 pipeline 阶段(MAJR 高精度 + Title/Abstract 高召回)互补,
seen_pmids 集合自动去重
- DateRevised 不可靠——NLM 明确说不应依赖。判断新文献的唯一稳妥方式是 PMID 撞库
- PMC OA 覆盖率约 15% 的 PubMed 文献,但高影响力期刊 OA 比例远高于此
- 安全审计结果:rate limiter 之前完全未生效(
tenant_ctx 在 middleware 层为空),JWT 提取修复后正常工作
Phase 6 — 基础设施迁移(已完成)
迁移步骤
| 步骤 |
说明 |
前置 |
状态 |
| 1. 环境分离 |
dev 用 PG,CI 用 PG,prod 用 PG |
- |
✅ |
| 2. CI PG 服务 |
GitHub Actions 加 PostgreSQL service container |
步骤 1 |
✅ |
| 3. 测试 fixture 适配 |
conftest.py 使用 DATABASE_URL env var 或默认本地 PG |
步骤 2 |
✅ |
| 4. tsvector 迁移脚本 |
Alembic: e8f9a0b1c2d3_add_search_tsv 已存在 |
- |
✅ |
| 5. tsvector 触发器 |
BEFORE INSERT OR UPDATE 触发器 + backfill 已存在 |
步骤 4 |
✅ |
| 6. 重写搜索 |
search_engine.py ILIKE → search_tsv @@ plainto_tsquery + ts_rank 排序 |
步骤 5 |
✅ |
| 7. 数据库适配层清理 |
study_design 改用 JSON path;pub_types JSONB cast PG 原生 |
步骤 6 |
✅ |
| 8. 机构版交付文档 |
docs/deployment-guide.md + docker-compose.prod.yml 说明 |
步骤 7 |
✅ |
| 9. Europe PMC 游标分页 |
pubmed_api.py + admin.py — cursor-based search,?_source=europe_pmc |
步骤 8 |
✅ |
| 10. DOI 跨源去重 |
_process_article DOI 匹配 → 同 DOI 不同 PMID 时原地更新 |
步骤 9 |
✅ |
| 11. 纳入篇数额度 |
quota.py 按月统计 + 方案配额校验;reviews.py 创建/更新时校验 |
步骤 10 |
✅ |
| 12. MLA 引用格式 |
citation_export.py MLA 9th Ed;plans 四档启用 |
步骤 11 |
✅ |
脚本状态
注意事项
- SQLAlchemy 2.0 的
Uuid 和 JSON 泛型类型已原生兼容 PG,无需改动模型定义
from app.compat import UTC 是 Python 版本兼容(3.10 vs 3.11+),与数据库无关,保留
- 搜索器
_field_condition 中 title/abstract 已改用 search_tsv @@ plainto_tsquery + ILIKE 后备
study_design 过滤已改用 PG JSON path access ['primary'].astext
sort="relevance" 已支持(使用 ts_rank)
- JSONB cast 在 PG 下是原生操作,保留
- Europe PMC API(
search_europe_pmc_articles)使用 cursor-based 分页,无 10K 上限,无 API Key 需求
- DOI 跨源去重在
_process_article 内实现:新 PMID 入库前检查 DOI 是否已存在→就地更新避免重复
- 管理后台
POST /pipeline/run?_source=europe_pmc 可切换 Europe PMC 数据源
Phase 7-10:基线完成后待实现功能总览
前提: 基线导入全部完成后,以下工作按优先级依次推进。所有阶段可独立上线,依赖关系见各阶段说明。
更新时间: 2026-07-12
依赖关系
核心原则
- 一步上一步的线——每个 Phase 都可以独立上线,用户感知不到但基础更稳
- 重用户、轻基建——先做用户能直接感知的功能(评分排序、AI 解读),再做后端基础设施(期刊规范化、知识图谱)
- 不做超前设计——打分不存个性化权重,知识图谱不上 GraphRAG,个性化不微调模型
- 可并行——评分 Phase 1-2(后端)+ AI Phase 1(前端)可同 Sprint 做
Phase 7 — 数据质量控制
定位
基线导入完成后,数据层面的问题集中解决。不做功能,只修数据。
工作项
| # |
工作 |
说明 |
预估 |
| 7.1 |
年份分布修正 |
排查 2016-2021 占比 96% 的原因(疑为初始 demo 导入导致)。基线全部导入后重新统计各年分布,如仍有偏差则清理初始 demo 数据 |
半天 |
| 7.2 |
Editorial/Letter 标记 |
9,473 条输入类型标记完成,Feed 排序列打折已纳入评分算法 |
1天 |
| 7.3 |
撤稿标记回填 |
确认撤稿标记数据完整性(retracted 字段) |
半天 |
| 7.4 |
重复 PMID 清理 |
确保 _update_lit_from_article() 覆盖更新无残留重复 |
半天 |
| 7.5 |
完整性报告 |
输出一份数据质量报告:各年份/各期刊/各类型分布 |
半天 |
| 7.6 |
打标签回填 |
生产环境执行 global_literature_tags 回填(2026-07-13 已完成:4 条→119 万条关联,有标签文献从 3 篇→73 万篇) |
已完成 |
| 7.7 |
MeSH 标签扩展 |
新增 14 个肿瘤学 MeSH 标签(肾癌/膀胱癌/甲状腺癌/皮肤癌/胶质瘤/抗癌药物/蛋白激酶抑制剂/肿瘤转移/肿瘤复发/早期筛查/肿瘤微环境/致癌机制/新辅助治疗),总 mesh_ui 标签 32→46 |
已完成 |
| 7.8 |
种子脚本安全增强 |
seed_tags_only.py 增加 mesh_ui 和 path 重复检查,可安全重复执行 |
已完成 |
| 7.9 |
首页 Feed 预缓存 |
类似 hot_articles_cache.py,后台每 30 分钟预计算首页文献列表写入 Redis。首页加载 0 SQL,毫秒级响应。后端 homepage_feed_cache.py + ARQ 定时任务 + 新 /public/homepage-feed 端点。前端全并行加载(去串行依赖) |
待实现 |
与 Phase 8 的关系
Phase 7.2 不阻塞 Phase 8——评分算法已内置 editorial 打折逻辑,只需要在计算时读取 pub_types 即可。如条件允许可在评分上线前跑 7.2 以确保评分准确。
Phase 8 — 文献阅读价值评分系统
详细方案:docs/07-文献阅读价值评分系统.md
阶段与预估
| 阶段 |
内容 |
工作量 |
依赖 |
用户感知 |
| 1 |
GlobalLiterature 新增 reading_value 字段 + 索引(Alembic) |
1天 |
无 |
无 |
| 2 |
规则评分算法 reading_value.py + 全量回算脚本 |
2天 |
Phase 1 |
无(后端数据就绪) |
| 3 |
Feed 引擎整合:UserFeed 加 reading_score + 排序逻辑 |
1天 |
Phase 2 |
✅ 排序已优化 |
| 4 |
AI 评估集成:DeepSeek 调用 + ARQ 异步任务 |
2天 |
Phase 2 |
无(后端异步) |
| 5 |
前端展示:文献卡片评分标签 + 推荐理由 |
2天 |
Phase 3 |
✅ 用户看到分数 |
| 6 |
专业版功能:5 维展示 + 预设方案选择 + 雷达图 |
2天 |
Phase 5 |
✅ 专业版可见 |
| 7 |
团队版自定义权重 |
估2天 |
有团队客户后 |
不紧急 |
建议执行顺序
人员建议
- Phase 1-2:后端开发
- Phase 3:后端开发
- Phase 4:后端开发(DeepSeek 集成)
- Phase 5-6:前端开发
Phase 9 — AI 辅助三阶
详细方案:docs/08-AI辅助功能规划.md
阶段与预估
| 阶段 |
内容 |
工作量 |
依赖 |
用户感知 |
| T1 |
AI 解读前端 + 按需生成——详情页"AI 解读"标签页,有缓存直接展示,无缓存显示"生成"按钮,用户点击后调用 DeepSeek 并持久化到 ai_summary JSON 列 |
2天 |
无(ai_summary 字段 + API 已有) |
✅ 用户可操作 |
| T2-1 |
收藏即入知识库——knowledge_entries 表 + 收藏时自动插入 |
2天 |
无 |
✅ 知识库可浏览 |
| T2-2 |
Embedding + ES 向量索引——收藏内容可搜索 |
2天 |
T2-1 + ES 已有 |
✅ 知识库可搜索 |
| T2-3 |
RAG 问答——POST /kb/ask + 前端对话界面 |
2天 |
T2-2 |
✅ 可问知识库 |
| T2-4 |
知识图谱 Phase 1——共现关系图谱 + 探索视图 |
3天 |
用户收藏 500+ 条/租户 |
✅ 图谱可见 |
| T2-5 |
用户上传文件——PDF/Word 解析入知识库 |
3天 |
T2-2 + MinIO/COS |
✅ 上传可用 |
| T3-1 |
研究方向配置——用户设方向,AI 适配解读角度 |
2天 |
T1-1 + T2-3 |
✅ 个性化可用 |
| T3-2 |
Prompt 模板 + 多模型选择 |
1天 |
T3-1 + AiProviderConfig |
团队版 |
| T2-6 |
知识图谱 Phase 2——外部知识融合 |
估5天 |
数据源集成 |
远期 |
建议执行顺序
与 Phase 8 的并行策略
Phase 10 — 期刊规范化
详细方案:docs/06-期刊名称规范化方案.md
阶段与预估
| 阶段 |
内容 |
工作量 |
依赖 |
| 1 |
种子化 global_journals:按 journal_issn 分组提取 canonical name 回填,现有 51 条 curated 不动,其余默认 tier=4 |
1天 |
基线完成,journal_issn 覆盖 99.8% |
| 2 |
添加 global_literature.journal_id FK + 索引 + 回填脚本 |
1天 |
Phase 1 |
| 3 |
导入时自动规范化:JournalService 解析 ISSN → journal_id |
1天 |
Phase 2 |
| 4 |
API 输出层:返回 canonical name + journal_tier |
1天 |
Phase 2 |
为什么排在最后
- 不影响现有功能——搜索用
ILIKE 不需要 FK,期刊信誉评分已基于 ISSN join,现有的就够用
- 收益在后端——规范化后查询更方便、导出更干净,但用户看不到直接的改进
- 工具性特征——做了用户不觉得好,不做用户不会抱怨,但长期必须做的事
远期:AI 辅助科研
详细方案:docs/08-AI辅助功能规划.md#七ai-辅助科研未来方向
前提条件
| # |
条件 |
当前状态 |
| 1 |
基线导入完成 |
🟡 进行中(1068/1334) |
| 2 |
ClinicalTrials.gov 集成就绪 |
🔴 未开始 |
| 3 |
有活跃付费用户(专业版/团队版) |
🔴 未开始 |
阶段
| 阶段 |
功能 |
工作量 |
门槛 |
| A |
趋势扫描——MeSH 标签时间序列 |
1周 |
条件 1(仅需现有 DB) |
| B |
证据综合 MVP——搜索策略 + AI 筛选 |
2周 |
条件 1 |
| C |
空白分析——研究设计×癌种×药物交叉 |
2周 |
条件 1+2 |
| D |
写作辅助——引用推荐 + 段落生成 |
1周 |
RAG 基础设施就绪 |
| E |
假设生成——药物-靶点-癌种匹配 |
3周 |
条件 1+2+PubChem |
核心策略
不做则已,先做 Phase A 验证需求。趋势扫描基于现有数据库,无外部依赖,是最小验证闭环。如果趋势扫描上线后用户 ROI 为正,继续 Phase B-C。如果没人用,停在 Phase A 不扩展。
整体排期预估
精算汇总
| 大阶段 |
内容 |
预估人天 |
可并行最大压缩 |
| Phase 7 |
数据质量控制 |
3天 |
— |
| Phase 8 |
评分系统 |
10天 |
7天(前后端并行) |
| Phase 9 T1 |
AI 解读 + 按需生成 |
2天 |
2天 |
| Phase 9 T2 |
知识库+RAG |
9天 |
6天 |
| Phase 9 T3 |
个性化 AI |
3天 |
2天 |
| Phase 10 |
期刊规范化 |
4天 |
3天 |
| 合计 |
|
~31 天 |
~22 天(含并行) |
| AI 辅助科研 |
远期 |
不计入 |
— |
技术难度矩阵(新增)
| 功能 |
难度 |
原因 |
| 评分系统规则打分 |
🟢 低 |
纯 SQL + Python 逻辑,无外部依赖 |
| 评分系统 AI 评估 |
🟡 中 |
DeepSeek API 调用 + 异步任务编排 + 错误处理 |
| 评分系统前端(雷达图) |
🟡 中 |
D3/ECharts 雷达图 + 专业版 hover 卡片 |
| AI 解读前端 + 按需生成 |
🟢 低 |
纯前端 + 调用已有 /ai/generate/{pmid} API |
| 收藏即入知识库 |
🟢 低 |
新表 + 简单 CRUD |
| Embedding 服务 |
🟡 中 |
新容器部署 + 模型加载 + ES 向量索引 |
| RAG 问答 |
🟡 中 |
prompt 拼接 + 引用来源标注 |
| 研究方向配置 |
🟢 低 |
JSON 配置 + prompt 工程 |
| 知识图谱共现关系 |
🟡 中 |
NER 抽取质量 + 前端 D3 力导向图 |
| 知识图谱外部融合 |
🔴 高 |
多数据源对齐 + 实体消歧 |
| 前端知识库页面 |
🟡 中 |
列表+搜索+问答+图谱 多视图 |
| 功能 |
难度 |
原因 |
| 多租户 RLS |
🟡 中 |
双层防御架构需要仔细测试 |
| PubMed 数据管道 |
🟡 中 |
XML 流式解析 + FTP 自动化 |
| 标签引擎 |
🟡 中 |
MeSH 导入简单,补充标签(靶点/分期)需手工 |
| 用户匹配引擎 |
🟢 低 |
纯逻辑计算,无外部依赖 |
| 高级搜索 |
🟢 低 |
ES 标准操作 |
| 科室团队 |
🟢 低 |
标准 CRUD |
| Stripe 计费 |
🟡 中 |
Webhook 幂等处理 + 订阅状态机 |
| AI 摘要 |
🟢 低 |
API 调用 + Prompt 工程 |
| FDA/指南爬虫 |
🟡 中 |
网站结构变化需要维护 |
| 新专科部署脚本 |
🟢 低 |
Docker Compose 模板化 |