📝 掌上考场

一个轻量级在线考试系统,实践了 Node.js 服务端渲染、JSON 文件存储(零数据库)、多租户进程隔离、AI 智能出题、切屏检测防作弊、考试场次管理、操作审计日志等技术。

项目简介

这个项目尝试解决的问题

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

功能实现

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

🤖

AI 智能出题

接入通义千问大模型 API,上传 PDF/Word/文本资料,AI 自动提取知识点并生成单选、多选、判断等多种题型,大幅缩短建库时间。

📝

动态考卷管理

自由创建、编辑、删除考卷。从题库按重要性筛选题目组卷,支持单选/多选混合,系统自动计算总分。组卷前可一键预览考卷内容。

📱

手机扫码免密答题

iOS 风格移动端 UI,考生扫码输入姓名即可答题,无需注册和密码。一题一页,支持跳题,提交后即时出分和错题解析。

👥

考试花名册

每份考卷独立配置考生花名册,支持批量导入。考卷之间数据完全隔离,成绩按场次归档,历史成绩长期保留可查可导出。

📅

考试场次管理

每次保存考卷自动开启新场次,旧场次自动归档。管理员可随时结束当前考试,已结束的考生扫码将提示"考试已结束"。

🔒

切屏检测防作弊

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

📚

错题本分析

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

📊

Excel 导入导出

支持 Excel 批量导入题库(自动以文件名命名),导出成绩表和题库。成绩表包含切屏次数、花名册匹配等列,管理员可离线分析。

📑

操作审计日志

零依赖审计系统,记录所有关键操作(登录/组卷/提交/导出/结束考试),按月自动轮转,含来源 IP,便于追溯排查。

技术架构

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

💻 后端技术

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

📱 前端技术

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

设计亮点

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

📦

为什么不用数据库?

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

📄

为什么单文件 5100 行?

刻意的设计选择:全局搜索定位快,不存在循环依赖问题。代码内部按功能模块清晰划分(路由、数据模型、业务逻辑、前端渲染),配合行号索引表,新人 10 分钟即可上手维护。

🛠

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

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

🤖

为什么接入 AI 出题?

传统题库建设需要人工逐题编写,效率极低。接入通义千问 API 后,上传一份制度文档即可自动生成数十道题目,管理员只需审核微调,建库效率提升 10 倍以上。