西安企业建站系统模板,常用的网络编程技术,百度联盟做网站赚钱吗,建网站赚钱简介
本系统基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台#xff0c;提供多租户、权限管理、考试、练习、在线学习等功能。主要功能为在线考试、练习、刷题#xff0c;在线学习。课程内容支持图文、视频#xff0c;考试类型支持考试、练习、问卷。
源码下载
网…简介
本系统基于 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.911-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 返回给客户端做数据展示功能。
首页数据
/*** 获取管控台首页数据*/GetMappingOperation(summary 后台首页数据展示, description 后台首页数据展示)public RDashboardDto 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请求方法用于处理与考试信息管理相关的业务逻辑。下面是对这段代码的详细解释
Slf4j这是一个日志注解用于在控制类中注入一个日志对象方便记录日志。AllArgsConstructor这是一个Lombok注解用于自动生成所有字段的构造函数。Tag(name 考试信息管理)这是一个自定义注解用于标记这个控制器属于哪个功能模块。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 RBoolean 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 RExamination examination(PathVariable Long id) {return R.success(examinationService.get(id));}GetMapping(/{id}/detail)Operation(summary 获取考试详细信息, description 根据考试 id 获取考试详细信息)public RExaminationDto detail(PathVariable Long id) {return R.success(examinationService.getDetail(id));}GetMapping(/{id}/getMembers)Operation(summary 获取考试成员 ID, description 根据考试 ID 获取考试成员 ID)public RMemberDto getMembers(PathVariable Long id) {return R.success(examPermissionService.getMembers(ExamConstant.PERMISSION_TYPE_EXAM, id));}GetMapping(/anonymousUser/{id})Operation(summary 获取考试信息, description 根据考试 id 获取考试详细信息)public RExamination anonymousUserGet(PathVariable Long id) {return R.success(examinationService.get(id));}GetMapping(examinationList)Operation(summary 获取考试列表)public RPageInfoExaminationDto examinationList(RequestParam MapString, 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 RPageInfoExaminationDto userExaminationList(RequestParam MapString, 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 RPageInfoSubjectDto subjectList(RequestParam MapString, 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));}PostMappingOperation(summary 创建考试, description 创建考试)SgLog(value 创建考试, operationType OperationType.INSERT)public RBoolean 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 RBoolean 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 RBoolean 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 RBoolean deleteAll(RequestBody Long[] ids) {return R.success(examinationService.deleteAll(ids) 0);}GetMapping(nexSubjectNo/{id})Operation(summary 获取下一题的序号)public RInteger nexSubjectNo(PathVariable Long id) {return R.success(examinationService.nextSubjectNo(id));}PostMapping(batchAddSubjects/{id})Operation(summary 批量添加题目)SgLog(value 批量添加题目, operationType OperationType.INSERT)public RBoolean batchAddSubjects(PathVariable Long id, RequestBody ListSubjectDto subjects) {return R.success(examinationService.batchAddSubjects(id, subjects));}PostMapping(randomAddSubjects/{id})Operation(summary 随机添加题目)SgLog(value 随机添加题目, operationType OperationType.INSERT)public RBoolean randomAddSubjects(PathVariable Long id, RequestBody RandomSubjectDto params) {return R.success(examinationService.randomAddSubjects(id, params));}
}