📝 掌上考场

个人练手项目:一个轻量级在线考试系统,实践了 Node.js 服务端渲染、JSON 文件存储(零数据库)、多租户进程隔离、切屏检测防作弊、操作审计日志等技术。

项目简介

这个项目尝试解决的问题

📄
纸质出卷、人工阅卷耗时耗力
在线组卷 + 自动评分,即时出成绩
📱
员工需要安装专门的考试 APP
手机浏览器扫码即考,无需安装
🔧
部署复杂,需要数据库和构建工具
零数据库、零构建,一行命令启动
🔒
无法检测考生是否切屏查答案
切屏自动记录,成绩表标红提示

功能实现

项目中实现的主要功能模块

📝

智能组卷

从题库按重要性筛选题目,支持单选/多选混合组卷,系统自动计算总分和每题分值。

📱

手机扫码答题

iOS 风格移动端 UI,输入姓名即可答题。一题一页,支持跳题,提交后即时出分和错题解析。

🔒

切屏检测防作弊

基于 visibilitychange API,考生切换标签页或最小化时自动记录次数,成绩表中标红显示。

📚

错题本分析

自动统计所有题目出错率,按错误率排序展示。支持"按错题优先"组卷,针对性复习。

📊

Excel 导出

使用 exceljs 导出成绩表和题库,成绩表包含切屏次数列,管理员可离线分析。

📑

操作审计日志

零依赖审计系统,记录所有关键操作(登录/组卷/提交/导出),按月自动轮转,含来源 IP。

技术架构

单文件部署 + 多租户进程隔离

💻 后端技术

  • Node.js + Express 框架
  • 服务端渲染(SSR),零构建步骤
  • JSON 文件存储,无需数据库
  • 多租户:独立进程 + 环境变量隔离
  • PM2 进程管理(崩溃自动重启)
  • 操作审计日志(fs.appendFileSync)
  • qrcode + exceljs 生成二维码和报表

📱 前端技术

  • 原生 HTML/CSS/JavaScript(零框架)
  • iOS 风格 UI 设计
  • 移动端自适应布局
  • visibilitychange API(切屏检测)
  • Nginx 反向代理 + SSL 终止
  • Let's Encrypt 自动续期证书
  • 跨平台:Linux / Windows 均可运行

设计亮点

这个项目中一些有意思的技术决策

📦

为什么不用数据库?

JSON 文件存储让部署极简——不需要安装 MySQL,备份就是复制文件,迁移就是拷贝目录。对于培训考试的数据量完全够用。

📄

为什么单文件 2600 行?

刻意的设计选择:全局搜索定位快,新人 5 分钟理解结构,不存在循环依赖问题。代码内部按功能模块清晰划分。

🛠

为什么每个租户一个进程?

故障隔离(一个崩溃不影响其他)、数据物理隔离(不存在跨租户泄露)、可独立部署不同版本。代价仅约 90MB 内存/实例。