Skip to content

新增教师介绍数据库与同步 API#2

Open
ElysiaFollower wants to merge 11 commits into
ZJUCSA:mainfrom
ElysiaFollower:feature/mentors-roster
Open

新增教师介绍数据库与同步 API#2
ElysiaFollower wants to merge 11 commits into
ZJUCSA:mainfrom
ElysiaFollower:feature/mentors-roster

Conversation

@ElysiaFollower

@ElysiaFollower ElysiaFollower commented May 3, 2026

Copy link
Copy Markdown

背景

本 PR 为教师介绍功能提供后端数据层、公开 API、后台管理 API 和同步审核能力,支撑前端新增的「教师介绍」公开页与「教师介绍管理」后台页。原实现阶段主要依赖人工整理资料和临时前端数据,无法满足后续维护中的持久化、权限控制、字段审校和同步失败回退需求。

配套前端 PR:ZJUCSA/csa-frontend#5

主要变更

数据模型与迁移

  • 新增 teachers 表,用于保存教师公开资料、排序、启用状态、头像 URL、研究方向、外部主页、来源状态、字段来源和同步草稿。
  • 新增 teacher_meta 表,用于保存教师资料整体同步时间、来源状态、来源 URL 和同步说明。
  • 在 Alembic 迁移中写入当前四位重点对接教师的初始资料,并统一使用云端头像 URL,避免将头像二进制资源放入仓库。
  • 更新 Alembic model import,确保新表可以被迁移环境识别。

教师数据契约与持久化服务

  • 新增 services/teachers_cache.py,集中定义公开响应、后台维护记录、来源配置、同步草稿和元信息的 Pydantic 契约。
  • 将教师资料读写从文件/临时数据迁移到数据库,并提供 load_teacher_storewrite_teacher_storepublic_response_from_store 等统一入口。
  • 对公开响应做投影处理:公开接口仅返回展示所需字段,不暴露后台同步状态、审校草稿和内部维护字段。
  • 对教师 ID、研究方向、JSON 字段、排序和来源配置做规范化,降低脏数据进入数据库的概率。

公开与后台 API

  • 新增公开接口:
    • GET /teachers/list:返回启用教师列表和公开元信息。
    • GET /teachers/detail?id=...:返回单个教师详情,未命中时返回 404。
  • 新增后台接口,均复用 login_required_publisher 权限:
    • GET /teachers/admin/list:读取后台完整维护数据。
    • POST /teachers/admin/save:新增或更新教师资料、排序、来源配置和外部链接。
    • DELETE /teachers/admin/{teacher_id}:删除教师记录。
    • POST /teachers/admin/sync:按单个教师或全量教师生成同步草稿。
    • POST /teachers/admin/publish:按字段发布待审核同步建议。
    • POST /teachers/admin/discard:忽略待审核同步建议。
    • POST /teachers/sync:保留兼容的同步入口。
  • 对后台保存请求增加校验:邮箱格式、标准浙大个人主页格式、外部链接格式、重复链接、排序冲突、ID 生成与冲突等。

标准主页同步与审核草稿

  • 新增 services/teachers_sync.py,支持从标准浙大个人主页 https://person.zju.edu.cn/<slug> 抽取姓名、职称、单位、邮箱、研究方向、简介摘要和详细简介。
  • 同步结果不直接覆盖已发布资料,而是生成 draft.changes,由后台逐字段审核后发布。
  • 对无标准主页、非标准主页、网络失败、页面可访问但无法解析、无变化等情况设置明确的草稿状态,保证已有公开资料不会因同步失败被清空。
  • 发布草稿后记录字段来源、更新时间和同步说明;忽略草稿时保留已发布资料。

验证脚本

  • 新增 scripts/verify_teachers_db.py:验证数据库记录、公开投影、详情接口、后台保存校验、内存数据库 round trip 和 404/422 行为。
  • 新增 scripts/verify_teachers_sync.py:使用本地 HTML fixture 和 fake session 验证标准主页解析、同步草稿、逐字段发布、人工保存后的草稿刷新和失败回退。

影响范围

  • 对外新增 /teachers/* API,不改变现有新闻、活动、用户、招新等接口语义。
  • 需要配套数据库迁移后使用;迁移会创建教师表并写入初始教师资料。
  • 后台写接口继续依赖已有发布者登录权限,不新增公开写入面。
  • 前端教师介绍页面依赖本 PR 的公开 API;后台教师介绍管理页面依赖本 PR 的后台 API。

验证

已在本地 csa_backend conda 环境执行:

conda run -n csa_backend python scripts/verify_teachers_db.py
conda run -n csa_backend python scripts/verify_teachers_sync.py

结果:

  • teachers database verification passed
  • teachers sync verification passed

另已执行:

git diff --check upstream/main...HEAD

结果:无 whitespace/error 输出。

后续注意

  • 标准主页解析规则当前只覆盖 person.zju.edu.cn/<slug> 形式,非标准主页会作为外部链接展示并进入人工维护路径。
  • 同步行为默认生成审核草稿,不自动发布,后续如需定时同步应继续保留人工审核边界。
  • 教师资料初始数据来自本阶段人工整理,后续仍可由协会维护者在后台逐条补充和修订。

@ElysiaFollower ElysiaFollower changed the title [codex] 新增教师介绍数据库与同步 API 新增教师介绍数据库与同步 API May 3, 2026
@ElysiaFollower
ElysiaFollower marked this pull request as ready for review May 3, 2026 14:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant