它知道现在是第几节课, 不会在课上打扰学生
课表、作业、通知、成绩、叫人
一个后端全管,老师在电脑或手机上发布,教室大屏和每台学生机同时收到; 断网时用本地缓存接着看,网络恢复自动补齐。
- v1.4.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 —— 数据也跟着搬过去。
- 课表由教师在管理端维护,教室客户端实时接收变更。
- 课件按日期与类型归档,教师可向授课班级共享或推送,灵动岛实时显示接收进度。
- 通知实时送达客户端;经典模式课堂暂存普通提醒,自定义模式提示铃铛。
装什么,挑一下
三个交付物互不依赖安装顺序,但 服务端要先有一台机器跑着 ,管理端与客户端才连得上。 下面的版本与文件清单是当场从本仓库的 GitHub Releases 读出来的:显示什么,就真能下到什么。
选择版本
正在读取版本列表……
装什么
它是怎么工作的
从按下「发布」到教室屏幕上弹出来
服务端保存内容后通过 WebSocket 广播,客户端刷新对应页面。实际延迟受网络与设备影响, 验收时由
pnpm verify:e2e
的本次输出记录。
-
老师发布
Web 管理端或手机浏览器。通知、作业、叫人、成绩都在这里录。
-
后端落库
Express 5 + Prisma 7 写进库,再按班级房间广播一条事件。
-
教室收到
Socket.IO 推到
class:班级房间 —— 教室机器、学生机、大屏同时收到。 -
判一次时间
课表服务回答「现在上不上课」,当场弹还是先收着,这一步就定下来了。
-
客户端显示
通知中心同步记录,灵动岛按经典或自定义模式提示。
上课的时候,通知会先排队
以下示例展示经典固定模式。课表决定课堂状态;自定义常驻模式通过铃铛提示消息,由用户主动展开。
09:20
正在上 第三节 · 数学
普通通知
学生机 · 灵动岛
先收着,打下课铃自动弹出来
普通通知
教室大屏 · ClassHelper
先收着,下课补弹
紧急通知 / 紧急叫人
教室大屏 · ClassHelper
灵动岛立即展开提醒
不管什么时候
通知中心
照常记一条,未读红点随时可查,不会被吞掉
经典模式普通叫人上课时保留可点击胶囊,不自动展开;紧急叫人立即展开。自定义模式都先提示铃铛。 那是老师正在等学生。老师在 Web 端发紧急通知时会先撞上全屏二次确认,确认按钮带 3 秒倒计时, 防止手滑。这一层拦在服务端,绕过界面直接调接口也一样会被拒。
它是怎么构成的
一份代码,三个交付物
一个 pnpm monorepo。三端共用同一份类型与权限矩阵,所以不会出现「Web 端说有、客户端说没有」。
| 交付物 | 形态 | 谁在用 |
|---|---|---|
| 后端服务 |
Express 5 + Prisma 7 + Socket.IO,接口前缀
/api
|
管理端与客户端 |
| Web 管理端 | Vue 3 + Element Plus,手机可用,可在浏览器里装成应用 | 老师、管理员 |
| 桌面客户端 | Electron + Vue 3,带灵动岛与系统托盘,断网可用 | 教室机器、学生机 |
每个界面都是跑起来截的
下面没有一张是画的示意。这些图是脚本真的把后端、Web 管理端、教室客户端和灵动岛跑起来之后 一屏一屏截下来的 —— 数据也是库里真实的数据。
点任意一张看大图。
老师那边,教室这边
老师与管理员
#班级人员
建班、换班主任、录学生
名单可以直接导入表格。教师录入与重置密码只对管理员开放,班主任也不行。
#课表
按周排课,支持单双周
也可以直接导入 ClassIsland 的档案 JSON —— 节次时间跟着课表一起进来,不用排两遍。
#作业
按「所属日期」归类
晚上八点留的作业算今天。教室机器也能录;未交名单勾一下,其余同学自动标成已完成。
#通知与叫人
分优先级发布,点名分两档
普通叫人上课时先收着,紧急的才当场打断课堂 —— 那是老师正在等学生。
#成绩
单条、批量,或者整张表导进来,还带排名
重复判定按「同班 + 同学生 + 同考试 + 同课程」,导入报错精确到 Excel 行号。单科排名自动出;这次考试要不要把各科相加排总分榜,你说了算。
#数据库
备份、导入导出、一键换库
SQLite 与 MySQL 互相搬数据,中途失败会自动回滚 —— 现有的库不会被动到。
#权限
谁能做什么,点着勾
建权限组、把账号分进去。没分组的按角色默认生效,分组之后只按组的并集算 —— 既能放权,也能收权。
#教室机器
统一管理设备、远控与更新
统一查看客户端在线状态、版本与远控结果,按设备或班级下发更新;可立即安装,或等待放学后安装。
#大模型助手
说一句话就发出去
它只把话解析成待确认的卡片,你点了才落库 —— 权限与上课时段保护仍复用既有流程。
#批量发布
勾几个班,一次发完
通知与作业都能批量。个别班失败不影响其余班级,哪个班为什么没发出去会逐班写清楚。
教室机器与学生机
#课表时间轴
大时钟、正在上的课、距下课倒计时
已结束的置灰,正在上的带进度条,下一节还有多久开始 —— 一眼看完。
#作业看板
按科目分卡,整屏缩放到刚好放下
标题和要求全文不截断,也不用上下翻页;全屏看板会自己算最合适的列数。
#灵动岛
消息到达的第一现场
无边框透明置顶的小窗,通知、作业、叫人在里面展开成卡片;鼠标穿透,不占任务栏。
#成绩排名
教室里就能看排名
单科榜按得分率排、并列同名次;老师把这次考试设成「各科相加」后,还多一张总分榜。开不开由服务端定,教室里只读。
#离线缓存
断网的时候接着看
课表、作业、通知、成绩先落本地,断网顶部提示离线、照旧显示,网络恢复自己刷新。
#外观
深浅两套,岛也能整
高度、宽度、圆角、字号、停靠位置、视觉风格都能调;越界的值在主进程统一夹紧。
#自愈
崩了会自己回来
渲染进程挂了先安静地重建窗口;断网期间错过的通知,重新上线时补弹一次。
它是怎么到你手里的
四种装法,按场景挑
| 场景 | 形态 | 入口 |
|---|---|---|
| 教师电脑、学校机房单机 | Windows 服务端安装程序,内置 Node 运行时 | 双击安装,自动建库建号、开机自启 |
| 云服务器、多终端共享 | Docker Compose,MySQL 与 SQLite 两种编排都在仓库里 | deploy/docker-compose.yml |
| 已有 Linux 服务器 |
一行命令装成 systemd 服务,附带
classhelper
运维命令
|
见下面的命令 |
| 已有 Node 环境 | 从源码构建,使用已安装的 Node |
pnpm build
后启动服务端,详见部署文档
|
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
接口、实时推送、权限越权、上课时段、表格导入、班级账号、数据库管理、更新检查
隔离
pnpm verify:desktop
默认后台快速检查:启动、桥接、缓存与关闭;视觉验收需 --visual
后台
pnpm verify:packaged
对打包后 / 已安装的那份 EXE 复跑同一套冒烟
后台
覆盖范围和数量以本次输出为准;默认后台冒烟不占用桌面,动画和透明度使用显式视觉验收。