Conversation
- 新增标签数据模型及关联表 - 添加标签相关API接口 - 实现前端标签管理界面 - 支持为论文添加/移除标签 - 支持按标签筛选论文 - 添加标签初始化脚本
添加 init_db.py 用于初始化数据库表结构 添加 check_db.py 用于检查数据库状态 添加 check_alembic.py 用于检查 alembic 版本
添加测试脚本test_ingest.py用于测试论文导入功能 在init_db.py中为pipeline_runs表添加decision_note列
|
/oc review |
🔍 OpenCode PR Review Required这是一个受保护的分支,merge 前需要进行 code review。 请运行以下命令进行 OpenCode review: 或者在 PR 页面评论 This is an automated reminder from PR Review Gate. |
|
现在我已经全面了解了这个 PR 的变更内容。让我进行 Code Review: Code Review 总结✅ 优点
|
opencode review 提出的 6 条意见里,采纳 2 条并落地: 1. [review #3] Papers.tsx handleDeleteTag 在确认框里提示 将同时移除 N 篇论文上的该标签关联,避免用户误删 2. [review #5] tags.py POST/PATCH /tags 参数严格校验 - name: min_length=1, max_length=64 - color: 正则 ^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$ smoke 过 5 个场景:合法/非法 color、空/超长 name、默认值 其余 4 条(批量更新竞态、list_all 性能、硬编码 down_revision、TS 类型长度)在 PR 评论中说明保留原因。 顺带清理 Papers.tsx 未使用的 X 图标 import。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
🔍 OpenCode PR Review Required这是一个受保护的分支,merge 前需要进行 code review。 请运行以下命令进行 OpenCode review: 或者在 PR 页面评论 This is an automated reminder from PR Review Gate. |
|
感谢细致的 review!逐条回应: ✅ 已采纳(commit b9a99cc)[#3] 删除标签前提示关联数 — [#5] color 参数正则校验 + name 长度校验 —
⏸ 保留现状(带技术理由)[#1] 批量更新竞态 — 当前代码已在 [#2] [#4] 硬编码 down_revision [#6] TS 类型缺少 minLength/maxLength — TypeScript 类型只做编译期检查,不做运行时校验。添加长度约束需要引入 zod 等运行时校验库,超出本 PR 范围。后端已加 📝 review 的改进建议(非阻塞)
全部验证通过后,准备合并到 main。 |

Summary
将外部贡献者 @keep-me (Ma Yukai, 曲阜师范大学) 的 "标签管理" 功能合并入主干。原本他提了 4 个 PR(#13/14/15/16),但存在:与 #17 的 6 文件冲突、垃圾文件
第二轮失败.txt、错写的 commit message、多头重复,所以走本地清理后重新提交。Supersedes: #13, #14, #15, #16 — 合并完成后会逐一关闭并指向本 PR。
作者署名
原始改动来自 @keep-me,本 PR 保留了他 3 个 commit 的原始 Author 字段(
keep <1603421097@qq.com>),贡献记录归他。变更内容
🆕 标签管理功能(cherry-pick 自 keep-me 0599bee)
tags+paper_tags表(SQLAlchemy 模型 + alembic 迁移20260415_0001_add_tags_table.py)/tagsCRUD +/papers/{id}/tags关联管理(8 个接口,全 UUID 校验、HTTP 规范)PaperRepository扩展:get_tags_for_papers/link_to_tag/unlink_from_tag+ 按 tag_ids 过滤论文列表TagRepository新增:CRUD + 按使用次数排序 +paper_count聚合PaperDetail.tsx/Papers.tsx接入标签管理 UI + 按标签筛选types/index.ts增加Tag/TagCreate/TagUpdate类型🛠 数据库工具脚本(cherry-pick 自 keep-me 5cf197b + 1a489e6)
scripts/init_db.py— 幂等的 CREATE TABLE IF NOT EXISTS 脚本,已审查无破坏性 DDL(无 DROP/TRUNCATE)scripts/check_db.py/check_alembic.py— 只读诊断工具scripts/init_tags_table.py— tags 表单独初始化脚本scripts/test_ingest.py— 入库测试脚本🐛 意外修到的 DAG 链接 bug
infra/migrations/versions/20260303_0009_ieee_mvp.py的down_revision原本写的是"20260228_0008",但父迁移的实际 revision 是"20260228_0008_agent_conversations",alembic 会断链。keep-me 顺手修了这个,本 PR 保留修复。🧹 顺路清理的 main 历史 ruff 债务(为通过 pre-commit)
原先在 main 分支就有 16 处既有 ruff 错误(跟 tags 功能本身无关),但 ruff 扫整文件时会把它们和 tags 新代码一起报出,导致 commit 被 pre-commit 阻止。既然碰了,顺手清一把:
apps/api/main.py: 2 处 E402(延迟 import 加# noqa)packages/ai/pipelines.py: F841 删未用变量、2 处 B007 去掉 unusedidx、SIM105 改contextlib.suppresspackages/storage/db.py: TC003 Generator 挪进 TYPE_CHECKINGpackages/storage/repositories.py: TC001/TC003 挪 UUID + schemas 进 TYPE_CHECKING、3 处 SQLAlchemy== None/== True改.is_not(None)/.is_(True)scripts/init_tags_table.py: 2 处 E402 加 noqa🗑 丢弃的提交
keep-me 的第 2 个 commit
53f9070 修复加载标签列表失败的结果标题与内容严重不符 — 它只添加了一行第二轮失败.txt(本地调试笔记)。本 PR 跳过这个 commit,不入库垃圾文件。验证(全本地跑过)
npx tsc --noEmitnpx vite buildalembic upgrade 20260415_0001已知遗留(非本 PR 引入)
20260303_0011_ieee_quota和20260415_0001),IEEE 分支未合入主线 — main 原本就是这个状态,建议后续单独 PR 处理Test plan
🤖 Generated with Claude Code