基于Springboot vue前后端分离在线培训考试系统源码

news2024/11/26 12:26:34

# 云帆培训考试系统 

管理账号:admin/admin 学员账号:person/person   


# 介绍
一款多角色在线培训考试系统,系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能,考试流程完善。


# 技术栈
SpringBoot / Redis / Shiro / Vue / MySQL

# 产品功能

## 系统完善:完善的权限控制和用户系统
权限控制:基于Shiro和JWT开发的权限控制功能。    
用户系统:用户管理、部门管理、角色管理等。    

## 多角色:多角色支持    
考试端:学生学员角色、支持在线考试、查看分数、训练错题。    
管理端:题库管理、试题管理、考试管理、用户部门管理、查看考试情况等等。    

## 定员考试:考试权限定义    
完全公开:任何人员都可以参与考试。    
指定部门:只有选中部门的人员才可以看到考试。    

## 多题型:常用题型支持    
支持题型:单选题、多选题、判断题。    
难易程度:普通、困难。    

## 便捷组卷:题库组卷    
题库组卷:指定题库、分数、数量;题目、选项随机排序、杜绝作弊    
 

package com.yf.exam.modules.exam.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yf.exam.core.api.ApiRest;
import com.yf.exam.core.api.controller.BaseController;
import com.yf.exam.core.api.dto.BaseIdReqDTO;
import com.yf.exam.core.api.dto.BaseIdsReqDTO;
import com.yf.exam.core.api.dto.BaseStateReqDTO;
import com.yf.exam.core.api.dto.PagingReqDTO;
import com.yf.exam.modules.exam.dto.ExamDTO;
import com.yf.exam.modules.exam.dto.request.ExamSaveReqDTO;
import com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO;
import com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO;
import com.yf.exam.modules.exam.entity.Exam;
import com.yf.exam.modules.exam.service.ExamService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
* <p>
* 考试控制器
* </p>
*
* @author 聪明笨狗
* @since 2023-02-25 16:18
*/
@Api(tags={"考试"})
@RestController
@RequestMapping("/exam/api/exam/exam")
public class ExamController extends BaseController {

    @Autowired
    private ExamService baseService;

    /**
    * 添加或修改
    * @param reqDTO
    * @return
    */
    @ApiOperation(value = "添加或修改")
    @RequestMapping(value = "/save", method = { RequestMethod.POST})
    public ApiRest save(@RequestBody ExamSaveReqDTO reqDTO) {
        //复制参数
        baseService.save(reqDTO);
        return super.success();
    }

    /**
    * 批量删除
    * @param reqDTO
    * @return
    */
    @ApiOperation(value = "批量删除")
    @RequestMapping(value = "/delete", method = { RequestMethod.POST})
    public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) {
        //根据ID删除
        baseService.removeByIds(reqDTO.getIds());
        return super.success();
    }

    /**
    * 查找详情
    * @param reqDTO
    * @return
    */
    @ApiOperation(value = "查找详情")
    @RequestMapping(value = "/detail", method = { RequestMethod.POST})
    public ApiRest<ExamDTO> find(@RequestBody BaseIdReqDTO reqDTO) {
        ExamSaveReqDTO dto = baseService.findDetail(reqDTO.getId());
        return super.success(dto);
    }

    /**
     * 查找详情
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "查找详情")
    @RequestMapping(value = "/state", method = { RequestMethod.POST})
    public ApiRest state(@RequestBody BaseStateReqDTO reqDTO) {

        QueryWrapper<Exam> wrapper = new QueryWrapper<>();
        wrapper.lambda().in(Exam::getId, reqDTO.getIds());
        Exam exam = new Exam();
        exam.setState(reqDTO.getState());
        exam.setUpdateTime(new Date());

        baseService.update(exam, wrapper);
        return super.success();
    }


    /**
     * 分页查找
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "考试视角")
    @RequestMapping(value = "/online-paging", method = { RequestMethod.POST})
    public ApiRest<IPage<ExamOnlineRespDTO>> myPaging(@RequestBody PagingReqDTO<ExamDTO> reqDTO) {

        //分页查询并转换
        IPage<ExamOnlineRespDTO> page = baseService.onlinePaging(reqDTO);
        return super.success(page);
    }

    /**
    * 分页查找
    * @param reqDTO
    * @return
    */
    @ApiOperation(value = "分页查找")
    @RequestMapping(value = "/paging", method = { RequestMethod.POST})
    public ApiRest<IPage<ExamDTO>> paging(@RequestBody PagingReqDTO<ExamDTO> reqDTO) {

        //分页查询并转换
        IPage<ExamDTO> page = baseService.paging(reqDTO);

        return super.success(page);
    }


    /**
     * 分页查找
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "待阅试卷")
    @RequestMapping(value = "/review-paging", method = { RequestMethod.POST})
    public ApiRest<IPage<ExamReviewRespDTO>> reviewPaging(@RequestBody PagingReqDTO<ExamDTO> reqDTO) {

        //分页查询并转换
        IPage<ExamReviewRespDTO> page = baseService.reviewPaging(reqDTO);

        return super.success(page);
    }


}

表名:el_exam
说明:考试信息
参数 类型 描述 ⾮空
id varchar(64) ID 否
title varchar(255) 考试名称 否
content varchar(255) 考试描述 否
open_type int(11) 1公开2部⻔3定员 否
join_type int(11) 组题⽅式1题库,2指定 否
level int(11) 难度:0不限,1普通,2较难 否
state int(11) 考试状态 否
time_limit tinyint(3) 是否限时 否
start_time datetime 开始时间 是
end_time datetime 结束时间 是
create_time datetime 创建时间 是
update_time datetime 更新时间 是
total_score int(11) 总分数 否
total_time int(11) 总时⻓(分钟) 否
qualify_score int(11) 及格分数 否
表名:el_exam_depart
说明:考试部⻔
参数 类型 描述 ⾮空
id varchar(32) ID 否
exam_id varchar(32) 考试ID 否
depart_id varchar(32) 部⻔ID 否
表名:el_exam_repo
说明:考试题库
参数 类型 描述 ⾮空
id varchar(64) ID 否
exam_id varchar(64) 考试ID 否
repo_id varchar(64) 题库ID 否
radio_count int(11) 单选题数量 否
radio_score int(11) 单选题分数 否
multi_count int(11) 多选题数量 否
multi_score int(11) 多选题分数 否
judge_count int(11) 判断题数量 否
judge_score int(11) 判断题分数 否
saq_count int(11) 简答题数量 否
saq_score int(11) 简答题分数 否
表名:el_paper
表名:el_paper
说明:试卷
参数 类型 描述 ⾮空
id varchar(64) 试卷ID 否
user_id varchar(64) ⽤户ID 否
depart_id varchar(32) 部⻔ID 否
exam_id varchar(64) 规则ID 否
title varchar(64) 考试标题 否
total_time int(11) 考试时⻓ 否
user_time int(11) ⽤户时⻓ 否
total_score int(11) 试卷总分 否
qualify_score int(11) 及格分 否
obj_score int(11) 客观分 否
subj_score int(11) 主观分 否
user_score int(11) ⽤户得分 否
has_saq tinyint(3) 是否包含简答题 否
state int(11) 试卷状态 否
create_time datetime 创建时间 是
update_time datetime 更新时间 是
limit_time datetime 截⽌时间 是
表名:el_paper_qu
说明:试卷考题
参数 类型 描述 ⾮空
id varchar(64) ID 否
paper_id varchar(64) 试卷ID 否
qu_id varchar(64) 题⽬ID 否
qu_type int(11) 题⽬类型 否
answered tinyint(3) 是否已答 否
answer varchar(5000) 主观答案 否
sort int(11) 问题排序 否
score int(11) 单题分分值 否
actual_score int(11) 实际得分(主观题) 否
is_right tinyint(3) 是否答对 否
表名:el_paper_qu_answer
说明:试卷考题备选答案
参数 类型 描述 ⾮空
id varchar(64) ⾃增ID 否
id varchar(64) ⾃增ID 否
paper_id varchar(64) 试卷ID 否
answer_id varchar(32) 回答项ID 否
qu_id varchar(32) 题⽬ID 否
is_right tinyint(11) 是否正确项 否
checked tinyint(11) 是否选中 否
sort int(11) 排序 否
abc varchar(64) 选项标签 否
表名:el_qu
说明:问题题⽬
参数 类型 描述 ⾮空
id varchar(64) 题⽬ID 否
qu_type int(11) 题⽬类型 否
level int(11) 1普通,2较难 否
image varchar(500) 题⽬图⽚ 否
content varchar(2000) 题⽬内容 否
create_time datetime 创建时间 否
update_time datetime 更新时间 否
remark varchar(255) 题⽬备注 否
analysis varchar(2000) 整题解析 否
表名:el_qu_answer
表名:el_qu_answer
说明:候选答案
参数 类型 描述 ⾮空
id varchar(64) 答案ID 否
qu_id varchar(64) 问题ID 否
is_right tinyint(3) 是否正确 否
image varchar(500) 选项图⽚ 否
content varchar(5000) 答案内容 否
analysis varchar(5000) 答案分析 否
表名:el_qu_repo
说明:试题题库
参数 类型 描述 ⾮空
id varchar(64) ⽆ 否
qu_id varchar(64) 试题 否
repo_id varchar(64) 归属题库 否
qu_type int(11) 题⽬类型 否
sort int(11) 排序 否
表名:el_repo
说明:题库
参数 类型 描述 ⾮空
id varchar(64) 题库ID 否
code varchar(255) 题库编号 否
title varchar(255) 题库名称 否
radio_count int(11) 单选数量 否
multi_count int(11) 多选数量 否
judge_count int(11) 判断数量 否
remark varchar(255) 题库备注 否
create_time datetime 创建时间 是
update_time datetime 更新时间 是

 

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

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

相关文章

C++:运算符重载与类的赋值运算符重载函数

目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数&#xff1a;重载函数(赋值运算符重载) 1.自定义重载函数 代码段2 2.编译器默认生成的重载函数 四.前置(--)和后置…

Facebook小组与主页:哪个更适合SEO?

在 SEO中&#xff0c;对于优化人员来说有两种策略&#xff1a;一种是在 Facebook组上投放广告&#xff1b;另一种则是在主页上投放广告。那么&#xff0c;这两种策略哪种更好呢&#xff1f;对于 SEO来说又有什么影响呢&#xff1f;如果你已经在 Facebook上进行了一些优化工作&a…

Python---文件操作

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 文件操作思维导图前言文件是什么文件路径文件操…

SpringBoot基础回顾:场景启动器

上一章我们回顾了 SpringBoot 的自动装配&#xff0c;以及承载自动装配的核心——自动配置类。自动配置类的定义位置通常在每个场景的 jar 包中&#xff0c;配置 spring.factories 文件中 EnableAutoConfiguration 的位置通常在相应的 autoconfigure jar 包下。本章会着重回顾和…

SpringMVC简介

SpringMVC简介什么是MVC?MVC的工作流程什么是SpringMVC&#xff1f;HelloWorld创建maven工程配置web.xml创建请求控制器配置springMVC.xml配置文件什么是MVC? MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的javaBean,作用是是处理数…

恶意代码分析实战 9 隐蔽的恶意代码启动

9.1 Lab12-1 分析 查看程序的导入函数。 通过这几个函数&#xff0c;可以推断出是远程线程注入。 使用ProMon检测&#xff0c;并没有看到什么有用的信息。 使用Proexproer检查。 也没有什么有用的信息。 拖入IDA中分析一下。 将这几个字符串重命名&#xff0c;便于识别。 …

【MyBatis】| MyBatis使用⼩技巧

目录 一&#xff1a;MyBatis使用⼩技巧 1. #{}和${} 2. typeAliases 3. mappers 4. IDEA配置⽂件模板 5. 插⼊数据时获取⾃动⽣成的主键 一&#xff1a;MyBatis使用⼩技巧 1. #{}和${} #{}&#xff1a;先编译sql语句&#xff0c;再给占位符传值&#xff0c;底层是Prepar…

【C语言进阶】一文带你学会C语言文件操作

前言 我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删除数据&#xff0c;此时数据是存放在内存中&#xff0c;当程序退出的时候&#xff0c;通讯录中的数据自然就不存在了&#xff0c;等下次运行通讯录…

Python---自动生成二维码

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 自动生成二维码 二维码的本质上&#xff0c;就…

人工智能学习06--pytorch05--torchvision中的数据集使用DataLoader的使用

torchvision中的数据集使用 test_set的class属性 把数据集每一部分都变成tensor类型 现在输出的就是tensor数据类型了 DataLoader的使用 batch_size 一摞牌中&#xff0c;每次抓几张shuffle 打乱&#xff0c;第二次打牌前&#xff0c;牌的顺序要跟第一次不一样&#xff0…

【JavaSE】一文看懂构造器/构造方法(Cunstructor)

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;Java冒险记【从小白到大佬之路】 ✈往期博文回顾: 【JavaSE】保姆级教程|1万字10张图学会类与对象–建议收藏 &#x1f575;️‍♂️近期目标…

CSS边框、边距、轮廓(边框宽度/颜色/各边/简写属性/圆角边框/内外边距/高度宽度/框模型/轮廓宽度/颜色/属性/偏移)——万字长文|一文搞懂

目录 CSS边框 CSS 边框属性 CSS 边框样式 实例 CSS 边框宽度 实例 特定边的宽度 实例 CSS 边框颜色 实例 特定边框的颜色 实例 HEX 值 实例 RGB 值 实例 HSL 值 实例 CSS 边框 - 单独的边 实例 不同的边框样式 实例 它的工作原理是这样的&#xff1a; …

ROS学习寄录1

1 创建ROS工作空间 1.1 创建工作空间 &#xff08;1&#xff09;创建工作空间 mkdir catkin_ws &#xff08;2&#xff09;进入catkin_ws文件夹&#xff0c;然后创建一个src文件夹 cd catkin_ws mkdir src &#xff08;3&#xff09;进入src文件夹&#xff0c;生成CMakeL…

「自控原理」4.2 根轨迹法分析与校正

本节介绍利用根轨迹法分析系统性能发热方法 本节介绍根轨迹校正 文章目录利用根轨迹分析系统性能主导极点法增加零极点对系统的影响根轨迹校正串连超前校正原理与步骤超前校正例题串连滞后校正附加开环偶极子的作用原理与步骤滞后校正例题利用根轨迹分析系统性能 利用根轨迹分…

Oracle cloud vps实例配置访问

Oracle cloud vps实例配置访问创建一个免费配置的实例&#xff0c;并配置访问创建实例时&#xff0c;系统映像选择创建实例时候的ssh密钥配置子网&#xff0c;打开22端口使用工具登录服务器配置多个公钥&#xff0c;支持多个ssh私钥来登录登录vps实例修改登录用户和身份验证方式…

【接口】接口超时原因分析

接口超时的原因&#xff1a; 一、网络抖动 有可能是你的网络出现抖动、网页请求API接口、接口返回数据给网页丢包了。 二、被带宽占满 用户量暴增&#xff0c;服务器网络带宽被占满。 服务器带宽&#xff1a;一定时间内传输数据的大小&#xff0c;如&#xff1a;1s传输10M…

剑指Offer 第1天

第 1 天 栈与队列&#xff08;简单&#xff09; 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() {} void appendTail(int value) { s1.push(value); } int deleteHead() { while(!s1.empty()) { …

【Git :分布式版本控制工具】

【Git &#xff1a;分布式版本控制工具】 了解 Git 基本概念 能够概述 Git 工作流程 能够使用 Git 常用命令 熟悉 Git 代码托管服务 能够使用 IDEA 操作 Git 一、 概述 1. 开发中的实际场景 备份代码还原协同开发追溯问题代码的编写人和编写时间 2. 版本控制器的方式 集中式…

【数据结构】6.6 图的应用

文章目录生成树及其构造生成树的特点无向图的生成树6.6.1 最小生成树最小生成树及其典型应用MST性质构造最小生成树1. Prim(普里姆)算法2. Kruskal(克鲁斯卡尔)算法两种算法比较6.6.2 最短路径最短路径问题1. Dijkstra(迪杰斯特拉)算法迪杰斯特拉算法步骤2. Floyd(弗洛伊德)算法…

从零搭建一个组件库(二)创建代码规范

文章目录前言集成eslint1.安装2.替换默认解析器3.创建.eslintrc.yml配置文件4.创建忽略文件.eslintignore集成 prettier1.安装2.创建配置文件.prettierrc集成# commitizen1.安装2.修改package.json3.测试className的BEM规范1.安装2.BEM概述3.创建hooks函数4.使用hooks函数5.封装…