Skip to content

bug(backend): 多教师公共课(形势与政策3/体育课)在排课模拟器中点击查看点评时显示所有教师评价而非只显示该教师评价 #152

Description

@yzxoi

用户反馈

在模拟排课界面点击张小凡老师的形势与政策3课程(课号540101)会显示这门课的所有老师的点评。体育课也有类似的问题。

意图判断

  • 类型: bug_report
  • 相关仓库: YourTJCourse-Serverless
  • 相关模块: backend (API), scheduler (frontend)
  • 标签: bug, area:backend, area:scheduler

去重检查

未发现语义重复的 open issue。Issue #79 仅涉及移动端评价弹窗样式,不涉及教师过滤逻辑。

代码静态扫描结果

根因 1: courses 表按 courseCode 聚合, 不区分教师

迁移 backend/migrations/010_materialize_courses_from_pk.sql 中的逻辑: courses 表对于形势与政策3 (540101)、体育课等多教师公共课只有一条记录, teacher_id 指向随机一名教师(MIN 聚合结果)。所有教师的教学班共享同一个 course_id。

根因 2: reviews 表缺少教师字段

backend/schema.sql 中 reviews 表只有 course_id, 没有 teacher_id / teacher_name。不同教师的教学班点评全部混入同一个 course_id 下。

根因 3: 后端 by-code 接口的教师过滤在回退逻辑中失效

backend/src/routes/public.ts 的 GET /course/by-code/:code 端点:

  1. 当 hasTeacherFilter = true 时, 先尝试 pkNamedRow / preferredRow 按 code + teacher 联合查找 courseId
  2. 如果联合查找无结果 -> 回退到仅按 code 查找(无教师过滤), 见 aliasRow / directRow 分支
  3. 构建 matchedIds 时, sameNameTeacherRows 查询只找到同一个 courseId(因为 courses 表只有一条记录)
  4. 最终 reviews 的 WHERE 子句: course_id IN (?) -> 仅查询这一个 course_id -> 返回该课号下所有教师的全部点评

Proposed Fix

推荐方案: 为 reviews 表添加 teacher_name 并升级 API 过滤逻辑

  1. Schema migration: 向 reviews 表添加 teacher_name TEXT DEFAULT 列
  2. Review 提交接口: 修改 POST /review 接收可选的 teacher_name 参数并存储
  3. by-code API: 当 hasTeacherFilter 为 true 时, 在 review 查询 WHERE 子句中增加 AND teacher_name = ? 或模糊匹配条件
  4. 回填策略: 对于已有 reviews, teacher_name 为空时不同步回填, 但新提交的 review 包含教师信息后可以逐步积累教师粒度的点评数据

补充措施

  • 前端(CourseReviewDrawer.vue)在提交点评时也应传递当前查看的 teacherName / teacherCode, 确保新点评能关联到具体教师
  • 在 POST /review 或其他评论提交路径中也对齐此逻辑

Reporter: wendaining (QQ: 2215589975)
来源: QQ 反馈群

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:backendBackend / Cloudflare Workerarea:schedulerScheduler / Vue 3 appbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions