Vue+SpringBoot在线教育考试及管理平台开发(纯原创)后续还在开发,会持续更新

登录页面设计

        登录页面设计思路-分为三个角色进行登录,分别为学生,教师,管理员。

        前端将登录设计为表单形式,通过选项组件绑定角色参数,向后端传递角色信息,通过表单绑定向后端传递登录者所有信息

              <div style="display: flex;  gap: 20px;"><vs-radio color="rgb(59,222,200)" v-model="form.type" val="学生">学生</vs-radio><vs-radio v-model="form.type" val="教师">教师</vs-radio><vs-radio danger v-model="form.type" val="管理员">管理员</vs-radio></div>
    @PostMapping("/user/login")public Map<String,Object> Login(@RequestBody User user){Map<String,Object> map = new HashMap<>();User u = userService.LoginByUserName(user.getUserNumber());Map<String,String>payload = new HashMap<>();if(u!=null){if(user.getPassword().equals(u.getPassword()) && user.getType().equals(u.getType())){if (u.getType().equals("学生")){String className = userService.FindClassNameByClassId(u.getClassid());map.put("className",className);}payload.put("id",u.getId().toString());payload.put("username",u.getUserNumber());String token = JWTUtil.createToken(payload);System.out.println("token为"+token);map.put("UserInfo",u);map.put("userId",u.getId());map.put("code",200);map.put("status",token);map.put("msg","登陆成功");}else {map.put("msg","密码错误");map.put("status",0);}}else{map.put("msg","不存在该用户");map.put("status",0);}return map;}

        通过在数据库中存入type字段,实现与后台对接并实现特定角色登录

考试系统设计

附:一张设计手稿,随笔字丑请忽略

设计思路(可结合下面数据表进行理解):

        1.试卷表:每一张试卷都对应一个特有的PaperId,并且在表中存有PaperName(试卷名),PaperTime(考试时间),PaperImageSrc(考试封面图),后续可以自信添加字段,丰富考卷所具有的信息。
        2.题目表:每一道题目都有一个PaperId,可以以此将隶属与对应试卷的题目信息读取,每一道题目含有独有的QuestionId(题目ID),QuestionContent(题目内容),QuestionScore(题目的得分,可以通过组卷时设置对应分数,实现灵活组卷),QuestionType(题目类型),通过这个字段可以定义题目对应的不同类型。
        3.题目细节表:每一条数据都有一个独有的QuestionId,可以让它属于对应的题目,QuesitonOption(题目选项表,设置ABCD等类型的选项内容),可以通过读取对应细节有几条数据来设置它为单选题还是填空题,QuestionCorrect(选项是否正确),通过此字段判断选项正确与否。
        4.题目商店表:用于老师的组卷功能,QuestionId,QuestionContent,QuestionType,QuestionTheme(问题主题,方便用于搜索,但是VueSax搜索不需要后端数据即可实现)。

思路串联:

        一、用户对应考卷的设计:通过UserNumber字段从f_exam_userneedexam表中查询该用户对应的所有PaperId,然后通过此PaperId查询f_exam_paper表中考卷具体信息,即可展示用户对应所需的考试信息。
        二、考卷的设计:一张试卷对应独特的PaperId,一道题目衔接对应的PaperId(衔接试卷表),题目选项衔接对应的QuestionId(衔接题目表)。
    //把试卷组好@GetMapping("/exam/SelectAllQustionByPaperIdUpdate")public List<QuestionWithOptions> SelectAllQustionByPaperIdUpdate(@RequestParam Integer PaperId){List<QuestionWithOptions> questionsWithOptions = new ArrayList<>();List<Questions> allQuestions = userExamService.SelectAllQustionByPaperIdUpdate(PaperId);for (Questions question : allQuestions) {List<Options> options = userExamService.SelectAllQustionByQuestionId(question.getQuestionId());QuestionWithOptions questionWithOptions = new QuestionWithOptions(question, options);questionsWithOptions.add(questionWithOptions);}//        System.out.println("第一组数据测试获取问题列表"+questionsWithOptions.get(0).getQuestion());
//        System.out.println("第一组数据测试获取选项列表"+questionsWithOptions.get(0).getOptions());
//        System.out.println("第一组数据测试获取选项列表的第一个选项内容"+questionsWithOptions.get(0).getOptions().get(0));
//        System.out.println("第一组数据测试获取选项列表的第二个选项内容"+questionsWithOptions.get(0).getOptions().get(1));
//        System.out.println("第一组数据"+questionsWithOptions.get(0));
//        System.out.println("返回的最终数据"+questionsWithOptions);return questionsWithOptions;}
@Data
public class QuestionWithOptions {private Questions question;private List<Options> options;
}

        <vs-dialog scroll overflow-hidden  auto-width  blur not-close  :prevent-close="true"  full-screen v-model="ExamActive"><div><h1>考卷</h1><div v-for="(questionWithOptions, index) in examQuestions" :key="index"><h2>{{ questionWithOptions.question.questionContent }}</h2><div v-for="(option, i) in questionWithOptions.options" :key="i"><label>
<!--                  <vs-checkbox :value="option" v-model="selectedOptions[index]">-->
<!--                    {{ option.questionOption }}-->
<!--                  </vs-checkbox>--><input type="radio" :value="option" v-model="selectedOptions[index]">{{ option.questionOption }}</label></div></div><vs-button gradient @click="submitExam">提交</vs-button></div></vs-dialog>
export default {data(){return{UserNumber:"",UserName:"",examInfo:[],active: false,input1: '',input2: '',checkbox1: false,ExamActive: false,examQuestions: [], // 包含问题和选项的数组selectedOptions: [], // 用户选择的答案//   JSON格式理解////   数组和对象//   LJL:[      ExamRecord:{//   PaperId: "",//       ExamUserNumber: "",//       ExamUserName: "",// },,      ExamRecord1:{//   PaperId: "",//       ExamUserNumber: "",//       ExamUserName: "",// },]ExamRecord:{paperId: "",examUserNumber: "",examUserName: "",},UserAnswer:{Answers:"",UserNumber:"",UserName:"",PaperId:"",},PaperId:""}},methods:{StartExam(){this.active = !this.active;this.ExamActive = !this.ExamActive;this.ExamRecord = {paperId: this.PaperId,examUserNumber: this.UserNumber,examUserName: this.UserName};//插入开考记录this.$ExamApi.insertRecordFromStartExam(this.ExamRecord).then(res=>{console.log(this.ExamRecord)}).catch(err=>console.log(err))},SelectExamByPaperId(paperId) {this.active = !this.activethis.PaperId = paperIdthis.$ExamApi.SelectAllQustionByPaperIdUpdate(paperId).then(res=>{this.examQuestions = res.dataconsole.log(res.data)// 初始化选项this.selectedOptions = new Array(this.examQuestions.length).fill("");console.log(this.selectedOptions)}).catch(err=>console.log(err))// 这里可以根据 paperId 执行你需要的逻辑,比如打开对应考试的详情页面等},submitExam() {this.UserAnswer={Answers: this.selectedOptions,UserName: this.UserName,UserNumber: this.UserNumber,PaperId: this.PaperId}this.$ExamApi.insertUserAnswerAndSubmitExamToAddScore(this.UserAnswer).then(res=>{console.log(this.UserAnswer)this.openNotification('top-center', '#7d33ff', `<i class='bx bx-bell' ></i>`)this.ExamActive = !this.ExamActive})// 这里可以将用户的答案发送给后端进行处理},//获取当前用户所需要的考试信息UserNeedExamByUserNumber(){// this.$loginApi.UserLogin(this.loginData).then(res=>{this.$ExamApi.UserNeedExamByUserNumber(this.UserNumber).then(res=>{this.examInfo = res.data.dataobjectconsole.log("查询到的考试信息为")console.log(this.examInfo)}).catch(err=>console.log(err))},getCoverUrl(coverUrl) {return this.$config.getBaseUrl()+coverUrl;},//消息通知框openNotification(position = null, color, icon) {const noti = this.$vs.notification({icon,color,position,title: '恭喜您!,顺利完成了测试!',text: `您将可以在考试查询界面,查询到自己的成绩以及答题情况!!!`})}},mounted() {this.UserNumber = sessionStorage.getItem("userNumber");this.UserName = sessionStorage.getItem("userName");this.UserNeedExamByUserNumber();}
}
        三、点击开考的设计:向f_exam_record(考试记录表)中插入,考试人员信息(ExamUserNumber,ExamUserName),开考时间(ExamStartTime),对应试卷PaperId。此时每条数据对应的ExamScore和ExamEndTime为空,通过交卷执行Update操作进行记录。
        四、点击交卷的设计:
        将用户所选的选项进行遍历,分别插入f_exam_user_answer(用户答题内容表,用于查看用户答题具体情况,即生成一份用户答题内容卷),记录用户所答题的具体信息。
        通过以下代码获取此用户所作的卷子记录(通过用户学号,开考时间的降序排序,限制为一条数据,获取用户当前所考的最新试卷,用于插入交卷时间和总分)
<!--    获得记录Id--><select id="SelectRecordId" parameterType="String" resultType="Integer">SELECT * from f_exam_record where ExamUserNumber = #{ExamUserNumber}  ORDER BY ExamStartTime DESC LIMIT 1</select>
        通过遍历questionCorrect字段,以获取哪条记录为正确选项,如果questionCorrect为true,通过此记录的QuestionId和PaperId在f_exam_question表中查找此题对应的QuestionScore值,然后在此时定义Score对象进行计算总分(避免了异步冲突),然后将总分以及交卷时间插入记录表格。
    @PostMapping("/exam/insertUserAnswerAndSubmitExamToAddScore")public void insertUserAnswer(@RequestBody Map<String, Object> requestData) {List<Map<String, Object>> answersMapList = (List<Map<String, Object>>) requestData.get("Answers");String userName = (String) requestData.get("UserName");String userNumber = (String) requestData.get("UserNumber");Integer recordId = userExamService.SelectRecordId(userNumber);Integer PaperId = (Integer) requestData.get("PaperId");int score = 0;for (Map<String, Object> answerMap : answersMapList) {UserAnswer userAnswer = new UserAnswer();userAnswer.setId((int) answerMap.get("id"));userAnswer.setQuestionId((int) answerMap.get("questionId"));userAnswer.setQuestionOption((String) answerMap.get("questionOption"));userAnswer.setQuestionCorrect((boolean) answerMap.get("questionCorrect"));userAnswer.setExamUserNumber(userNumber);userAnswer.setExamUserName(userName);userAnswer.setRecordId(recordId);userExamService.insertUserAnswer(userAnswer);if((Boolean) answerMap.get("questionCorrect")==true){ExamRequestScore examRequestScore = new ExamRequestScore();examRequestScore.setPaperId(PaperId);examRequestScore.setQuestionId(userAnswer.getQuestionId());Integer s = userExamService.selectScoreFromStoreByQuestionIdAndPaperId(examRequestScore);score = s+score;System.out.println("编号为"+userAnswer.getQuestionId()+"的问题回答正确"+"并且正确答案的分数为:"+s);System.out.println("总分为"+score);}}ExamRecord examRecord = new ExamRecord();examRecord.setPaperId(PaperId);examRecord.setExamUserNumber(userNumber);examRecord.setExamScore(score);System.out.println("examRecord"+examRecord);userExamService.updateRecordFromEndExam(examRecord);}

 数据库分为:

        题目所对应的数据表:

        试卷表

        题目表

        题目细节表(选项表)

        题目商店表(题库表)

用户考试对应的表:

        用户所需考试表

        用户考试记录表

        用户答题记录表

附:一些界面设计截图

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

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

相关文章

必示科技携手云杉网络发布“智能可观测性联合解决方案”

近日&#xff0c;必示科技与云杉网络携手发布“智能可观测性联合解决方案”&#xff0c;整体方案融合云杉网络DeepFlow产品在可观测性领域、必示科技AIOps产品在运维数据分析领域的深厚技术积淀&#xff0c;完整实现IT系统高质量、高性能、全栈的可观测数据采集、智能监控和智能…

网络: 数据链路层

数据链路层: 数据帧的封装与传输 以太网数据帧 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;帧协议类型字段有三种值,分别对应IP、ARP、RARP;帧末尾是CRC校验码 以太网 "以太网" 不是一种具体的网络, 而是一种技术标准; 既…

String 作为方法参数是值传递还是引用传递

当将一个String作为方法参数传递时&#xff0c;实际上传递的是String对象的引用的副本&#xff0c;而不是String对象本身。即&#xff0c;在方法内部对String对象进行操作时&#xff0c;操作的是引用的副本&#xff0c;而不会影响原始的String对象。这也意味着&#xff0c;如果…

Cubemx串口配置

1.时钟 2.引脚配置 3.重写printf代码 /* USER CODE BEGIN 1 */ int __io_putchar(int ch){HAL_UART_Transmit(&huart1,(uint8_t *) ch, 1,1000);return ch; } /* USER CODE END 1 */

05分布式事务之CAP理论和BASE理论

分布式事务 项目优化 在网站上加载课程详情信息时如果很慢(排除网速)会影响用户的体验性&#xff0c;为了提高响应速度需要将课程详情信息进行缓存并且将课程信息加入索引库方便全局搜索 Redis中的课程缓存信息是将课程发布表中的数据转为json进行存储Elasticsearch中的课程…

Mysql数据库:索引管理

目录 一、索引的概述 1、索引的概念 2、索引的作用 3、索引的副作用 4、创建索引的原则依据 5、索引优化 6、索引的分类 7、数据文件与索引文件 二、管理数据库索引 1、查询索引 2、创建索引 2.1 创建普通索引 2.2 创建唯一索引 2.3 创建主键索引 2.4 创建组合…

58、服务攻防——应用协议设备KibanaZabbix远控向日葵VNCTeamViwer

文章目录 vnc默认端口&#xff1a;5900 or 5902&#xff0c;hydra支持vnc破解。VNC有三种模式&#xff1a;使用vnc密码、windows密码、无密码。 teamviewer、向日葵都是使用之前爆过漏洞进行测试。 zabbix&#xff1a;监控系统&#xff0c;蓝队部署平台。zabbix页面如下&#…

(PAT乙级) 1084 外观数列 (C语言实现,不要使用strcat)

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…

建立一个高效协作的团队从《团队章程》开始

《团队章程》 项目资源分为团队资源&#xff08;人力&#xff09;和实物资源。而项目资源管理的目的拿今天最流行的说法就是降本增效&#xff0c;那么建立一个高效协作的团队从《团队章程》开始&#xff0c;以某供应链团队的团队章程&#xff08;简化&#xff09;举例&#xf…

puppeteer使用示例云顶之弈官网

自己从0到1开发的&#xff0c;微信小程序【云顶宝藏】求求点个5星好评吧&#xff01; 需求&#xff1a;拿到所有英雄的信息 思路&#xff1a;点击每个英雄&#xff0c;进入英雄详情页&#xff0c;拿信息&#xff0c;并返回&#xff0c;继续下一个英雄** 最终效果 本地环境 win…

如何搭建DolphinScheduler服务并结合内网穿透公网远程任务调度

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

C语言学习 四、选择与循环

4.1关系表达式与逻辑表达式 算术运算符的优先级高于关系运算符关系运算符的优先级高于逻辑与 和 逻辑或运算符相同优先级的运算符从左到右进行结合 【例】 表达式 5 > 3 && 8 < 4 - !0 的最终值为多少 4.2 if-else语句 4.2.1 if-else单分支语句 if判断条件&am…

力扣日记3.21【贪心算法篇】45. 跳跃游戏 II

力扣日记&#xff1a;【贪心算法篇】45. 跳跃游戏 II 日期&#xff1a;2024.3.21 参考&#xff1a;代码随想录、力扣 45. 跳跃游戏 II 题目描述 难度&#xff1a;中等 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转…

C语言例:设 int x; 则表达式 (x=4*5,x*5),x+25 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int x,m;m ((x4*5,x*5),x25);printf("(x4*5,x*5),x25 %d\n",m);//x4*520//x*5100//x2545return 0; } 结果如下&#xff1a;

网络仿真3-NS2协议修改和移植

Ns2实现原理 OTcl与C关联 执行路径&#xff1a;Tcl->Otcl->C 返回路径&#xff1a;C->Otcl->Tcl NS2协议修改和移植 NS2中的各种网络协议在底层通过C实现&#xff0c;在网络仿真过程中最终通过调用底层C代码实现网络行为、算法、功能等各种仿真 NS2协议修改&…

牛客NC403 编辑距离为一【中等 模拟法 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/0b4b22ae020247ba8ac086674f1bd2bc 思路 注意&#xff1a;必须要新增一个&#xff0c;或者删除一个&#xff0c;或者替换一个&#xff0c;所以不能相等1.如果s和t相等&#xff0c;返回false,如果s和t长度差大于1…

【数据库系统】SQL和T-SQL

第四章 SQL 基本内容 系统结构、DDL、DML、视图、数据控制、嵌入式SQL SQL介绍 特点 一体化&#xff1b;面向集合操作&#xff1b;非过程化语言&#xff1b;可以单独写&#xff0c;也可以作为嵌入式语言&#xff08;JDBC&#xff09; 体系结构 数据库存储结构 逻辑存储结构 面…

在vscode中使用git-新手向

Git 应该是必学的版本同步工具&#xff0c;是代码管理的好帮手。 可是对新手来说上手还是有一丢丢门槛&#xff0c;结合 vscode 同步非常方便。 可实现可视化代码变化&#xff0c;提醒自己记录版本修改内容。非常好用。 在 VSCode 中将项目上传至 GitHub 私有仓库基本步骤 确保…

基于ssm电子竞技管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电子竞技管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置&#xff08;模板页面还需要修改&#xff09; 总结 1 vmware exporter安装配置 …