跳转到内容

核心概念

这九个词贯穿全部文档。先花五分钟弄懂,后面每一页都会顺很多。

班级 vs 课次(最容易搞混的一组)

章节:班级 vs 课次(最容易搞混的一组)
  • 班级档案——「初一数学A班」是一条记录,有学生名单、有任课老师、有教室。
  • 课次时间轴上的实例——「10 月 8 日 18:00–19:30 的那一节」。

中间隔着一层:节奏。你在班级上排的是「每周三 18:00」这个规则,系统把它在学期范围内物化成 18 个具体课次。

班级「初一数学A班」
└─ 节奏「每周三 18:00–19:30」
└─ 物化 ──▶ 课次 9/3、9/10、9/17 …(跳过假期周)共 18 节

这一层理解错,后面调课、停课、补课、打印全会跟着错。三个最常见的后果:

  • 想改「以后每周都挪到周四」,却一节一节地拖——那是改课次,不是改节奏。
  • 改了节奏,奇怪为什么已经手工调过的那节课没跟着变。
  • 停一次课和停整段课,操作入口不一样。

展开见学期节奏与物化

报读 ≠ 编班(第二组最容易搞混的)

章节:报读 ≠ 编班(第二组最容易搞混的)
  • 编班是把学生放进班级的花名册,决定他出现在哪张课表上。
  • 报读是给学生的课时账户入一笔账,决定他有多少课时可以消耗。
  • 两件事互不触发:编了班不等于买了课时,买了课时也不等于进了班。

展开见报读与课时台账建班级、编班

点名产生课消

章节:点名产生课消
  • 课时不是手工扣的,是点名的副产品
  • 点名保存的同一个事务里,课消行就写进台账了;台账里 kind='attendance' 的行没有别的写口
  • 改点名记录,课消跟着增改删。

展开见点名与课消

  • 课时不是一个总数,是按学生 × 学科分开的几个桶
  • 没指定学科的那个桶叫「通用课时」。
  • 所以会出现「合计余额是正的,但数学桶已经欠着了」这种情况,预警名单会把那一桶单独标红。

展开见课时余额与预警

校区是底座概念,不是花名册的一部分。它是权限范围的锚:一个校区管理员「只能管西湖校区」,这个「只能」是靠校区实现的。

技术上校区(scope_units)住在 modules/identity,不隶属于任何业务积木——这就是为什么权限总是「按校区划」的。教室、学生、成员都挂在校区下面,周网格也按校区筛选。建法见建校区

一个机构 = 一个租户。数据隔离在数据库层面用行级安全(RLS)强制,不是靠应用层过滤。见多租户与行级安全

四个内置角色:总部超管 / 校区管理员 / 教务 / 老师。

角色决定能做什么(权限点),校区决定能对谁做(范围)。两者是正交的:

能做什么能对谁做
总部超管全部权限点全部校区
校区管理员排课 / 看板 / 基础档案 / 打印限一个校区
教务排课 / 基础档案 / 打印限一个校区
老师查看课表 + 收集提交 + 打印可跨多个校区

所以「教务」和「校区管理员」的差别不在校区数量,在权限点——前者没有看板。

学期划定时间范围(名称 + 起止日期)——周数由起止日期算出来,不用你填;校历在这个范围里一天一条地登记节假日,没有「按周标上课周 / 假期周 / 调休」这种粒度。

物化课次时两者都会被算进去——国庆七天各登记一条,那七天就不会凭空多出课。建法见定学期与校历

OpSkool 是「一个底座 + 一组可拼装的能力积木」。哪些积木能用,由开通状态决定,安全默认是「什么都没开通」——所以新装的实例不跑种子会看起来是空的,见首次初始化必读

社区版的种子数据里写了一条全开的长效记录,完整对照见社区版与专业版对照