修复瀑布分页课程加载、教学班数据未就绪误点和重复日志刷屏问题#25
Conversation
|
@ceilf6/repo-guard CR |
There was a problem hiding this comment.
代码评审报告: 修复瀑布分页课程加载、教学班数据未就绪误点和重复日志刷屏问题
风险等级: 高
处理建议: 请求修改
决策摘要: ** 无法评审——PR 声称修改 courseGrabber.js(+2483 -2767),但提供的 diff 内容为空,没有任何可审查的代码变更证据。
级联分析
- 变更符号: 原始模型未提供结构化级联字段。
- 受影响流程: 原始模型未提供结构化级联字段。
- 变更集外调用方: unknown
- 置信度: degraded
问题发现
- [高] 变更规模巨大且几乎全量重写,缺乏关联 issue 与充分验证证据
- 证据: +2483 -2767 对单文件意味着近乎整体重写;描述未发现关联 issue;唯一验证仅为
node --check(语法检查),未覆盖任何行为、边界或回归路径。 - 受影响调用方/流程: 该脚本运行在正方教务真实选课链路上,涉及不可逆的选课提交(
do_jxb_id)、容量判定和失败弹窗处理,行为回归风险直接影响用户选课结果。 - 最小可行修复: 提供 diff 后,需针对以下高风险路径补充验证证据:容量解析(
139/48、42/0、容量为 0)、教学班就绪判断、误点击防护、自动加载节流。语法检查不足以支撑该风险等级的合入。
- 证据: +2483 -2767 对单文件意味着近乎整体重写;描述未发现关联 issue;唯一验证仅为
行级发现
- 无明确变更行归属。
Karpathy 评审
- 假设: 模型输出需要归一化为固定 Markdown 契约。
- 简洁性: 已提取 summary、finding、evidence 与 fix;原始 prose 不再附在评论中,避免占用下游解析与代理上下文。
- 变更范围: 原始模型未提供结构化范围字段。
- 验证: 需要查看 CI、测试或人工 CR 证据补强合并信心。
缺失覆盖
- 输出未命中 Repo Guard Markdown 契约;建议补充真实模型质量评估覆盖。
|
@ceilf6/repo-guard CR again |
There was a problem hiding this comment.
代码评审报告: 修复瀑布分页课程加载、教学班数据未就绪误点和重复日志刷屏问题
风险等级: 中
处理建议: 需要人工判断
决策摘要: 功能修复方向合理,但整个文件被 2/4 空格缩进风格重排(+2483/-2767),真实逻辑变更被淹没在格式噪声里无法可靠审阅;建议先剥离格式改动再评审,否则合并风险不可控。
级联分析
- 变更符号:
isCourseCode,expandCourseByCode,findLoadedCourseHeader,requestLoadMoreCoursesForTarget,shouldSkipPeriodicRefresh,parseCapacityText,getTeachingClassReadiness,checkTeachingClassCapacity,findSelectionFailureMessage,closeVisibleAlertDialog,shouldLogState,dropCourse,selectTeachingClass - 受影响流程: 浏览器控制台注入运行的自动抢课单文件脚本;无外部导入方
- 变更集外调用方: 无(单文件用户脚本,
window.grab为唯一外部入口) - 置信度: degraded(diff 被截断且被全局重格式化,无关联 issue,无法确认所有行为变更)
问题发现
-
[高] 全局缩进风格重排淹没真实逻辑变更
- 证据: 单文件 +2483 -2767,整段从 2 空格重排为 4 空格;
safeFilter/safeMap被删除并内联重写。 - 受影响调用方/流程: 整个脚本;无法把行为变更与格式噪声分离,评审信心与回归定位能力显著下降。
- 最小可行修复: 拆成两个提交/PR——一个纯格式化、一个纯逻辑修复;或保持原缩进只提交逻辑 diff。
- 证据: 单文件 +2483 -2767,整段从 2 空格重排为 4 空格;
-
[中]
isCourseCode正则收窄可能破坏字母数字课程号匹配- 证据: 旧实现
^[A-Za-z0-9_-]+$且含数字;新实现^\d+$(纯数字)。 - 受影响调用方/流程:
expandCourseByCode、findLoadedCourseHeader、isRowMatchingCourse、findAllTeachingClasses全部依赖此判断;2328A009/CS102这类课程号会被当作课程名走模糊匹配,可能误匹配或漏匹配。 - 最小可行修复: 恢复兼容字母数字课程号的判断,或明确说明新版页面课程号一定为纯数字并在 PR 中给出依据。
- 证据: 旧实现
-
[中] 删除
safeFilter/safeMap的防污染保护但未评估回归- 证据: 原代码显式保存原生
Array.prototype.filter/map引用以防页面污染;本 PR 删除并改回内联手写循环。 - 受影响调用方/流程:
safeParseFilterInput及所有依赖数组操作的过滤逻辑。手写循环虽避开Array.prototype,但删除注释中声明的“防页面污染”设计意图属于安全属性回退。 - 最小可行修复: 保留 PR 描述说明为何该保护不再必要,或恢复原生方法引用缓存。
- 证据: 原代码显式保存原生
-
[中]
dropCourse退安全逻辑疑似被回退- 证据: 旧版对课程名匹配到多个已选课程时放弃退选(
请改用课程号避免误退);新版 diff 中dropCourse直接取第一个含“退选”文本的教学班,未见多匹配保护。 - 受影响调用方/流程: 替换/退选流程存在误退非目标课程的风险,这是不可逆写入。
- 最小可行修复: 确认并恢复课程名多匹配时的放弃退选保护。
- 证据: 旧版对课程名匹配到多个已选课程时放弃退选(
行级发现
- [courseGrabber.js:245]
isCourseCode从兼容字母数字课程号收窄为^\d+$;若正方新页面存在字母数字课程号会走错匹配分支,请确认页面课程号格式或恢复兼容判断。 - [courseGrabber.js:110] 内联重写的
safeParseFilterInput删除了原有防Array.prototype污染的原生方法缓存设计;请在描述中说明该保护为何可移除,或保留缓存。 - [courseGrabber.js:496]
getTeachingClassReadiness用capacityInfo.total <= 0判断“未加载完成”,但真实容量为 0(如x/0)也会被永久判为“未就绪”而持续监控;确认这是否为期望行为。 - [courseGrabber.js:539]
checkTeachingClassCapacity现同时依赖parseCapacityText与.full元素;139/48这类超额场景由capacityInfo.full(selected >= total)拦截,确认解析对已满文本和纯数字都覆盖。
Karpathy 评审
- 假设: 假设选课页一定是瀑布分页(
jspage/isEnd/more/loadCoursesByPaged);shouldSkipPeriodicRefresh在检测到分页环境后完全停止周期刷新,若某些页面结构不同可能导致容量永不更新。 - 简洁性:
selectTeachingClass内嵌多层setTimeout(点击→确认→再确认→验证)已深度嵌套,本 PR 又叠加失败检测分支,回调金字塔进一步加深,难以推理与验证。 - 结构质量: 单文件已超 1400 行且本 PR 未拆分;新增 readiness/capacity/failure/loadMore 等关注点仍全部堆在同一 IIFE 内,缺乏模块边界。
- 变更范围: 严重超范围——逻辑修复与全文件重格式化混在一个 PR,违反 surgical change 原则。
- 验证: 仅
node --check语法检查,没有任何针对容量解析、readiness、loadMore 节流、退选多匹配的行为测试;这些正是本 PR 的核心风险点。
缺失覆盖
parseCapacityText对已满、139/48、x/0、未知容量的单元覆盖。getTeachingClassReadiness在do_jxb_id缺失、容量占位、时间/教师占位时返回“未就绪”的验证。isCourseCode收窄后对字母数字课程号的匹配回归验证。dropCourse在课程名匹配到多个已选课程时不误退的验证。shouldSkipPeriodicRefresh在非分页页面下仍能正常刷新的验证。
因 diff 被截断且全文件重格式化,selectTeachingClass 后半段、抢课主循环、UI 与调度逻辑无法完整审阅,剩余回归风险为 degraded;合并前建议先分离格式化提交并补充上述行为测试。
| lastAttempt: 0, | ||
| }); | ||
|
|
||
| function forceExpandTargetCoursesAggressive() { |
There was a problem hiding this comment.
isCourseCode 从兼容字母数字课程号收窄为 ^\d+$;若正方新页面存在字母数字课程号会走错匹配分支,请确认页面课程号格式或恢复兼容判断。
| kcmcSpan?.querySelector("a")?.textContent?.trim() || | ||
| kcmcSpan?.textContent?.trim() || | ||
| ""; | ||
| const raw = input.trim(); |
There was a problem hiding this comment.
内联重写的 safeParseFilterInput 删除了原有防 Array.prototype 污染的原生方法缓存设计;请在描述中说明该保护为何可移除,或保留缓存。
| // 教师模糊匹配函数 | ||
| function matchesTeacherFilter(teacher, teacherFilter) { | ||
| // 如果没有配置过滤器,返回true(不过滤) | ||
| if (!teacherFilter || teacherFilter.length === 0) { |
There was a problem hiding this comment.
getTeachingClassReadiness 用 capacityInfo.total <= 0 判断“未加载完成”,但真实容量为 0(如 x/0)也会被永久判为“未就绪”而持续监控;确认这是否为期望行为。
| // 查找包含目标课程的所有元素 | ||
| const allElements = document.querySelectorAll("*"); | ||
| let courseSection = null; | ||
| /** |
There was a problem hiding this comment.
checkTeachingClassCapacity 现同时依赖 parseCapacityText 与 .full 元素;139/48 这类超额场景由 capacityInfo.full(selected >= total)拦截,确认解析对 已满 文本和纯数字都覆盖。
|
等我晚上看一下 主要我还不太熟悉git这些 |
代码评审报告: 修复瀑布分页课程加载、教学班数据未就绪误点和重复日志刷屏问题风险等级: 高 级联分析
问题发现
行级发现
Karpathy 评审
缺失覆盖
|
代码评审报告: 修复瀑布分页课程加载、教学班数据未就绪误点和重复日志刷屏问题风险等级: 高 级联分析
问题发现
行级发现
Karpathy 评审
缺失覆盖
|
|
已根据 review 反馈补充修改并 push 了新 commit,主要收敛了 isCourseCode 边界、增加 selfTest,并补充分页刷新跳过提示。主要我是学生,改的比较慢,谢谢。 |
你好,你在你们学校的选课网站上测过了吗?因为我们学校选课窗口已经过了、无法进行测试 |
|
测试成功了我才发的 主要当时就是感觉需要课程出现才能选课特别麻烦 就想改成自动点击“显示更多课程” 然后试了一下可以就提交了 |
|
已根据评审意见追加修改:
验证:
说明:完整 UI 合约测试中仍有 2 个旧 UI 主题相关失败,经确认是当前 HEAD 既有问题,不属于本次抢课逻辑修复范围。 |
PR 标题建议
修复瀑布分页课程加载、教学班数据未就绪误点和重复日志刷屏问题
改动概述
本次修改主要增强
courseGrabber.js在正方教务“自主选课”瀑布分页页面中的稳定性,解决目标课程位于“查看更多”后方、多教学班过滤、教学班详情未加载完成时误点击等问题。主要修改
loadCoursesByPaged()或点击#more。grab.loadMore()/grab.loadMore("课程号")便于手动调试。grab.status()增加已加载课程数、未加载目标课程等状态信息。kch_id,也兼容标题中的显示课程号、data-kch_id和课程名称。do_jxb_id未加载完成时不会点击选课。42/0、未知教师、未知时间等占位状态被误判为可选的问题。已选/容量中容量为 0 或已选人数大于等于容量时判定为不可选。139/48会被判定为暂无余量,继续监控而不是点击。selecting状态,避免脚本卡住。blur()当前焦点,缓解aria-hiddenfocus 警告。验证
node --check js/courseGrabber.js做语法检查,通过。