当前位置: 首页 > news >正文

SpringBoot+Vue轻松实现考试管理系统

简介

本系统基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台,提供多租户、权限管理、考试、练习、在线学习等功能。主要功能为在线考试、练习、刷题,在线学习。课程内容支持图文、视频,考试类型支持考试、练习、问卷。

源码下载

网盘链接 密码8418

在这里插入图片描述
在这里插入图片描述

题型支持单选题、多选题、判断题、简答题、视频、语音,题目内容支持图文、视频等。支持题库、刷题功能。

本版本为 Spring Boot 版本,没有太多中间件依赖,使用、部署都非常方便,并且持续更新维护。

架构设计

在这里插入图片描述

功能概述

在这里插入图片描述

项目分 web 前台、后台管理、小程序三部分,前台、小程序主要提供考试功能,后台提供基础管理、考试管理功能。

web 前台主要功能:提供在线考试、课程学习、练习等功能。

后台主要功能:系统管理(单位管理、用户管理、部门管理、角色管理、菜单管理、操作日志、代码生成),考务管理(课程管理、考试管理、题库管理、成绩管理)。

部署指南

1. 新建数据库

我们可以使用 navicat 新建数据库,数据库名可以自定义,字符集和排序规则是确定的。

在这里插入图片描述

2. 运行 SQL 文件

我们导入源码中 init.sql 新建相关表,初始化数据。
在这里插入图片描述

3. 修改配置文件

我们把两个 yml 配置文件复制到 sg-user-service 目录中的 resource 目录中,按需进行修改,比如 MySQL 数据库用户名密码,redis 密码等。

4. 编译 jar 包

我们要检查电脑上是否安装 gradle,运行以下指令测试。

>gradle -v
------------------------------------------------------------
Gradle 8.5
------------------------------------------------------------Build time:   2023-11-29 14:08:57 UTC        
Revision:     28aca86a7180baa17117e0e5ba01d8ea9feca598Kotlin:       1.9.20
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          17.0.9 (Oracle Corporation 17.0.9+11-LTS-jvmci-23.0-b21)
OS:           Windows 11 10.0 amd64

我们直接在根目录下运行打包指令,并跳过测试。

gradle build -x test

生成的 jar 包在 build/libs 目录下,运行 java -jar xxx.jar,后端的部署就完成了。

5. 运行前端

我们再进入 frontend/sg-exam-app 目录,运行 npm install 下载依赖,下载完成后运行npm run dev 启动运行。

后台管理项目存放在 frontend/sg-exam-app-admin 目录,运行 pnpm install 下载依赖,下载完成后运行npm run dev 启动运行。

前端部署完成。

代码讲解

下面这段代码是用来展示后台首页数据,其中 userVo 用来查询用户数量,dto 返回给客户端做数据展示功能。

首页数据

/*** 获取管控台首页数据*/@GetMapping@Operation(summary = "后台首页数据展示", description = "后台首页数据展示")public R<DashboardDto> dashboard() {String tenantCode = SysUtil.getTenantCode();DashboardDto dto = new DashboardDto();// 查询用户数量UserVo userVo = new UserVo();userVo.setTenantCode(tenantCode);dto.setOnlineUserNumber(userService.userCount(userVo).toString());// 租户数量dto.setTenantCount(tenantService.tenantCount().toString());// 查询考试数量ExaminationDashboardDto dashboardDto = examRecordService.findExamDashboardData(tenantCode);if (dashboardDto != null) {if (dashboardDto.getExaminationCount() != null) {dto.setExaminationNumber(dashboardDto.getExaminationCount().toString());}if (dashboardDto.getExamUserCount() != null) {dto.setExamUserNumber(dashboardDto.getExamUserCount().toString());}if (dashboardDto.getExaminationRecordCount() != null) {dto.setExaminationRecordNumber(dashboardDto.getExaminationRecordCount().toString());}}return R.success(dto);}

考试管理

这段代码是一个使用Java语言和Spring框架编写的RESTful API控制器。它定义了一系列的HTTP GET和POST请求方法,用于处理与考试信息管理相关的业务逻辑。下面是对这段代码的详细解释:

  1. @Slf4j:这是一个日志注解,用于在控制类中注入一个日志对象,方便记录日志。
  2. @AllArgsConstructor:这是一个Lombok注解,用于自动生成所有字段的构造函数。
  3. @Tag(name = "考试信息管理"):这是一个自定义注解,用于标记这个控制器属于哪个功能模块。
  4. @RestController:表示这是一个RESTful风格的控制器,它将返回JSON格式的数据。

接下来是部分方法的解释:

  • canStart:这个方法通过GET请求方式,提供查询是否能开始考试的功能。它接受一个Long类型的参数id,表示考试的ID。方法内部会查询该ID对应的考试信息,并检查考试是否已经开始,以及是否有结束时间限制。
  • examination:这个方法通过GET请求方式,提供根据考试ID获取考试信息的功能。
  • detail:这个方法通过GET请求方式,提供根据考试ID获取考试详细信息的功能。
  • getMembers:这个方法通过GET请求方式,提供根据考试ID获取考试成员ID的功能。
  • anonymousUserGet:这个方法通过GET请求方式,提供根据考试ID获取考试信息的功能,但是这个方法专门为匿名用户设计。
@Slf4j
@AllArgsConstructor
@Tag(name = "考试信息管理")
@RestController
@RequestMapping("/v1/examination")
public class ExaminationController extends BaseController {private final IExaminationService examinationService;private final IExamPermissionService examPermissionService;@GetMapping("canStart")@Operation(summary = "查询是否能开始考试", description = "查询是否能开始考试")public R<Boolean> canStart(@RequestParam Long id) {boolean canStart = false;Examination examination = examinationService.get(id);if (examination != null) {if (examination.getStartTime() != null && examination.getEndTime() != null) {long currentMillis = System.currentTimeMillis();canStart = ((currentMillis > examination.getStartTime().getTime()) && (examination.getEndTime().getTime() > currentMillis));} else {// 没有限制考试时间canStart = true;}}return R.success(canStart);}@GetMapping("/{id}")@Operation(summary = "获取考试信息", description = "根据考试 ID 获取考试信息")public R<Examination> examination(@PathVariable Long id) {return R.success(examinationService.get(id));}@GetMapping("/{id}/detail")@Operation(summary = "获取考试详细信息", description = "根据考试 id 获取考试详细信息")public R<ExaminationDto> detail(@PathVariable Long id) {return R.success(examinationService.getDetail(id));}@GetMapping("/{id}/getMembers")@Operation(summary = "获取考试成员 ID", description = "根据考试 ID 获取考试成员 ID")public R<MemberDto> getMembers(@PathVariable Long id) {return R.success(examPermissionService.getMembers(ExamConstant.PERMISSION_TYPE_EXAM, id));}@GetMapping("/anonymousUser/{id}")@Operation(summary = "获取考试信息", description = "根据考试 id 获取考试详细信息")public R<Examination> anonymousUserGet(@PathVariable Long id) {return R.success(examinationService.get(id));}@GetMapping("examinationList")@Operation(summary = "获取考试列表")public R<PageInfo<ExaminationDto>> examinationList(@RequestParam Map<String, Object> condition,@RequestParam(value = PAGE, required = false, defaultValue = PAGE_DEFAULT) int pageNum,@RequestParam(value = PAGE_SIZE, required = false, defaultValue = PAGE_SIZE_DEFAULT) int pageSize) {return R.success(examinationService.examinationList(condition, pageNum, pageSize));}@GetMapping("userExaminationList")@Operation(summary = "获取用户有权限的考试列表")public R<PageInfo<ExaminationDto>> userExaminationList(@RequestParam Map<String, Object> condition,@RequestParam(value = PAGE, required = false, defaultValue = PAGE_DEFAULT) int pageNum,@RequestParam(value = PAGE_SIZE, required = false, defaultValue = PAGE_SIZE_DEFAULT) int pageSize) {return R.success(examinationService.userExaminationList(condition, pageNum, pageSize));}@RequestMapping("subjectList")@Operation(summary = "获取题目列表")public R<PageInfo<SubjectDto>> subjectList(@RequestParam Map<String, Object> condition,@RequestParam(value = PAGE, required = false, defaultValue = PAGE_DEFAULT) int pageNum,@RequestParam(value = PAGE_SIZE, required = false, defaultValue = PAGE_SIZE_DEFAULT) int pageSize,SubjectDto subjectDto) {return R.success(examinationService.findSubjectPageById(subjectDto, condition, pageNum, pageSize));}@PostMapping@Operation(summary = "创建考试", description = "创建考试")@SgLog(value = "创建考试", operationType = OperationType.INSERT)public R<Boolean> add(@RequestBody @Valid ExaminationDto examinationDto) {examinationDto.setCommonValue();return R.success(examinationService.insertExamination(examinationDto) > 0);}@PutMapping("{id}")@Operation(summary = "更新考试信息", description = "根据考试 ID 更新考试的基本信息")@SgLog(value = "更新考试", operationType = OperationType.UPDATE)public R<Boolean> update(@PathVariable Long id, @RequestBody @Valid ExaminationDto examinationDto) {examinationDto.setId(id);examinationDto.setCommonValue();return R.success(examinationService.updateExamination(examinationDto) > 0);}@DeleteMapping("{id}")@Operation(summary = "删除考试", description = "根据 ID 删除考试")@SgLog(value = "删除考试", operationType = OperationType.DELETE)public R<Boolean> delete(@PathVariable Long id) {Examination examination = examinationService.get(id);if (examination != null) {examination.setCommonValue();return R.success(examinationService.delete(examination) > 0);}return R.success(Boolean.FALSE);}@PostMapping("deleteAll")@Operation(summary = "批量删除考试", description = "根据考试 id 批量删除考试")@SgLog(value = "删除考试", operationType = OperationType.DELETE)public R<Boolean> deleteAll(@RequestBody Long[] ids) {return R.success(examinationService.deleteAll(ids) > 0);}@GetMapping("nexSubjectNo/{id}")@Operation(summary = "获取下一题的序号")public R<Integer> nexSubjectNo(@PathVariable Long id) {return R.success(examinationService.nextSubjectNo(id));}@PostMapping("batchAddSubjects/{id}")@Operation(summary = "批量添加题目")@SgLog(value = "批量添加题目", operationType = OperationType.INSERT)public R<Boolean> batchAddSubjects(@PathVariable Long id, @RequestBody List<SubjectDto> subjects) {return R.success(examinationService.batchAddSubjects(id, subjects));}@PostMapping("randomAddSubjects/{id}")@Operation(summary = "随机添加题目")@SgLog(value = "随机添加题目", operationType = OperationType.INSERT)public R<Boolean> randomAddSubjects(@PathVariable Long id, @RequestBody RandomSubjectDto params) {return R.success(examinationService.randomAddSubjects(id, params));}
}

相关文章:

SpringBoot+Vue轻松实现考试管理系统

简介 本系统基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台&#xff0c;提供多租户、权限管理、考试、练习、在线学习等功能。主要功能为在线考试、练习、刷题&#xff0c;在线学习。课程内容支持图文、视频&#xff0c;考试类型支持考试、练习、问卷。 源码下载 网…...

详解Keras:keras.preprocessing.image

keras.preprocessing.image Keras 库中的一个模块&#xff0c;用于处理和增强图像数据&#xff0c;它提供了一些实用的函数&#xff0c;如图像的加载、预处理、增强等。 常用函数 1、load_img 用于加载图像文件&#xff0c;并返回一个 NumPy 数组表示该图像 示例 from ker…...

来瞅瞅Java 11都有啥新特性

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff01;今天小黑要和咱们聊聊Java 11&#xff0c;这个在Java发展史上占有一席之地的版本。说起Java&#xff0c;咱们都知道&#xff0c;它是一门历史悠久又持续发展的编程语言。Java不仅因其“一次编写&#xff0c;到处…...

Copilot在IDEA中的应用:提升编码效率的得力助手

Copilot在IDEA中的应用&#xff1a;提升编码效率的得力助手 前言: 欢迎来到本篇博客&#xff0c;今天我们将深入探讨 GitHub Copilot 在 IntelliJ IDEA 中的应用。GitHub Copilot 是一款由 GitHub 与 OpenAI 共同开发的人工智能代码生成工具&#xff0c;它能够根据上下文提示…...

【Python】Excel不同sheet另存为不同CSV

我有一个excel&#xff0c;内有不同sheet&#xff0c;现在批量生成不通csv文件&#xff0c;并以sheet名命名&#xff0c;或根据sheet名调整命名。 # 读取新的Excel文件 df pd.read_excel(rD:\itm\data.xlsx, sheet_nameNone)# 遍历每个sheet&#xff0c;将其另存为不同的CSV文…...

软件测试|深入学习 Docker Logs

简介 Docker 是一种流行的容器化技术&#xff0c;它能够帮助用户将应用程序及其依赖项打包成一个可移植的容器。Docker logs 是 Docker 提供的用于管理容器日志的命令&#xff0c;本文将深入学习 Docker logs 的使用和管理&#xff0c;帮助用户更好地监测和解决容器问题。 Do…...

试除法求约数算法总结

知识概览 试除法求一个数的约数的时间复杂度是。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/871/ 题解 用试除法求约数&#xff0c;…...

[JavaWeb玩耍日记] 数据库

mysql版本&#xff1a;5.7.24 使用Navicat for MySQL辅助学习(2015年版)&#xff0c;这个在粘贴本博客的块引用内容时会有额外的不可见内容导致sql运行出问题&#xff0c;不过有影响的地方笔者已排除 目录 一.数据库创建 二.使用数据库与创建表 三.表内列的数据类型 四.修…...

rime中州韵小狼毫 inputShow lua Translator 输入字符透传翻译器

在 rime中州韵小狼毫 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator&#xff0c;并以 五笔・拼音 为例引用了该 translator&#xff0c;并且达到了预期的效果。 今天&#xff0c;我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translat…...

【RockChip | RV1126】学习与开发

【RockChip | RV1126】学习与开发 文章目录 【RockChip | RV1126】学习与开发1. 资料1. 资料 您好,这是关于A191型RV1126的资料包,请您及时接收哦~链接: https://pan.baidu.com/s/1FXWVxa27Q78nI78d2QKlBQ?pwd=j7mk 提取码: j7mk 若您在开发过程中遇到技术问题,需要帮助时:…...

copilot在pycharm的应用

Copilot在PyCharm中的应用 一、引言 随着人工智能技术的飞速发展&#xff0c;AI在编程领域的应用也越来越广泛。Copilot&#xff0c;作为一款由微软开发的AI编程助手&#xff0c;已经引起了广大开发者的关注。它利用深度学习技术&#xff0c;通过分析大量开源代码&#xff0c…...

HDU 2841:Visible Trees ← 容斥原理

【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid2841【题目描述】 There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is standing at (0,0) point. He wonders how many trees he can see. If two trees and Sherlock are in…...

分布式数据之复制(Replication)

1.简介 1.1简介——使用复制的目的 在分布式系统中&#xff0c;数据通常需要被分散在多台机器上&#xff0c;主要为了达到以下目的&#xff1a; 扩展性&#xff0c;数据量因读写负载巨大&#xff0c;一台机器无法承载&#xff0c;数据分散在多台机器 上可以有效地进行负载均衡…...

【多线程】

文章目录 一、线程与进程的概念&#xff1a;二、多线程实现三、线程锁四、线程数量的设置 一、线程与进程的概念&#xff1a; 简单理解 假设总共有3个孩子需要喂饭&#xff0c;孩子每吃一口饭需要咀嚼消化一下。 多线程方案&#xff1a; 雇佣1个保姆&#xff0c;在喂A孩子吃饭…...

基于Vue开发的一个仿京东电商购物平台系统(附源码下载)

电商购物平台项目 项目完整源码下载 基于Vue开发的一个仿京东电商购物平台系统 Build Setup # csdn下载该项目源码压缩包 解压重命名为sangpinghui_project# 进入项目目录 cd sangpinghui_project# 安装依赖 npm install# 建议不要直接使用 cnpm 安装以来&#xff0c;会有各…...

Nginx多ip部署多站点

目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置&#xff0c;使用 d…...

Unity SVN更新提交小工具

Unity SVN更新提交小工具 前言使用说明必要前提源码参数说明 感谢 前言 Unity开发时每次都要到文件夹中操作SVN&#xff0c;做了一个小工具能够在Editor中直接操作。 使用说明 必要前提 前提是要安装好SVN&#xff0c;在文件夹右键能够看到安装的SVN 源码 using System…...

听GPT 讲Rust源代码--compiler(19)

File: rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs 该文件&#xff08;rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs&#xff09;是Rust编译器针对MIPS架构上的Linux系统的目标描述文件。它的作用是定义了在这个目标上编译时的一些配置…...

redis单机部署

一、下载redis压缩包tar.gz 官网下载&#xff0c;现在一般用6.x以上版本 二、上传指定目录&#xff0c;解压缩 #假如上传到redis用户的家目录 cd /home/redis tar -zxvf redis-6.2.14.tar.gz 三、进入解压缩目录&#xff0c;进行编译 cd redis-6.2.14 make &&a…...

el-upload上传文件

需求&#xff1a;选中或拖拽文件后&#xff0c;使用http-request属性实现自动上传&#xff0c;并根据后端传回来的结果显示错误和控制fileList的显示&#xff0c;如果后端返回成功&#xff0c;则文件显示在文件列表处&#xff0c;如果后端返回失败&#xff0c;则文件列表不显示…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...