e688241355a172056db2ee0f161d32422ed222a8
F1: search_engine.py `_pubmed_conditions` 顶层 [MH:noexp] 丢失 _noexp 标志
按 _noexp 分组 mesh_terms,分别调用 _expand_mesh_tag_ids(noexp=True/False)
F2: search_engine.py 组内 NOT 违反 De Morgan 律
全组 is_not=True 时单 NOT 包裹组合条件而非 per-term not_()
F3: pubmed_query_parser.py `_parse_not_expr` 不支持重复 NOT
改为递归调用,NOT NOT toggle is_not(三重 NOT 正确)
F4: SearchView.vue Custom Range datePreset 不发送日期参数
增加 datePreset === 'custom' 分支发送 year_from/year_to
F5: HomeView.vue restoreFromUrl 恢复不全
补全 sort/field/retracted/negative_result
F6: AdvancedSearchPanel.vue precision_mode 死控件移除(UI+emit+reset)
types/index.ts precision_mode 死类型字段移除
F7: types/index.ts is_oa 标记为 unused, reserved
F8: search_engine.py `_expand_mesh_tag_ids` N+1 → 2 批量查询
所有 entry_terms 和 name_en 分别合并为 OR 查询
测试: 新增 NOT NOT/triple NOT/NOT group/DM:noexp 顶层 共 7 项
SciLit Oncology — 肿瘤科文献管理平台
快速启动
# 1. 启动所有服务
docker compose up -d
# 2. 初始化数据库(首次)
docker compose exec backend alembic upgrade head
# 3. 访问
# 前端: http://localhost:5173
# 后端 API: http://localhost:8000/docs
# MinIO 控制台: http://localhost:9001 (minioadmin/minioadmin)
项目结构
backend/
├── app/
│ ├── main.py # FastAPI 入口
│ ├── config.py # 配置
│ ├── db.py # 数据库连接
│ ├── core/ # 核心:安全、权限、多租户中间件
│ ├── models/ # SQLAlchemy 模型 (32 张表)
│ ├── schemas/ # Pydantic 请求/响应
│ ├── api/v1/ # REST API 端点
│ └── tasks/ # ARQ 异步任务 (PubMed 管道)
├── alembic/ # 数据库迁移
└── config/specialties/ # 科室配置 (oncology.yaml)
frontend/
├── src/
│ ├── views/public/ # 公开页面 (无需登录)
│ ├── views/auth/ # 登录/注册
│ ├── views/app/ # 已登录应用页面
│ ├── stores/ # Pinia 状态管理
│ ├── api/ # Axios 封装
│ └── router/ # Vue Router
docs/ # 完整设计文档 (9 份)
技术栈
- 后端: FastAPI + SQLAlchemy 2.0 (async) + PostgreSQL 16 + Redis + Elasticsearch
- 前端: Vue 3 + Naive UI + Pinia + Vite
- 任务队列: ARQ
- 文件存储: MinIO / S3
- 多租户: PostgreSQL RLS + ContextVar 双层隔离
文档
详细的产品规划、数据库设计、标签体系、数据管道、UI 设计见 docs/ 目录。
Languages
Python
69.3%
Vue
26.1%
TypeScript
2.8%
Shell
1.3%
PLpgSQL
0.2%
Other
0.1%