基于springboot题库管理系统的设计与实现

news2025/7/22 14:07:14

   目前,许多高校绝大多数课程还采用考教统一的模式来完成教学过程,这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性。另外随着各高校近年来学生规模的扩大,教学任务日益繁重,教师的工作量相应的不断增加。迫切需要计算机辅助教学系统来打破这种传统的教学模式,减轻教师的工作负担,提高教学质量。因此,本文研究设计了一个试题库管理系统,来解决和缓解高校课程教学中现存的问题,提高教学质量和考试效果,减轻教师工作压力。试题库管理系统可辅助教师对所教科目的各种试题的题型、知识点、难度等相关资料进行保存、查询等信息管理;并在需要对学生进行测验、评估的时候,从题库中抽取出相应要求的题目,组成一套试卷。

试题库管理是学校工作的重要组成部分,如何快速有效合理的组卷和试题库完善的保管是所有教师和学校管理者共同高度关注的问题。大部分的题库管理系统很难保证试题的多样性、全面性和试卷难度的恰当分配。为了解决教师出题困难,帮助教师轻松的出一份高质量的试卷,所以开发试题库管理系统是非常必要的。

 本系统基于java的springboot开发框架,数据库采用mysql,开发工具采用idea进行设计,本文首先简要介绍了开发试题库管理系统的可行性分析,系统的需求分析和总体设计,然后主要针对系统的设计、组成、用户界面设计、程序设计进行了详细分析,并对系统部分关键性代码进行了讲解,同时对一般系统软件设计的基本思想及工作流程给出了方法技巧。首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。

关键字:springboot  mybatis  题库管理 mysql数据库

目    录

1    

1.1 题目的来源及背景

1.2 研究意义

1.3 软件工程瀑布模型介绍

2  需求分析

2.1  项目内容及要求

2.1.1 具体完成功能

2.1.2 实现目标

2.2 可行性分析

2.2.1 经济可行性

2.2.2 技术可行性

2.3 开发工具的论述

2.3.1 前台开发工具

2.3.2 后台数据库

3  系统结构特性设计

3.1  系统分析模型

3.2  数据库设计

4  系统行为特性设计

4.1 软件结构设计

4.2功能子模块设计

4.2.1 教师登录模块

4.2.2 题库的管理与维护模块

4.2.3 试题查询模块

4.2.4 自动生成试卷模块

4.2.5 手工改动现有试卷模块

5 系统测试

5.1 系统测试方案

5.2 测试结果分析与调试

 

 

 

 

 

 

 yml配置:

spring:
  datasource:
    #    数据源基本配置
    username: root    #前面没有data直接是username或password
    password: root
    url: jdbc:mysql://localhost:3306/software?useUnicode=true&characterEncoding=utf-8&useSSL=false&&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    #   数据源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall  #,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  #    schema:
  #      - classpath:sql/books.sql
  #    initialization-mode: always
  thymeleaf:
    prefix: classpath:/templates/
    cache: false
    suffix: .html
    encoding: UTF-8
    mode: HTML
    servlet:
      content-type: text/html
#开发时让无缓存

mybatis:
  type-aliases-package: com.zhao.quiz.domain
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

关键代码:

package com.zhao.quiz.controller;

import com.zhao.quiz.domain.*;
import com.zhao.quiz.service.ExamService;
import com.zhao.quiz.service.PaperService;
import com.zhao.quiz.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/exam")
public class ExamController {
    @Autowired
    private ExamService examService;
    @Autowired
    private PaperService paperService;
    @Autowired
    private RecordService recordService;

    //前台跳转
    @RequestMapping("/toExam")
    public String toExam(Model model){
        List<Exam> Exams = examService.getAll();
        model.addAttribute("Exams",Exams);
        return "exam/examplan";
    }

    @RequestMapping("/toHist/{id}")
    public String toHist(@PathVariable ("id") Integer id,Model model){
        List<Record> records=recordService.queryAllExamById(id);
        model.addAttribute("records",records);
        return "exam/histplan";
    }

    //从其他页面跳转到home
    @RequestMapping("/toHome")
    public String tohome(){
        return "redirect:/indexprexam";
    }

    //来到对应考试页面
    @RequestMapping("/toDoExam/{id}")
    public String toDoExam(@PathVariable ("id") Integer id,Model model,String examId){
        List<QuestionPaper> questionPapers = paperService.paperQueryALlQuestionByIdOrderByType(id);
        int exId=Integer.parseInt(examId);
        Exam examById = examService.getExamById(exId);
        Paper paperName = paperService.queryPaperNameById(examById.getPaperId());
        model.addAttribute("paperName",paperName);
        model.addAttribute("examById",examById);
        model.addAttribute("questionPapers",questionPapers);
        return "exam/doExam";
    }

    //提交试卷
    @RequestMapping("/submitExam")
    public String submitExam(Integer paperId, Integer studentId, HttpServletRequest request){
        List<QuestionPaper> questionPapers = paperService.paperQueryALlQuestionByIdOrderByType(paperId);
        List<String> ans=new ArrayList<>();
        List<String> RightAns=new ArrayList<>();
        for (QuestionPaper qb:questionPapers){
            RightAns.add(qb.getQuestion().getQuestionOpright());
            String parameter="";
            String []parameters;
            if(qb.getQuestion().getQuestionType().equals("y")){
                parameters= request.getParameterValues("optionsSelect" + qb.getQuestionId());
                for(String s:parameters){
                    parameter+=s;
                }
            }else {
                parameter = request.getParameter("optionsSelect" + qb.getQuestionId());
            }
            ans.add(parameter);
        }
        //核对答案得到成绩
        int k=0;    //哨兵
        Double y=0.0;    //正确数
        int score=0;    //得分
        int a=0;        //记录单选题个数
        int b=0;        //记录多选题个数
        int c=0;        //记录判断题个数
        int totalScore=0;
        for (QuestionPaper qb:questionPapers){
            //若为单选题则正确+单选题分数
            if(qb.getQuestion().getQuestionType().equals("x")){
                if(ans.get(k).equals(RightAns.get(k))){
                    score+=qb.getPaper().getScoreSin();
                    y++;
                }
                a++;
                k++;
            }else if(qb.getQuestion().getQuestionType().equals("y")){
                if(ans.get(k).equals(RightAns.get(k))){
                    score+=qb.getPaper().getScoreChe();
                    y++;
                }
                b++;
                k++;
            }else {
                if(ans.get(k).equals(RightAns.get(k))){
                    score+=qb.getPaper().getScoreJug();
                    y++;
                }
                c++;
                k++;
            }
        }
        int scoreSin1 = questionPapers.get(0).getPaper().getScoreSin();
        int scoreChe1 = questionPapers.get(0).getPaper().getScoreChe();
        int scoreJug1 = questionPapers.get(0).getPaper().getScoreJug();
        int bool=recordService.queryBooleanToscore(paperId);
        if (bool==0){
        totalScore=scoreSin1*a+scoreChe1*b+scoreJug1*c; //得到每张试卷总分
        Toscore toscore=new Toscore();
        toscore.setPaperId(paperId);
        toscore.setToscore(totalScore);
        recordService.AddToScore(toscore);
        }
        //保存答题记录
        String answer = String.join(",", ans);
        Paper paper = paperService.queryPaperNameById(paperId);
        String paperName = paper.getPaperName();
        Double recordAcc=y/k;
        int recordScore=score;
        Record record=new Record();
        record.setRecordName(paperName);
        record.setStudentId(studentId);
        record.setPaperId(paperId);
        record.setRecordAnswer(answer);
        record.setRecordAcc(recordAcc);
        record.setRecordScore(recordScore);
        recordService.addRecord(record);
        return "redirect:/exam/toExam";
    }
    /**
     * 考试后台
     * */
    //查看所有考试安排后台
    @RequestMapping("/getAllExam")
    public String getAllExam(Model model){
        List<Exam> Exams = examService.getAllS();
        model.addAttribute("Exams",Exams);
        return "exam/backexamlist";
    }

    //去往考试添加页面
    @RequestMapping("/toAddExam")
    public String toAddExam(Model model){
        List<Paper> papers = paperService.getAll();
        model.addAttribute("papers",papers);
        return "exam/AddExam";
    }
    //添加操作
    @RequestMapping("/addExam")
    public String addExam(Exam exam, String examBegins,String examEnds) throws ParseException {
        String t1 = examBegins.replace("T", " ");
        String t2 = examEnds.replace("T", " ");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Date begin = sdf.parse(t1);
        Date end = sdf.parse(t2);
        exam.setExamBegin(begin);
        exam.setExamEnd(end);
        examService.AddExam(exam);
        return "redirect:/exam/getAllExam";
    }
    @RequestMapping("/deleteExam/{id}")
    public String toEditExam(@PathVariable ("id") Integer id,Model model){
        examService.deleteById(id);
        return "redirect:/exam/getAllExam";
    }
}

 

java毕业设计之基于springboot题库管理系统源码含论文mysql404【包调试运行 指导】

 

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

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

相关文章

【Bio】基础生物学 - 蛋白质 protein

文章目录1. 蛋白质Ref1. 蛋白质 蛋白质是生命的物质基础&#xff0c;是有机大分子&#xff0c;是构成细胞的基本有机物&#xff0c;是生命活动的主要承担者。没有蛋白质就没有生命。 蛋白质的基本组成单位是 氨基酸 (amino acid)\blue{\text{氨基酸 (amino acid)}}氨基酸 (am…

【C++】树?堆?怎么实现?

新的一周过去了&#xff0c;大家有没有对上星期练习的题目更加熟练呢&#xff1f; 上星期和上上星期我们主要学习了顺序表&#xff0c;链表&#xff0c;和用这俩都能实现的栈和队列 那么今天我们看看堆又是什么结构 目录 1.树 介绍 2.堆 介绍 3.堆的实现 1.树の介绍 不就是树…

cartopy绘制中国降雨地图

常用的地图可视化的编程工具有 MATLAB、IDL、R、GMT、NCL 等。相比于ArcGIS、QGIS和ArcGISpro用鼠标点来点去&#xff0c;编程绘图也是有很大的优点的&#xff0c;方便&#xff0c;可批量&#xff0c;美观。 大气科学和气象的朋友们一直使用的应该是 NCL&#xff0c;易用性不错…

Windows 编写自动复制备份、删除文件定时任务脚本

目录 一、backup.bat 脚本内容如下&#xff1a; 二、脚本内容解析 1.自动生成当天日期的目录 2. 删除前 n 天的文件 forfile 命令参数说明&#xff1a; 3.复制文件到指定目录 robocopy 命令参数说明&#xff1a; 结论&#xff1a; 三、设置定时任务 1. 打开 控制面板…

【数据结构】谈谈ArrayList和LinkedList的区别

&#xff08;此图源于比特高博&#xff09; 上图简洁明了的列出了二者的不同点 下面咱们详细聊聊具体的 要问的是区别&#xff0c;问不同点&#xff0c;那就得从二者共有的但是不同的点来讨论 1.底层实现上&#xff1a;ArrayList底层是顺序表&#xff0c;采用数组结构&…

引入DDP技术:英特尔网卡让数据处理更高效

英特尔网卡引入DDP技术后&#xff0c;提高了云和NFV部署的数据包处理效率&#xff0c;按需重配置报文处理引擎&#xff0c;让数据处理更高效 ◆可编程报文处理流水线 ◆按需优化工作负载 ◆无需重启服务器 ◆设备使用更高效 ◆无缝启用新服务 Intel Ethernet 700系列产品…

谷粒商城项目总结(一)-基础篇

一、项目简介 本项目适合人群&#xff1a;学过ssm是必须的。项目里有mybatis-plus和springcloud的内容&#xff0c;你可以用本项目来做实践&#xff0c;也可以利用本项目初识cloud&#xff0c;但最好还是对微服务有一定了解。 下好了vargant&#xff0c;如果安装centos7很慢&…

是什么让 NFT 项目成为“蓝筹”?

Nov. 2022, Vincy Data Source: Footprint Analytics - Bluechip Collection 在 NFT 这样一个不稳定和新兴的行业中&#xff0c;要赋予项目为 "蓝筹 " 地位是很难的。然而&#xff0c;不少的 NFT 项目宣称自己是蓝筹项目&#xff0c;但它们是吗&#xff1f; Foot…

从零开始配置vim(29)——DAP 配置

首先给大家说一声抱歉&#xff0c;前段时间一直在忙换工作的事&#xff0c;包括但不限于交接、背面试题准备面试。好在最终找到了工作&#xff0c;也顺利入职了。期间也有朋友在催更&#xff0c;在这里我对关注本系列的朋友表示感谢。多的就不说了&#xff0c;我们正式进入vim …

【案例 5-1】 模拟订单号生成

【案例介绍】 1.任务描述 编写一个程序&#xff0c;模拟订单系统中订单号的生成。例如给定一个包括年月日以及毫秒值的 数组 arr{2019,0504,1101},将其拼接成字符串 s:[201905041101]。要求使用 String 类常用方 法来实现字符串的拼接。 2.运行结果 运行结果如图 5-1 所示 图…

【SRE】Linux加入AD域控

老牌企业一般因为安全要求或者历史遗留要求&#xff0c;会要求服务器加入AD域控 RHEL/CentOS/Ubuntu 加入 Windows ldap 域控 网上有各种各样的方法&#xff0c;很多复杂且模糊&#xff0c;操作到一大半发现没法推进&#xff0c;这个是亲测最好用的办法 使用pbis-open使Linux服…

关于Ubuntu ssh远程连接报错和无法root登录的解决方法

一、使用远程工具连接Ubuntu提示报错 MobaXterm v22.0 版本直接可以远程连接上&#xff08;前提是sshd服务是开启的状态&#xff09; 注意&#xff1a;须使用最新版本或较高版本的ssh远程连接工具&#xff0c;进行ssh连接&#xff1b;若使用较低版本的ssh远程连接工具&#xf…

MySQL产生死锁原因

阅读目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍 MySQL 有三种锁的级别&#xff1a;页级、表级、行级 1 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c…

正则表达式(常用最新版)

密码 【1】密码必须为包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在6-10之间。 /^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{6,10}$/ 【2】密码必须为包含大小写字母和数字的组合&#xff0c;可以使用特殊字符&#xff0c;长度在6-10之间。 /^(?.*[a-z]…

【快速上手系列】百度富文本编辑器的快速上手和简单使用

【快速上手系列】百度富文本编辑器的快速上手和简单使用 使用步骤 1、首先要把demo下载下来 demo链接&#xff1a; (18条消息) 百度富文本编辑器demo-Javascript文档类资源-CSDN文库 index.html&#xff1a;demo中的测试页面&#xff0c;可以看到很多方法使用 2、新建一个we…

【freeRTOS】操作系统之二-队列

在任何RTOS中&#xff0c;都具有一个重要的通信机制----消息队列。 ​ 队列是任务间通信的主要形式。**它们可用于在任务之间、中断和任务之间发送消息。**在大多数情况下&#xff0c;它们被用作线程安全的FIFO(先进先出)缓冲区&#xff0c;新数据被发送到队列的后面&#xff…

OpenCV图像处理——傅里叶变换

总目录 图像处理总目录←点击这里 十三、傅里叶变换 13.1、原理 我们生活在时间的世界中&#xff0c;早上7:00起来吃早饭&#xff0c;8:00去挤地铁&#xff0c;9:00开始上班。。。 以时间为参照就是时域分析。在频域中一切都是静止的 对傅里叶变换写的很好的一篇文章→ h…

【C++】队列来喽,真的很简单的

我们经历了那么多练习和顺序表&#xff0c;链表&#xff0c;栈的大风大浪&#xff0c;小小一个队列可以说简单至极了 练习&#xff0c;以及顺序表之类的文章都在我的主页哦&#xff0c;请认真学习之后再看本文 目录 1.队列的结构 2.实现 3.栈和队列的相互实现 1.队列的结构 …

Postgresql源码(88)column definition list语义解析流程分析

0 总结 如果调用函数时同时满足以下几种情况 在from后面。返回值为RECORD&#xff08;或者是anyelement表示的RECORD&#xff09;&#xff08;anyelement的实际类型由入参决定&#xff0c;入参是RECORD&#xff0c;返回就是RECORD&#xff09;。返回值被判定为TYPEFUNC_RECOR…

11.18 - 每日一题 - 408

每日一句&#xff1a;不如就利用孤单一人的时间&#xff0c;使自己变得更优秀&#xff0c;给来的人一个惊喜&#xff0c;也给自己一个好的交代 数据结构 1 当一棵有n个结点的二叉树按层次从上到下&#xff0c;同层次从左到右将结点中的数据存放在一维数组A[1…n&#xff3d;中…