在线考试系统

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

🚀 快速导航

我想... 查看文档
🎬 快速启动项目 快速开始指南.md ⭐ 新手必看
💻 了解技术实现 功能说明文档.md
🎓 准备答辩PPT 答辩PPT大纲.md ⭐ 答辩必备
📄 写毕业论文 毕业设计论文模板.md
🗄️ 查看数据库设计 ER图设计.md

🎯 项目简介

这是一个功能完整的在线考试系统,支持题库管理、自动组卷、在线答题、自动评分、成绩统计等核心功能。相比图书管理系统,本项目具有更高的技术复杂度和实用价值。

✨ 核心亮点

  1. 🤖 智能组卷 - 支持按难度、题型、分值自动组卷算法
  2. ⚡ 实时答题 - Redis缓存答题进度,防止异常丢失
  3. 🔒 防作弊 - 切屏检测、禁止复制、时间限制
  4. 📊 智能评分 - 客观题自动评分,主观题教师评分
  5. 📈 数据分析 - ECharts可视化成绩分布、正确率统计
  6. 📚 错题本 - 自动收集错题,支持复习巩固
  7. 👥 三种角色 - 管理员、教师、学生,权限分明
  8. 📱 响应式设计 - 支持PC、平板、手机多端访问

🚀 快速开始

环境要求

  • Docker Desktop - 运行 MySQL 和 Redis(下载地址
  • Node.js >= 18.0(下载地址
  • pnpm - 运行 npm install -g pnpm 安装

一键启动(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道错题(待复习)

🎯 体验建议

使用不同角色登录,体验完整功能:

  1. 学生账号 (student1 / 123456) - 张三

    • ✅ 查看可参加的考试列表(3场可考)
    • ✅ 查看我的考试记录(2条记录)
    • ✅ 查看成绩详情和答题情况
    • ✅ 查看错题本(2道错题)
  2. 教师账号 (teacher1 / 123456) - 王老师

    • ✅ 题目管理(36道题目)
    • ✅ 考试管理(3场已发布 + 1场草稿)
    • ✅ 阅卷评分(查看学生答题,评分主观题)
    • ✅ 统计分析(考试统计、学生排名、正确率分析)
  3. 管理员账号 (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)⭐核心

题型支持:

  1. 单选题 - 4个选项,1个正确答案
  2. 多选题 - 4个选项,多个正确答案
  3. 判断题 - 正确/错误
  4. 填空题 - 支持多个空格
  5. 简答题 - 文本输入,教师评分

功能特性:

  • ✅ 题目增删改查
  • ✅ 富文本编辑器(题目内容)
  • ✅ 题目分类管理
  • ✅ 难度设置(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)⭐核心

试卷类型:

  1. 固定试卷 - 手动选择题目
  2. 随机试卷 - 自动组卷算法

自动组卷算法:

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)⭐核心

考试流程:

  1. 学生进入考试 → 创建考试记录
  2. 在线答题 → Redis缓存答案(30秒自动保存)
  3. 提交试卷 → 自动评分(客观题)
  4. 教师评分 → 手动评分(主观题)
  5. 查看成绩 → 显示得分、答案、解析

防作弊机制:

  • ✅ 切屏检测(记录次数,超过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个表)

  1. users - 用户表(管理员、教师、学生)
  2. categories - 题目分类表(支持多级)
  3. questions - 题目表(5种题型)
  4. exams - 考试/试卷表
  5. exam_questions - 试卷-题目关联表
  6. exam_records - 考试记录表
  7. exam_answers - 考生答案表
  8. 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

🎓 适合毕业设计的理由

✅ 技术复杂度高

  1. 后端算法 - 自动组卷算法、自动评分算法
  2. 实时功能 - Redis缓存、WebSocket(可扩展)
  3. 安全机制 - JWT认证、密码加密、防作弊
  4. 性能优化 - 缓存策略、数据库索引

✅ 功能完整度高

  • 8个功能模块
  • 36+API接口
  • 15+页面组件
  • 5种题型支持

✅ 实用价值高

  • 教育行业刚需
  • 企业培训应用
  • 在线招聘笔试

✅ 答辩亮点多

  • 自动组卷算法设计与实现
  • 防作弊机制的技术方案
  • Redis缓存的应用场景
  • 数据统计与可视化展示

📚 配套文档

完整的项目文档,助您快速上手和答辩通过!

📖 文档列表

文档 说明 适用场景
快速开始指南.md 5分钟快速了解和启动项目 ⭐ 新手必看
功能说明文档.md 详细功能说明、API文档、开发指南 开发必备
答辩PPT大纲.md 完整的20页PPT演示大纲 ⭐ 答辩必备
毕业设计论文模板.md 完整的论文结构模板 论文写作
ER图设计.md 数据库设计文档 数据库设计

🎯 推荐阅读顺序

首次使用:

  1. 📖 快速开始指南.md - 了解项目并快速启动
  2. 🎮 登录系统体验各种角色的功能
  3. 📝 功能说明文档.md - 深入了解技术实现

准备答辩:

  1. 📊 答辩PPT大纲.md - 制作答辩PPT
  2. 📄 毕业设计论文模板.md - 撰写论文
  3. 🎤 准备演示视频和答辩问题

📝 文档亮点

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"

解决步骤:

  1. 以管理员身份打开 PowerShell
  2. 运行:wsl --install
  3. 重启电脑
  4. 再次启动 Docker Desktop

Q3: Docker 启动很慢或卡住?

  1. 确保电脑已开启虚拟化(在BIOS中开启 VT-x 或 AMD-V)
  2. 关闭杀毒软件再试
  3. 检查磁盘空间是否充足(至少10GB)
  4. 重启 Docker Desktop

Q4: 我不想用 Docker,能直接用本地数据库吗?

可以! 如果你本地已经安装了 MySQL 和 Redis:

  1. 修改后端配置 backend/.env

    DB_HOST=localhost
    DB_PORT=3306
    DB_USERNAME=root
    DB_PASSWORD=你的MySQL密码
    DB_DATABASE=exam_system
    
    REDIS_HOST=localhost
    REDIS_PORT=6379
    
  2. 手动创建数据库:

    # 登录 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
    
  3. 跳过第1步,直接从第2步启动后端即可


🔧 启动相关

Q5: 端口被占用怎么办?

错误: "Port 3306 is already in use"

原因: 本地已经运行了 MySQL

解决方案A: 停止本地 MySQL

  • Windows:打开"服务"(Win+R 输入 services.msc),找到 MySQL 服务并停止

解决方案B: 修改 Docker 端口

  1. 编辑 docker-compose.yml,将 3306:3306 改为 3307:3306
  2. 编辑 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"?

检查步骤:

  1. 确认 Docker Desktop 正在运行(绿色图标)
  2. 运行 docker ps 检查容器是否启动
  3. 等待30秒 再启动后端(MySQL初始化需要时间)
  4. 查看 MySQL 日志:docker logs exam-mysql

💻 使用相关

Q8: 数据库中文显示乱码?

症状: 题目、用户名等中文显示为 马天 之类的乱码

解决方案(推荐):

  1. 双击运行 4-重置数据库.bat
  2. 输入 y 确认重置
  3. 等待约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: 如何添加新的题型?

  1. question.entity.ts 中添加新的枚举值
  2. 在前端组件中添加对应的输入/显示组件
  3. 在评分算法中添加对应的评分逻辑

Q3: 如何实现WebSocket实时通信?

# 安装依赖
pnpm add @nestjs/websockets @nestjs/platform-socket.io

# 创建WebSocket网关
nest g gateway exam

Q4: 如何优化查询性能?

  1. 添加数据库索引
  2. 使用Redis缓存热点数据
  3. 使用分页查询
  4. 使用连接池

Q5: 如何部署到生产环境?

# 后端打包
cd backend
pnpm run build
node dist/main.js

# 前端打包
cd frontend
pnpm run build
# 部署 dist 目录到 Nginx

📖 学习建议

前端学习路径

  1. Vue3 Composition API
  2. Pinia 状态管理
  3. Element Plus 组件库
  4. Axios 请求封装
  5. ECharts 数据可视化

后端学习路径

  1. NestJS 架构设计
  2. TypeORM 数据库操作
  3. JWT 身份认证
  4. Swagger API文档
  5. Redis 缓存应用

📞 技术支持


📄 许可协议

MIT License


🎓 祝您毕业设计顺利!答辩高分通过!

( 评价)
会员专享资源
开通会员即可免费下载
已有 0 人下载
分类:毕业设计
更新时间:2025-12-01 06:10:00
标签:
Vue3Node.js管理系统

相关推荐