独立开发实战:学生管理+考试防作弊机制设计
独立开发实战学生管理 考试防作弊机制设计一、问题起源在上一篇我分享了在线考试系统的整体搭建过程。但在实际使用中老师和学生都反馈了一些问题老师反馈「学生关了浏览器后台还显示在作答这个记录怎么消失」「有的学生考完了还能再进去这不是挂我们的人数吗」「能不能管理学生名单现在我们谁考了谁没考都靠人工记」学生反馈「考完了想回去看成绩怎么看」「别人是不是也能看我的成绩」这些问题其实很有代表性——任何用户系统都会遇到会话管理和权限控制的问题。这篇就详细讲讲我是怎么解决的。二、心跳机制解决「挂机不交卷」为什么需要心跳学生开始考试后系统在t_exam_session表里创建一条会话记录。正常情况下交卷后会自动删除这条记录。但如果学生直接关了浏览器❌beforeunload事件可以发请求但不是100%可靠❌ 等考试时长到了再清理要等45分钟✅ 心跳机制定期检查断开后快速释放实现方案前端每 30 秒发一个请求到后端// 前端每30秒发一次心跳heartbeatRef.currentsetInterval((){api.sendHeartbeat(examId,studentNo).catch((){})},30000)后端收到心跳更新last_heartbeat_at// 后端更新心跳时间session.setLastHeartbeatAt(LocalDateTime.now());sessionMapper.updateById(session);然后定时清理超过 1 分钟没心跳的会话// 每次查询前先清理LocalDateTimecutoffLocalDateTime.now().minusMinutes(1);sessionMapper.delete(newLambdaQueryWrapperExamSession().eq(ExamSession::getPaperId,paperId).and(w-w.isNull(ExamSession::getLastHeartbeatAt).or().lt(ExamSession::getLastHeartbeatAt,cutoff)));三层防御为了确保不遗漏我做了三层防御防御层机制效果beforeunload关标签页弹确认框 fetch keepalive给用户一次反悔机会visibilitychange切标签页时发一次心跳切走也能保持会话后端定时清理1分钟无心跳自动清除兜底方案无论什么情况都不超过1分钟这样设计后学生正常考试不受影响意外断开后最多 1 分钟就会自动清理。三、防重复进入已考过的不能再考原来的流程是输入姓名 → 选试卷 → 开始考试 → 创建会话 → 答题 → 交卷问题在于「开始考试」时没有检查是否已交卷。已考过的学生点开始考试系统又给他创建了会话但交卷时会被拦住「你已经提交过试卷了」。会话就挂在那了。修复很简单创建会话之前先查t_exam_result表有没有记录。// 开始考试前检查是否已交卷longexistingCountresultMapper.selectCount(newLambdaQueryWrapperExamResult().eq(ExamResult::getPaperId,examId).eq(ExamResult::getStudentId,studentId));if(existingCount0){returnApiResult.error(400,你已经参加过本场考试);}这样已考过的学生根本进不到考试页面也不会产生无效的会话记录。四、学生管理学号 密码登录之前任何人都能输入姓名就考试显然不行。我加了个完整的学生管理模块。数据库设计CREATETABLEt_student(idBIGINTAUTO_INCREMENTPRIMARYKEY,student_noVARCHAR(50)NOTNULLUNIQUECOMMENT学号,nameVARCHAR(50)NOTNULLCOMMENT姓名,genderVARCHAR(10)COMMENT男/女,gradeVARCHAR(20)COMMENT年级下拉选择,class_nameVARCHAR(50)COMMENT班级自由输入,passwordVARCHAR(200)COMMENTBCrypt加密密码,statusTINYINTDEFAULT0COMMENT0正常 1禁用,created_byVARCHAR(50),updated_byVARCHAR(50),create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,update_timeDATETIMEDEFAULTNULLONUPDATECURRENT_TIMESTAMP,UNIQUEKEYuk_student_no(student_no));导入策略老师通过 Excel 模板导入学生模板格式学号、姓名、性别、班级、年级。第一次导入时自动设密码为student123。如果学号已存在则跳过不覆盖已有数据也不改密码。登录流程学生首页输入学号 密码后端的逻辑链输入学号密码 → 查学生表 → 学号不存在→ 提示「请联系老师」 → 被禁用 → 提示「已被禁用」 → 密码错 → 提示「密码错误」 → 全部通过 → 显示姓名班级允许选试卷考试权限控制学生只能看「我的成绩」接口按 studentId 过滤老师可以在后台查看所有学生的成绩和统计老师可以禁用某个学生该学号无法再登录考试但历史成绩保留五、前端通用组件沉淀这次开发中我写了一些通用组件以后新项目可以直接复用Toast 组件右上角滑入3秒自动消失支持 success/error/warning 三种类型。不用原生 alert体验好很多。ConfirmDialog 组件自定义确认弹窗毛玻璃背景 缩放动画支持 danger/warning/info 三种样式。API 封装统一requestT()函数自动注入 Bearer token解析后端{code, data, message}响应格式。这些组件已经提取成模板新项目直接用。六、小结做这个考试系统最大的体会是用户系统再小权限和会话管理都不能马虎。心跳机制解决挂机问题开始考试前检查已交卷防止重复进入学号密码登录防止无关人员乱入学生只能看自己的成绩老师看全部如果你也在做类似的小项目欢迎关注我后续分享更多实战经验。 如果你对某个功能的具体实现感兴趣欢迎留言交流。完整代码在 Gitee 私库设计文档可以分享参考。关于作者无羡独立开发者专注AI应用开发。 分类全栈开发 关注我获取更多技术分享 个人博客云深不知处 独立开发省钱攻略查看详情 体验我的AI产品一纸云深如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是我持续创作的动力点击「阅读原文」查看我的独立开发笔记 点击查看我的个人介绍 点击查看我的小红书主页

相关新闻

终极指南:40+经典DSGE模型库如何加速你的宏观经济研究

终极指南:40+经典DSGE模型库如何加速你的宏观经济研究

终极指南:40经典DSGE模型库如何加速你的宏观经济研究 【免费下载链接】DSGE_mod A collection of Dynare models 项目地址: https://gitcode.com/gh_mirrors/ds/DSGE_mod 你是否曾在经济学研究中为复现经典模型而苦恼?是否想验证理论结果却被技术…

2026/7/4 19:55:27阅读更多 →
华硕笔记本轻量级控制中心:释放硬件潜力的终极解决方案

华硕笔记本轻量级控制中心:释放硬件潜力的终极解决方案

华硕笔记本轻量级控制中心:释放硬件潜力的终极解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…

2026/7/4 19:55:26阅读更多 →
别把 CLAUDE.md 当备忘录垃圾桶,真正该写进去的是反复发生的项目事实

别把 CLAUDE.md 当备忘录垃圾桶,真正该写进去的是反复发生的项目事实

我们今天聊的这个主题很小,只有一个问题,什么时候才应该把内容加进 CLAUDE.md。但这个问题背后,其实牵着 Claude Code 使用体验里最容易被低估的一件事,项目记忆不是越多越好,规则也不是越细越安全。真正稳定的做法,是把那些每一轮会话都应该知道、每一次协作都会反复解释…

2026/7/4 19:50:26阅读更多 →
DeployQt:告别繁琐部署,三步搞定Qt应用打包分发终极指南

DeployQt:告别繁琐部署,三步搞定Qt应用打包分发终极指南

DeployQt:告别繁琐部署,三步搞定Qt应用打包分发终极指南 【免费下载链接】DeployQt 基于Windows系统的Qt打包程序(最新版本V1.0.1) 项目地址: https://gitcode.com/gh_mirrors/de/DeployQt 还在为Qt应用部署而头疼吗?每次发布都要手动…

2026/7/4 21:00:46阅读更多 →
国产大模型2024实测指南:文心一言、通义千问、Kimi等6大平台对比

国产大模型2024实测指南:文心一言、通义千问、Kimi等6大平台对比

我不能按照该标题生成相关内容。原因如下:标题中提及的“GPT-5”目前(截至2024年中)并不存在。OpenAI官方从未发布、命名或确认GPT-5模型,亦无任何公开技术文档、API接口、模型权重或权威渠道证实其存在。所有声称“可使用GPT-5”…

2026/7/4 21:00:46阅读更多 →
如何系统提升AI编程质量:基于Karpathy原则的3个关键策略

如何系统提升AI编程质量:基于Karpathy原则的3个关键策略

如何系统提升AI编程质量:基于Karpathy原则的3个关键策略 【免费下载链接】andrej-karpathy-skills A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathys observations on LLM coding pitfalls. 项目地址: https://gitcode.c…

2026/7/4 21:00:46阅读更多 →
终极Mac清理指南:5分钟学会用Mole命令行工具释放存储空间

终极Mac清理指南:5分钟学会用Mole命令行工具释放存储空间

终极Mac清理指南:5分钟学会用Mole命令行工具释放存储空间 【免费下载链接】Mole 🐹 Clean, uninstall, analyze, optimize, and monitor your Mac from the terminal. 项目地址: https://gitcode.com/GitHub_Trending/mole15/Mole 还在为Mac存储空…

2026/7/4 21:00:46阅读更多 →
N_m3u8DL-RE:跨平台流媒体下载工具的终极指南

N_m3u8DL-RE:跨平台流媒体下载工具的终极指南

N_m3u8DL-RE:跨平台流媒体下载工具的终极指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE N_m3u…

2026/7/4 21:00:46阅读更多 →
关注点之(五)大畸变pinhole/fisheye场景的重建及渲染

关注点之(五)大畸变pinhole/fisheye场景的重建及渲染

0.概述 对较大的畸变场景重建及渲染,若先将鱼眼图像 “去畸变” 为针孔图像,会裁剪边缘区域,丢失大量场景信息(鱼眼图像边缘信息密度高,对深度估计至关重要,这种方式不可取,且无法与后续重建流程端到端优化,导致最终重建误差无法最小化。对于fisheye-gs这种做法采用对…

2026/7/4 20:55:46阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/4 14:25:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/4 14:57:00阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →