【JAVA程序设计】基于SpringBoot+vue的在线考试系统-以计算机网络为例,可自行录入题库-附下载地址

基于SpringBoot+vue的在线考试系统-以计算机网络为例,可自行录入题库

    • 一、项目简介
    • 二、开发环境
    • 三、项目技术
    • 四、功能结构
    • 五、运行截图
    • 六、功能实现
    • 七、数据库设计
    • 八、源码获取

一、项目简介

随着信息技术的迅猛发展,教育行业正面临着巨大的变革和挑战。为了适应当下时代的需求,我们开发了一款现代化的在线考试系统,旨在提供高效、便捷、安全的考试环境,为学生和教师带来更好的考试体验和教学管理。

我们的在线考试系统采用了先进的技术架构,其中后端采用了Spring Boot,前端则采用Vue2和ElementUI。同时,作为数据库,我们选择了MySQL,以保障数据的可靠性和稳定性。

该系统提供了全面的功能模块,涵盖学生管理、教师管理、题库管理、考试管理、留言、在线考试和成绩统计等方面。学生管理模块包含学生信息的录入、查询和修改功能,教师管理模块提供了教师信息信息添加、删除功能,题库管理模块允许教师对题目进行增加于查看,考试管理模块支持考试计划创建、考试计划修改以及删除等操作,留言功能方便学生和教师之间的交流,而在线考试模块则为学生提供了在线答题和交卷的便捷方式并且提供自动判分。成绩统计模块则帮助教师对学生的考试成绩进行全面统计和分析,为教学提供有效参考。

二、开发环境

开发环境版本/工具
基础环境Jdk1.8、node.js14
开发工具IntelliJ IDEA、WebStorm
操作系统Windows 10
内存要求8GB 以上
浏览器Firefox (推荐)、Google Chrome (推荐)、Edge
数据库MySQL 8.0 (推荐)
数据库工具Navicat Premium 15 (推荐)
项目框架后端SpringBoot、前端ElementUi

三、项目技术

后端:SpringBoot、MybatisPlus、MySQL

前端:Vue2、ElementUi、vue-router、vuex、JavaScript

四、功能结构

学生管理功能 : 学生管理模块允许学生进行个人信息的修改和添加,保证学生信息的及时更新。学生登录功能为学生提供了便捷的访问入口,让他们可以方便地查看考试计划、参加在线考试,并随时查询个人的考试成绩。

教师管理功能 : 教师管理模块为教师提供了个人信息的管理功能,教师可以随时修改和添加自己的信息。通过教师登录功能,教师可以查看自己负责的考试和班级,进行考试的修改和删除等操作,实现对教学事务的全面管理。

题库管理功能 : 题库管理模块为教师提供了方便快捷的试卷题库添加功能,支持多种题型的题目录入。教师可以查看已有的题库,便于组卷时参考。同时,试卷在线组卷功能可以根据需要自动生成试卷,减轻了教师的工作负担。

考试管理功能 : 考试管理模块支持考试计划的添加、修改和删除,教师可以根据学习进度和课程需要进行灵活安排。考试的修改功能也让教师在出现变动时能够及时调整考试安排,保证教学进度的顺利进行。

成绩查询功能 : 成绩查询功能允许学生方便地查询自己的考试成绩,而且考试分段成绩统计功能可以为教师提供更全面的学生成绩分析,辅助教学改进和个性化辅导。

在线考试客户端 : 在线考试客户端为学生提供了便捷的在线考试体验。学生可以在客户端查看考试计划,准时参加在线答题考试,并通过自动判分功能快速获取考试成 绩。客户端还支持留言功能,学生可以向教师提问或反馈问题,促进师生间的有效沟通。
在这里插入图片描述

五、运行截图

考试计划查看:
在这里插入图片描述
在线考试:
在这里插入图片描述

提交考试:
在这里插入图片描述

考试成绩查看:
在这里插入图片描述
留言板:
在这里插入图片描述

登录页面:
在这里插入图片描述

考试管理:
在这里插入图片描述
在这里插入图片描述

题库管理:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

教师管理:
在这里插入图片描述
在这里插入图片描述

学生管理:
在这里插入图片描述
在这里插入图片描述

留言:
在这里插入图片描述

考试成绩统计:
在这里插入图片描述
在这里插入图片描述

六、功能实现

前端获取当前考试信息

    getExamData() { //获取当前试卷所有信息let date = new Date()this.startTime = this.getTime(date)let examCode = this.$route.query.examCode //获取路由传递过来的试卷编号this.$axios(`/api/exam/${examCode}`).then(res => {  //通过examCode请求试卷详细信息this.examData = { ...res.data.data} //获取考试详情this.index = 0this.time = this.examData.totalScore //获取分钟数let paperId = this.examData.paperIdthis.$axios(`/api/paper/${paperId}`).then(res => {  //通过paperId获取试题题目信息this.topic = {...res.data}let reduceAnswer = this.topic[1][this.index]this.reduceAnswer = reduceAnswerlet keys = Object.keys(this.topic) //对象转数组keys.forEach(e => {let data = this.topic[e]this.topicCount.push(data.length)let currentScore = 0for(let i = 0; i< data.length; i++) { //循环每种题型,计算出总分currentScore += data[i].score}this.score.push(currentScore) //把每种题型总分存入score})let len = this.topicCount[1]let father = []for(let i = 0; i < len; i++) { //根据填空题数量创建二维空数组存放每道题答案let children = [null,null,null,null]father.push(children)}this.fillAnswer = fatherlet dataInit = this.topic[1]this.number = 1this.showQuestion = dataInit[0].questionthis.showAnswer = dataInit[0]})})}

自动判分方法核心代码

   commit() { //答案提交计算分数/* 计算选择题总分 */let topic1Answer = this.topic1Answerlet finalScore = 0topic1Answer.forEach((element,index) => { //循环每道选择题根据选项计算分数let right = nullif(element != null) {switch(element) { //选项1,2,3,4 转换为 "A","B","C","D"case 1:right = "A"breakcase 2:right = "B"breakcase 3:right = "C"breakcase 4:right = "D"}if(right == this.topic[1][index].rightAnswer) { // 当前选项与正确答案对比finalScore += this.topic[1][index].score // 计算总分数}console.log(right,this.topic[1][index].rightAnswer)}// console.log(topic1Answer)})/**计算判断题总分 */// console.log(`this.fillAnswer${this.fillAnswer}`)// console.log(this.topic[2][this.index])let fillAnswer = this.fillAnswerfillAnswer.forEach((element,index) => { //此处index和 this.index数据不一致,注意element.forEach((inner) => {if(this.topic[2][index].answer.includes(inner)) { //判断填空答案是否与数据库一致console.log("正确")finalScore += this.topic[2][this.index].score}})});/** 计算判断题总分 */let topic3Answer = this.judgeAnswertopic3Answer.forEach((element,index) => {let right = nullswitch(element) {case 1:right = "T"breakcase 2:right = "F"}if(right == this.topic[3][index].answer) { // 当前选项与正确答案对比finalScore += this.topic[3][index].score // 计算总分数}})if(this.time != 0) {this.$confirm("考试结束时间未到,是否提前交卷","友情提示",{confirmButtonText: '立即交卷',cancelButtonText: '再检查一下',type: 'warning'}).then(() => {console.log("交卷")let date = new Date()this.endTime = this.getTime(date)let answerDate = this.endTime.substr(0,10)//提交成绩信息this.$axios({url: '/api/score',method: 'post',data: {examCode: this.examData.examCode, //考试编号studentId: this.userInfo.id, //学号subject: this.examData.source, //课程名称etScore: finalScore, //答题成绩answerDate: answerDate, //答题日期}}).then(res => {if(res.data.code == 200) {this.$router.push({path:'/studentScore',query: {score: finalScore,startTime: this.startTime,endTime: this.endTime}})}})}).catch(() => {console.log("继续答题")})}},

后端获取考试信息接口

    @GetMapping("/exam/{examCode}")public ApiResult findById(@PathVariable("examCode") Integer examCode){System.out.println("根据ID查找");ExamManage res = examManageService.findById(examCode);if(res == null) {return ApiResultHandler.buildApiResult(10000,"考试编号不存在",null);}return ApiResultHandler.buildApiResult(200,"请求成功!",res);}

后端获取试题接口

    @GetMapping("/paper/{paperId}")public Map<Integer, List<?>> findById(@PathVariable("paperId") Integer paperId) {List<MultiQuestion> multiQuestionRes = multiQuestionService.findByIdAndType(paperId);   //选择题题库 1List<FillQuestion> fillQuestionsRes = fillQuestionService.findByIdAndType(paperId);     //填空题题库 2List<JudgeQuestion> judgeQuestionRes = judgeQuestionService.findByIdAndType(paperId);   //判断题题库 3Map<Integer, List<?>> map = new HashMap<>();map.put(1,multiQuestionRes);map.put(2,fillQuestionsRes);map.put(3,judgeQuestionRes);return  map;}

七、数据库设计

表名:admin

字段名称数据类型是否必填注释
adminIdint(11)ID号
adminNamevarchar(20)姓名
sexvarchar(2)性别
telvarchar(11)电话号码
emailvarchar(20)电子邮箱
pwdvarchar(16)密码
cardIdvarchar(18)身份证号
rolevarchar(1)角色(0管理员,1教师,2学生)

表名:exam_manage

字段名称数据类型是否必填注释
examCodeint(11)考试编号
descriptionvarchar(50)该次考试介绍
sourcevarchar(20)课程名称
paperIdint(11)试卷编号
examDatevarchar(10)考试日期
totalTimeint(11)持续时长
gradevarchar(10)年级
termvarchar(10)学期
majorvarchar(20)专业
institutevarchar(20)学院
totalScoreint(11)总分
typevarchar(255)考试类型
tipsvarchar(255)考生须知

表名:fill_question

字段名称数据类型是否必填注释
questionIdint(11)试题编号
subjectvarchar(20)考试科目
questionvarchar(255)试题内容
answervarchar(255)正确答案
analysisvarchar(255)题目解析
scoreint(11)分数
levelvarchar(5)难度等级
sectionvarchar(20)所属章节

表名:judge_question

字段名称数据类型是否必填注释
questionIdint(11)试题编号
subjectvarchar(20)考试科目
questionvarchar(255)试题内容
answervarchar(255)正确答案
analysisvarchar(255)题目解析
scoreint(11)分数
levelvarchar(1)难度等级
sectionvarchar(20)所属章节

表名:message

字段名称数据类型是否必填注释
idint(11)留言编号
titlevarchar(20)标题
contentvarchar(255)留言内容
timedate留言时间

八、源码获取

源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache-DBUtils

目录 封装方法 引出dbutils 案例 当关闭connection后&#xff0c;resultset结果集就无法使用了&#xff0c;这就使得resultset不利于数据的管理 封装方法 我们可以将结果集先存储在一个集合中&#xff0c;当connection关闭后&#xff0c;我们可以通过访问集合来访问结果集 …

Firefox(火狐),使用技巧汇总,问题处理

本文目的 说明火狐如何安装在C盘之外的盘&#xff0c;即定制安装路径。如何将同步功能切换到本地服务上。默认是国际服务器。安装在C盘之后如何解决&#xff0c;之前安装的扩展无法自动同步的问题。顺带讲解一下&#xff0c;火狐的一些比较好用的扩展。 安装路径定制 火狐目前…

系统架构设计师之缓存技术:Redis持久化的两种方式-RDB和AOF

系统架构设计师之缓存技术&#xff1a;Redis持久化的两种方式-RDB和AOF

Vue2学习笔记のVue组件化编程

目录 Vue组件化编程非单文件组件基本使用几个注意点组件的嵌套VueComponent一个重要的内置关系 单文件组件index.htmlmain.jsApp.vueSchool.vueStudent.vue 各位小伙伴们好呀&#xff0c;不知道上一篇文章你是否有收获&#xff01;这篇是Vue2学习笔记第二篇&#xff0c;也是Vue…

期权分仓平台开户有什么优势?

期权分仓平台开户有什么优势&#xff1f;这最大的优势可以说零门槛开通上证50ETF期权和创业板ETF期权账户了&#xff0c;毕竟券商的门槛50万摆在那里&#xff0c;对于市场散户来说是遥望不可及的&#xff0c;只能选择第三方期权分仓平台来实现可以做期权交易的梦想。本文来自&a…

C语言:选择+编程(每日一练Day6)

目录 ​编辑选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;至少是其他数字两倍的最大数 思路一&#xff1a; 思路二&#xff1a; 题二&#xff1a;两个数组的交集…

docker之DockerFile与网络

目录 DockerFile 构建步骤 基础知识 指令 实战&#xff1a;构建自己的centos 第一步&#xff1a;编写dockerfile文件 第二步&#xff1a;构建镜像文件 docker网络 原理 功能 网络模式 host模式 container模式 none模式 bridge模式 DockerFile dockerfile 是用来…

返回前端json数据格式案例二

需求 A表中有 设备的ID &#xff0c;sbid ,以及设备名称 sbmcb 都是以字符串进行拼接。 sbid:sb123,sb567 sbmc:mc设备01&#xff0c;mc设备02&#xff0c; B表有 dpt【代表拍摄的流程】字段&#xff0c;以及设备IDa&#xff0c;和设备名称 sbmch&#xff0c; 一个…

交叉编译工具链

一、交叉编译 1. 编译原理 机器码&#xff08;二进制&#xff09;是处理器能直接识别的语言&#xff0c;不同的机器码代表不同的运算指令&#xff0c;处理器能够识别哪些机器码是由处理器的硬件设计所决定的&#xff0c;不同的处理器机器码不同&#xff0c;所以机器码不可移植…

Linux 进程间通信(IPC)

文章目录 进程间通信介绍进程间通信的概念进程间通信的目的进程间通信的本质理解进程间通信分类 管道匿名管道匿名管道的原理 pipe函数管道的特点 命名管道命名管道的原理使用相关命令创建命名管道使用命名管道实现server端和client端通信 system V共享内存共享内存通信的基本原…

算法基础(1):排序和查找算法

1、排序算法 1.1、堆排序(大顶堆)-重点&#xff1a; 参考文章&#xff1a;堆排序1、堆排序二 前置知识&#xff1a; 大顶堆&#xff1a;完全二叉树&#xff0c;且父节点大于左右儿子&#xff0c;左右子树又是大顶堆&#xff0c;依赖数组来实现(vector)第一个节点的父节点&…

vue3 02-reactive使用

1.reactive函数通常定义:复杂类型的响应式数据 2.reactive怎么使用&#xff1a; 2-1.首先先导入reactive函数 import { reactive } from vue;2-2.创建响应式数据对象const state reactive({name:老段,age:18})2-3.返回数据return{state}2-4.页面中展示<p>姓名:{{ state…

【Rust】Rust学习 第十六章无畏并发

安全且高效的处理并发编程是 Rust 的另一个主要目标。并发编程&#xff08;Concurrent programming&#xff09;&#xff0c;代表程序的不同部分相互独立的执行&#xff0c;而 并行编程&#xff08;parallel programming&#xff09;代表程序不同部分于同时执行&#xff0c;这两…

C# 反编译dll文件,将dll文件转为cs文件

工具名&#xff1a;reflector&#xff0c;可免费使用 工具下载地址使用方法 工具下载地址 下载地址&#xff1a; https://www.red-gate.com/products/reflector/ 使用方法 下载安装&#xff1b; 打开软件 打开dll文件 侧边栏找打刚打开的dll文件&#xff0c;直接就能导…

Redisson 分布式锁

Redis是基础客户端库&#xff0c;可用于执行基本操作。 Redisson是基于Redis的Java客户端&#xff0c;提供高级功能如分布式锁、分布式集合和分布式对象。 Redisson提供更友好的API&#xff0c;支持异步和响应式编程&#xff0c;提供内置线程安全和失败重试机制。 实现步骤…

密码学学习笔记(十八):Diffie–Hellman (DH) 密钥交换

DH算法是第一个密钥交换算法&#xff0c;也是第一个得到形式化描述的公钥密码算法。 群论 DH密钥交换算法基于数学中的群论&#xff0c;群论也是当今大多数公钥密码的基础。 要使集合及其运算成为一个群&#xff0c;需要满足以下性质&#xff1a; 封闭性&#xff1a;群中两…

Python 爬虫小练

Python 爬虫小练 获取贝壳网数据 使用到的模块 标准库 Python3 标准库列表 os 模块&#xff1a;os 模块提供了许多与操作系统交互的函数&#xff0c;例如创建、移动和删除文件和目录&#xff0c;以及访问环境变量等。math 模块&#xff1a;math 模块提供了数学函数&#xf…

第10章 其他调优

10.1 编译时计算 如果程序中包含不依赖输入的计算&#xff0c;那么这些计算就可以提起在编译时计算而不是在运行时计算。 C14标准提供了constexpr函数&#xff0c;C17标准通过了if constexpr提供编译时分支。 10.2 编译器内建函数 可以强制编译器产生专门的汇编指令而不用编…

使用three.js与WebGL相比有什么优势?

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 特点 WebGL和Three.js是两个与网页3D图形渲染相关的技术。以下是它们的一些特点&#xff1a; WebGL: 基于OpenGL ES标准&#xff0c;为网页提供了一种基于GPU加速的图形渲染API。具有高性能的图像处…

Effective C++条款12——复制对象时勿忘其每一个成分(构造/析构/赋值运算)

设计良好之面向对象系统&#xff08;OO-systems&#xff09;会将对象的内部封装起来&#xff0c;只留两个函数负责对象拷贝(复制)&#xff0c;那便是带着适切名称的copy构造函数和 copy assignment操作符,我称它们为copying函数。条款5观察到编译器会在必要时候为我们的classes…