入口:`https://rd.huiflytech.com/extracur/`(与研发任务/测试/库房/评审会/家庭同一 Flask 服务 `rd-h5.service :13544`)
代码:`/home/ubuntu/.hermes/scripts/extracur.html` + `extracur_api.py`(Blueprint `bp`,必须 `@bp.route`)
数据:`/home/ubuntu/docs/extracur/extracur.db`
页面已设 `Cache-Control: no-store`(2026-09 起)
| 表 | 说明 |
| — | — |
| `courses` | 课程:`name/price/total_hours/per_hours/mode/weekdays/start_time/end_time/first_date/members/note/archived/slots` |
| `records` | 上课记录:`course_id/date/weekday/status(已上课/未上课)/note/auto` |
| `leaves` | 请假:`course_id/date/weekday/note` |
| `makes` | 补课 |
| `holidays` | 放假区间:`course_id/start_date/end_date` |
- `weekdays` / `slots[].wd` 用 0=周一 编号(`wd=3` → 星期四,`wd=6` → 星期日) - `slots` 多时段:`[{wd:[3], st:“17:30”, et:“19:30”, per:2, who:“席子恩”}, …]`
| mode | 含义 |
| — | — |
| 1 | 请假需补课(请假也占课时,显示“未上课”) |
| 2 | 请假不记课时,结束日期顺延 |
_old:每天只取【第一个匹配时段】的 per _new:当天【所有匹配时段的 per 累加】
实现位置:`extracur_api.py` → `_course_stats()` → `per_of(dstr)`
为什么改:街舞课周四有两个孩子的时段(小恩 2 课时 + 小初 0.5 课时),按旧逻辑只扣 2,实际应扣 2.5。
| # | 课程 | 总课时 | 时段(每次课时) | 已用 | 剩余 | 预计结束 |
| — | — | — | — | — | — | — |
| 1 | 瑞思英语K3(小恩) | 144 | 周二/周五 2 | 66 | 78 | 2027-03-10 |
| 2 | 瑞思英语K1(小初) | 60 | 周二/周五 2 | 36 | 24 | 2026-12-05 |
| 3 | 街舞课(共用) | 85 | 周四 小恩 2 + 小初 0.5(=2.5);周日 小初 1 | 19 | 66 | 2027-03-04 |
| 4 | 围棋课(一同弈童) | 100 | 周五 3 | 75 | 25 | 2026-12-25 |
| 5 | 声乐课(一鸣音乐) | 50 | 周日 1 | 11 | 39 | 2027-07-18 |
| 6 | 古筝课(百家筝鸣) | 24 | 周六 1 | 15 | 9 | 2026-12-26 |
| 日期 | 星期 | 扣课时 |
| — | — | — |
| 2026-09-03 | 星期四 | 2.5 |
| 2026-09-10 | 星期四 | 2.5 |
| 2026-09-13 | 星期日 | 1.0 |
| 2026-09-17 | 星期四 | 2.5 |
| 2026-09-20 | 星期日 | 1.0 |
| 2026-09-24 | 星期四 | 2.5 |
| 2026-10-11 | 星期日 | 1.0 |
| 2026-10-15 | 星期四 | 2.5 |
| 2026-10-18 | 星期日 | 1.0 |
| 2026-10-22 | 星期四 | 2.5 |
| 合计 | 周四6×2.5 + 周日4×1 | 19 课时 |
放假 2026-09-25 ~ 10-08 期间无记录(符合设定)
`cron` 自动按各时段的星期生成“已上课”记录,跳过放假区间;请假(`leaves`)在 mode=2 下不划扣。
- 改课时/时段:页面课程卡 → 编辑 → 「上课时段(可添加多个)」逐条设置 星期/时间/每次课时/使用人 - 请假:课程卡 → 请假(mode=2 当天不划扣) - 放假:设置区间,自动跳过 - 改完前端/后端:`sudo systemctl restart rd-h5.service`;页面加 `?v=N` 强刷