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

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

[复制链接]
发表于 昨天 10:40 | 显示全部楼层 |阅读模式
购买主题 已有 7 人购买  本主题需向作者支付 30 RMB金钱 才能浏览
回复

使用道具 举报

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

示例 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),不打开也能看出是哪个口径。

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

使用道具 举报

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

多班并行:同一个班同时只能开一场,不同班可以同时开。多班并行时学生端网址带班级: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 套测试的质量数据。
回复

使用道具 举报

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

零依赖是怎么做到的
通常要引库的事这里的做法
数据库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 欢迎跟帖,看到就改。
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-11 06:06 , Processed in 0.067108 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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