找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1052|回复: 71

[辅助教学] [原创]课堂签到 · 局域网版 —— 教师机开着程序就是服务器,学生点一下名字就签完

[复制链接]
发表于 2026-10-10 10:40:04 | 显示全部楼层 |阅读模式
本帖最后由 addre 于 2026-10-14 15:46 编辑

一句话
教师机双击一下,它自己就是服务器;学生机(哪怕机房里锁死的老机器)用浏览器打开一个网址,点一下自己的名字就签完。投影大屏上四个数字实时跳。

学生不装软件、不注册、不记密码;教师机不用装任何东西;整套跑在局域网里,不经过任何外部服务器。
当前版本 v2.8.1.0(Windows)。两个形态:单文件版 42 MB(拷一个文件双击)、免安装目录版 108 MB(整个目录拷走)。


图形界面启动器:启动/停止、开工作台、开大屏、备份数据库、自检、复制学生网址都是按钮。数据写在程序旁边的 data/ 里,整个文件夹拷 U 盘就走。


为什么不用云签到
教室点名两个老问题:慢(念一遍三五分钟)、假(代答「到」谁都会喊,事后没台账)。云方案要装 App、绑微信、连外网 —— 遇上机房没网、外网被封、学生不许带手机就全废了。

典型场景说明
机房 / 多媒体教室学生机统一、有浏览器、不许装软件、不许连外网。实测 20 台设备并发提交 14 ms 全部落库、无丢写
日常上课考勤课表排好后进「今日课程」点一下就开场,5 分钟到点自动结束
断网 / 弱网 / 外网受限全链路只用局域网 HTTP 与 SSE,封外网、信号差、云平台卡顿完全不受影响


三端,一个进程一个端口
🖥️ 教师机 · 工作台 /admin —— 建班级、导名单、排课、开签、导出
📺 投影 · 签到大屏 /screen —— 四个大数字 + 进度环 + 二维码 + 签到码 + 随机点名
📱 学生机 · 学生端 http://教师机IP:8080/ —— 点名字 → 提交,一行 8 个格子
大屏与学生端走 SSE 实时推送,学生端不用刷新、不用重新扫码。数据只落在一个 SQLite 文件 data/checkin.db。

五分钟上手
启动方式怎么做
单文件版拷 课堂签到-单文件版.exe 一个文件过去(42 MB,内嵌 Node),双击
免安装目录版整个目录一起拷,双击 课堂签到.exe(108 MB,启动 0.8 秒)
源码方式装 Node.js 22.5+,双击 启动签到.bat



启动后先跑 6 项自检:数据目录 / 数据库 / 端口 / 防火墙 / 局域网地址 / 页面资源,红项会写明原因和处理办法。


学生连不上,90% 是防火墙没放行,自检页给出现成命令(管理员身份跑一次):
netsh advfirewall firewall add rule name="ClassroomCheckin" dir=in action=allow protocol=TCP localport=8080
首次配置只做一次:设 4 位口令 → 建班级 → 导入名单 → 排课表。学生端网址 http://教师机IP:8080/ 末尾斜杠不能少。

各功能怎么用
① 开一场签到:今日课程一键开 / 大屏选班级开 / 手动开始,时长 2/5/10/15 分钟,到点自动结束。点「开始签到」后学生端不用刷新,名单自己亮起来。同一个班同时只能开一场,不同班可以同时开(多班并行时学生端网址带班级:/c/班级ID)。

工作台「今日课程」:排过课后按星期自动列出今天的课,点一下就开。

② 名单:模板四列 年级,班级,学号,姓名,向导看表头识别列(顺序可乱)。三种写入模式,多班默认落在不删人的「合并」;导入后还能逐行增删改。

一次导入全校:文件里带「年级/班级」两列,一份表把整个年级一起建出来。

③ 签到大屏:四个大数字(已签到/未签到/应到人数/签到率)+ 进度环 + 最近 10 次签到,断线自动重连。

签到大屏:投影给全班看的实时进度。

④ 学生端:点名字 → 点提交,两个动作。一人一场一次,选错再点取消,提交后不能改;同一台电脑一场只能提交一次(防刷新代签);名单一行 8 个。

学生端(电脑)。

⑤ 历史与导出:按班级 + 日期筛选 → 4 个工作表,第四张「学生汇总」是按人的(应到·实到·缺勤·迟到·代签·出勤率),期末直接交班主任。

历史记录与导出。


四个特色功能(简)
1 · 一次导入全校:传统导入的班级归属靠「界面上选中的那个班」,表被转发、存档后归属就丢了。这里把年级班级写进文件,价值不在少点几下,在归属不再丢;多班默认「合并」不删人。
2 · 签到码:学生端网址要发到班级群,那就是公开的。开签时用 crypto.randomInt 生成 4 位数字,只投在教室大屏上(学生端接口只拿得到「本场要不要码」这个布尔值)。

大屏扫码卡片:二维码 + 网址 + 本场签到码。

3 · 随机点名:抓缺席从「没签到的」抽,答题从「全班」抽,开关就地切换;一次抽 N 人一次排出 N 个名字,一轮不重复。

一次抽 10 人,弹窗写着「本轮已抽 10/24,还剩 14 人」。

4 · 期末按人算账:期末要看的不是「第 3 次课谁没来」,而是「小王这学期缺了几次」—— 就是那张「学生汇总」表。
另有:老师代签(可标迟到,只认教师机时间)、撤销结束(收早了再放开 2 分钟,重开记进报表)。

与竞品对比
对标:学习通、雨课堂、课堂派等
对比项学习通 / 雨课堂 / 课堂派本系统
学生怎么用装 App + 注册 / 绑微信开个网址扫码即进
要不要外网要(厂商云)不要,纯局域网
抓缺席的点名雨课堂只抽已签到的可从没签到的抽
数据在哪厂商云老师电脑上一个文件
教师机装什么浏览器 / PPT 插件 + 微信双击 exe 就完事


优点:学生零安装零注册;不碰公网不碰云;零第三方依赖(内置 SQLite + 手写 XLSX + 手写二维码,没有 npm 依赖,也就没有供应链风险);可解释的失败(每个失败原因都有对应的一句人话)。
三个坑:① 防火墙没放行(自检页有命令);② 教师机地址会变;③ 还原卡会把 data 还原。
分享前先删掉 data/ —— 里面有管理口令的哈希与真实学生姓名学号。
下载链接


楼下跟帖补:四个特色功能的详细示例、零依赖与安全加固、14 套测试的质量数据。有需求或 bug 欢迎跟帖。

提取码.rar

81 Bytes, 阅读权限: 1, 下载次数: 8

售价: 100 RMB金钱  [记录]

提取码

回复

使用道具 举报

 楼主| 发表于 2026-10-10 10:54:53 | 显示全部楼层
楼主补充①:四个特色功能,逐个拆开讲(主帖里只列了结论)

示例 1 · 一次导入全校:把「年级 / 班级」写进文件里
传统导入只能「先选中左边那个班,再导」,归属靠的是界面上选中的那个班这个上下文 —— 一份表被转发、存档、归档之后归属就丢了。这个功能的价值不在「少点几下」,在「归属不再丢」。
① 准备四列文件(顺序可乱,向导看表头)→ ② 点「解析并校对」,界面会写明「本次将导入 2 个班(以文件里的年级/班级两列为准,不是左边选中的那个班)」→ ③ 不存在的年级班级连名字一起建,默认勾选 → ④ 多班默认落在「合并」(按学号更新姓名、补新人、不删人)→ ⑤ 整批一个事务,任何一组失败前面几组一个字不写。
※ 多班默认不是「覆盖」的原因:功能从「一次动一个班」扩到「一次动全校」后,覆盖的误删面会放大 —— 一份只含 3 个年级、某个班只填了前 20 人的表,会让所有涉及的班静默丢人。更狠的是一份被转发过的表(少了两个班)导进去,那两个班就空了。

示例 2 · 签到码:给「在场」上一道锁
学生端网址是要发到班级群的,那就是公开的,没来教室的人拿到网址照样能签。
① 勾上「开签时要求签到码」→ ② 开签时系统用 crypto.randomInt 随机生成一个 4 位数字(不是 Math.random,它是凭证,不该可预测)→ ③ 投在大屏上,扫码卡片上会显示那 4 位数字 → ④ 学生扫完码进去,先输对屏幕上那 4 位数字再提交 → ⑤ 判定严格:完全相等才算对(1234 不会被 12345 蒙对)。
[img][/img]
学生端输码后选中自己的名字。

※ 签到码只显示在教室里的屏幕上,扫描网址进来的人拿不到它 —— 码一旦能从接口读出来,这个功能就等于没做。所以学生端只拿得到「本场要不要码」这个布尔值。

示例 3 · 随机点名:一次抽 10 个人,一轮内不重复
两种都是真实需求:抓缺席要从「没签到的」里抽;抽人回答问题要从「全班的」里抽。所以给一个就地切换的开关,默认落在「没签到的」。
大屏「未签名单」卡片右上角点「随机点名」→ 弹窗顶部切换范围(括号里是实时人数)→ 在「一次抽 N 人」里填数量,点「再抽一次」,屏幕上一次排出 10 个名字,不是让你点 10 次 → 一轮之内不会重复抽到同一个人,弹窗写着「本轮已抽 10/24 还剩 14 人」→ 抽完一轮会出现「本轮已抽完」,点「重开一轮」从头抽(只清记录,不会顺手替你抽一个)。
[img][/img]
抽 1 个人。

※ 对标时发现:某主流课堂工具(雨课堂)的随机点名只从「已签到名单」里抽,未签到者不参与,也就是说「抓缺席」这件事它做不了。我们把这个开关交给老师自己拨。

示例 4 · 期末按人算账:导出的第 4 张表「学生汇总」
期末真正要看的不是「第 3 次课谁没来」,而是「小王这学期一共缺了几次」。
进「历史记录」筛选班级 + 日期范围 → 点「导出考勤表(4 个工作表)」→ 前三张是按场次的原始账(场次汇总 / 签到明细 / 缺席名单),第四张「学生汇总」是按人的结论:
学号 · 姓名 · 班级 · 应到次数 · 实到 · 缺勤 · 迟到 · 教师代签 · 出勤率(%)
把第四张表直接交给班主任即可。文件名会带上表数(如 考勤_高一(3)班_全部日期_4表.xlsx),不打开也能看出是哪个口径。

—— 下一条跟帖补:各功能的更多细节(多班并行 / 名单三种模式 / 课表 / 手机竖屏 / 学生端判定链)+ 明确不做与顺手能用的场景。
回复

使用道具 举报

 楼主| 发表于 2026-10-10 10:58:09 | 显示全部楼层
楼主补充②:各功能更多细节(主帖篇幅有限,这里补全)

多班并行:同一个班同时只能开一场,不同班可以同时开。多班并行时学生端网址带班级:http://教师机IP:8080/c/<班级ID>,哪个班在签就发哪一条。
[img][/img]
两个班同时签到,大屏可切换查看各自进度。


名单:三种写入模式
模板四列 年级,班级,学号,姓名,向导看表头识别列,顺序可乱。学号按文本保存,007 和 7 是两个不同学号。单次最多 8000 行 / 16MB。
模式表里没有的已存在的(学号相同)什么时候用
合并新增按学号更新姓名★ 常规重导。只补人、只改名,绝不删人
覆盖新增删掉重建(表里没有的人会消失)只给单班用,且确认过这份表是全的
追加新增跳过(名字也不改)纯粹补录新人

导入后还能逐个改:每行后面有 ↑↓「修改」「删除」,表头有「+ 添加学生」「删除选中」—— 中途转来一个学生、学号打错一位,都不必再导一遍整表。顶部有「导出名单」与「导出全校名单」(四列,与导入模板完全同构,改完直接导回)。
[img][/img]
名单维护:增删改调序都在表格里就地完成。

※ 改名单会同时作用到正在进行中的那一场,已结束的历史场次一个字都不变 —— 每一场的「应到人数」是开签那一刻的名单快照,考勤一旦产生就不该被事后改写。

课表:填「星期 / 开始 / 结束 / 节次 / 班级」(全角冒号自动归一成半角),排好后「今日课程」按星期自动列出。
[img][/img]
课表维护。


学生端 · 手机竖屏:名单一行 8 个,屏幕窄了自动降列,手机竖屏仍是 2 列。每次提交,服务端顺着一条链往下判,每一关都有对应的一句人话:
关卡学生看到的话
场次是否进行中签到已结束,请等老师重新开始
是否在本班在册你不在本班名单中,请举手告诉老师
本场是否要签到码本场需要签到码,请输入屏幕上公布的 4 位数字
码对不对签到码不对,请看屏幕上最新公布的 4 位数字
本场是否签过你已签到,无需重复提交
设备是否已被占用该设备本场已完成签到(已为 XX 签到),请回到自己的座位
提交太频繁这台设备提交次数过多,请稍等一会儿再试

[img][/img]
手机竖屏仍是两列。


明确不做 vs 顺手能用
顺手也能用在:实训室分组点到、培训班到场统计、会议签到、值班在岗确认 —— 只要「一张名单 + 一块屏幕 + 一个局域网」就成立。
明确不做:不做 GPS 围栏(虚拟定位 App 公开可得,拦不住有心人,却会让「在教室但信号差」的学生签不上,在场证明我们改用签到码);不做拍照留痕(涉及学生人脸信息,合规成本远高于收益);不做云同步 / 家长端(与「不碰公网、数据在老师手里」这条底线冲突)。

—— 下一条跟帖补:底子(零依赖)、修掉的安全问题、以及 14 套测试的质量数据。
回复

使用道具 举报

 楼主| 发表于 2026-10-10 11:00:45 | 显示全部楼层
楼主补充③:底子(零依赖)、修掉的安全问题、质量数据

零依赖是怎么做到的
通常要引库的事这里的做法
数据库Node 内置 node:sqlite —— 拿到事务、崩溃恢复和「备份变成一个文件」,同时守住「解压即用、不编译原生模块」。代价是版本要求抬到 Node 22.5(用 exe 不受影响)
Excel 导出lib/xlsx.js,零依赖 XLSX 生成(ZIP store + SpreadsheetML,支持多工作表)
二维码public/js/qrcode.js,约 400 行手写:Byte 模式 / 纠错 M / 版本 1–10 / GF(256) Reed-Solomon / 8 种掩码按规范四条惩罚规则选优 / BCH(15,5) 格式信息。并配了一个独立的反向解码器自校验(18 项全绿,判据是数学的:合法 RS 码字的伴随式必须全为 0)


修掉的安全问题(都是可实际利用的,不是理论风险)
问题原来的后果现在
4 位口令可无限次爆破局域网里几分钟试完 1 万种前 4 次算手滑;之后指数退避锁定,锁定期间连正确口令也拒绝
登录 token 永不过期且只增不减跑一学期能攒下几千个有效凭证闲置 12 小时滑动过期;存活上限 200,超出按最久未用淘汰
学生提交接口无频率限制可枚举学号刷接口每 5 分钟最多 20 次没签成功的提交(正常学生一次就签上,绝不误伤)
首次设口令可被局域网抢注老师还没设,别人先设一个把他关在门外只允许本机发起,并写审计事件
全校名单接口完全公开任何人加个参数就能拉走全校名单与实时进度教师口径必须登录;学生口径保持免登录
一个畸形网址就能打崩进程一条 curl 让全班签到下线(不需要登录)异常统一收口;畸形 URL 用例断言「进程还活着」
学号叫 __proto__ 永远签不上大屏、导出、统计三处结论互相矛盾且不报错映射改用 Object.create(null)


质量与验证
不是「写完就发」的脚本。前后走了 9 轮全量核查,每轮都有独立回归脚本,最后一次全量回归 14 套测试全绿:
验证项项数验的是什么
classroom-sim.js5820 台设备实况模拟:每台绑独立源地址走真实 HTTP 签到 + 随机点名抽 10 人。20 台并发 14 ms、20/20、无丢写
smoke.js85接口全流程(含多班并行、签到码、限流与鉴权)
round8-audit.js77多班导入专项(表头识别与两个边界、三种模式、整批事务、导出 round-trip)
roster-edit.js61名单维护,并验证「进行中的那一场跟着变、已结束的历史场次逐字节不变」
negative-audit.js53不带 token 与畸形输入会看到什么
round3-audit.js55★ 强制走局域网地址的界面回归
qr-verify.js18二维码反向解码 + RS 伴随式数学校验
启动器冒烟 / 按钮对齐48 / 11界面逐分支截图 / 量坐标(差 1 px 就算不齐)
打包后自检 + 真机拉窗口25 / 6两个 exe 各 25/25;标题带版本号、关闭无残留进程

「数请求次数」≠「看数据对不对」 —— 有一轮做反向验证:临时撤掉按钮的防重入锁,然后真双击。「确认导入」「开始签到」的请求数从 1 变成 2,但数据没坏(前者被按学号去重兜住、后者被引擎「一班一场」兜住);而「建班级」「添加课程」「大屏确认补签」是真的坏了。所以凡「会写数据」的按钮,都必须有一条落在次数上的断言。

版本与获取
产物体积说明
课堂签到-单文件版.exe42 MB一个文件拷过去双击即可(启动约 1.6 秒,每次先把 Node 解包到临时目录)
课堂签到-免安装版/108 MB整个目录一起拷,双击 课堂签到.exe(启动 0.8 秒)。不能只拷 exe —— 少了同级的 _internal/,表现是「双击后进程在,但界面一直不出来」

当前版本 v2.8.1.0。数据目录可以整个拷走;对外分享前记得先删掉 data/ —— 里面有管理口令的哈希与真实学生姓名学号。删掉后首次打开会重新走一遍设置口令流程,不影响程序本身。
—— 有需求或 bug 欢迎跟帖,看到就改。
回复

使用道具 举报

发表于 2026-10-10 11:06:23 | 显示全部楼层
感谢楼主分享,但好像没有下载地址。
回复

使用道具 举报

发表于 2026-10-10 12:36:55 来自手机 | 显示全部楼层
很好用,感谢大佬的无私奉献!
回复

使用道具 举报

发表于 2026-10-10 12:52:13 | 显示全部楼层
wenzi 发表于 2026-10-10 11:06
感谢楼主分享,但好像没有下载地址。

点击购买主题,就能看到下载地址了
回复

使用道具 举报

 楼主| 发表于 2026-10-10 13:42:02 | 显示全部楼层
本帖最后由 addre 于 2026-10-10 13:45 编辑

只是初品,功能方面不想加了,功能越多bug越多。完善一下已有的功能和修复一下已知的BUG,欢迎大家测试。
回复

使用道具 举报

发表于 2026-10-10 14:34:29 | 显示全部楼层
看看到底隐藏了什么好东东
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|腾飞在线 ( 冀ICP备05002530号 )

GMT+8, 2026-10-20 06:45 , Processed in 0.097302 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表