二级选课课表恢复¶
日期:2026-10-22。基线:main 8e960842。
问题与原因¶
二级课程从教务 portal3rd.do?m=bks_ejkbSearch 获取,按校历的第一周周一起点展开,再与一级 JSONP 课表合并。
时间轴窗口 effect 捕获了首次渲染的校历。冷启动时,一级课表请求可以先完成,此时 calendar.data 仍为空;校历随后更新,旧 effect 的依赖列表却缺少 firstDay,因此这次窗口保留一级结果。已缓存校历的设备容易掩盖这一时序问题。
月历列表使用独立的整月请求,原调用链直接显示一级 getSchedule 结果,二级合并入口缺失。
二级页面结构异常或落在登录页时,原解析器可返回空数组。系统日历依靠二级读取的成功状态判断完整性,因此需要将此类响应区分为加载失败。
修改¶
- 时间轴监听
calendar.data.firstDay,校历到达后重新加载窗口;过时窗口停止提交缓存和页面状态。 - 月历列表接收相同校历起点,使用共用
appendSecondarySchedule合并当前月份的二级课程。 - 合并返回新数组,按课程名、日期与开始时间去重,保留二级来源标识和原始一级快照。
- 解析器识别登录页、未知页面、截断函数和已填充但结构变化的页面;合法空函数仍表示成功空课表。
- 周次范围兼容
~,教学日与大节继续使用现有parseCellAnchor规则。 - 时间轴与列表在二级刷新失败时保留一级结果,提供中英文提示及刷新入口;诊断分别记录
SECONDARY-WEEK和SECONDARY-MONTH。 - 系统日历沿用既有完整学期保护,解析失败使同步进入完整缓存回退或失败保留路径。
验证¶
| 范围 | 结果 |
|---|---|
| 二级真实解析函数与共用合并 | 11 项通过:周次、星期、大节、窗口、范围、空表、登录与异常页、去重和输入快照 |
| 锚点规则 | 14 项通过 |
| 系统日历状态回归 | 211 项通过,包含二级失败保护、完整学期缓存及旧缓存隔离 |
| 浏览器真实页面 | 85 项断言通过:完整/极简/实用三种模式,1280 与 390 宽度,延迟校历、时间轴、列表、时段、详情、屏幕宽度 |
| TypeScript | 桌面工程 tsc --noEmit 通过 |
| i18n | 中英文各 7555/7555,errors 0;Android 62 个 fallback 一致 |
浏览器采用独立存储、模拟校园响应和真实 React 组件,外部学校网络被阻断。本机另行取回真实二级页面并验证解析数量;Windows、Android 的安装运行及完整学校会话仍需各自实机复测。
浏览器证据目录:/Volumes/OneTHUBuild/artifacts/secondary-schedule-2026-10-22/,含六张模式/尺寸截图及 report.json。
复跑¶
node tools/secondary-schedule-test.mjs
node --import ./tools/ts-resolve-register.mjs tools/secondary-anchor-test.mjs
node tools/system-calendar-state-test.mjs
pnpm --filter @onethu/desktop typecheck
pnpm i18n:check
浏览器脚本 tools/secondary-schedule-browser-test.mjs 读取 ONETHU_TEST_URL、ONETHU_TEST_OUT。Playwright 安装在独立运行时的环境可通过 ONETHU_PLAYWRIGHT_PATH 指定其 index.mjs。
应用本地源码包含本次修复;已分发安装包在重新构建后获得对应代码。
0.11.1 发布前复审¶
系统日历学期缓存升级为 syscal-sem-v5。新缓存建立在二级页面完整性校验之上,旧 v3/v4 的一级完整/二级缺失结果按原协议保留。二级读取失败时,新同步回退到 v5 完整镜像,或保留系统日历现有内容并报告失败。新增夹具验证旧 v3/v4 半量镜像保持隔离。
三端应用版本统一为 0.11.1;Android versionCode 11007。发布工作流在 macOS 和 Windows 构建前执行二级解析、锚点及系统日历状态检查。
真实页面复核:英文周次回归¶
用户在当前 tauri:dev 再次复现。原测试覆盖了中文页面结构,遗漏了学校英文面板会话的周次格式。2026-10-22 本机实际返回 9087 字符的二级课表,有 8 个有效课程块,提示串采用 week 4、week 6 等英文周次;原自写解析器只认 第4周,8 个课程块均被展开为空。0.10 阶段的中文返回可显示,学校英文面板接入后暴露出该协议兼容缺口。
修复在同一解析入口接受中英文单周、范围、单双周及全周等描述;有课程但周次未知时明确失败。完整缓存升至 v5,隔离 v3/v4 时代可能存下的缺课镜像。
实证:新增英文回归先复现失败;修改后真实页面恢复 8 条记录,当前周为 2 条。dev 实际日志已从 SECONDARY-PARSE 0 变为 SECONDARY-PARSE 2。原始页面仅保存在本机私有目录;提交中使用替换课程名与地点的八条匿名夹具。界面回归扩展到中文/英文学校响应 × 三种模式 × 1280/390 宽度,共 85 项断言。屏幕录制接口本次无法启用,桌面运行结果以实际请求及解析日志确认;页面视觉与交互由浏览器测试验证。
先前构建的未公开 0.11.1 产物以源码 d8dc26fa 为基线,缺少该英文周次修复。正式发布须替换三端包;Android 新构建递增为 11007。