写在前面

作为一名高校物理实验教师,我一直在寻找一个轻量、好用的在线考试工具。市面上的系统要么太重,部署复杂;要么功能单一,无法满足实际教学需求。于是,我决定自己动手做一个。

经过一段时间的开发和迭代,这个在线考试系统已经基本成型,今天就来介绍一下它的主要功能和一些设计上的思考。

系统地址:https://aphysics.cn/exam/
教师测试账号不再提供
学生测试账号20261234密码123456


系统概览

这是一个基于 PHP + MySQL 的在线考试系统,前端采用单页应用(SPA)架构,整体风格是深色主题,支持响应式布局。系统分为三个角色:管理员教师学生,各自有不同的功能权限。


核心功能

1. 用户与权限管理

系统支持三级权限体系:

  • 管理员:负责创建和管理所有用户账号(包括教师和学生),可以分配班级、设置角色。
  • 教师:可以创建试卷、发布考试、批改作业、查看统计数据。
  • 学生:参加考试、查看成绩、查看错题汇总。

学生忘记密码时,只能由管理员手动重置——这是一个刻意的设计,避免学生随意修改密码导致账号混乱。

2. 试卷与题目管理

教师可以创建试卷,支持三种题型:

  • 选择题:支持多个选项(A/B/C/D...)
  • 填空题:学生输入答案
  • 判断题:对/错二选一

题目支持批量导入,教师可以快速录入大量题目。试卷可以设置目标班级,只允许特定班级的学生参加。

3. 在线考试

学生登录后,可以看到分配给自己的试卷列表,点击进入考试界面。考试界面简洁清晰,每道题都有题号标识,方便学生导航。

提交后系统自动批改(客观题),学生可以立即看到成绩和详细解析。

4. 防作弊机制

这是我在设计时重点考虑的功能。系统支持两个可选的防作弊选项:

  • 题目顺序随机化:每个学生的题目顺序不同
  • 选项打乱:选择题的选项顺序随机打乱

这两个选项教师可以在发布试卷时自由开关。关键的是,随机化只在前端进行,后端存储和统计的数据格式保持不变,这样就不会影响错题统计等功能的准确性。

5. 试卷克隆

教师经常需要出多套难度相近的试卷。为了简化这个流程,我加入了试卷克隆功能。教师可以一键克隆现有试卷(包括所有题目),然后在此基础上微调,快速生成新卷。

6. 学生记录与数据分析

这是学生端的一个亮点功能——"我的记录"页面:

  • 成绩趋势图:用 Canvas 绘制折线图,展示学生历次考试的得分率变化,直观反映学习进步情况。
  • 错题汇总:自动收集学生所有做错的题目,按时间排序,方便复习和查漏补缺。

这个功能的设计初衷是让学生不只是"考完就忘",而是能看到自己的成长轨迹,知道哪些知识点还需要加强。

7. 教师统计与错题分析

教师端有专门的统计页面,可以查看每道题的正确率、常见错误选项等,帮助教师了解学生的薄弱环节,调整教学重点。


技术栈与架构

  • 后端:PHP + MySQL,轻量易部署
  • 前端:原生 JavaScript 单页应用,无框架依赖
  • 样式:自定义深色主题,CSS 变量管理
  • 图表:Canvas 原生绘制,无第三方库

整个系统的代码量不大,核心逻辑都在一个 index.html 文件里,后端 API 分散在多个 PHP 文件中。这种架构虽然简单,但对于中小型考试系统来说已经足够。


一些设计思考

为什么选择单页应用?

最初也考虑过传统多页面架构,但考虑到考试系统的交互性较强(比如答题过程中的状态管理),单页应用的体验会更流畅。而且部署简单,不需要复杂的前端构建流程。

为什么随机化只在前端?

如果随机化在后端进行,每个学生的题目 ID 会不同,这会给错题统计、成绩分析带来很大麻烦。前端随机化后,学生提交的答案仍然映射到原始题目 ID,后端无需做任何特殊处理。

为什么学生不能重置密码?

这是一个权衡。虽然学生自助重置密码更方便,但在实际教学场景中,学生账号往往由教师统一管理,学生随意修改密码反而会导致教师无法登录学生账号进行调试或补考。所以保留了这个"不便"的设计。


未来计划

目前系统已经可以满足基本的在线考试需求,但还有一些功能想加入:

  • 主观题批改:支持教师手动批改填空题和简答题
  • 考试监控:实时监控学生答题进度,防止切屏作弊
  • 移动端适配:进一步优化手机端的考试体验
  • 数据导出:支持导出成绩为 Excel,方便教师存档

最后

这个考试系统是我在教学工作中"用脚投票"的产物。它可能不如商业产品那样功能丰富,但它贴合我的实际需求,部署简单,维护方便。

如果你也在寻找一个轻量级的在线考试解决方案,或者对物理实验教学感兴趣,欢迎交流。


如果你对这个项目感兴趣,可以关注我的后续更新。

标签: none

仅有一条评论

  1. 测试猿 测试猿

    我要测试一下

添加新评论