私教课时管理

单教练卖课包、排课、记课时的系统。卖了几节、上了几节、还剩几节,教练和学员看的是同一本账。

这是可操作的演示:学员、课包、排课全是合成数据,随便点。 真实系统在闸后运行,服务于一位真实教练与他的学员。 你的改动只存在你自己的浏览器里,刷新页面点「重置演示」即可还原。

1 · 这套系统解决什么问题

单教练卖的是课包次卡(一次买 10 节、20 节),不是按月订阅。麻烦全在中间那些不确定的事上:

学员爽约教练已经到场、场地已经占用 —— 这一节要扣,否则爽约没有成本。
教练有事取消责任在教练 —— 不扣
已经扣了又要退回学员受伤请假、下雨换场、教练记错 —— 能退,但必须写明理由,否则这本账随手就能抹平,学员对不上就不信了。
学员想自己看余额又不能给他登录账号 —— 用不可枚举的私密链接,只读。

下面的演示里这四条规则都是真的在跑,不是画的。

本周排课

学员与课包余额

2 · 技术上怎么做的

后端Python + FastAPI + SQLite,服务端渲染(Jinja2),没有前端框架。单教练的量级,一个进程一个文件足够,省掉整条前后端分离的复杂度。
余额不存字段,实时算:余额 = 课包总数 − 该包下所有「扣次状态」的课次数。存字段就会有「改了课次没改余额」的不一致,而这种不一致在对账时才会暴露。
状态机四态 已排课 / 已上课 / 未到 / 已取消;只有前两类里的「已上课、未到」扣次。从扣次态改到取消归类为 concession,强制填理由码并写审计。
学员端每位学员一枚长随机 token,独立路由只读渲染,与教练端共用同一套领域函数 —— 两端看到的数不可能对不上。
双端网页端 + 微信小程序,同一个后端。教练在健身房用手机排课,学员在微信里看余额。
演示数据全部合成,仅存在于你的浏览器(localStorage)。本页不向任何服务器发送数据。