chore(release): 1.3.3 发布并退役旧联动

This commit is contained in:
LoveChengke committed 2026-10-17 03:06:46 +08:00
1 parent b7cdc7c9ea
commit c0ebf88138
184 files changed
+5450 -11705

No files matched your search

+2 -3
View File
@@ -19,7 +19,7 @@ description: 老师点名让学生过来:普通与紧急两档、快捷短语
## 两档
| 级别 | 落库级别 | ClassHelper 班级端行为 |
| 级别 | 落库级别 | ClassHelper 班级端行为 |
| ------------ | -------- | ----------------------------------------------------------------------------------------------------- |
| **普通叫人** | `HIGH` | 课间先显示「叫人」胶囊,点击展开;**上课时段只进队列、不打断课堂**,下课后自动弹出详情(90 秒后收起) |
| **紧急叫人** | `URGENT` | **无视上课时段立即展开**,上课时被收起后仍保留胶囊、可再次点开 |
@@ -53,5 +53,4 @@ description: 老师点名让学生过来:普通与紧急两档、快捷短语
- `notification:new` 到班级房间(通知中心与灵动岛都靠它);
- `call:new` 定向到被叫学生 / 班级设备。
如果教室的「通知显示位置」不是"只在 ClassHelper",这条叫人也会推给 ClassIsland,
教室大屏一并播报。
叫人通过实时通道送达本班客户端与灵动岛。
+1 -1
View File
@@ -27,7 +27,7 @@ description: ClassHelper每一项功能怎么用:课表、作业、通知、
[角色与权限](../dev/permissions.md)。
**二、上课时段不打扰课堂。** 「上课时段」由课表实时判定,普通通知与普通叫人只进队列、下课补弹;
紧急通知与紧急叫人才会立刻打断。规则只有一份,客户端与 ClassIsland 都遵守它。
紧急通知与紧急叫人才会立刻打断。客户端与灵动岛共用这套规则。
细节见[通知与提醒](notifications.md)。
**三、实时推送只走班级房间。** 老师一发内容,服务端写库后按班级房间广播,客户端立刻更新,
+8 -23
View File
@@ -10,7 +10,7 @@ description: 通知的三档优先级、上课时段策略、紧急通知的二
## 三档优先级
| 优先级 | ClassHelper 班级端表现 |
| 优先级 | ClassHelper 班级端表现 |
| ------ | -------------------------------------------------------------------------------------------- |
| 普通 | 课间弹「新消息」胶囊,点击展开详情;**上课时段完全不显示**(窗口隐藏)并进队列,下课自动补弹 |
| 重要 | 同上,卡片上有优先级标签 |
@@ -23,12 +23,10 @@ description: 通知的三档优先级、上课时段策略、紧急通知的二
「上课时段」由课表实时判定(见[课表](schedules.md))。判定之后:
| ClassHelper 班级端行为 | 上课时段 | 课间 / 放学 |
| ---------- | ---------------------------------------- | ----------- |
| 普通通知 | 收着不弹(窗口隐藏),进待发队列 | 直接弹 |
| 紧急通知 | **立刻弹** | 立刻弹 |
| 任何点击 | 一律不响应(不会展开、也不会回缩出胶囊) | 正常 |
ClassIsland 那一端遵守同一套规则,否则会出现"学生在客户端看不到、却在教室大屏上被打断"。
| ---------------------- | ---------------------------------------- | ----------- |
| 普通通知 | 收着不弹(窗口隐藏),进待发队列 | 直接弹 |
| 紧急通知 | **立刻弹** | 立刻弹 |
| 任何点击 | 一律不响应(不会展开、也不会回缩出胶囊) | 正常 |
## 紧急通知的二次确认
@@ -48,20 +46,9 @@ Web 端在提交前会先查一次上课状态,命中就弹一个**全屏二
**这个拦截在服务端,不是前端提醒。** 绕过界面直接调接口一样会被拦 —— 这是产品行为,不是可以关掉的提示。
## 提醒弹在哪个端
## 提醒显示
教室机器上的客户端「设置 → 提醒」里选,选择会同步到班级记录:
| 选择 | ClassHelper 客户端 | ClassIsland |
| ----------------------------------------- | ------------------------------ | ----------- |
| `ClassHelper 与 ClassIsland 都弹`(默认) | 弹窗 + 灵动岛 | 全屏提醒 |
| `只在 ClassHelper 客户端弹` | 弹窗 + 灵动岛 | 不推送 |
| `只在 ClassIsland 上弹` | 只进通知中心(不弹窗、不上岛) | 全屏提醒 |
这条规则**任何入口都遵守**,包括 ClassIsland 联动页的「下发提醒」——
那种情况下会回一句"该班教室已设置为只在 ClassHelper 客户端显示"。
管理员与教师也可以用 `PATCH /api/classes/:id/notification-channel` 改,但默认由教室机器自己定。
通知通过实时通道发送到 ClassHelper 客户端与灵动岛。设置页显示本机提醒规则,旧的跨应用通知渠道已移除。
## 已读、红点与删除
@@ -74,9 +61,7 @@ Web 端在提交前会先查一次上课状态,命中就弹一个**全屏二
## 发布入口只有一个实现
「通知发布」页、叫人、ClassIsland 联动页的「下发提醒」三个入口,
**共用同一份 ClassIsland 推送实现**。所以不存在"某个页面发的通知不联动"这种事 ——
以前有过,现在是硬约定:新增发通知的入口必须复用同一份代码。
「通知发布」与叫人复用同一套服务端发布流程和实时广播。
## 接口
+5 -17
View File
@@ -51,27 +51,15 @@ GET /api/schedules/current?classId=<班级 id>[&at=<ISO 时间>]
返回 `{ inClass, current, next, week, serverTime }`。`at` 参数可以覆盖判定时刻,用来联调与测试。
判定结果被用在四处,规则完全一致:
判定结果被用在三处,规则完全一致:
1. 客户端灵动岛:上课时段普通通知**不显示**(窗口直接隐藏)并进队列,下课自动补弹;
2. ClassIsland 插件:同样暂存,下课后补弹;
3. 服务端发布接口:上课时段发紧急通知会被拦(`409 URGENT_DURING_CLASS`),确认后放行;
4. Web 端:提交紧急通知前先查一次状态,命中就弹全屏二次确认。
2. 服务端发布接口:上课时段发紧急通知会被拦(`409 URGENT_DURING_CLASS`),确认后放行;
3. Web 端:提交紧急通知前先查一次状态,命中就弹全屏二次确认。
## 课表的"来源"字段
## 课表来源
每一行课表都记着它是从哪来的:
| 来源 | 什么时候产生 | 会被自动清理吗 |
| ------------- | ---------------------------------------------- | ---------------------------- |
| `manual` | Web 端手工录入、从 ClassIsland JSON 一次性导入 | **不会**,永远保留 |
| `classisland` | 教室插件上报同步过来的 | 会——本次没再上报的行会被删掉 |
这条规则解决了"老师在 ClassIsland 里删掉一节,小助手这边却永远留着"的幽灵课问题,
同时保证老师在小助手这边手排的课不会被插件覆盖掉。
> 去重键是「星期 + 开始时间 + 单双周」。如果老师手排的某一节恰好和上报的同一时间槽重合,
> 那一行会被上报"收养"(保留原本的 `manual` 来源),下一次清理不会删它。
课表由管理端维护,支持手工录入与离线 JSON 导入。升级会保留旧联动课表并将其来源归为 `manual`。
## 排课 / 改课 / 导入