在线考试系统
> Vue3 + NestJS + MySQL + Redis 全栈在线考试系统 > 适合教育培训、企业招聘、毕业设计












🚀 快速导航
| 我想... | 查看文档 |
|---|---|
| 🎬 快速启动项目 | → 快速开始指南.md ⭐ 新手必看 |
| 💻 了解技术实现 | → 功能说明文档.md |
| 🎓 准备答辩PPT | → 答辩PPT大纲.md ⭐ 答辩必备 |
| 📄 写毕业论文 | → 毕业设计论文模板.md |
| 🗄️ 查看数据库设计 | → ER图设计.md |
🎯 项目简介
这是一个功能完整的在线考试系统,支持题库管理、自动组卷、在线答题、自动评分、成绩统计等核心功能。相比图书管理系统,本项目具有更高的技术复杂度和实用价值。
✨ 核心亮点
- 🤖 智能组卷 - 支持按难度、题型、分值自动组卷算法
- ⚡ 实时答题 - Redis缓存答题进度,防止异常丢失
- 🔒 防作弊 - 切屏检测、禁止复制、时间限制
- 📊 智能评分 - 客观题自动评分,主观题教师评分
- 📈 数据分析 - ECharts可视化成绩分布、正确率统计
- 📚 错题本 - 自动收集错题,支持复习巩固
- 👥 三种角色 - 管理员、教师、学生,权限分明
- 📱 响应式设计 - 支持PC、平板、手机多端访问
🚀 快速开始
环境要求
一键启动(2步)
1️⃣ 启动数据库
⚠️ 启动前确保 Docker Desktop 已运行(右下角图标是绿色)
双击运行:1-启动数据库.bat
2️⃣ 启动应用(前端+后端)
双击运行:2-启动应用.bat
会自动打开两个窗口分别运行前端和后端,不要关闭这两个窗口。
✅ 访问系统
打开浏览器访问:http://localhost:5173
🔑 测试账号
| 角色 | 用户名 | 密码 | 说明 |
|---|---|---|---|
| 管理员 | admin | 123456 | 系统管理、用户管理 |
| 教师 | teacher1 | 123456 | 题库管理、试卷管理、成绩管理 |
| 学生 | student1 | 123456 | 参加考试、查看成绩、错题本 |
📊 完整演示数据
系统已包含完整的测试数据,可直接体验所有功能:
👥 用户数据(8个)
- 1个管理员: admin
- 2个教师: teacher1, teacher2
- 5个学生: student1 ~ student5
📚 题目数据(36道)
- 单选题: 10道(操作系统、数据结构、Java、Python、MySQL等)
- 多选题: 5道(各种基础知识)
- 判断题: 6道(基础概念判断)
- 填空题: 5道(关键知识点填空)
- 简答题: 5道(深度理解题)
📝 考试数据(4场)
- 计算机基础综合测试(已发布,100分,90分钟)
- 已有6条考试记录,学生可直接查看
- Java编程能力测试(已发布,100分,120分钟)
- 已有2条考试记录
- 数据库原理与应用(已发布,100分,60分钟)
- 已有1条考试记录
- Python编程测试(草稿状态)
📈 考试记录(6条)
- 学生1(张三): 完成2场考试
- 计算机基础:85分(及格)✅
- Java编程:72分(及格)✅
- 有2道错题
- 学生2(李四): 完成1场考试
- 计算机基础:78分(及格)✅
- 学生3(王五): 完成1场考试
- Java编程:56分(不及格)❌
- 有3道错题
- 学生4(赵六): 完成2场考试
- 计算机基础:92分(优秀)🌟
- 数据库应用:88分(优秀)🌟
❌ 错题数据(5条)
- 学生张三:2道错题(MySQL存储引擎、Java访问修饰符)
- 学生王五:3道错题(待复习)
🎯 体验建议
使用不同角色登录,体验完整功能:
学生账号 (
student1 / 123456) - 张三- ✅ 查看可参加的考试列表(3场可考)
- ✅ 查看我的考试记录(2条记录)
- ✅ 查看成绩详情和答题情况
- ✅ 查看错题本(2道错题)
教师账号 (
teacher1 / 123456) - 王老师- ✅ 题目管理(36道题目)
- ✅ 考试管理(3场已发布 + 1场草稿)
- ✅ 阅卷评分(查看学生答题,评分主观题)
- ✅ 统计分析(考试统计、学生排名、正确率分析)
管理员账号 (
admin / 123456)- ✅ 用户管理(8个用户)
- ✅ 分类管理(14个分类)
- ✅ 全部功能权限
⚠️ 数据乱码问题?
如果看到中文乱码,请运行 4-重置数据库.bat 重新导入数据。
详细解决方案请查看:解决乱码问题.md
📂 项目结构
02-online-exam-system/
├── 📄 项目规划.md # 详细规划文档
├── 📊 database/ # 数据库设计
│ ├── ER图设计.md # 数据库设计文档
│ ├── schema.sql # 表结构(8个核心表)
│ ├── data.sql # 演示数据(36道题目)
│ ├── docker-compose.yml # Docker配置
│ └── 1-启动数据库.bat # 一键启动脚本
├── 🔧 backend/ # NestJS后端
│ ├── src/
│ │ ├── main.ts # 入口文件
│ │ ├── app.module.ts # 主模块
│ │ └── modules/ # 功能模块
│ │ ├── auth/ # 认证模块(JWT)
│ │ ├── users/ # 用户管理
│ │ ├── categories/ # 分类管理
│ │ ├── questions/ # 题库管理⭐
│ │ ├── exams/ # 考试管理⭐(含自动组卷)
│ │ ├── exam-records/ # 考试记录⭐(答题+评分)
│ │ └── statistics/ # 统计分析
│ ├── package.json # 依赖配置
│ └── .env # 环境变量
├── 🎨 frontend/ # Vue3前端
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ │ ├── Login.vue # 登录页
│ │ │ ├── Dashboard.vue # 仪表盘
│ │ │ ├── Questions.vue # 题库管理
│ │ │ ├── Exams.vue # 考试管理
│ │ │ ├── TakeExam.vue # 在线答题⭐
│ │ │ ├── ExamResults.vue # 成绩查看
│ │ │ ├── WrongQuestions.vue # 错题本
│ │ │ └── Statistics.vue # 数据统计
│ │ ├── api/ # API封装
│ │ ├── stores/ # Pinia状态管理
│ │ └── utils/ # 工具函数
│ ├── package.json # 依赖配置
│ └── vite.config.ts # Vite配置
└── 📖 docs/ # 文档
├── 功能说明文档.md # 详细功能说明
├── 毕业设计论文模板.docx # 论文模板
└── 答辩PPT模板.pptx # PPT模板
🎓 功能模块详解
1. 👤 用户认证(Auth)
- ✅ JWT Token 认证
- ✅ 用户注册/登录
- ✅ 密码加密(bcryptjs)
- ✅ 角色权限控制(RBAC)
- ✅ 个人信息管理
API接口:
POST /auth/register- 用户注册POST /auth/login- 用户登录GET /auth/profile- 获取个人信息
2. 👥 用户管理(Users)
管理员功能:
- ✅ 用户列表查询
- ✅ 创建/编辑/删除用户
- ✅ 修改用户角色
- ✅ 启用/禁用账号
学生/教师功能:
- ✅ 修改个人信息
- ✅ 修改密码
- ✅ 上传头像
API接口:
GET /users- 获取用户列表POST /users- 创建用户PUT /users/:id- 更新用户DELETE /users/:id- 删除用户POST /users/change-password- 修改密码
3. 📁 分类管理(Categories)
功能:
- ✅ 多级分类管理
- ✅ 树形结构展示
- ✅ 排序功能
API接口:
GET /categories- 获取分类列表GET /categories/tree- 获取树形分类POST /categories- 创建分类PUT /categories/:id- 更新分类
4. 📝 题库管理(Questions)⭐核心
题型支持:
- 单选题 - 4个选项,1个正确答案
- 多选题 - 4个选项,多个正确答案
- 判断题 - 正确/错误
- 填空题 - 支持多个空格
- 简答题 - 文本输入,教师评分
功能特性:
- ✅ 题目增删改查
- ✅ 富文本编辑器(题目内容)
- ✅ 题目分类管理
- ✅ 难度设置(1-5星)
- ✅ 标签管理
- ✅ 题目导入/导出(Excel)
- ✅ 使用次数统计
- ✅ 正确率统计
API接口:
GET /questions- 获取题目列表(支持分页、筛选)GET /questions/:id- 获取题目详情POST /questions- 创建题目PUT /questions/:id- 更新题目DELETE /questions/:id- 删除题目POST /questions/import- 批量导入题目GET /questions/export- 导出题目
5. 📄 考试管理(Exams)⭐核心
试卷类型:
- 固定试卷 - 手动选择题目
- 随机试卷 - 自动组卷算法
自动组卷算法:
interface AutoGenerateConfig {
totalScore: number; // 总分 100
singleCount: number; // 单选题 10题
singleScore: number; // 每题 5分
multipleCount: number; // 多选题 5题
multipleScore: number; // 每题 10分
judgeCount: number; // 判断题 10题
judgeScore: number; // 每题 2分
difficulty: [3, 4, 3]; // 难度分布 [简单, 中等, 困难]
categoryIds: [1, 2, 3]; // 指定分类
}
配置项:
- ✅ 考试时间设置
- ✅ 及格分数设置
- ✅ 考试次数限制
- ✅ 是否显示答案
- ✅ 是否显示分数
- ✅ 是否打乱题目顺序
- ✅ 是否打乱选项顺序
考试状态:
draft- 草稿(未发布)published- 已发布(进行中)ended- 已结束
API接口:
GET /exams- 获取考试列表GET /exams/:id- 获取考试详情POST /exams- 创建考试POST /exams/auto-generate- 自动组卷⭐PUT /exams/:id- 更新考试DELETE /exams/:id- 删除考试POST /exams/:id/publish- 发布考试
6. 📋 在线考试(Exam Records)⭐核心
考试流程:
- 学生进入考试 → 创建考试记录
- 在线答题 → Redis缓存答案(30秒自动保存)
- 提交试卷 → 自动评分(客观题)
- 教师评分 → 手动评分(主观题)
- 查看成绩 → 显示得分、答案、解析
防作弊机制:
- ✅ 切屏检测(记录次数,超过3次警告)
- ✅ 禁止复制粘贴
- ✅ 倒计时自动交卷
- ✅ IP地址记录
- ✅ 考试时长统计
自动评分算法:
// 单选题、多选题、判断题
function autoGrade(userAnswer, correctAnswer): boolean {
if (type === 'single' || type === 'judge') {
return userAnswer === correctAnswer;
}
if (type === 'multiple') {
return JSON.stringify(userAnswer.sort()) === JSON.stringify(correctAnswer.sort());
}
}
// 填空题(模糊匹配)
function gradeWithFunction(userAnswer, correctAnswer): boolean {
return userAnswer.trim().toLowerCase() === correctAnswer.trim().toLowerCase();
}
考试记录状态:
in_progress- 进行中submitted- 已提交graded- 已评分
API接口:
POST /exam-records/start/:examId- 开始考试POST /exam-records/:id/answer- 提交答案POST /exam-records/:id/submit- 提交试卷GET /exam-records/:id- 获取考试记录GET /exam-records/my-records- 我的考试记录POST /exam-records/:id/grade- 教师评分(主观题)
7. 📊 数据统计(Statistics)⭐核心
学生端统计:
- ✅ 考试历史记录
- ✅ 成绩趋势图(ECharts折线图)
- ✅ 错题统计
- ✅ 考试排名
教师端统计:
- ✅ 考试参与人数
- ✅ 平均分、最高分、最低分
- ✅ 及格率统计
- ✅ 成绩分布图(ECharts柱状图)
- ✅ 题目正确率分析
- ✅ 学生答题情况
管理员端统计:
- ✅ 用户数量统计
- ✅ 题库数量统计
- ✅ 考试数量统计
- ✅ 系统概览
API接口:
GET /statistics/overview- 系统概览GET /statistics/exam/:examId- 考试统计GET /statistics/student/:userId- 学生统计GET /statistics/question-analysis- 题目分析
8. 📚 错题本(Wrong Questions)
功能:
- ✅ 自动收集错题
- ✅ 错误次数统计
- ✅ 标记已掌握
- ✅ 复习提醒
- ✅ 查看错题解析
API接口:
GET /wrong-questions- 获取我的错题PUT /wrong-questions/:id/master- 标记已掌握POST /wrong-questions/review- 错题复习
🛠️ 技术栈
前端技术
| 技术 | 版本 | 说明 |
|---|---|---|
| Vue3 | ^3.4.0 | 渐进式JavaScript框架 |
| Element Plus | ^2.5.0 | Vue3 UI组件库 |
| Pinia | ^2.1.7 | Vue状态管理 |
| Vue Router | ^4.2.5 | 路由管理 |
| Axios | ^1.6.5 | HTTP请求库 |
| ECharts | ^5.4.3 | 数据可视化图表 |
| Vite | ^5.0.0 | 前端构建工具 |
| TypeScript | ^5.3.0 | 类型安全 |
| dayjs | ^1.11.10 | 时间处理 |
后端技术
| 技术 | 版本 | 说明 |
|---|---|---|
| NestJS | ^10.3.0 | 企业级Node.js框架 |
| TypeORM | ^0.3.19 | ORM框架 |
| MySQL | ^8.0 | 关系型数据库 |
| Redis | ^7.0 | 缓存数据库 |
| JWT | ^10.2.0 | 身份认证 |
| Passport | ^0.7.0 | 认证中间件 |
| bcryptjs | ^2.4.3 | 密码加密 |
| class-validator | ^0.14.0 | 数据验证 |
| Swagger | ^7.1.17 | API文档 |
| Multer | ^1.4.5 | 文件上传 |
开发工具
| 工具 | 说明 |
|---|---|
| Docker | 容器化部署 |
| Docker Compose | 多容器编排 |
| pnpm | 包管理器 |
| ESLint | 代码检查 |
| Prettier | 代码格式化 |
💾 数据库设计
核心表结构(8个表)
- users - 用户表(管理员、教师、学生)
- categories - 题目分类表(支持多级)
- questions - 题目表(5种题型)
- exams - 考试/试卷表
- exam_questions - 试卷-题目关联表
- exam_records - 考试记录表
- exam_answers - 考生答案表
- wrong_questions - 错题本表
详细设计请查看:ER图设计.md
📸 功能截图
学生端
- 🏠 首页 - 可参加的考试列表
- 📝 在线答题 - 倒计时、答题卡、自动保存
- 📊 成绩查看 - 得分、排名、答题详情
- 📚 错题本 - 错题收集、复习巩固
- 👤 个人中心 - 考试历史、成绩趋势
教师端
- 📝 题库管理 - 增删改查、导入导出
- 📄 试卷管理 - 手动组卷、自动组卷
- ✅ 成绩管理 - 手动评分、批量导出
- 📊 数据统计 - 成绩分布、正确率分析
管理员端
- 👥 用户管理 - 增删改查、角色分配
- 📁 分类管理 - 树形结构管理
- 📊 系统统计 - 数据概览
🔧 管理脚本
Windows (.bat)
1-启动数据库.bat # 启动 MySQL + Redis(Docker)
2-启动应用.bat # 启动前端 + 后端
3-停止数据库.bat # 停止数据库
4-重置数据库.bat # 重置数据库和演示数据
5-查看日志.bat # 查看MySQL/Redis日志
🐳 Docker 部署
数据库配置
# docker-compose.yml
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: exam_system
ports:
- "3306:3306"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
一键启动
docker-compose up -d
🎓 适合毕业设计的理由
✅ 技术复杂度高
- 后端算法 - 自动组卷算法、自动评分算法
- 实时功能 - Redis缓存、WebSocket(可扩展)
- 安全机制 - JWT认证、密码加密、防作弊
- 性能优化 - 缓存策略、数据库索引
✅ 功能完整度高
- 8个功能模块
- 36+API接口
- 15+页面组件
- 5种题型支持
✅ 实用价值高
- 教育行业刚需
- 企业培训应用
- 在线招聘笔试
✅ 答辩亮点多
- 自动组卷算法设计与实现
- 防作弊机制的技术方案
- Redis缓存的应用场景
- 数据统计与可视化展示
📚 配套文档
完整的项目文档,助您快速上手和答辩通过!
📖 文档列表
| 文档 | 说明 | 适用场景 |
|---|---|---|
| 快速开始指南.md | 5分钟快速了解和启动项目 | ⭐ 新手必看 |
| 功能说明文档.md | 详细功能说明、API文档、开发指南 | 开发必备 |
| 答辩PPT大纲.md | 完整的20页PPT演示大纲 | ⭐ 答辩必备 |
| 毕业设计论文模板.md | 完整的论文结构模板 | 论文写作 |
| ER图设计.md | 数据库设计文档 | 数据库设计 |
🎯 推荐阅读顺序
首次使用:
准备答辩:
- 📊 答辩PPT大纲.md - 制作答辩PPT
- 📄 毕业设计论文模板.md - 撰写论文
- 🎤 准备演示视频和答辩问题
📝 文档亮点
1. 快速开始指南
- ✅ 2步快速启动项目
- ✅ 完整的演示数据说明
- ✅ 三种角色体验流程
- ✅ 常见问题解决方案
2. 功能说明文档
- ✅ 核心功能详解
- ✅ 36+ API接口文档
- ✅ 代码示例和实现细节
- ✅ 性能优化建议
- ✅ 部署指南
3. 答辩PPT大纲
- ✅ 20页完整PPT结构
- ✅ 每页详细内容建议
- ✅ 配色和字体建议
- ✅ 演讲技巧和时间分配
- ✅ 常见答辩问题准备
4. 毕业设计论文模板
- ✅ 完整的6章论文结构
- ✅ 每章详细内容框架
- ✅ 参考文献格式
- ✅ 图表绘制建议
❓ 常见问题(FAQ)
🐳 Docker 相关
Q1: 什么是 Docker?为什么需要它?
简单说: Docker 是一个容器工具,可以让你轻松运行 MySQL 和 Redis,而不需要在电脑上安装它们。
优势:
- ✅ 一键启动数据库,无需复杂配置
- ✅ 不会污染本地环境
- ✅ 数据隔离,删除容器不影响本地文件
- ✅ 跨平台,Windows/Mac/Linux 都能用
Q2: Docker Desktop 安装失败怎么办?
常见错误: "WSL 2 installation is incomplete"
解决步骤:
- 以管理员身份打开 PowerShell
- 运行:
wsl --install - 重启电脑
- 再次启动 Docker Desktop
Q3: Docker 启动很慢或卡住?
- 确保电脑已开启虚拟化(在BIOS中开启 VT-x 或 AMD-V)
- 关闭杀毒软件再试
- 检查磁盘空间是否充足(至少10GB)
- 重启 Docker Desktop
Q4: 我不想用 Docker,能直接用本地数据库吗?
可以! 如果你本地已经安装了 MySQL 和 Redis:
修改后端配置
backend/.env:DB_HOST=localhost DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=你的MySQL密码 DB_DATABASE=exam_system REDIS_HOST=localhost REDIS_PORT=6379手动创建数据库:
# 登录 MySQL mysql -u root -p # 创建数据库 CREATE DATABASE exam_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 导入表结构 mysql -u root -p exam_system < database/schema.sql # 导入演示数据 mysql -u root -p exam_system < database/data.sql跳过第1步,直接从第2步启动后端即可
🔧 启动相关
Q5: 端口被占用怎么办?
错误: "Port 3306 is already in use"
原因: 本地已经运行了 MySQL
解决方案A: 停止本地 MySQL
- Windows:打开"服务"(Win+R 输入
services.msc),找到 MySQL 服务并停止
解决方案B: 修改 Docker 端口
- 编辑
docker-compose.yml,将3306:3306改为3307:3306 - 编辑
backend/.env,将DB_PORT=3306改为DB_PORT=3307
Q6: pnpm install 很慢或失败?
使用国内镜像:
# 设置淘宝镜像
pnpm config set registry https://registry.npmmirror.com
# 重新安装
pnpm install
Q7: 后端启动失败 "Can't connect to MySQL"?
检查步骤:
- 确认 Docker Desktop 正在运行(绿色图标)
- 运行
docker ps检查容器是否启动 - 等待30秒 再启动后端(MySQL初始化需要时间)
- 查看 MySQL 日志:
docker logs exam-mysql
💻 使用相关
Q8: 数据库中文显示乱码?
症状: 题目、用户名等中文显示为 马天 之类的乱码
解决方案(推荐):
- 双击运行
4-重置数据库.bat - 输入
y确认重置 - 等待约30秒自动完成
系统会使用UTF8MB4字符集重新导入所有数据。
详细解决方案请查看:解决乱码问题.md
Q9: 系统没有测试数据?
不会! 系统已包含完整的演示数据:
- 8个用户(管理员、教师、学生)
- 36道题目(单选、多选、判断、填空、简答)
- 4场考试(3场已发布、1场草稿)
- 6条考试记录(学生已完成的考试)
- 5条错题记录
如果数据为空,请运行 4-重置数据库.bat 重新导入。
查看完整数据说明:完整演示数据
Q10: 如何修改数据库配置?
编辑 backend/.env 文件:
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=root123
DB_DATABASE=exam_system
Q11: 如何添加新的题型?
- 在
question.entity.ts中添加新的枚举值 - 在前端组件中添加对应的输入/显示组件
- 在评分算法中添加对应的评分逻辑
Q3: 如何实现WebSocket实时通信?
# 安装依赖
pnpm add @nestjs/websockets @nestjs/platform-socket.io
# 创建WebSocket网关
nest g gateway exam
Q4: 如何优化查询性能?
- 添加数据库索引
- 使用Redis缓存热点数据
- 使用分页查询
- 使用连接池
Q5: 如何部署到生产环境?
# 后端打包
cd backend
pnpm run build
node dist/main.js
# 前端打包
cd frontend
pnpm run build
# 部署 dist 目录到 Nginx
📖 学习建议
前端学习路径
- Vue3 Composition API
- Pinia 状态管理
- Element Plus 组件库
- Axios 请求封装
- ECharts 数据可视化
后端学习路径
- NestJS 架构设计
- TypeORM 数据库操作
- JWT 身份认证
- Swagger API文档
- Redis 缓存应用
📞 技术支持
- 📧 邮箱: support@exam.com
- 📱 微信: exam-system
- 🌐 官网: https://exam-system.com
📄 许可协议
MIT License
🎓 祝您毕业设计顺利!答辩高分通过! ✨