【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.rhkb.cn/news/101204.html

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

相关文章

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 3 Paramter标签页介绍

这页是参数设置的界面,那首先要知道什么是参数,参数就是算法中的系数这些可以更改的变量,接下来就是要学习如何创建参数,如下图: 打开模型资源管理器 选择model Workspace标签,点击上边工具栏里的创建参数的按钮(红色箭头指向的按钮),添加一个新的参数K,值设置为4,数…

【Golang系统开发】搜索引擎(3) 压缩倒排索引表

写在前面 假设我们的数据集中有 800000 篇文章&#xff0c;每篇文章有 200 词条&#xff0c;每个词条有6个字符&#xff0c;倒排记录数目是 1 亿。那么如果我们倒排索引表中单单记录文档id&#xff0c;不记录文档内的频率和偏移信息。 那么 文档id 的长度就必须是 l o g 2 8…

Java动态代理、反射

文章目录 动态代理调用者--->代理--->对象为什么需要代理代理的详细实现过程代码详情 反射反射概念反射中常用的方法所有代码 动态代理 调用者—>代理—>对象 动态代理就是无侵入式的给代码增加新的功能&#xff0c;通过接口保证后面的对象和代理需要实现同一个接…

19万字智慧城市总体规划与设计方案WORD

导读&#xff1a;原文《19万字智慧城市总体规划与设计方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 感知基础设施 感知基础设施架构由感知范围、感知手…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果

No mapping found for HTTP request with URI

参考: 参考地址 说明 ssm老项目,接过来别人的项目 临时建了一个Controller方便测试用的,结果访问掉不通,报: No mapping found for HTTP request with URIxxxx 这样的错误 解决办法 看了下web,xml配置 在 webmvc-config.xml 配置文件里面添加了几行配置 说明: com.iph.h…

实景无人直播平台是这么开发出来的

标题&#xff1a;实景无人直播平台开发&#xff1a;探索专业性、思考深度与逻辑性的全新体验 随着科技的不断进步&#xff0c;实景无人直播平台成为了当今数字娱乐领域的热门话题。这种新型娱乐方式将虚拟与现实相结合&#xff0c;为用户带来了前所未有的视听体验。本文将探…

搜狗拼音占用了VSCode及微信小程序开发者工具快捷键Ctrl + Shit + K 搜狗拼音截图快捷键

修改搜狗拼音的快捷键 右键--更多设置--属性设置--按键--系统功能快捷键--系统功能快捷键设置--取消Ctrl Shit K的勾选--勾选截屏并设置为Ctrl Shit A 微信开发者工具设置快捷键 右键--Command Palette--删除行 微信开发者工具快捷键 删除行&#xff1a;Ctrl Shit K 或…

【LeetCode】复写零

复写零 题目描述算法描述编程代码 链接: 复写零 题目描述 算法描述 编程代码 class Solution { public:void duplicateZeros(vector<int>& arr) {int n arr.size();int dest -1,cur 0;while(cur < n){if(arr[cur]){dest;}else{dest2;}cur;if(dest > n-1){…

数学建模大全及优缺点解读

分类模型 1、距离聚类&#xff08;系统聚类&#xff09;&#xff08;常用&#xff0c;需掌握&#xff09; 优点&#xff1a; ①将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类 ②是一种探索性的分析方法&#xff0c;分类结果不一定相同 例如&am…

java面试基础 -- 深克隆 浅克隆

引例 说到java的克隆你还记得多少? 一说到克隆你可能就会想起来那个接口, 没错, 他就是Cloneable Cloneable是java里面内置的很常用的接口, 我们说 Object类中也有一个clone方法: 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedEx…

Redis 数据库 NoSQL

目录 一、NoSQL 二、为什么会出现NoSQL技术 三、NoSQL的类别 键值&#xff08;Key-Value&#xff09;存储数据库 列存储数据库 文档型数据库 图形&#xff08;Graph&#xff09;数据库 四、NoSQL适应场景 五、在分布式数据库中CAP原理 1、CAP 2、BASE 一、NoSQL NoS…

[C++ 网络协议编程] 域名及网络地址

1. DNS服务器 DNS&#xff08;Domain Name System&#xff09;&#xff1a;是对IP地址和域名&#xff08;如:www.baidu.com等&#xff09;进行相互转换的系统&#xff0c;其核心是DNS服务器。 我们输入的www.baidu.com是域名&#xff0c;是一种虚拟地址&#xff0c;而非实际地…

Error creating bean with name ‘esUtils‘ defined in file

报错异常&#xff1a; 背景&#xff1a; esUtils在common服务中、启动media服务时候、报这个异常、后排查esUtils在启动时候发生异常引起的、在相关bean中加入try{}catch{}即可解决问题 String[] split url.split(","); HttpHost[] httpHosts new HttpHost[split.…

MySQL的配置文件my.cnf与my.ini

一、my.cnf与my.ini win系统&#xff0c;MySQL配置文件为my.ini 其他系统&#xff08;Ubuntu、CentOS、macOS)MySQL配置文件为my.cnf 二、my.cnf与my.ini的路径 2.1 默认路径 MySQL 的配置文件 my.cnf 可能位于多个位置&#xff0c;具体取决于安装方式和操作系统。以下是一…

燃尽图、甘特图、鱼骨图

燃尽图、甘特图、鱼骨图 1. 燃尽图 燃尽图&#xff08;burn down chart&#xff09;是在项目完成之前&#xff0c;对需要完成的工作的一种可视化表示。燃尽图有一个Y轴&#xff08;工作&#xff09;和X轴&#xff08;时间&#xff09;。理想情况下&#xff0c;该图表是一个向下…

2023.8 - java - Number类和Math类

一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 然而&#xff0c;在实际开发过程中&#xff0c;我们经常会遇到需要使用对象&#xff0c;而不是内置数据类型的情形。为了解决这个问题&a…

LeetCode[面试题04.12]求和路径

难度&#xff1a;Medium 题目&#xff1a; 给定一棵二叉树&#xff0c;其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法&#xff0c;打印节点数值总和等于某个给定值的所有路径的数量。注意&#xff0c;路径不一定非得从二叉树的根节点或叶节点开始或结束&#x…

Java数据库连接池原理及spring boot使用数据库连接池(HikariCP、Druid)

和线程池类似&#xff0c;数据库连接池的作用是建立一些和数据库的连接供需要连接数据库的业务使用&#xff0c;避免了每次和数据库建立、销毁连接的性能消耗&#xff0c;通过设置连接池参数可以防止建立连接过多导致服务宕机等&#xff0c;以下介绍Java中主要使用的几种数据库…

nlp系列(7)三元组识别(Bi-LSTM+CRF)pytorch

模型介绍 在实体识别中&#xff1a;使用了Bert模型&#xff0c;CRF模型 在关系识别中&#xff1a;使用了Bert模型的输出与实体掩码&#xff0c;进行一系列变化&#xff0c;得到关系 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&…