ANU 课表
查看你在 ANU 的辅导课和实验课分组如何与讲座安排在一起,每次看一个带日期的教学周。
在线地址: https://comp4020-crit7-petrewei.fly.dev/zh/
MyTimetable 把每门课的分组分开显示,无法看到已分配的分组在不同课程之间如何衔接。这个应用列出每个实验课和辅导课的分组并标出已分配的那一组,可以记录另一个分组,并按上课日期显示你的讲座和已分配的分组,冲突标在发生冲突的日期上。
它按我自己的 2026 年第二学期课表(COMP3300、COMP3500 和 COMP4020)建模,没有登录功能,所以任何拿到网址的人都可以更改记录的分配。
功能
- 分组一览。 每个实验课和辅导课列出其分组、固定上课时间和剩余名额,COMP4020 辅导课的每个小组还列出小组名称和助教。卡片的详情给出每次课的类型、日期和教室,包括一次性的补课,例如因公共假日而调课的辅导课。
- 记录分配。 在某个分组上按“分配”即可记录。分配保存在 SQLite 中,所以刷新页面、重启服务器或重新部署后都还在。
- 你的一周。 选定教学周的周一到周五日历,显示你的讲座和已分配的分组,并有上一周和下一周的链接,以及跳到任意一周的滑块。
- 冲突标在正确的日期上。 两次课在同一个星期几、时间重叠且有共同日期时才算冲突。一次性的课只在它所在的那一周冲突:7 月 30 日的 COMP3500 讲座只在那一周与实验课小组 01 冲突。
- 不需要 JavaScript。 每个“分配”按钮都是表单按钮,切换周次用的是普通链接和一个自带“显示”按钮的表单滑块,服务器会拒绝该课程没有的分组。
- 简体中文。 两个页面也在
/zh/和/zh/readme/提供,课程名称和界面文字已翻译,课程代码、活动代码、分组编号、教室和时间保持 MyTimetable 中的原样。
数据
课程和分组于 2026 年 9 月 29 日从 MyTimetable 复制到 src/data/timetable-2026-s2.json,COMP4020 辅导课的小组名称和助教于 9 月 30 日从课程网站复制,每次启动时都用这个文件填充数据库。日历订阅网址不放在仓库里,因为它能读取我的课表。
技术栈
- Astro 7,使用 Node 适配器进行服务器端渲染
- 通过 better-sqlite3 和 Drizzle ORM 使用 SQLite
- Vitest 和 jsdom,针对构建好的服务器进行测试
- Fly.io,数据库放在 Fly 卷上
快速开始
你需要 Node 24 和 pnpm 11;mise install 会根据 mise.toml 安装这两个工具。
pnpm install
pnpm dev
开发服务器运行在 http://localhost:4321。数据库创建在 .data/app.db;设置 DATABASE_PATH 可以使用其他文件。
| 命令 | 作用 |
|---|---|
pnpm dev |
启动开发服务器 |
pnpm build |
把 Node 服务器构建到 dist/ |
pnpm check |
类型检查、构建并运行所有测试 |
pnpm db:generate |
编辑 src/lib/schema.ts 后生成迁移文件 |
测试
spec/ 中的测试用一个全新的数据库启动构建好的服务器,覆盖刷新和重启后的持久化、页面自带的表单、被拒绝的请求、冲突规则、中文页面、每个分组都来自 MyTimetable 的副本,以及仓库中没有提交订阅网址或学号。页面是否比 MyTimetable 更清楚、在手机上是否好读,则要在浏览器中判断。
部署
每次推送到 main 都会在 GitHub Actions 中运行检查,通过后部署到 Fly.io。迁移在持有数据卷的机器启动时运行。
项目结构
src/data/timetable-2026-s2.json:从 MyTimetable 复制的课表src/lib/:数据库结构、数据填充、冲突规则、周视图和翻译src/components/Timetable.astro:分组和周日历,在/和/zh/提供README.zh-CN.md:本说明的简体中文版,在/zh/readme/提供src/pages/api/allocation.ts:记录分配spec/:针对构建好的服务器的测试drizzle/:已提交的迁移文件
未实现
偏好排序、登录、标签页之间的实时更新,以及编辑课表。
智能体的工作规则在 CLAUDE.md 中,应用的构建过程记录在 PROCESS.md 中。