它知道现在是第几节课, 不会在课上打扰学生
课表、作业、通知、成绩、叫人
一个后端全管,老师在电脑或手机上发布,教室大屏和每台学生机同时收到; 断网时用本地缓存接着看,网络恢复自动补齐。
- v1.2.0
- Windows 10/11
- Linux · Docker
- 触摸屏可用
08:42 07
第 6 教学周 · 单周 · 周二
正在上 数学
08:00–08:45 · 教学楼 A301 · 距下课 3 分钟
上面这个灵动岛不是截图 —— 圆角路径与尺寸都是产品的(胶囊 268×44、展开 424×230、连续圆角 4.2 次方), 形变用的是 beUI 的 Dynamic Island 那套弹簧:壳 0.8 秒、回弹 0.2,内容层回弹 0.35。
- 装着 SQLite 就能跑,需要时一键换到 MySQL —— 数据也跟着搬过去。
- 课表由教室的 ClassIsland 上报,不用在小助手这边再排一遍。
- 教室把通知交给哪个端,由教室那台机器自己选:客户端、大屏,或者两边都弹。
装什么,挑一下
四个交付物互不依赖安装顺序,但 服务端要先有一台机器跑着 ,另外三个才连得上。 下面的版本与文件清单是当场从本仓库的 GitHub Releases 读出来的:显示什么,就真能下到什么。
选择版本
正在读取版本列表……
装什么
它是怎么工作的
从按下「发布」到教室屏幕上弹出来
中间只隔着一条 WebSocket 广播。实测从老师提交到教室机器收到,是 30 到 50 毫秒 —— 这个数字由
pnpm verify:e2e
每次跑的时候重新量,不是写在文档里的估计值。
-
老师发布
Web 管理端或手机浏览器。通知、作业、叫人、成绩都在这里录。
-
后端落库
Express 5 + Prisma 7 写进库,再按班级房间广播一条事件。
-
教室收到
Socket.IO 推到
class:班级房间 —— 教室机器、学生机、大屏同时收到。 -
判一次时间
课表服务回答「现在上不上课」,当场弹还是先收着,这一步就定下来了。
-
两端弹出
灵动岛展开成卡片,ClassIsland 同时全屏提醒,可以语音朗读。
上课的时候,通知会先排队
判定来自课表本身,不是按时钟拍脑袋。把下面这条时间轴拨一下,看看同样的通知在课上和课间分别会怎样。
09:20
正在上 第三节 · 数学
普通通知
学生机 · 灵动岛
先收着,打下课铃自动弹出来
普通通知
教室大屏 · ClassIsland
先收着,下课补弹
紧急通知 / 叫人
教室大屏 · ClassIsland
立刻全屏弹出,不打断也拦不住
不管什么时候
通知中心
照常记一条,未读红点随时可查,不会被吞掉
普通叫人(默认级别)上课时只进队列,下课后自动弹出详情;标成紧急的才当场打断课堂 —— 那是老师正在等学生。老师在 Web 端发紧急通知时会先撞上全屏二次确认,确认按钮带 3 秒倒计时, 防止手滑。这一层拦在服务端,绕过界面直接调接口也一样会被拒。
它是怎么构成的
一份代码,四个交付物
一个 pnpm monorepo。三端共用同一份类型与权限矩阵,所以不会出现「Web 端说有、客户端说没有」。
| 交付物 | 形态 | 谁在用 |
|---|---|---|
| 后端服务 |
Express 5 + Prisma 7 + Socket.IO,接口前缀
/api
|
其它三端 |
| Web 管理端 | Vue 3 + Element Plus,手机可用,可在浏览器里装成应用 | 老师、管理员 |
| 桌面客户端 | Electron + Vue 3,带灵动岛与系统托盘,断网可用 | 教室机器、学生机 |
| ClassIsland 联动插件 | .NET 8 插件,装进教室已有的 ClassIsland 里 | 教室大屏 |
每个界面都是跑起来截的
下面没有一张是画的示意。这些图是脚本真的把后端、Web 管理端、教室客户端和灵动岛跑起来之后 一屏一屏截下来的 —— 数据也是库里真实的数据。
点任意一张看大图。
老师那边,教室这边
老师与管理员
#班级人员
建班、换班主任、录学生
名单可以直接导入表格。教师录入与重置密码只对管理员开放,班主任也不行。
#课表
按周排课,支持单双周
也可以直接导入 ClassIsland 的档案 JSON —— 节次时间跟着课表一起进来,不用排两遍。
#作业
按「所属日期」归类
晚上八点留的作业算今天。教室机器也能录;未交名单勾一下,其余同学自动标成已完成。
#通知与叫人
分优先级发布,点名分两档
普通叫人上课时先收着,紧急的才当场打断课堂 —— 那是老师正在等学生。
#成绩
单条、批量,或者整张表导进来
重复判定按「同班 + 同学生 + 同考试 + 同课程」,导入报错精确到 Excel 行号,改完再导。
#数据库
备份、导入导出、一键换库
SQLite 与 MySQL 互相搬数据,中途失败会自动回滚 —— 现有的库不会被动到。
教室机器与学生机
#课表时间轴
大时钟、正在上的课、距下课倒计时
已结束的置灰,正在上的带进度条,下一节还有多久开始 —— 一眼看完。
#作业看板
按科目分卡,整屏缩放到刚好放下
标题和要求全文不截断,也不用上下翻页;全屏看板会自己算最合适的列数。
#灵动岛
消息到达的第一现场
无边框透明置顶的小窗,通知、作业、叫人在里面展开成卡片;鼠标穿透,不占任务栏。
#离线缓存
断网的时候接着看
课表、作业、通知、成绩先落本地,断网顶部提示离线、照旧显示,网络恢复自己刷新。
#外观
深浅两套,岛也能整
高度、宽度、圆角、字号、停靠位置、视觉风格都能调;越界的值在主进程统一夹紧。
它是怎么到你手里的
四种装法,按场景挑
| 场景 | 形态 | 入口 |
|---|---|---|
| 教师电脑、学校机房单机 | Windows 服务端安装程序,内置 Node 运行时 | 双击安装,自动建库建号、开机自启 |
| 云服务器、多终端共享 | Docker Compose,MySQL 与 SQLite 两种编排都在仓库里 | deploy/docker-compose.yml |
| 已有 Linux 服务器 |
一行命令装成 systemd 服务,附带
classhelper
运维命令
|
见下面的命令 |
| 已有 Node 环境 | 免安装目录,自带 node.exe |
pnpm dist:server
的产物
|
curl -fsSL -o /tmp/classhelper-install.sh https://raw.githubusercontent.com/LoveChengke/ClassHelper/master/deploy/install.sh && sudo bash /tmp/classhelper-install.sh
脚本自己从 GitHub Release 取最新版、核对发布页上的
.sha256
,再装成 systemd 服务。 想先不改动系统,把末尾换成
--check
就只体检。装完之后,
classhelper upgrade
、
backup
、
doctor
、
password
这些命令都在
/usr/local/bin
里等着。
学生机这边是安装包和单文件版两种:安装包走 NSIS,单文件版不用装、放 U 盘里就能分发。 两个都不写死服务器地址 —— 第一次打开时填教室的地址和班级码就行。
每个功能都配了一条能复跑的用例
仓库里带着这几套脚本,跑到哪儿、过了几条由脚本自己数,不是文档里写死的数字。 交付前它们必须全绿 —— 包括对 已经打包装好 的那份客户端再跑一遍。
pnpm verify:e2e
接口、实时推送、权限越权、上课时段、表格导入、班级账号、数据库管理、更新检查
190
pnpm verify:desktop
客户端冒烟:登录、离线回退、灵动岛开合与命中、设置页真实点击
105
pnpm verify:packaged
对打包后 / 已安装的那份 EXE 复跑同一套冒烟
105
pnpm verify:classisland
设备令牌、课表上报、提醒下发与回执、镜像契约、幽灵行清理
42
pnpm verify:classisland-plugin
插件清单、注册完整性、C# DTO 与服务端校验逐字段对齐
68
上面是 2026-10-05 那一次的结果。这几套脚本每天都在跑,数字会变;跑到多少条,以脚本自己打印的为准。