当前位置: 首页 > 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;则文件列表不显示…...

LVDS协议解析:从差分信号原理到高速接口设计实战

1. LVDS协议基础&#xff1a;差分信号原理与硬件特性 第一次接触LVDS时&#xff0c;我被它那两根看似"镜像对称"的信号线搞糊涂了——为什么传输一个信号需要两根线&#xff1f;后来在调试一块高速图像采集卡时&#xff0c;当其他接口都受到电机干扰出现雪花噪点&…...

如何在电脑上完美运行3DS游戏:Citra模拟器5步安装指南

如何在电脑上完美运行3DS游戏&#xff1a;Citra模拟器5步安装指南 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 想要在电脑上重温任天堂3DS的经典游戏吗&#xff1f;Citra模拟器作为目前最优秀的开源3DS模拟…...

5个核心功能:Winhance中文版如何重塑你的Windows体验

5个核心功能&#xff1a;Winhance中文版如何重塑你的Windows体验 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_…...

书匠策AI毕业论文功能全揭秘:一个工具,把你从选题焦虑里捞出来!

各位正在和毕业论文死磕的同学们&#xff0c;大家好&#xff01; 今天这篇内容&#xff0c;我不讲大道理&#xff0c;就给你们安利一个我最近反复在用的工具——书匠策AI&#xff08;官网&#xff1a; 官网直达&#xff1a;www.shujiangce.com。如果你现在正处于"选题没…...

Transit Map:让公共交通可视化变得简单有趣的工具

Transit Map&#xff1a;让公共交通可视化变得简单有趣的工具 【免费下载链接】transit-map The server and client used in transit map simulations like swisstrains.ch 项目地址: https://gitcode.com/gh_mirrors/tr/transit-map 还在为复杂的交通网络数据可视化而烦…...

Cursor Free VIP:解锁AI编程助手完整功能的技术解决方案

Cursor Free VIP&#xff1a;解锁AI编程助手完整功能的技术解决方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…...

3个核心优势:Open-Meteo如何用开源技术重构天气API的经济学模型

3个核心优势&#xff1a;Open-Meteo如何用开源技术重构天气API的经济学模型 【免费下载链接】open-meteo Free Weather Forecast API for non-commercial use 项目地址: https://gitcode.com/GitHub_Trending/op/open-meteo 在传统天气数据服务领域&#xff0c;开发者往…...

PHP 的多态机制的庖丁解牛

它的本质是&#xff1a;多态 (Polymorphism) 允许不同的类对象&#xff0c;在响应 相同的方法调用 (Method Call) 时&#xff0c;表现出 不同的行为 (Behavior)。它基于 继承 (Inheritance) 或 接口实现 (Interface Implementation)&#xff0c;通过 父类/接口引用 指向 子类/实…...

如何用GenshinPlayerQuery深度分析原神账号:3个维度掌握角色成长与战斗表现

如何用GenshinPlayerQuery深度分析原神账号&#xff1a;3个维度掌握角色成长与战斗表现 【免费下载链接】GenshinPlayerQuery 根据原神uid查询玩家信息(基础数据、角色&装备、深境螺旋战绩等) 项目地址: https://gitcode.com/gh_mirrors/ge/GenshinPlayerQuery 你是…...

Taotoken用量看板如何帮助团队管理大模型API成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板如何帮助团队管理大模型API成本 作为团队的技术负责人&#xff0c;在引入大模型能力支持多个项目时&#xff0c;一…...