chore: batch commit remaining changes
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s

Includes search engine improvements, Alembic migrations,
new services (pubmed_daily_update, query_expansion),
frontend updates, and documentation sync.
This commit is contained in:
34047007@qq.com
2026-07-27 08:35:12 +08:00
parent 35b0a5c565
commit 62ca8fa6b8
82 changed files with 314248 additions and 1519 deletions
+109
View File
@@ -0,0 +1,109 @@
# Pub高级搜索 测试用例
## 测试环境
打开 <http://localhost:5173/advanced-pub-search>
---
## 1. Search Builder(查询构建器)
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 1.1 | AND 状态下,Field 选 Title,输入 `lung cancer`,点 Add | Query Box 显示:`"lung cancer"[TI]` |
| 1.2 | 把 AND 改成 ORField 选 Author,输入 `Smith J`,点 Add | Query Box 显示:`"lung cancer"[TI] OR "Smith J"[AU]` |
| 1.3 | Field 选 All Fields,输入 `pembrolizumab`,点 Add | Query Box 显示:`"lung cancer"[TI] OR "Smith J"[AU] AND pembrolizumab` |
| 1.4 | **引号去重**Field 选 Title,输入 `"already quoted"`,点 Add | Query Box 最后追加 `"already quoted"[TI]`(不会出现 `""already quoted""` |
| 1.5 | **Enter 快捷键**Field 选 All Fields,输入 `test`,按 Enter | 同点 Add,自动追加到 Query Box |
## 2. Query Box(查询框)
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 2.1 | 手动输入:`"breast cancer"[TI] AND "trastuzumab"[TIAB]` | Translation Table 显示 2 行:`[TI] Title` / `[TIAB] Title/Abstract` |
| 2.2 | 追加 `AND 2022:2024[DP]` | Translation Table 新增 1 行:`[DP] Publication Date``2022:2024` |
| 2.3 | 测试 `NOT` 查询:`"lung cancer"[TI] NOT "mouse"[MH]` | 前端验证通过,不报错 |
| 2.4 | **长日期格式**`2020/01/01:2020/12/31[DP]` | Translation Table 正确显示 Date Range |
| 2.5 | **括号嵌套**`("a"[TI] OR "b"[TI]) AND "c"[TIAB]` | 验证通过 |
| 2.6 | **PMID**`12345678[PMID]` | Translation Table 显示 `[PMID]` 行 |
## 3. 验证规则
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 3.1 | Query Box 为空,点 Search | 提示"请输入查询" |
| 3.2 | 输入 `AND lung cancer`(以运算符开头) | 提示"查询不能以布尔运算符开头" |
| 3.3 | 输入 `lung cancer AND`(以运算符结尾) | 提示"查询不能以布尔运算符结尾" |
| 3.4 | 输入 `a AND AND b`(连续运算符) | 提示"不允许连续使用布尔运算符" |
| 3.5 | 输入 `(a AND b`(缺少右括号) | 提示"括号不匹配" |
| 3.6 | 输入 `a AND b)`(多余右括号) | 提示"多余的右括号" |
| 3.7 | 输入 `"test"[INVALID]` | 提示"字段标签 [INVALID] 不合法" |
## 4. Search(搜索执行)
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 4.1 | 输入 `"lung cancer"[TI]`,点 **Search** | 跳转到 `/search?q="lung cancer"[TI]`,显示结果 |
| 4.2 | 检查搜索结果 | 标题字段匹配 "lung cancer" 的文献,数量 > 0 |
| 4.3 | **OR 查询**:回到 Pub高级搜索页,输入 `"lung"[TI] OR "cancer"[TI]`,点 Search | 结果比 4.1 多(应该是两个词各自结果的并集) |
| 4.4 | **NOT 查询**`"lung cancer"[TI] NOT "review"[PT]`,点 Search | 结果比 4.1 少(排除了 review 类型) |
| 4.5 | **日期范围**`2024:2025[DP] AND "cancer"[TI]`,点 Search | 只返回 2024-2025 年的文献 |
| 4.6 | **MeSH 查询**`"lung neoplasms"[MH]`,点 Search | 返回带有 Lung Neoplasms MeSH 标签的文献 |
| 4.7 | **MAJR 查询**`"lung neoplasms"[MAJR]`,点 Search | 比 4.6 少(仅 Major Topic |
| 4.8 | **PMID 精确搜索**`36261522[PMID]`,点 Search | 精确返回该文献 |
| 4.9 | **DOI 搜索**:已知某篇 DOI,输入 `"10.xxxx/xxxx"[DOI]`,点 Search | 精确返回该文献 |
| 4.10 | **多字段复杂查询**`("lung cancer"[TI] OR "nsclc"[TIAB]) AND 2023:2025[DP] NOT "case reports"[PT]`,点 Search | 执行复杂布尔查询,返回结果 |
## 5. Search History(搜索历史)
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 5.1 | 执行 4.1 的搜索(`"lung cancer"[TI]` | 成功后 History 出现 `#1`,显示查询、结果数和时间 |
| 5.2 | 执行 4.3 的搜索(OR 查询) | History 出现 `#2` |
| 5.3 | 刷新页面 | #1#2 仍然存在(localStorage 持久化) |
| 5.4 | 点击 `#1` | `#1` 追加到 Query Box 末尾 |
| 5.5 | Query Box 中写 `#1 AND #2`,点 Search | resolve 后正确跳转到搜索结果页 |
| 5.6 | 输入 `#999`(不存在的编号),点 Search | 提示"历史引用 #999 不存在" |
| 5.7 | 点 `#1` 行的 ✕ 按钮 | #1 从 History 中删除 |
| 5.8 | 点 **Clear All** | 所有历史被清空,显示"暂无搜索历史" |
| 5.9 | 点 **Download** | 下载一个 `.tsv` 文件,内容包含所有历史记录 |
## 6. Combine(组合历史查询)
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 6.1 | 先搜索 2 个不同查询(如 `"lung"[TI]``"breast"[TI]` | 分别产生 #1#2 |
| 6.2 | Combine 行:输入框 A 写 `1`,选 `AND`,输入框 B 写 `2`,点 Combine | Query Box 追加 `#1 AND #2` |
| 6.3 | 点 Search | 自动展开为 `("lung"[TI]) AND ("breast"[TI])`,搜索结果正确 |
| 6.4 | 输入框 A 写 `#1`,输入框 B 写 `#2`(带 # 前缀) | 同样正常工作,不会出现 `##1` |
## 7. Add to History(仅加入历史)
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 7.1 | 输入 `"targeted therapy"[TI]`,点 **Add to History** | 提示"#3 已加入历史(N 条结果)"Query Box 不变 |
## 8. 暗色模式
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 8.1 | 切换到暗色模式(如果有切换开关) | 页面正常显示 |
| 8.2 | 点击 Search Builder 的 Field 下拉框 | 下拉弹窗选项文字在 hover/选中时显示白色 |
| 8.3 | 点击任意按钮(Search/Clear/Add | 按钮文字始终白色可见 |
## 9. 响应式
| 步骤 | 操作 | 期望结果 |
|------|------|----------|
| 9.1 | 浏览器窗口缩窄到 < 768px | Builder 变垂直排列,下拉框全宽 |
| 9.2 | 手机宽度下测试 | 无水平溢出,所有功能正常 |
---
## 回归检查
| 检查项 | 期望 |
|--------|------|
| 首页搜索框旁的 Pub高级搜索按钮(代码图标) | 正常显示,点击跳转 |
| 首页原有"高级搜索"齿轮按钮 | 不受影响,功能不变 |
| 搜索结果页宽度 | 与首页、Pub高级搜索页一致 |