diff --git a/src-源文件/main/java/com/yf/exam/ExamApplication.java b/src-源文件/main/java/com/yf/exam/ExamApplication.java index 265c269..606609d 100644 --- a/src-源文件/main/java/com/yf/exam/ExamApplication.java +++ b/src-源文件/main/java/com/yf/exam/ExamApplication.java @@ -1,17 +1,17 @@ -package com.yf.exam; +package com.yf.exam; // 定义包路径 -import com.yf.exam.core.api.utils.JsonConverter; -import lombok.extern.log4j.Log4j2; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.Environment; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.yf.exam.core.api.utils.JsonConverter; // 导入JsonConverter工具类 +import lombok.extern.log4j.Log4j2; // 导入log4j2日志工具 +import org.springframework.boot.SpringApplication; // 导入Spring Boot的SpringApplication类 +import org.springframework.boot.autoconfigure.SpringBootApplication; // 导入SpringBoot应用的启动注解 +import org.springframework.context.ConfigurableApplicationContext; // 导入Spring上下文配置类 +import org.springframework.core.env.Environment; // 导入Spring环境配置类 +import org.springframework.http.converter.HttpMessageConverter; // 导入HTTP消息转换器接口 +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; // 导入Web MVC配置接口 -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.List; +import java.net.InetAddress; // 导入InetAddress类用于获取IP地址 +import java.net.UnknownHostException; // 导入UnknownHostException异常类 +import java.util.List; // 导入List集合类 /** * 云帆在线考试系统 @@ -19,23 +19,28 @@ import java.util.List; * @email 18365918@qq.com * @date 2020-03-04 19:41 */ -@Log4j2 -@SpringBootApplication -public class ExamApplication implements WebMvcConfigurer { +@Log4j2 // 使用log4j2进行日志记录 +@SpringBootApplication // 声明一个Spring Boot应用程序 +public class ExamApplication implements WebMvcConfigurer { // 实现WebMvcConfigurer接口,定制MVC配置 - public static void main(String[] args) throws UnknownHostException { + public static void main(String[] args) throws UnknownHostException { // 主方法,应用程序入口 + // 启动Spring Boot应用,获取应用上下文 ConfigurableApplicationContext application = SpringApplication.run(ExamApplication.class, args); + // 获取环境配置信息 Environment env = application.getEnvironment(); + // 获取本机IP地址 String ip = InetAddress.getLocalHost().getHostAddress(); + // 获取端口号 String port = env.getProperty("server.port"); + // 获取上下文路径 String path = env.getProperty("server.servlet.context-path"); - // 未配置默认空白 + // 如果没有配置路径,则默认为空字符串 if(path == null){ path = ""; } - + // 输出启动信息到日志 log.info("\n----------------------------------------------------------\n\t" + "云帆考试系统启动成功,访问路径如下:\n\t" + "本地路径: \t\thttp://localhost:" + port + path + "/\n\t" + @@ -45,9 +50,8 @@ public class ExamApplication implements WebMvcConfigurer { } @Override - public void extendMessageConverters(List> converters) { - //保留原有converter,把新增fastConverter插入集合头,保证优先级 + public void extendMessageConverters(List> converters) { // 扩展Spring MVC的消息转换器 + // 保留原有的消息转换器,将新的fastConverter插入到集合的头部,确保其优先级 converters.add(0, JsonConverter.fastConverter()); } - -} \ No newline at end of file +} diff --git a/src-源文件/main/java/com/yf/exam/modules/Constant.java b/src-源文件/main/java/com/yf/exam/modules/Constant.java index 20c5726..7e83ead 100644 --- a/src-源文件/main/java/com/yf/exam/modules/Constant.java +++ b/src-源文件/main/java/com/yf/exam/modules/Constant.java @@ -1,14 +1,15 @@ -package com.yf.exam.modules; - +package com.yf.exam.modules; // 包名:表示该类属于 modules 包 /** - * 通用常量 - * @author bool + * 通用常量类 + * 用于存放项目中使用的常量 + * @作者 bool */ public class Constant { /** - * 会话 + * 会话常量 + * 用于存放 Token 的常量名 */ - public static final String TOKEN = "token"; + public static final String TOKEN = "token"; // 定义一个常量 TOKEN,表示会话中的 Token 名称 } diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/controller/ExamController.java b/src-源文件/main/java/com/yf/exam/modules/exam/controller/ExamController.java index e5583f2..6adeb13 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/controller/ExamController.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/controller/ExamController.java @@ -1,151 +1,144 @@ -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.apache.shiro.authz.annotation.RequiresRoles; -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; +package com.yf.exam.modules.exam.controller; // 定义包名,控制器所在的包路径 + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入MyBatis Plus的查询包装类 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入MyBatis Plus的分页接口 +import com.yf.exam.core.api.ApiRest; // 导入自定义的API响应类 +import com.yf.exam.core.api.controller.BaseController; // 导入基控制器类 +import com.yf.exam.core.api.dto.BaseIdReqDTO; // 导入基础ID请求数据传输对象 +import com.yf.exam.core.api.dto.BaseIdsReqDTO; // 导入基础IDs请求数据传输对象 +import com.yf.exam.core.api.dto.BaseStateReqDTO; // 导入基础状态请求数据传输对象 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入考试DTO +import com.yf.exam.modules.exam.dto.request.ExamSaveReqDTO; // 导入考试保存请求DTO +import com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO; // 导入在线考试响应DTO +import com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO; // 导入考试审核响应DTO +import com.yf.exam.modules.exam.entity.Exam; // 导入考试实体类 +import com.yf.exam.modules.exam.service.ExamService; // 导入考试服务接口 +import io.swagger.annotations.Api; // 导入Swagger注解 +import io.swagger.annotations.ApiOperation; // 导入Swagger操作注解 +import org.apache.shiro.authz.annotation.RequiresRoles; // 导入Shiro权限注解 +import org.springframework.beans.factory.annotation.Autowired; // 导入Spring的自动注入注解 +import org.springframework.web.bind.annotation.RequestBody; // 导入Spring MVC的请求体注解 +import org.springframework.web.bind.annotation.RequestMapping; // 导入Spring MVC的请求映射注解 +import org.springframework.web.bind.annotation.RequestMethod; // 导入Spring MVC的请求方法注解 +import org.springframework.web.bind.annotation.RestController; // 导入Spring MVC的控制器注解 + +import java.util.Date; // 导入Java的日期类 /** -*

-* 考试控制器 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Api(tags={"考试"}) -@RestController -@RequestMapping("/exam/api/exam/exam") -public class ExamController extends BaseController { + *

+ * 考试控制器,处理与考试相关的请求 + *

+ * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Api(tags={"考试"}) // Swagger注解,定义API的标签 +@RestController // Spring MVC注解,声明这是一个REST控制器 +@RequestMapping("/exam/api/exam/exam") // Spring MVC注解,定义请求的基础路径 +public class ExamController extends BaseController { // 声明控制器类,继承自基控制器 @Autowired - private ExamService baseService; + private ExamService baseService; // 自动注入考试服务 /** - * 添加或修改 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "添加或修改") - @RequestMapping(value = "/save", method = { RequestMethod.POST}) - public ApiRest save(@RequestBody ExamSaveReqDTO reqDTO) { - //复制参数 - baseService.save(reqDTO); - return super.success(); + * 添加或修改考试信息 + * @param reqDTO 考试保存请求数据传输对象 + * @return ApiRest 返回操作结果 + */ + @RequiresRoles("sa") // Shiro权限注解,要求角色为"sa"(超级管理员) + @ApiOperation(value = "添加或修改") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/save", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest save(@RequestBody ExamSaveReqDTO reqDTO) { // 定义添加或修改考试的方法 + // 复制参数并保存 + baseService.save(reqDTO); // 调用服务层保存考试信息 + return super.success(); // 返回成功响应 } /** - * 批量删除 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "批量删除") - @RequestMapping(value = "/delete", method = { RequestMethod.POST}) - public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { - //根据ID删除 - baseService.removeByIds(reqDTO.getIds()); - return super.success(); + * 批量删除考试 + * @param reqDTO 包含要删除的考试ID列表 + * @return ApiRest 返回操作结果 + */ + @RequiresRoles("sa") // Shiro权限注解,要求角色为"sa"(超级管理员) + @ApiOperation(value = "批量删除") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/delete", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { // 定义批量删除考试的方法 + // 根据ID删除考试 + baseService.removeByIds(reqDTO.getIds()); // 调用服务层根据ID列表删除考试 + return super.success(); // 返回成功响应 } /** - * 查找详情 - * @param reqDTO - * @return - */ - @ApiOperation(value = "查找详情") - @RequestMapping(value = "/detail", method = { RequestMethod.POST}) - public ApiRest find(@RequestBody BaseIdReqDTO reqDTO) { - ExamSaveReqDTO dto = baseService.findDetail(reqDTO.getId()); - return super.success(dto); + * 查找考试详情 + * @param reqDTO 包含考试ID + * @return ApiRest 返回考试详情 + */ + @ApiOperation(value = "查找详情") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/detail", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest find(@RequestBody BaseIdReqDTO reqDTO) { // 定义查找考试详情的方法 + ExamSaveReqDTO dto = baseService.findDetail(reqDTO.getId()); // 调用服务层查找考试详情 + return super.success(dto); // 返回成功响应和考试详情 } /** - * 查找详情 - * @param reqDTO - * @return + * 更新考试状态 + * @param reqDTO 包含考试ID和新状态 + * @return ApiRest 返回操作结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "查找详情") - @RequestMapping(value = "/state", method = { RequestMethod.POST}) - public ApiRest state(@RequestBody BaseStateReqDTO reqDTO) { - + @RequiresRoles("sa") // Shiro权限注解,要求角色为"sa"(超级管理员) + @ApiOperation(value = "更新考试状态") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/state", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest state(@RequestBody BaseStateReqDTO reqDTO) { // 定义更新考试状态的方法 + // 创建查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().in(Exam::getId, reqDTO.getIds()); - Exam exam = new Exam(); - exam.setState(reqDTO.getState()); - exam.setUpdateTime(new Date()); + wrapper.lambda().in(Exam::getId, reqDTO.getIds()); // 构造查询条件,查询指定ID的考试 + Exam exam = new Exam(); // 创建考试实体 + exam.setState(reqDTO.getState()); // 设置新状态 + exam.setUpdateTime(new Date()); // 设置更新时间为当前时间 - baseService.update(exam, wrapper); - return super.success(); + baseService.update(exam, wrapper); // 调用服务层更新考试状态 + return super.success(); // 返回成功响应 } - /** - * 分页查找 - * @param reqDTO - * @return + * 分页查找考试 + * @param reqDTO 分页请求数据传输对象 + * @return ApiRest> 返回分页考试列表 */ - @ApiOperation(value = "考试视角") - @RequestMapping(value = "/online-paging", method = { RequestMethod.POST}) - public ApiRest> myPaging(@RequestBody PagingReqDTO reqDTO) { - - //分页查询并转换 - IPage page = baseService.onlinePaging(reqDTO); - return super.success(page); + @ApiOperation(value = "考试视角") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/online-paging", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest> myPaging(@RequestBody PagingReqDTO reqDTO) { // 定义分页查找考试的方法 + // 分页查询并转换 + IPage page = baseService.onlinePaging(reqDTO); // 调用服务层进行分页查询 + return super.success(page); // 返回成功响应和分页结果 } /** - * 分页查找 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) - public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - - //分页查询并转换 - IPage page = baseService.paging(reqDTO); - - return super.success(page); + * 分页查找考试 + * @param reqDTO 分页请求数据传输对象 + * @return ApiRest> 返回分页考试列表 + */ + @RequiresRoles("sa") // Shiro权限注解,要求角色为"sa"(超级管理员) + @ApiOperation(value = "分页查找") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/paging", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { // 定义分页查找考试的方法 + // 分页查询并转换 + IPage page = baseService.paging(reqDTO); // 调用服务层进行分页查询 + return super.success(page); // 返回成功响应和分页结果 } - /** - * 分页查找 - * @param reqDTO - * @return + * 分页查找待阅试卷 + * @param reqDTO 分页请求数据传输对象 + * @return ApiRest> 返回分页待阅试卷列表 */ - @RequiresRoles("sa") - @ApiOperation(value = "待阅试卷") - @RequestMapping(value = "/review-paging", method = { RequestMethod.POST}) - public ApiRest> reviewPaging(@RequestBody PagingReqDTO reqDTO) { - //分页查询并转换 - IPage page = baseService.reviewPaging(reqDTO); - return super.success(page); + @RequiresRoles("sa") // Shiro权限注解,要求角色为"sa"(超级管理员) + @ApiOperation(value = "待阅试卷") // Swagger注解,定义操作的描述 + @RequestMapping(value = "/review-paging", method = { RequestMethod.POST}) // Spring MVC注解,定义请求的映射和方法 + public ApiRest> reviewPaging(@RequestBody PagingReqDTO reqDTO) { // 定义分页查找待阅试卷的方法 + // 分页查询并转换 + IPage page = baseService.reviewPaging(reqDTO); // 调用服务层进行分页查询 + return super.success(page); // 返回成功响应和分页结果 } - - } diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java index 90f86f1..8f9b69e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java @@ -1,101 +1,93 @@ -package com.yf.exam.modules.exam.dto; +package com.yf.exam.modules.exam.dto; // 定义包名,DTO类所在的包路径 -import com.fasterxml.jackson.annotation.JsonFormat; -import com.yf.exam.modules.paper.enums.ExamState; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; // 导入Jackson库的注解,用于格式化日期 +import com.yf.exam.modules.paper.enums.ExamState; // 导入考试状态枚举 +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 +import org.springframework.format.annotation.DateTimeFormat; // 导入Spring的日期格式化注解 -import java.io.Serializable; -import java.util.Date; +import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化 +import java.util.Date; // 导入Java的日期类 /** -*

-* 考试数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Data -@ApiModel(value="考试", description="考试") -public class ExamDTO implements Serializable { + *

+ * 考试数据传输类,封装考试的基本信息 + *

+ * 此类用于封装考试的基本信息,以便在应用程序中传输。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="考试", description="考试") // Swagger注解,描述这个类的用途 +public class ExamDTO implements Serializable { // 声明类,实现Serializable接口以确保可以序列化 + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性 - private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String id; // 考试ID + @ApiModelProperty(value = "考试名称", required=true) // Swagger注解,描述字段的用途和是否必填 + private String title; // 考试名称 - @ApiModelProperty(value = "ID", required=true) - private String id; + @ApiModelProperty(value = "考试描述", required=true) // Swagger注解,描述字段的用途和是否必填 + private String content; // 考试描述 - @ApiModelProperty(value = "考试名称", required=true) - private String title; + @ApiModelProperty(value = "1公开2部门3定员", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer openType; // 开放类型,1表示公开,2表示部门,3表示定员 - @ApiModelProperty(value = "考试描述", required=true) - private String content; + @ApiModelProperty(value = "考试状态", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer state; // 考试状态 - @ApiModelProperty(value = "1公开2部门3定员", required=true) - private Integer openType; + @ApiModelProperty(value = "是否限时", required=true) // Swagger注解,描述字段的用途和是否必填 + private Boolean timeLimit; // 是否限时 - @ApiModelProperty(value = "考试状态", required=true) - private Integer state; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") // Jackson注解,格式化日期 + @DateTimeFormat(pattern = "yyyy-MM-dd") // Spring注解,格式化日期 + @ApiModelProperty(value = "开始时间", required=true) // Swagger注解,描述字段的用途和是否必填 + private Date startTime; // 考试开始时间 - @ApiModelProperty(value = "是否限时", required=true) - private Boolean timeLimit; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") // Jackson注解,格式化日期 + @DateTimeFormat(pattern = "yyyy-MM-dd") // Spring注解,格式化日期 + @ApiModelProperty(value = "结束时间", required=true) // Swagger注解,描述字段的用途和是否必填 + private Date endTime; // 考试结束时间 - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @ApiModelProperty(value = "开始时间", required=true) - private Date startTime; + @ApiModelProperty(value = "创建时间", required=true) // Swagger注解,描述字段的用途和是否必填 + private Date createTime; // 创建时间 - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @ApiModelProperty(value = "结束时间", required=true) - private Date endTime; - - @ApiModelProperty(value = "创建时间", required=true) - private Date createTime; - - @ApiModelProperty(value = "更新时间", required=true) - private Date updateTime; - - @ApiModelProperty(value = "总分数", required=true) - private Integer totalScore; - - @ApiModelProperty(value = "总时长(分钟)", required=true) - private Integer totalTime; - - @ApiModelProperty(value = "及格分数", required=true) - private Integer qualifyScore; + @ApiModelProperty(value = "更新时间", required=true) // Swagger注解,描述字段的用途和是否必填 + private Date updateTime; // 更新时间 + @ApiModelProperty(value = "总分数", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer totalScore; // 总分数 + @ApiModelProperty(value = "总时长(分钟)", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer totalTime; // 总时长(分钟) + @ApiModelProperty(value = "及格分数", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer qualifyScore; // 及格分数 /** - * 是否结束 - * @return + * 判断考试状态 + * 根据当前时间和考试的限时设置,返回考试的实际状态。 + * + * @return 当前考试状态 */ - public Integer getState(){ - - if(this.timeLimit!=null && this.timeLimit){ - - if(System.currentTimeMillis() < startTime.getTime() ){ - return ExamState.READY_START; + public Integer getState() { + if (this.timeLimit != null && this.timeLimit) { + if (System.currentTimeMillis() < startTime.getTime()) { + return ExamState.READY_START; // 如果当前时间小于开始时间,状态为准备开始 } - - if(System.currentTimeMillis() > endTime.getTime()){ - return ExamState.OVERDUE; + if (System.currentTimeMillis() > endTime.getTime()) { + return ExamState.OVERDUE; // 如果当前时间大于结束时间,状态为已过期 } - - if(System.currentTimeMillis() > startTime.getTime() + if (System.currentTimeMillis() > startTime.getTime() && System.currentTimeMillis() < endTime.getTime() - && !ExamState.DISABLED.equals(this.state)){ - return ExamState.ENABLE; + && !ExamState.DISABLED.equals(this.state)) { + return ExamState.ENABLE; // 如果当前时间在开始时间和结束时间之间,并且状态不是禁用,状态为正在进行 } - } - - return this.state; + return this.state; // 如果不满足上述条件,返回当前状态 } -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java index d0e54b7..7710955 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java @@ -1,33 +1,32 @@ -package com.yf.exam.modules.exam.dto; +package com.yf.exam.modules.exam.dto; // 定义包名,DTO类所在的包路径 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 -import java.io.Serializable; +import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化 /** -*

-* 考试部门数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-03 17:24 -*/ -@Data -@ApiModel(value="考试部门", description="考试部门") -public class ExamDepartDTO implements Serializable { + *

+ * 考试部门数据传输类,封装考试部门相关信息 + *

+ * 此类用于封装与考试部门相关的数据,以便在应用程序中传输。 + * + * @author 聪明笨狗 + * @since 2020-09-03 17:24 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="考试部门", description="考试部门") // Swagger注解,描述这个类的用途 +public class ExamDepartDTO implements Serializable { // 声明类,实现Serializable接口以确保可以序列化 - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "ID", required=true) - private String id; - - @ApiModelProperty(value = "考试ID", required=true) - private String examId; - - @ApiModelProperty(value = "部门ID", required=true) - private String departId; - -} + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性 + + @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String id; // 唯一标识符,标识考试部门记录的ID + + @ApiModelProperty(value = "考试ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String examId; // 考试的唯一标识符,关联到具体的考试 + + @ApiModelProperty(value = "部门ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String departId; // 部门的唯一标识符,关联到具体的部门 +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java index 7244e9a..5cbc8a4 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java @@ -1,51 +1,50 @@ -package com.yf.exam.modules.exam.dto; +package com.yf.exam.modules.exam.dto; // 定义包名,DTO类所在的包路径 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 -import java.io.Serializable; +import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化 /** -*

-* 考试题库数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-05 11:14 -*/ -@Data -@ApiModel(value="考试题库", description="考试题库") -public class ExamRepoDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "ID", required=true) - private String id; - - @ApiModelProperty(value = "考试ID", required=true) - private String examId; - - @ApiModelProperty(value = "题库ID", required=true) - private String repoId; - - @ApiModelProperty(value = "单选题数量", required=true) - private Integer radioCount; - - @ApiModelProperty(value = "单选题分数", required=true) - private Integer radioScore; - - @ApiModelProperty(value = "多选题数量", required=true) - private Integer multiCount; - - @ApiModelProperty(value = "多选题分数", required=true) - private Integer multiScore; - - @ApiModelProperty(value = "判断题数量", required=true) - private Integer judgeCount; - - @ApiModelProperty(value = "判断题分数", required=true) - private Integer judgeScore; - -} + *

+ * 考试题库数据传输类,封装考试题库相关信息 + *

+ * 此类用于封装考试题库的数据,以便在应用程序中传输。 + * + * @author 聪明笨狗 + * @since 2020-09-05 11:14 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="考试题库", description="考试题库") // Swagger注解,描述这个类的用途 +public class ExamRepoDTO implements Serializable { // 声明类,实现Serializable接口以确保可以序列化 + + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性 + + @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String id; // 题库ID,唯一标识符 + + @ApiModelProperty(value = "考试ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String examId; // 关联的考试ID,标识与哪个考试相关联 + + @ApiModelProperty(value = "题库ID", required=true) // Swagger注解,描述字段的用途和是否必填 + private String repoId; // 题库ID,标识具体的题库 + + @ApiModelProperty(value = "单选题数量", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer radioCount; // 单选题数量,表示题库中单选题的总数 + + @ApiModelProperty(value = "单选题分数", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer radioScore; // 单选题分数,表示单选题的总分 + + @ApiModelProperty(value = "多选题数量", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer multiCount; // 多选题数量,表示题库中多选题的总数 + + @ApiModelProperty(value = "多选题分数", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer multiScore; // 多选题分数,表示多选题的总分 + + @ApiModelProperty(value = "判断题数量", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer judgeCount; // 判断题数量,表示题库中判断题的总数 + + @ApiModelProperty(value = "判断题分数", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer judgeScore; // 判断题分数,表示判断题的总分 +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java index a566fec..e1887c3 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java @@ -1,32 +1,30 @@ -package com.yf.exam.modules.exam.dto.ext; +package com.yf.exam.modules.exam.dto.ext; // 定义包名,DTO扩展类所在的包路径 -import com.yf.exam.modules.exam.dto.ExamRepoDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.exam.dto.ExamRepoDTO; // 导入考试题库数据传输类 +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 /** -*

-* 考试题库数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-05 11:14 -*/ -@Data -@ApiModel(value="考试题库扩展响应类", description="考试题库扩展响应类") -public class ExamRepoExtDTO extends ExamRepoDTO { + *

+ * 考试题库数据传输类的扩展,包含额外的题库信息 + *

+ * + * @author 聪明笨狗 + * @since 2020-09-05 11:14 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="考试题库扩展响应类", description="考试题库扩展响应类") // Swagger注解,描述这个类的用途 +public class ExamRepoExtDTO extends ExamRepoDTO { // 声明类,继承自ExamRepoDTO - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制 - - @ApiModelProperty(value = "单选题总量", required=true) - private Integer totalRadio; - - @ApiModelProperty(value = "多选题总量", required=true) - private Integer totalMulti; - - @ApiModelProperty(value = "判断题总量", required=true) - private Integer totalJudge; - + @ApiModelProperty(value = "单选题总量", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer totalRadio; // 单选题总量 + + @ApiModelProperty(value = "多选题总量", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer totalMulti; // 多选题总量 + + @ApiModelProperty(value = "判断题总量", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer totalJudge; // 判断题总量 } diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java index 5c1a95b..aa62266 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java @@ -1,32 +1,30 @@ -package com.yf.exam.modules.exam.dto.request; +package com.yf.exam.modules.exam.dto.request; // 定义包名,请求DTO类所在的包路径 -import com.yf.exam.modules.exam.dto.ExamDTO; -import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入基础考试DTO类 +import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; // 导入考试题库扩展DTO类 +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 -import java.util.List; +import java.util.List; // 导入Java的List接口,用于定义列表类型的属性 /** -*

-* 考试保存请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Data -@ApiModel(value="考试保存请求类", description="考试保存请求类") -public class ExamSaveReqDTO extends ExamDTO { - - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "题库列表", required=true) - private List repoList; - - @ApiModelProperty(value = "考试部门列表", required=true) - private List departIds; - -} + *

+ * 考试保存请求类,封装考试保存请求的相关信息 + *

+ * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="考试保存请求类", description="考试保存请求类") // Swagger注解,描述这个类的用途 +public class ExamSaveReqDTO extends ExamDTO { // 声明类,继承自ExamDTO + + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制 + + @ApiModelProperty(value = "题库列表", required=true) // Swagger注解,描述字段的用途和是否必填 + private List repoList; // 题库列表,存储与考试相关的题库信息 + + @ApiModelProperty(value = "考试部门列表", required=true) // Swagger注解,描述字段的用途和是否必填 + private List departIds; // 考试部门ID列表,存储与考试相关的部门ID +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java index edbc5ce..ec344db 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java @@ -1,22 +1,21 @@ -package com.yf.exam.modules.exam.dto.response; +package com.yf.exam.modules.exam.dto.response; // 定义包名,响应DTO类所在的包路径 -import com.yf.exam.modules.exam.dto.ExamDTO; -import io.swagger.annotations.ApiModel; -import lombok.Data; +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入基础考试DTO类 +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 /** -*

-* 考试分页响应类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Data -@ApiModel(value="在线考试分页响应类", description="在线考试分页响应类") -public class ExamOnlineRespDTO extends ExamDTO { + *

+ * 在线考试分页响应类,封装在线考试的分页响应信息 + *

+ * 此类用于封装在线考试相关的分页数据,提供给前端展示。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="在线考试分页响应类", description="在线考试分页响应类") // Swagger注解,描述这个类的用途 +public class ExamOnlineRespDTO extends ExamDTO { // 声明类,继承自ExamDTO - private static final long serialVersionUID = 1L; - - -} + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性 +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java index 7d9ad36..68d4236 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java @@ -1,31 +1,28 @@ -package com.yf.exam.modules.exam.dto.response; +package com.yf.exam.modules.exam.dto.response; // 定义包名,响应DTO类所在的包路径 -import com.yf.exam.modules.exam.dto.ExamDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入基础考试DTO类 +import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型 +import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 /** -*

-* 考试分页响应类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Data -@ApiModel(value="阅卷分页响应类", description="阅卷分页响应类") -public class ExamReviewRespDTO extends ExamDTO { - - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "考试人数", required=true) - private Integer examUser; - - @ApiModelProperty(value = "待阅试卷", required=true) - private Integer unreadPaper; - - - -} + *

+ * 阅卷分页响应类,封装阅卷相关的分页响应信息 + *

+ * 此类用于封装阅卷相关的分页数据,提供给前端展示。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@ApiModel(value="阅卷分页响应类", description="阅卷分页响应类") // Swagger注解,描述这个类的用途 +public class ExamReviewRespDTO extends ExamDTO { // 声明类,继承自ExamDTO + + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性 + + @ApiModelProperty(value = "考试人数", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer examUser; // 考试人数,表示参与考试的用户总数 + + @ApiModelProperty(value = "待阅试卷", required=true) // Swagger注解,描述字段的用途和是否必填 + private Integer unreadPaper; // 待阅试卷数量,表示尚未被阅卷的试卷数量 +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/entity/Exam.java b/src-源文件/main/java/com/yf/exam/modules/exam/entity/Exam.java index e198c69..cd2d284 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/entity/Exam.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/entity/Exam.java @@ -1,100 +1,61 @@ -package com.yf.exam.modules.exam.entity; +package com.yf.exam.modules.exam.entity; // 定义包名,实体类所在的包路径 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; -import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; // 导入MyBatis Plus的ID类型注解 +import com.baomidou.mybatisplus.annotation.TableField; // 导入MyBatis Plus的表字段注解 +import com.baomidou.mybatisplus.annotation.TableId; // 导入MyBatis Plus的表ID注解 +import com.baomidou.mybatisplus.annotation.TableName; // 导入MyBatis Plus的表名注解 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入MyBatis Plus的模型类 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 +import java.util.Date; // 导入Java的日期类 /** -*

-* 考试实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Data -@TableName("el_exam") -public class Exam extends Model { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; - - /** - * 考试名称 - */ - private String title; - - /** - * 考试描述 - */ - private String content; - - /** - * 1公开2部门3定员 - */ - @TableField("open_type") - private Integer openType; - - /** - * 考试状态 - */ - private Integer state; - - /** - * 是否限时 - */ - @TableField("time_limit") - private Boolean timeLimit; - - /** - * 开始时间 - */ - @TableField("start_time") - private Date startTime; - - /** - * 结束时间 - */ - @TableField("end_time") - private Date endTime; - - /** - * 创建时间 - */ - @TableField("create_time") - private Date createTime; - - /** - * 更新时间 - */ - @TableField("update_time") - private Date updateTime; - - /** - * 总分数 - */ - @TableField("total_score") - private Integer totalScore; - - /** - * 总时长(分钟) - */ - @TableField("total_time") - private Integer totalTime; - - /** - * 及格分数 - */ - @TableField("qualify_score") - private Integer qualifyScore; - -} + *

+ * 考试实体类,封装考试的基本信息 + *

+ * 此类用于数据库操作,映射考试表的字段。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@TableName("el_exam") // MyBatis Plus注解,指定这个实体类对应的数据库表名 +public class Exam extends Model { // 声明类,继承自MyBatis Plus的Model类,用于数据库操作 + + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的唯一性 + + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定这个字段为表的主键,类型为自增ID + private String id; // 考试ID,唯一标识符 + + private String title; // 考试名称,描述考试的标题 + + private String content; // 考试描述,详细描述考试的内容 + + @TableField("open_type") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Integer openType; // 开放类型,表示考试的开放范围(1公开,2部门,3定员) + + private Integer state; // 考试状态,表示考试的当前状态(如:未开始、进行中、已结束) + + @TableField("time_limit") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Boolean timeLimit; // 是否限时,表示考试是否有时间限制 + + @TableField("start_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Date startTime; // 开始时间,表示考试的开始时间 + + @TableField("end_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Date endTime; // 结束时间,表示考试的结束时间 + + @TableField("create_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Date createTime; // 创建时间,表示记录的创建时间 + + @TableField("update_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Date updateTime; // 更新时间,表示记录的最后更新时间 + + @TableField("total_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Integer totalScore; // 总分数,表示考试的总分 + + @TableField("total_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Integer totalTime; // 总时长(分钟),表示考试的总时长 + + @TableField("qualify_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名 + private Integer qualifyScore; // 及格分数,表示考试的及格分数线 +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java b/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java index 19a4238..b39d71c 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java @@ -1,42 +1,47 @@ -package com.yf.exam.modules.exam.entity; +package com.yf.exam.modules.exam.entity; // 定义包名,实体类所在的包路径 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入MyBatis Plus的ID类型注解 +import com.baomidou.mybatisplus.annotation.TableField; // 导入MyBatis Plus的表字段注解 +import com.baomidou.mybatisplus.annotation.TableId; // 导入MyBatis Plus的表ID注解 +import com.baomidou.mybatisplus.annotation.TableName; // 导入MyBatis Plus的表名注解 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入MyBatis Plus的模型类 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 + +import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化 /** -*

-* 考试部门实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-03 17:24 -*/ -@Data -@TableName("el_exam_depart") -public class ExamDepart extends Model { + *

+ * 考试部门实体类,封装考试部门的基本信息 + *

+ * 此类用于数据库操作,映射考试部门表的字段。 + * + * @author 聪明笨狗 + * @since 2020-09-03 17:24 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@TableName("el_exam_depart") // MyBatis Plus注解,指定这个实体类对应的数据库表名 +public class ExamDepart extends Model { // 声明类,继承自MyBatis Plus的Model类,用于数据库操作 + + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的唯一性 - private static final long serialVersionUID = 1L; - /** - * ID - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) + * ID + * 唯一标识符,用于标识考试部门记录。 + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定这个字段为表的主键,类型为自增ID private String id; /** - * 考试ID - */ - @TableField("exam_id") + * 考试ID + * 关联的考试ID,标识这个部门所属的考试。 + */ + @TableField("exam_id") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private String examId; /** - * 部门ID - */ - @TableField("depart_id") + * 部门ID + * 关联的部门ID,标识参与考试的部门。 + */ + @TableField("depart_id") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private String departId; - -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamRepo.java b/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamRepo.java index 3884051..5249056 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamRepo.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/entity/ExamRepo.java @@ -1,78 +1,87 @@ -package com.yf.exam.modules.exam.entity; +package com.yf.exam.modules.exam.entity; // 定义包名,实体类所在的包路径 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入MyBatis Plus的ID类型注解 +import com.baomidou.mybatisplus.annotation.TableField; // 导入MyBatis Plus的表字段注解 +import com.baomidou.mybatisplus.annotation.TableId; // 导入MyBatis Plus的表ID注解 +import com.baomidou.mybatisplus.annotation.TableName; // 导入MyBatis Plus的表名注解 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入MyBatis Plus的模型类 +import lombok.Data; // 导入Lombok注解,用于简化数据类的编写 /** -*

-* 考试题库实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-05 11:14 -*/ -@Data -@TableName("el_exam_repo") -public class ExamRepo extends Model { + *

+ * 考试题库实体类,封装考试题库的基本信息 + *

+ * 此类用于数据库操作,映射考试题库表的字段。 + * + * @author 聪明笨狗 + * @since 2020-09-05 11:14 + */ +@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法 +@TableName("el_exam_repo") // MyBatis Plus注解,指定这个实体类对应的数据库表名 +public class ExamRepo extends Model { // 声明类,继承自MyBatis Plus的Model类,用于数据库操作 + + private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的唯一性 - private static final long serialVersionUID = 1L; - /** - * ID - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) + * ID + * 唯一标识符,用于标识考试题库记录。 + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定这个字段为表的主键,类型为自增ID private String id; /** - * 考试ID - */ - @TableField("exam_id") + * 考试ID + * 关联的考试ID,标识这个题库所属的考试。 + */ + @TableField("exam_id") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private String examId; /** - * 题库ID - */ - @TableField("repo_id") + * 题库ID + * 关联的题库ID,标识具体的题库。 + */ + @TableField("repo_id") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private String repoId; /** - * 单选题数量 - */ - @TableField("radio_count") + * 单选题数量 + * 题库中包含的单选题数量。 + */ + @TableField("radio_count") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private Integer radioCount; /** - * 单选题分数 - */ - @TableField("radio_score") + * 单选题分数 + * 单选题的总分。 + */ + @TableField("radio_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private Integer radioScore; /** - * 多选题数量 - */ - @TableField("multi_count") + * 多选题数量 + * 题库中包含的多选题数量。 + */ + @TableField("multi_count") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private Integer multiCount; /** - * 多选题分数 - */ - @TableField("multi_score") + * 多选题分数 + * 多选题的总分。 + */ + @TableField("multi_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private Integer multiScore; /** - * 判断题数量 - */ - @TableField("judge_count") + * 判断题数量 + * 题库中包含的判断题数量。 + */ + @TableField("judge_count") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private Integer judgeCount; /** - * 判断题分数 - */ - @TableField("judge_score") + * 判断题分数 + * 判断题的总分。 + */ + @TableField("judge_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名 private Integer judgeScore; - -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamDepartMapper.java b/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamDepartMapper.java index 0c1f39a..60c30d2 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamDepartMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamDepartMapper.java @@ -1,15 +1,17 @@ -package com.yf.exam.modules.exam.mapper; +package com.yf.exam.modules.exam.mapper; // 定义包名,Mapper接口所在的包路径 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.exam.entity.ExamDepart; -/** -*

-* 考试部门Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-09-03 17:24 -*/ -public interface ExamDepartMapper extends BaseMapper { +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis Plus的基础Mapper接口 +import com.yf.exam.modules.exam.entity.ExamDepart; // 导入考试部门实体类 -} +/** + *

+ * 考试部门Mapper,提供考试部门的数据库操作接口 + *

+ * 此类是一个Mapper接口,继承自MyBatis Plus的BaseMapper,用于定义针对考试部门表的数据库操作。 + * + * @author 聪明笨狗 + * @since 2020-09-03 17:24 + */ +public interface ExamDepartMapper extends BaseMapper { // 声明接口,继承自BaseMapper并指定操作的实体类为ExamDepart + // 继承BaseMapper,提供基本的CRUD操作(创建、读取、更新、删除) +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamMapper.java b/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamMapper.java index 1ce4504..f4908e8 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamMapper.java @@ -1,45 +1,52 @@ -package com.yf.exam.modules.exam.mapper; +package com.yf.exam.modules.exam.mapper; // 定义包名,Mapper接口所在的包路径 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yf.exam.modules.exam.dto.ExamDTO; -import com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO; -import com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO; -import com.yf.exam.modules.exam.entity.Exam; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis Plus的基础Mapper接口 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入MyBatis Plus的分页结果接口 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入MyBatis Plus的分页对象 +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入考试DTO +import com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO; // 导入阅卷分页响应DTO +import com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO; // 导入在线考试分页响应DTO +import com.yf.exam.modules.exam.entity.Exam; // 导入考试实体类 +import org.apache.ibatis.annotations.Param; // 导入MyBatis的参数注解 /** -*

-* 考试Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -public interface ExamMapper extends BaseMapper { + *

+ * 考试Mapper,提供考试的数据库操作接口 + *

+ * 此类是一个Mapper接口,继承自MyBatis Plus的BaseMapper,用于定义针对考试表的数据库操作。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +public interface ExamMapper extends BaseMapper { // 声明接口,继承自BaseMapper并指定操作的实体类为Exam /** * 查找分页内容 - * @param page - * @param query - * @return + * 方法用于根据给定的分页对象和查询条件,查询考试数据的分页结果。 + * + * @param page 分页对象,包含分页信息,如当前页码和每页大小 + * @param query 查询条件,封装了考试查询的相关信息 + * @return IPage 返回包含考试DTO的分页结果 */ IPage paging(Page page, @Param("query") ExamDTO query); /** * 查找分页内容 - * @param page - * @param query - * @return + * 方法用于根据给定的分页对象和查询条件,查询阅卷数据的分页结果。 + * + * @param page 分页对象,包含分页信息,如当前页码和每页大小 + * @param query 查询条件,封装了考试查询的相关信息 + * @return IPage 返回包含阅卷分页响应DTO的分页结果 */ IPage reviewPaging(Page page, @Param("query") ExamDTO query); /** * 在线考试分页响应类-考生视角 - * @param page - * @param query - * @return + * 方法用于根据给定的分页对象和查询条件,查询在线考试数据的分页结果,从考生视角。 + * + * @param page 分页对象,包含分页信息,如当前页码和每页大小 + * @param query 查询条件,封装了考试查询的相关信息 + * @return IPage 返回包含在线考试分页响应DTO的分页结果 */ IPage online(Page page, @Param("query") ExamDTO query); -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamRepoMapper.java b/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamRepoMapper.java index 83407df..69900d2 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamRepoMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/mapper/ExamRepoMapper.java @@ -1,26 +1,29 @@ -package com.yf.exam.modules.exam.mapper; +package com.yf.exam.modules.exam.mapper; // 定义包名,Mapper接口所在的包路径 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; -import com.yf.exam.modules.exam.entity.ExamRepo; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis Plus的基础Mapper接口 +import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; // 导入考试题库扩展DTO +import com.yf.exam.modules.exam.entity.ExamRepo; // 导入考试题库实体类 +import org.apache.ibatis.annotations.Param; // 导入MyBatis的参数注解 -import java.util.List; +import java.util.List; // 导入Java的List接口 /** -*

-* 考试题库Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-09-05 11:14 -*/ -public interface ExamRepoMapper extends BaseMapper { + *

+ * 考试题库Mapper,提供考试题库的数据库操作接口 + *

+ * 此类是一个Mapper接口,继承自MyBatis Plus的BaseMapper,用于定义针对考试题库表的数据库操作。 + * + * @author 聪明笨狗 + * @since 2020-09-05 11:14 + */ +public interface ExamRepoMapper extends BaseMapper { // 声明接口,继承自BaseMapper并指定操作的实体类为ExamRepo /** * 查找考试题库列表 - * @param examId - * @return + * 方法用于根据给定的考试ID,查询关联的考试题库列表,返回扩展的DTO对象。 + * + * @param examId 考试ID,用于指定查询哪个考试的题库列表 + * @return List 返回包含考试题库扩展信息的列表 */ - List listByExam(@Param("examId") String examId); -} + List listByExam(@Param("examId") String examId); // 使用MyBatis的@Param注解来指定方法参数的名称 +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamDepartService.java b/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamDepartService.java index 301c010..068a6dc 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamDepartService.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamDepartService.java @@ -1,32 +1,36 @@ -package com.yf.exam.modules.exam.service; +package com.yf.exam.modules.exam.service; // 定义包名,服务接口所在的包路径 -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.modules.exam.entity.ExamDepart; +import com.baomidou.mybatisplus.extension.service.IService; // 导入MyBatis Plus的服务接口 +import com.yf.exam.modules.exam.entity.ExamDepart; // 导入考试部门实体类 -import java.util.List; +import java.util.List; // 导入Java的List接口 /** -*

-* 考试部门业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-03 17:24 -*/ -public interface ExamDepartService extends IService { + *

+ * 考试部门业务类,提供考试部门的业务逻辑 + *

+ * 此类是一个服务接口,继承自MyBatis Plus的IService,用于定义考试部门相关的业务操作。 + * + * @author 聪明笨狗 + * @since 2020-09-03 17:24 + */ +public interface ExamDepartService extends IService { // 声明接口,继承自IService并指定操作的实体类为ExamDepart /** - * 保存全部 - * @param examId - * @param departs + * 保存全部部门信息 + * 方法用于根据给定的考试ID和部门ID列表,保存考试与部门的关联关系。 + * + * @param examId 考试ID,标识要关联的考试 + * @param departs 部门ID列表,包含要关联的部门ID */ void saveAll(String examId, List departs); - /** * 根据考试查找对应的部门 - * @param examId - * @return + * 方法用于根据给定的考试ID,查询与之关联的部门ID列表。 + * + * @param examId 考试ID,用于指定查询哪个考试的部门 + * @return List 返回部门ID列表,包含所有与考试关联的部门ID */ List listByExam(String examId); -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamRepoService.java b/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamRepoService.java index 78b4ec1..5758185 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamRepoService.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamRepoService.java @@ -1,40 +1,45 @@ -package com.yf.exam.modules.exam.service; +package com.yf.exam.modules.exam.service; // 定义包名,服务接口所在的包路径 -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; -import com.yf.exam.modules.exam.entity.ExamRepo; +import com.baomidou.mybatisplus.extension.service.IService; // 导入MyBatis Plus的服务接口 +import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; // 导入考试题库扩展DTO +import com.yf.exam.modules.exam.entity.ExamRepo; // 导入考试题库实体类 -import java.util.List; +import java.util.List; // 导入Java的List接口 /** -*

-* 考试题库业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-05 11:14 -*/ -public interface ExamRepoService extends IService { - + *

+ * 考试题库业务类,提供考试题库的业务逻辑 + *

+ * 此类是一个服务接口,继承自MyBatis Plus的IService,用于定义考试题库相关的业务操作。 + * + * @author 聪明笨狗 + * @since 2020-09-05 11:14 + */ +public interface ExamRepoService extends IService { // 声明接口,继承自IService并指定操作的实体类为ExamRepo /** - * 保存全部 - * @param examId - * @param list + * 保存全部题库信息 + * 方法用于根据给定的考试ID和题库列表,保存考试与题库的关联关系。 + * + * @param examId 考试ID,标识要关联的考试 + * @param list 题库列表,包含要关联的题库信息 */ void saveAll(String examId, List list); /** * 查找考试题库列表 - * @param examId - * @return + * 方法用于根据给定的考试ID,查询与之关联的题库列表。 + * + * @param examId 考试ID,用于指定查询哪个考试的题库 + * @return List 返回题库列表,包含所有与考试关联的题库信息 */ List listByExam(String examId); /** * 清理脏数据 - * @param examId + * 方法用于清除与指定考试ID关联的题库数据,用于数据清理或重置场景。 + * + * @param examId 考试ID,用于指定要清理的考试关联的题库数据 */ void clear(String examId); - -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamService.java b/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamService.java index 3f75664..47d77b8 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamService.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/service/ExamService.java @@ -1,64 +1,75 @@ -package com.yf.exam.modules.exam.service; +package com.yf.exam.modules.exam.service; // 定义包名,服务接口所在的包路径 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -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.baomidou.mybatisplus.core.metadata.IPage; // 导入MyBatis Plus的分页结果接口 +import com.baomidou.mybatisplus.extension.service.IService; // 导入MyBatis Plus的服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求DTO +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入考试DTO +import com.yf.exam.modules.exam.dto.request.ExamSaveReqDTO; // 导入考试保存请求DTO +import com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO; // 导入在线考试响应DTO +import com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO; // 导入阅卷响应DTO +import com.yf.exam.modules.exam.entity.Exam; // 导入考试实体类 /** -*

-* 考试业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -public interface ExamService extends IService { + *

+ * 考试业务类,提供考试的业务逻辑 + *

+ * 此类是一个服务接口,继承自MyBatis Plus的IService,用于定义考试相关的业务操作。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +public interface ExamService extends IService { // 声明接口,继承自IService并指定操作的实体类为Exam /** * 保存考试信息 - * @param reqDTO + * 方法用于保存考试信息,包括考试的基本信息和相关联的题库、部门等。 + * + * @param reqDTO 考试保存请求数据传输对象,包含考试的详细信息 */ void save(ExamSaveReqDTO reqDTO); /** * 查找考试详情 - * @param id - * @return + * 方法用于根据考试ID查询考试的详细信息,包括考试的基本数据和相关联的部门、题库等。 + * + * @param id 考试ID,用于指定要查询的考试 + * @return ExamSaveReqDTO 返回考试详情,包含考试的详细信息 */ ExamSaveReqDTO findDetail(String id); /** * 查找考试详情--简要信息 - * @param id - * @return + * 方法用于根据考试ID查询考试的简要信息,通常用于列表展示。 + * + * @param id 考试ID,用于指定要查询的考试 + * @return ExamDTO 返回考试简要信息,包含考试的基本数据 */ ExamDTO findById(String id); /** - * 分页查询数据 - * @param reqDTO - * @return - */ + * 分页查询数据 + * 方法用于分页查询考试数据,通常用于列表展示。 + * + * @param reqDTO 分页请求数据传输对象,包含分页信息和查询条件 + * @return IPage 返回分页考试数据,包含考试列表和分页信息 + */ IPage paging(PagingReqDTO reqDTO); - /** * 在线考试分页响应类-考生视角 - * @param reqDTO - * @return + * 方法用于分页查询在线考试数据,从考生视角,通常用于考生查看可参加的考试列表。 + * + * @param reqDTO 分页请求数据传输对象,包含分页信息和查询条件 + * @return IPage 返回分页在线考试数据,包含在线考试列表和分页信息 */ IPage onlinePaging(PagingReqDTO reqDTO); - /** * 待阅试卷列表 - * @param reqDTO - * @return + * 方法用于分页查询待阅试卷数据,通常用于阅卷老师查看需要批改的试卷列表。 + * + * @param reqDTO 分页请求数据传输对象,包含分页信息和查询条件 + * @return IPage 返回分页待阅试卷数据,包含待阅试卷列表和分页信息 */ IPage reviewPaging(PagingReqDTO reqDTO); -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamDepartServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamDepartServiceImpl.java index 37ca2ff..3460e7c 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamDepartServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamDepartServiceImpl.java @@ -1,66 +1,64 @@ -package com.yf.exam.modules.exam.service.impl; +package com.yf.exam.modules.exam.service.impl; // 定义包名,服务实现类所在的包路径 -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.exception.ServiceException; -import com.yf.exam.modules.exam.entity.ExamDepart; -import com.yf.exam.modules.exam.mapper.ExamDepartMapper; -import com.yf.exam.modules.exam.service.ExamDepartService; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入MyBatis Plus的查询包装类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入MyBatis Plus的服务实现类 +import com.yf.exam.core.exception.ServiceException; // 导入自定义的服务异常类 +import com.yf.exam.modules.exam.entity.ExamDepart; // 导入考试部门实体类 +import com.yf.exam.modules.exam.mapper.ExamDepartMapper; // 导入考试部门Mapper接口 +import com.yf.exam.modules.exam.service.ExamDepartService; // 导入考试部门服务接口 +import org.springframework.stereotype.Service; // 导入Spring的服务注解 +import org.springframework.util.CollectionUtils; // 导入Spring的集合工具类 -import java.util.ArrayList; -import java.util.List; +import java.util.ArrayList; // 导入Java的ArrayList类 +import java.util.List; // 导入Java的List接口 /** -*

-* 考试部门业务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-03 17:24 -*/ -@Service -public class ExamDepartServiceImpl extends ServiceImpl implements ExamDepartService { + *

+ * 考试部门业务实现类,提供考试部门的具体业务逻辑实现 + *

+ * 此类实现了ExamDepartService接口,用于处理考试部门相关的业务逻辑。 + * + * @author 聪明笨狗 + * @since 2020-09-03 17:24 + */ +@Service // Spring注解,声明这是一个服务组件 +public class ExamDepartServiceImpl extends ServiceImpl implements ExamDepartService { // 声明类,继承自ServiceImpl并实现ExamDepartService接口 @Override public void saveAll(String examId, List departs) { - - // 先删除 + // 先删除已有的部门 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(ExamDepart::getExamId, examId); - this.remove(wrapper); + wrapper.lambda().eq(ExamDepart::getExamId, examId); // 构造查询条件,查询指定考试ID的部门 + this.remove(wrapper); // 根据条件删除部门 - // 再增加 - if(CollectionUtils.isEmpty(departs)){ - throw new ServiceException(1, "请至少选择选择一个部门!!"); + // 再增加新的部门 + if (CollectionUtils.isEmpty(departs)) { // 检查部门列表是否为空 + throw new ServiceException(1, "请至少选择选择一个部门!!"); // 如果为空,抛出异常 } - List list = new ArrayList<>(); + List list = new ArrayList<>(); // 创建考试部门列表 - for(String id: departs){ - ExamDepart depart = new ExamDepart(); - depart.setDepartId(id); - depart.setExamId(examId); - list.add(depart); + for (String id : departs) { + ExamDepart depart = new ExamDepart(); // 创建考试部门对象 + depart.setDepartId(id); // 设置部门ID + depart.setExamId(examId); // 设置考试ID + list.add(depart); // 添加到列表 } - this.saveBatch(list); + this.saveBatch(list); // 批量保存部门 } @Override public List listByExam(String examId) { - // 先删除 + // 查找考试对应的部门 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(ExamDepart::getExamId, examId); - List list = this.list(wrapper); - List ids = new ArrayList<>(); - if(!CollectionUtils.isEmpty(list)){ - for(ExamDepart item: list){ - ids.add(item.getDepartId()); + wrapper.lambda().eq(ExamDepart::getExamId, examId); // 构造查询条件,查询指定考试ID的部门 + List list = this.list(wrapper); // 根据条件查询部门列表 + List ids = new ArrayList<>(); // 创建部门ID列表 + if (!CollectionUtils.isEmpty(list)) { // 检查部门列表是否为空 + for (ExamDepart item : list) { + ids.add(item.getDepartId()); // 添加部门ID到列表 } } - - return ids; - + return ids; // 返回部门ID列表 } -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamRepoServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamRepoServiceImpl.java index ea630e6..e161f56 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamRepoServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamRepoServiceImpl.java @@ -1,67 +1,63 @@ -package com.yf.exam.modules.exam.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.exception.ServiceException; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; -import com.yf.exam.modules.exam.entity.ExamRepo; -import com.yf.exam.modules.exam.mapper.ExamRepoMapper; -import com.yf.exam.modules.exam.service.ExamRepoService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -import java.util.List; +package com.yf.exam.modules.exam.service.impl; // 定义包名,服务实现类所在的包路径 + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入MyBatis Plus的查询包装类 +import com.baomidou.mybatisplus.core.toolkit.IdWorker; // 导入MyBatis Plus的ID生成工具类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入MyBatis Plus的服务实现类 +import com.yf.exam.core.exception.ServiceException; // 导入自定义的服务异常类 +import com.yf.exam.core.utils.BeanMapper; // 导入自定义的Bean映射工具类 +import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; // 导入考试题库扩展DTO +import com.yf.exam.modules.exam.entity.ExamRepo; // 导入考试题库实体类 +import com.yf.exam.modules.exam.mapper.ExamRepoMapper; // 导入考试题库Mapper接口 +import com.yf.exam.modules.exam.service.ExamRepoService; // 导入考试题库服务接口 +import org.springframework.stereotype.Service; // 导入Spring的服务注解 +import org.springframework.transaction.annotation.Transactional; // 导入Spring的事务注解 +import org.springframework.util.CollectionUtils; // 导入Spring的集合工具类 + +import java.util.List; // 导入Java的List接口 /** -*

-* 考试题库业务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-05 11:14 -*/ -@Service -public class ExamRepoServiceImpl extends ServiceImpl implements ExamRepoService { - - - @Transactional(rollbackFor = Exception.class) + *

+ * 考试题库业务实现类,提供考试题库的具体业务逻辑实现 + *

+ * 此类实现了ExamRepoService接口,用于处理考试题库相关的业务逻辑。 + * + * @author 聪明笨狗 + * @since 2020-09-05 11:14 + */ +@Service // Spring注解,声明这是一个服务组件 +public class ExamRepoServiceImpl extends ServiceImpl implements ExamRepoService { // 声明类,继承自ServiceImpl并实现ExamRepoService接口 + + @Transactional(rollbackFor = Exception.class) // Spring事务注解,声明事务边界和回滚条件 @Override public void saveAll(String examId, List list) { - - // 先删除 + // 先删除已有的题库 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(ExamRepo::getExamId, examId); - this.remove(wrapper); + wrapper.lambda().eq(ExamRepo::getExamId, examId); // 构造查询条件,查询指定考试ID的题库 + this.remove(wrapper); // 根据条件删除题库 - // 再增加 - if(CollectionUtils.isEmpty(list)){ - throw new ServiceException(1, "必须选择题库!"); + // 再增加新的题库 + if (CollectionUtils.isEmpty(list)) { // 检查题库列表是否为空 + throw new ServiceException(1, "必须选择题库!"); // 如果为空,抛出异常 } - List repos = BeanMapper.mapList(list, ExamRepo.class); - for(ExamRepo item: repos){ - item.setExamId(examId); - item.setId(IdWorker.getIdStr()); + List repos = BeanMapper.mapList(list, ExamRepo.class); // 使用BeanMapper将DTO列表转换为实体类列表 + for (ExamRepo item : repos) { + item.setExamId(examId); // 设置考试ID + item.setId(IdWorker.getIdStr()); // 使用IdWorker生成ID } - this.saveBatch(repos); + this.saveBatch(repos); // 批量保存题库 } @Override public List listByExam(String examId) { - return baseMapper.listByExam(examId); + return baseMapper.listByExam(examId); // 调用Mapper接口的方法,查找考试题库列表 } @Override public void clear(String examId) { - - // 先删除 + // 先删除已有的题库 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(ExamRepo::getExamId, examId); - this.remove(wrapper); + wrapper.lambda().eq(ExamRepo::getExamId, examId); // 构造查询条件,查询指定考试ID的题库 + this.remove(wrapper); // 根据条件删除题库 } - - -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamServiceImpl.java index 7451bd9..50ae151 100644 --- a/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/exam/service/impl/ExamServiceImpl.java @@ -1,194 +1,173 @@ -package com.yf.exam.modules.exam.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.enums.OpenType; -import com.yf.exam.core.exception.ServiceException; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.exam.dto.ExamDTO; -import com.yf.exam.modules.exam.dto.ExamRepoDTO; -import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; -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.mapper.ExamMapper; -import com.yf.exam.modules.exam.service.ExamDepartService; -import com.yf.exam.modules.exam.service.ExamRepoService; -import com.yf.exam.modules.exam.service.ExamService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.stereotype.Service; - -import java.util.List; +package com.yf.exam.modules.exam.service.impl; // 定义包名,服务实现类所在的包路径 + +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入MyBatis Plus的分页结果接口 +import com.baomidou.mybatisplus.core.toolkit.IdWorker; // 导入MyBatis Plus的ID生成工具类 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入MyBatis Plus的分页对象 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入MyBatis Plus的服务实现类 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求DTO +import com.yf.exam.core.enums.OpenType; // 导入开放类型枚举 +import com.yf.exam.core.exception.ServiceException; // 导入自定义的服务异常类 +import com.yf.exam.core.utils.BeanMapper; // 导入自定义的Bean映射工具类 +import com.yf.exam.modules.exam.dto.ExamDTO; // 导入考试DTO +import com.yf.exam.modules.exam.dto.ExamRepoDTO; // 导入考试题库DTO +import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; // 导入考试题库扩展DTO +import com.yf.exam.modules.exam.dto.request.ExamSaveReqDTO; // 导入考试保存请求DTO +import com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO; // 导入在线考试响应DTO +import com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO; // 导入阅卷响应DTO +import com.yf.exam.modules.exam.entity.Exam; // 导入考试实体类 +import com.yf.exam.modules.exam.mapper.ExamMapper; // 导入考试Mapper接口 +import com.yf.exam.modules.exam.service.ExamDepartService; // 导入考试部门服务接口 +import com.yf.exam.modules.exam.service.ExamRepoService; // 导入考试题库服务接口 +import com.yf.exam.modules.exam.service.ExamService; // 导入考试服务接口 +import org.apache.commons.lang3.StringUtils; // 导入Apache Commons Lang的字符串工具类 +import org.springframework.beans.factory.annotation.Autowired; // 导入Spring的自动注入注解 +import org.springframework.dao.DuplicateKeyException; // 导入Spring的重复键异常类 +import org.springframework.stereotype.Service; // 导入Spring的服务注解 + +import java.util.List; // 导入Java的List接口 /** -*

-* 考试业务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-07-25 16:18 -*/ -@Service -public class ExamServiceImpl extends ServiceImpl implements ExamService { - + *

+ * 考试业务实现类 + *

+ * 此类实现了ExamService接口,用于处理考试相关的业务逻辑。 + * + * @author 聪明笨狗 + * @since 2020-07-25 16:18 + */ +@Service // Spring注解,声明这是一个服务组件 +public class ExamServiceImpl extends ServiceImpl implements ExamService { // 声明类,继承自ServiceImpl并实现ExamService接口 @Autowired - private ExamRepoService examRepoService; + private ExamRepoService examRepoService; // 自动注入考试题库服务 @Autowired - private ExamDepartService examDepartService; + private ExamDepartService examDepartService; // 自动注入考试部门服务 @Override public void save(ExamSaveReqDTO reqDTO) { - // ID String id = reqDTO.getId(); - if(StringUtils.isBlank(id)){ - id = IdWorker.getIdStr(); + if(StringUtils.isBlank(id)){ // 如果ID为空,则生成新的ID + id = IdWorker.getIdStr(); // 使用IdWorker生成ID } - //复制参数 - Exam entity = new Exam(); + // 复制参数 + Exam entity = new Exam(); // 创建考试实体 // 计算分值 - this.calcScore(reqDTO); - + this.calcScore(reqDTO); // 调用方法计算分值 // 复制基本数据 - BeanMapper.copy(reqDTO, entity); - entity.setId(id); + BeanMapper.copy(reqDTO, entity); // 使用BeanMapper复制属性 + entity.setId(id); // 设置ID // 修复状态 - if (reqDTO.getTimeLimit()!=null + if (reqDTO.getTimeLimit() != null && !reqDTO.getTimeLimit() - && reqDTO.getState()!=null + && reqDTO.getState() != null && reqDTO.getState() == 2) { - entity.setState(0); + entity.setState(0); // 如果不限时且状态为2,则状态设置为0 } else { - entity.setState(reqDTO.getState()); + entity.setState(reqDTO.getState()); // 否则直接设置状态 } // 题库组卷 try { - examRepoService.saveAll(id, reqDTO.getRepoList()); + examRepoService.saveAll(id, reqDTO.getRepoList()); // 调用考试题库服务保存题库 }catch (DuplicateKeyException e){ - throw new ServiceException(1, "不能选择重复的题库!"); + throw new ServiceException(1, "不能选择重复的题库!"); // 如果出现重复键异常,则抛出服务异常 } - // 开放的部门 - if(OpenType.DEPT_OPEN.equals(reqDTO.getOpenType())){ - examDepartService.saveAll(id, reqDTO.getDepartIds()); + if(OpenType.DEPT_OPEN.equals(reqDTO.getOpenType())){ // 如果开放类型为部门开放 + examDepartService.saveAll(id, reqDTO.getDepartIds()); // 调用考试部门服务保存部门 } - this.saveOrUpdate(entity); - + this.saveOrUpdate(entity); // 保存或更新考试实体 } @Override public ExamSaveReqDTO findDetail(String id) { - ExamSaveReqDTO respDTO = new ExamSaveReqDTO(); - Exam exam = this.getById(id); - BeanMapper.copy(exam, respDTO); + ExamSaveReqDTO respDTO = new ExamSaveReqDTO(); // 创建响应DTO + Exam exam = this.getById(id); // 根据ID查询考试实体 + BeanMapper.copy(exam, respDTO); // 使用BeanMapper复制属性 // 考试部门 - List departIds = examDepartService.listByExam(id); - respDTO.setDepartIds(departIds); + List departIds = examDepartService.listByExam(id); // 调用考试部门服务查询部门ID列表 + respDTO.setDepartIds(departIds); // 设置部门ID列表 // 题库 - List repos = examRepoService.listByExam(id); - respDTO.setRepoList(repos); + List repos = examRepoService.listByExam(id); // 调用考试题库服务查询题库列表 + respDTO.setRepoList(repos); // 设置题库列表 - return respDTO; + return respDTO; // 返回响应DTO } @Override public ExamDTO findById(String id) { - ExamDTO respDTO = new ExamDTO(); - Exam exam = this.getById(id); - BeanMapper.copy(exam, respDTO); - return respDTO; + ExamDTO respDTO = new ExamDTO(); // 创建响应DTO + Exam exam = this.getById(id); // 根据ID查询考试实体 + BeanMapper.copy(exam, respDTO); // 使用BeanMapper复制属性 + return respDTO; // 返回响应DTO } @Override public IPage paging(PagingReqDTO reqDTO) { + // 创建分页对象 + Page page = new Page(reqDTO.getCurrent(), reqDTO.getSize()); // 使用分页请求DTO创建分页对象 - //创建分页对象 - Page page = new Page(reqDTO.getCurrent(), reqDTO.getSize()); - - //转换结果 - IPage pageData = baseMapper.paging(page, reqDTO.getParams()); - return pageData; - } + // 转换结果 + IPage pageData = baseMapper.paging(page, reqDTO.getParams()); // 调用Mapper接口的分页方法 + return pageData; // 返回分页结果 + } @Override public IPage onlinePaging(PagingReqDTO reqDTO) { - - // 创建分页对象 - Page page = new Page(reqDTO.getCurrent(), reqDTO.getSize()); + Page page = new Page(reqDTO.getCurrent(), reqDTO.getSize()); // 使用分页请求DTO创建分页对象 // 查找分页 - IPage pageData = baseMapper.online(page, reqDTO.getParams()); - - return pageData; + IPage pageData = baseMapper.online(page, reqDTO.getParams()); // 调用Mapper接口的在线考试分页方法 + return pageData; // 返回分页结果 } @Override public IPage reviewPaging(PagingReqDTO reqDTO) { // 创建分页对象 - Page page = new Page(reqDTO.getCurrent(), reqDTO.getSize()); + Page page = new Page(reqDTO.getCurrent(), reqDTO.getSize()); // 使用分页请求DTO创建分页对象 // 查找分页 - IPage pageData = baseMapper.reviewPaging(page, reqDTO.getParams()); - - return pageData; + IPage pageData = baseMapper.reviewPaging(page, reqDTO.getParams()); // 调用Mapper接口的阅卷分页方法 + return pageData; // 返回分页结果 } - /** * 计算分值 - * @param reqDTO + * 方法用于计算考试的总分值,根据题库中的题目数量和分数。 + * + * @param reqDTO 考试保存请求DTO */ - private void calcScore(ExamSaveReqDTO reqDTO){ - + private void calcScore(ExamSaveReqDTO reqDTO) { // 主观题分数 int objScore = 0; // 题库组卷 - List repoList = reqDTO.getRepoList(); - - for(ExamRepoDTO item: repoList){ - if(item.getRadioCount()!=null - && item.getRadioCount()>0 - && item.getRadioScore()!=null - && item.getRadioScore()>0){ - objScore+=item.getRadioCount()*item.getRadioScore(); + List repoList = reqDTO.getRepoList(); // 获取题库列表 + + for(ExamRepoDTO item : repoList){ // 遍历题库列表 + if(item.getRadioCount() != null && item.getRadioCount() > 0 && item.getRadioScore() != null && item.getRadioScore() > 0){ + objScore += item.getRadioCount() * item.getRadioScore(); // 计算单选题分数 } - if(item.getMultiCount()!=null - && item.getMultiCount()>0 - && item.getMultiScore()!=null - && item.getMultiScore()>0){ - objScore+=item.getMultiCount()*item.getMultiScore(); + if(item.getMultiCount() != null && item.getMultiCount() > 0 && item.getMultiScore() != null && item.getMultiScore() > 0){ + objScore += item.getMultiCount() * item.getMultiScore(); // 计算多选题分数 } - if(item.getJudgeCount()!=null - && item.getJudgeCount()>0 - && item.getJudgeScore()!=null - && item.getJudgeScore()>0){ - objScore+=item.getJudgeCount()*item.getJudgeScore(); + if(item.getJudgeCount() != null && item.getJudgeCount() > 0 && item.getJudgeScore() != null && item.getJudgeScore() > 0){ + objScore += item.getJudgeCount() * item.getJudgeScore(); // 计算判断题分数 } } - - - reqDTO.setTotalScore(objScore); + reqDTO.setTotalScore(objScore); // 设置总分值 } - -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/controller/PaperController.java b/src-源文件/main/java/com/yf/exam/modules/paper/controller/PaperController.java index 5549670..a3ad8ed 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/controller/PaperController.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/controller/PaperController.java @@ -1,13 +1,19 @@ -package com.yf.exam.modules.paper.controller; +package com.yf.exam.modules.paper.controller; // 定义当前类所在的包路径 +// 引入分页查询结果的接口 import com.baomidou.mybatisplus.core.metadata.IPage; +// 引入统一的API响应封装类 import com.yf.exam.core.api.ApiRest; +// 引入基础控制器类,提供通用的API响应方法 import com.yf.exam.core.api.controller.BaseController; +// 引入各种DTO类,用于请求和响应数据传输 import com.yf.exam.core.api.dto.BaseIdReqDTO; import com.yf.exam.core.api.dto.BaseIdRespDTO; import com.yf.exam.core.api.dto.BaseIdsReqDTO; import com.yf.exam.core.api.dto.PagingReqDTO; +// 引入工具类,用于对象之间的属性拷贝 import com.yf.exam.core.utils.BeanMapper; +// 引入试卷相关的DTO类 import com.yf.exam.modules.paper.dto.PaperDTO; import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; import com.yf.exam.modules.paper.dto.request.PaperAnswerDTO; @@ -17,14 +23,22 @@ import com.yf.exam.modules.paper.dto.request.PaperQuQueryDTO; import com.yf.exam.modules.paper.dto.response.ExamDetailRespDTO; import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO; import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; +// 引入试卷实体类 import com.yf.exam.modules.paper.entity.Paper; +// 引入试卷相关的业务处理服务类 import com.yf.exam.modules.paper.service.PaperService; +// 引入用户工具类,获取当前登录用户信息 import com.yf.exam.modules.user.UserUtils; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +// 引入Shiro注解,用于角色权限管理 import org.apache.shiro.authz.annotation.RequiresRoles; +// 引入Spring的Bean工具类,用于属性复制 import org.springframework.beans.BeanUtils; +// 引入Spring的自动注入注解,用于自动注入服务 import org.springframework.beans.factory.annotation.Autowired; +// 引入Spring的Web注解,定义HTTP请求的映射方式 import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -34,123 +48,126 @@ import org.springframework.web.bind.annotation.RestController; *

* 试卷控制器 *

-* +* 提供有关试卷的操作,如分页查询、创建试卷、查看试卷详情等 * @author 聪明笨狗 * @since 2020-05-25 16:33 */ -@Api(tags={"试卷"}) -@RestController -@RequestMapping("/exam/api/paper/paper") -public class PaperController extends BaseController { +@Api(tags={"试卷"}) // Swagger API 文档注解,用于描述该接口属于试卷相关操作 +@RestController // 标记为Spring的控制器,处理HTTP请求 +@RequestMapping("/exam/api/paper/paper") // 定义请求路径的基础路径 +public class PaperController extends BaseController { // 继承BaseController类,提供基本的API返回 - @Autowired + @Autowired // 自动注入PaperService,负责业务逻辑处理 private PaperService baseService; /** - * 分页查找 - * @param reqDTO - * @return + * 分页查找试卷列表 + * @param reqDTO 包含分页信息和查询条件的请求数据 + * @return 分页后的试卷列表 */ - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) + @ApiOperation(value = "分页查找") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/paging", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - //分页查询并转换 + // 调用业务层进行分页查询 IPage page = baseService.paging(reqDTO); + // 返回成功响应,并附带查询结果 return super.success(page); } - - /** * 创建试卷 - * @param reqDTO - * @return + * @param reqDTO 创建试卷所需的请求数据 + * @return 返回创建成功后的试卷ID */ - @ApiOperation(value = "创建试卷") - @RequestMapping(value = "/create-paper", method = { RequestMethod.POST}) + @ApiOperation(value = "创建试卷") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/create-paper", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest save(@RequestBody PaperCreateReqDTO reqDTO) { - //复制参数 + // 调用业务层创建试卷,传入当前用户ID和考试ID String paperId = baseService.createPaper(UserUtils.getUserId(), reqDTO.getExamId()); + // 返回创建结果,包括试卷ID return super.success(new BaseIdRespDTO(paperId)); } /** - * 批量删除 - * @param reqDTO - * @return + * 获取试卷详情 + * @param reqDTO 请求参数,包含试卷ID + * @return 返回试卷的详细信息 */ - @ApiOperation(value = "试卷详情") - @RequestMapping(value = "/paper-detail", method = { RequestMethod.POST}) + @ApiOperation(value = "试卷详情") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/paper-detail", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest paperDetail(@RequestBody BaseIdReqDTO reqDTO) { - //根据ID删除 + // 调用业务层获取试卷详情 ExamDetailRespDTO respDTO = baseService.paperDetail(reqDTO.getId()); + // 返回成功响应,并附带试卷详情 return super.success(respDTO); } /** - * 批量删除 - * @param reqDTO - * @return + * 获取试题详情 + * @param reqDTO 请求参数,包含试卷ID和试题ID + * @return 返回试题的详细信息 */ - @ApiOperation(value = "试题详情") - @RequestMapping(value = "/qu-detail", method = { RequestMethod.POST}) + @ApiOperation(value = "试题详情") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/qu-detail", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest quDetail(@RequestBody PaperQuQueryDTO reqDTO) { - //根据ID删除 + // 调用业务层获取试题详情 PaperQuDetailDTO respDTO = baseService.findQuDetail(reqDTO.getPaperId(), reqDTO.getQuId()); + // 返回成功响应,并附带试题详情 return super.success(respDTO); } /** * 填充答案 - * @param reqDTO - * @return + * @param reqDTO 请求数据,包含填充的答案 + * @return 返回操作成功的响应 */ - @ApiOperation(value = "填充答案") - @RequestMapping(value = "/fill-answer", method = { RequestMethod.POST}) + @ApiOperation(value = "填充答案") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/fill-answer", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest fillAnswer(@RequestBody PaperAnswerDTO reqDTO) { - //根据ID删除 + // 调用业务层填充答案操作 baseService.fillAnswer(reqDTO); + // 返回成功响应 return super.success(); } - /** * 交卷操作 - * @param reqDTO - * @return + * @param reqDTO 请求数据,包含试卷ID + * @return 返回交卷操作成功的响应 */ - @ApiOperation(value = "交卷操作") - @RequestMapping(value = "/hand-exam", method = { RequestMethod.POST}) + @ApiOperation(value = "交卷操作") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/hand-exam", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest handleExam(@RequestBody BaseIdReqDTO reqDTO) { - //根据ID删除 + // 调用业务层进行交卷操作 baseService.handExam(reqDTO.getId()); + // 返回成功响应 return super.success(); } - /** - * 批量删除 - * @param reqDTO - * @return + * 获取试卷结果 + * @param reqDTO 请求数据,包含试卷ID + * @return 返回试卷的考试结果 */ - @ApiOperation(value = "试卷详情") - @RequestMapping(value = "/paper-result", method = { RequestMethod.POST}) + @ApiOperation(value = "试卷结果") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/paper-result", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest paperResult(@RequestBody BaseIdReqDTO reqDTO) { - //根据ID删除 + // 调用业务层获取试卷的考试结果 ExamResultRespDTO respDTO = baseService.paperResult(reqDTO.getId()); + // 返回成功响应,并附带试卷结果 return super.success(respDTO); } - /** * 检测用户有没有中断的考试 - * @return + * @return 返回用户未完成的考试信息 */ - @ApiOperation(value = "检测进行中的考试") - @RequestMapping(value = "/check-process", method = { RequestMethod.POST}) + @ApiOperation(value = "检测进行中的考试") // Swagger操作注解,用于描述接口 + @RequestMapping(value = "/check-process", method = { RequestMethod.POST}) // 定义POST请求路径 public ApiRest checkProcess() { - //复制参数 + // 调用业务层检测用户是否有未完成的考试 PaperDTO dto = baseService.checkProcess(UserUtils.getUserId()); + // 返回成功响应,并附带考试进程数据 return super.success(dto); } } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperDTO.java index dcfb9ef..8b59dcb 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperDTO.java @@ -1,79 +1,83 @@ -package com.yf.exam.modules.paper.dto; +package com.yf.exam.modules.paper.dto; // 定义当前类所在的包路径 +// 引入Dict注解,用于字典表的映射 import com.yf.exam.core.annon.Dict; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入Serializable接口,用于对象序列化 import java.io.Serializable; +// 引入Date类,用于表示日期和时间 import java.util.Date; /** -*

-* 试卷请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@ApiModel(value="试卷", description="试卷") -public class PaperDTO implements Serializable { - - private static final long serialVersionUID = 1L; + *

+ * 试卷请求类 + *

+ * 该类用于传输试卷的基本信息,包含试卷的ID、考试规则、标题、时长、得分等字段。 + * 提供了试卷的详细信息,通常在查询和展示试卷时使用。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷", description="试卷") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperDTO implements Serializable { // 实现Serializable接口,表示该类的对象可以被序列化 + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 - @ApiModelProperty(value = "试卷ID", required=true) - private String id; + @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String id; // 试卷ID - @Dict(dictTable = "sys_user", dicText = "real_name", dicCode = "id") - @ApiModelProperty(value = "用户ID", required=true) - private String userId; + @Dict(dictTable = "sys_user", dicText = "real_name", dicCode = "id") // 字典表映射,映射用户表的姓名字段 + @ApiModelProperty(value = "用户ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String userId; // 用户ID - @Dict(dictTable = "sys_depart", dicText = "dept_name", dicCode = "id") - @ApiModelProperty(value = "部门ID", required=true) - private String departId; + @Dict(dictTable = "sys_depart", dicText = "dept_name", dicCode = "id") // 字典表映射,映射部门表的部门名称字段 + @ApiModelProperty(value = "部门ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String departId; // 部门ID - @ApiModelProperty(value = "规则ID", required=true) - private String examId; + @ApiModelProperty(value = "规则ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String examId; // 规则ID,表示该试卷对应的考试规则 - @ApiModelProperty(value = "考试标题", required=true) - private String title; + @ApiModelProperty(value = "考试标题", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String title; // 考试标题,表示试卷的名称 - @ApiModelProperty(value = "考试时长", required=true) - private Integer totalTime; + @ApiModelProperty(value = "考试时长", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer totalTime; // 考试时长(单位:分钟) - @ApiModelProperty(value = "用户时长", required=true) - private Integer userTime; + @ApiModelProperty(value = "用户时长", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer userTime; // 用户已使用的时间(单位:分钟) - @ApiModelProperty(value = "试卷总分", required=true) - private Integer totalScore; + @ApiModelProperty(value = "试卷总分", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer totalScore; // 试卷总分 - @ApiModelProperty(value = "及格分", required=true) - private Integer qualifyScore; + @ApiModelProperty(value = "及格分", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer qualifyScore; // 及格分数 - @ApiModelProperty(value = "客观分", required=true) - private Integer objScore; + @ApiModelProperty(value = "客观分", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer objScore; // 客观题分数 - @ApiModelProperty(value = "主观分", required=true) - private Integer subjScore; + @ApiModelProperty(value = "主观分", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer subjScore; // 主观题分数 - @ApiModelProperty(value = "用户得分", required=true) - private Integer userScore; + @ApiModelProperty(value = "用户得分", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer userScore; // 用户得分 - @ApiModelProperty(value = "是否包含简答题", required=true) - private Boolean hasSaq; + @ApiModelProperty(value = "是否包含简答题", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Boolean hasSaq; // 是否包含简答题,布尔类型,表示该试卷是否有简答题 - @ApiModelProperty(value = "试卷状态", required=true) - private Integer state; + @ApiModelProperty(value = "试卷状态", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer state; // 试卷状态,表示试卷的当前状态,如未开始、进行中、已结束等 - @ApiModelProperty(value = "创建时间", required=true) - private Date createTime; + @ApiModelProperty(value = "创建时间", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Date createTime; // 创建时间,表示试卷的创建时间 - @ApiModelProperty(value = "更新时间", required=true) - private Date updateTime; + @ApiModelProperty(value = "更新时间", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Date updateTime; // 更新时间,表示试卷的最后更新时间 - @ApiModelProperty(value = "截止时间") - private Date limitTime; - + @ApiModelProperty(value = "截止时间") // Swagger注解,描述该字段在API文档中的含义 + private Date limitTime; // 截止时间,表示考试的最后提交时间 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuAnswerDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuAnswerDTO.java index e449e79..48672a7 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuAnswerDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuAnswerDTO.java @@ -1,48 +1,50 @@ -package com.yf.exam.modules.paper.dto; +package com.yf.exam.modules.paper.dto; // 定义当前类所在的包路径 +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入Serializable接口,用于对象序列化 import java.io.Serializable; /** -*

-* 试卷考题备选答案请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") -public class PaperQuAnswerDTO implements Serializable { - - private static final long serialVersionUID = 1L; + *

+ * 试卷考题备选答案请求类 + *

+ * 该类用于表示试卷考题的备选答案,包含每个备选答案的ID、题目ID、选项标签、是否选中等信息。 + * 适用于考题答案的请求传输。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperQuAnswerDTO implements Serializable { // 实现Serializable接口,表示该类的对象可以被序列化 + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 - @ApiModelProperty(value = "自增ID", required=true) - private String id; + @ApiModelProperty(value = "自增ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String id; // 自增ID,表示备选答案的唯一标识符 - @ApiModelProperty(value = "试卷ID", required=true) - private String paperId; + @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String paperId; // 试卷ID,表示该备选答案所属的试卷 - @ApiModelProperty(value = "回答项ID", required=true) - private String answerId; + @ApiModelProperty(value = "回答项ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String answerId; // 回答项ID,表示该备选答案的唯一标识符 - @ApiModelProperty(value = "题目ID", required=true) - private String quId; + @ApiModelProperty(value = "题目ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String quId; // 题目ID,表示该备选答案所属的题目 - @ApiModelProperty(value = "是否正确项", required=true) - private Boolean isRight; + @ApiModelProperty(value = "是否正确项", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Boolean isRight; // 是否正确项,布尔值,表示该备选答案是否是正确答案 - @ApiModelProperty(value = "是否选中", required=true) - private Boolean checked; + @ApiModelProperty(value = "是否选中", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Boolean checked; // 是否选中,布尔值,表示该备选答案是否已被选中 - @ApiModelProperty(value = "排序", required=true) - private Integer sort; + @ApiModelProperty(value = "排序", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer sort; // 排序,表示该备选答案在题目中的排序位置 - @ApiModelProperty(value = "选项标签", required=true) - private String abc; - + @ApiModelProperty(value = "选项标签", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String abc; // 选项标签,通常为 A、B、C、D 等,表示该备选答案的标识符 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuDTO.java index 349868e..05bf6d7 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/PaperQuDTO.java @@ -1,54 +1,55 @@ -package com.yf.exam.modules.paper.dto; +package com.yf.exam.modules.paper.dto; // 定义当前类所在的包路径 +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入Serializable接口,用于对象序列化 import java.io.Serializable; /** -*

-* 试卷考题请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@ApiModel(value="试卷考题", description="试卷考题") -public class PaperQuDTO implements Serializable { - - private static final long serialVersionUID = 1L; + *

+ * 试卷考题请求类 + *

+ * 该类用于表示试卷中的每一道题目,包含题目的基本信息,如题目ID、试卷ID、题目类型、是否答对、得分等。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷考题", description="试卷考题") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperQuDTO implements Serializable { // 实现Serializable接口,表示该类的对象可以被序列化 + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 - @ApiModelProperty(value = "ID", required=true) - private String id; + @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String id; // 题目ID,唯一标识符 - @ApiModelProperty(value = "试卷ID", required=true) - private String paperId; + @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String paperId; // 试卷ID,表示该题目所属的试卷 - @ApiModelProperty(value = "题目ID", required=true) - private String quId; + @ApiModelProperty(value = "题目ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String quId; // 题目ID,唯一标识该题目 - @ApiModelProperty(value = "题目类型", required=true) - private Integer quType; + @ApiModelProperty(value = "题目类型", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer quType; // 题目类型,表示题目的分类,如选择题、判断题、主观题等 - @ApiModelProperty(value = "是否已答", required=true) - private Boolean answered; + @ApiModelProperty(value = "是否已答", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Boolean answered; // 是否已答,布尔值,表示该题目是否已被回答 - @ApiModelProperty(value = "主观答案", required=true) - private String answer; + @ApiModelProperty(value = "主观答案", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String answer; // 主观答案,表示对该题目的回答内容(适用于主观题) - @ApiModelProperty(value = "问题排序", required=true) - private Integer sort; + @ApiModelProperty(value = "问题排序", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer sort; // 问题排序,表示该题目在试卷中的顺序 - @ApiModelProperty(value = "单题分分值", required=true) - private Integer score; + @ApiModelProperty(value = "单题分分值", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer score; // 单题分值,表示该题目的满分 - @ApiModelProperty(value = "实际得分(主观题)", required=true) - private Integer actualScore; + @ApiModelProperty(value = "实际得分(主观题)", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer actualScore; // 实际得分,表示用户在该题目中实际得到的分数(适用于主观题) - @ApiModelProperty(value = "是否答对", required=true) - private Boolean isRight; - + @ApiModelProperty(value = "是否答对", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Boolean isRight; // 是否答对,布尔值,表示用户是否答对了该题目 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuAnswerExtDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuAnswerExtDTO.java index 3124d9e..357808a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuAnswerExtDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuAnswerExtDTO.java @@ -1,29 +1,30 @@ -package com.yf.exam.modules.paper.dto.ext; +package com.yf.exam.modules.paper.dto.ext; // 定义该类所在的包路径 +// 引入试题答案DTO类,作为当前类的父类 import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; /** *

* 试卷考题备选答案请求类 *

-* +* 该类用于描述试卷考题的备选答案信息,继承自PaperQuAnswerDTO,扩展了额外的字段,如图片和内容。 * @author 聪明笨狗 * @since 2020-05-25 17:31 */ -@Data -@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") -public class PaperQuAnswerExtDTO extends PaperQuAnswerDTO { +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") // Swagger注解,描述模型信息,生成API文档时使用 +public class PaperQuAnswerExtDTO extends PaperQuAnswerDTO { // 继承自PaperQuAnswerDTO类,扩展了额外属性 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化时的版本控制 - @ApiModelProperty(value = "试题图片", required=true) - private String image; + @ApiModelProperty(value = "试题图片", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String image; // 试题对应的图片内容 - @ApiModelProperty(value = "答案内容", required=true) - private String content; - - + @ApiModelProperty(value = "答案内容", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String content; // 备选答案的具体内容 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuDetailDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuDetailDTO.java index ee1e998..e2d693b 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuDetailDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/ext/PaperQuDetailDTO.java @@ -1,32 +1,35 @@ -package com.yf.exam.modules.paper.dto.ext; +package com.yf.exam.modules.paper.dto.ext; // 定义当前类所在的包路径 +// 引入试题DTO类,作为当前类的父类 import com.yf.exam.modules.paper.dto.PaperQuDTO; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入List集合,用于存储多个备选答案 import java.util.List; /** *

* 试卷考题请求类 *

-* +* 该类用于描述试卷中每个考题的详细信息,继承自PaperQuDTO,扩展了试题的图片、内容和答案列表等字段。 * @author 聪明笨狗 * @since 2020-05-25 17:31 */ -@Data -@ApiModel(value="试卷题目详情类", description="试卷题目详情类") -public class PaperQuDetailDTO extends PaperQuDTO { +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷题目详情类", description="试卷题目详情类") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperQuDetailDTO extends PaperQuDTO { // 继承自PaperQuDTO类,扩展了额外属性 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化时的版本控制 - @ApiModelProperty(value = "图片", required=true) - private String image; + @ApiModelProperty(value = "图片", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String image; // 题目的图片内容 - @ApiModelProperty(value = "题目内容", required=true) - private String content; + @ApiModelProperty(value = "题目内容", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String content; // 试题的具体内容 - @ApiModelProperty(value = "答案内容", required=true) - List answerList; + @ApiModelProperty(value = "答案内容", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private List answerList; // 存储该题目的备选答案,使用List集合存储多个答案 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperAnswerDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperAnswerDTO.java index ccbe3ce..25df4c6 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperAnswerDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperAnswerDTO.java @@ -1,22 +1,25 @@ -package com.yf.exam.modules.paper.dto.request; +package com.yf.exam.modules.paper.dto.request; // 定义当前类所在的包路径 +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入List集合,用于存储多个答案 import java.util.List; /** * @author bool + * 查找试卷题目详情请求类,用于接收查找试卷题目详情的请求数据。 + * 继承自PaperQuQueryDTO,扩展了回答列表和主观答案字段。 */ -@Data -@ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") -public class PaperAnswerDTO extends PaperQuQueryDTO { - - @ApiModelProperty(value = "回答列表", required=true) - private List answers; +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperAnswerDTO extends PaperQuQueryDTO { // 继承自PaperQuQueryDTO类,扩展了额外属性 - @ApiModelProperty(value = "主观答案", required=true) - private String answer; + @ApiModelProperty(value = "回答列表", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private List answers; // 存储多个选择题答案的列表 + @ApiModelProperty(value = "主观答案", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String answer; // 存储主观题的答案内容 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperCreateReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperCreateReqDTO.java index 6a8f8c5..22d11e9 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperCreateReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperCreateReqDTO.java @@ -1,22 +1,26 @@ -package com.yf.exam.modules.paper.dto.request; +package com.yf.exam.modules.paper.dto.request; // 定义当前类所在的包路径 +// 引入父类BaseDTO,用于继承基础字段和功能 import com.yf.exam.core.api.dto.BaseDTO; +// 引入Jackson注解,用于处理JSON序列化时忽略某些字段 import com.fasterxml.jackson.annotation.JsonIgnore; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; /** * @author bool + * 试卷创建请求类,用于接收试卷创建的请求数据,包含考试ID和用户ID等字段。 */ -@Data -@ApiModel(value="试卷创建请求类", description="试卷创建请求类") -public class PaperCreateReqDTO extends BaseDTO { +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷创建请求类", description="试卷创建请求类") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperCreateReqDTO extends BaseDTO { // 继承自BaseDTO类,扩展了考试ID和用户ID字段 - @JsonIgnore - private String userId; - - @ApiModelProperty(value = "考试ID", required=true) - private String examId; + @JsonIgnore // Jackson注解,表示在进行JSON序列化/反序列化时忽略该字段 + private String userId; // 存储用户ID,通常用于标识发起请求的用户,但在JSON序列化中不会被传递 + @ApiModelProperty(value = "考试ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String examId; // 存储考试ID,用于创建试卷时指定关联的考试 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperListReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperListReqDTO.java index c333241..a166dc8 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperListReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperListReqDTO.java @@ -1,39 +1,40 @@ -package com.yf.exam.modules.paper.dto.request; +package com.yf.exam.modules.paper.dto.request; // 定义当前类所在的包路径 +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入Serializable接口,用于对象序列化 import java.io.Serializable; /** *

* 试卷请求类 *

-* +* 该类用于接收请求数据,包含用户ID、部门ID、规则ID、用户昵称和试卷状态等信息, +* 用于查询试卷列表。 * @author 聪明笨狗 * @since 2020-05-25 17:31 */ -@Data -@ApiModel(value="试卷", description="试卷") -public class PaperListReqDTO implements Serializable { - - private static final long serialVersionUID = 1L; +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷", description="试卷") // Swagger注解,描述该类在API文档中的作用和说明 +public class PaperListReqDTO implements Serializable { // 实现Serializable接口,支持对象的序列化 - @ApiModelProperty(value = "用户ID", required=true) - private String userId; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化时的版本控制 - @ApiModelProperty(value = "部门ID", required=true) - private String departId; + @ApiModelProperty(value = "用户ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String userId; // 存储请求发起者的用户ID,通常用于标识用户 - @ApiModelProperty(value = "规则ID", required=true) - private String examId; + @ApiModelProperty(value = "部门ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String departId; // 存储请求者所在部门的ID,用于查询特定部门的试卷 - @ApiModelProperty(value = "用户昵称", required=true) - private String realName; + @ApiModelProperty(value = "规则ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String examId; // 存储与试卷相关的考试规则ID,用于标识试卷属于哪种考试 - @ApiModelProperty(value = "试卷状态", required=true) - private Integer state; + @ApiModelProperty(value = "用户昵称", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String realName; // 存储用户的真实姓名,用于标识请求者 - + @ApiModelProperty(value = "试卷状态", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private Integer state; // 存储试卷的状态,可能的值如:未开始、进行中、已完成等 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperQuQueryDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperQuQueryDTO.java index 48184b6..b91286c 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperQuQueryDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/request/PaperQuQueryDTO.java @@ -1,21 +1,25 @@ -package com.yf.exam.modules.paper.dto.request; +package com.yf.exam.modules.paper.dto.request; // 定义当前类所在的包路径 +// 引入父类BaseDTO,用于继承基础字段和功能 import com.yf.exam.core.api.dto.BaseDTO; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; /** * @author bool + * 查找试卷题目详情请求类,用于接收试卷和题目详情查询的请求数据。 + * 包含试卷ID和题目ID字段。 */ -@Data -@ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") -public class PaperQuQueryDTO extends BaseDTO { +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperQuQueryDTO extends BaseDTO { // 继承自BaseDTO类,扩展了试卷ID和题目ID字段 - @ApiModelProperty(value = "试卷ID", required=true) - private String paperId; - - @ApiModelProperty(value = "题目ID", required=true) - private String quId; + @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String paperId; // 存储试卷ID,用于查询特定试卷的题目详情 + @ApiModelProperty(value = "题目ID", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String quId; // 存储题目ID,用于查询指定试卷中的某一道题目 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamDetailRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamDetailRespDTO.java index c307c84..12aecf2 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamDetailRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamDetailRespDTO.java @@ -1,38 +1,48 @@ -package com.yf.exam.modules.paper.dto.response; +package com.yf.exam.modules.paper.dto.response; // 定义当前类所在的包路径 +// 引入父类PaperDTO,用于继承基础字段和功能 import com.yf.exam.modules.paper.dto.PaperDTO; +// 引入PaperQuDTO类,用于表示试题的DTO import com.yf.exam.modules.paper.dto.PaperQuDTO; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入Calendar类,用于时间计算 import java.util.Calendar; +// 引入List集合,用于存储试题列表 import java.util.List; -@Data -@ApiModel(value="考试详情", description="考试详情") -public class ExamDetailRespDTO extends PaperDTO { - +/** + *

+ * 考试详情响应类 + *

+ * 该类继承自PaperDTO,扩展了多个属性,包含单选题、多选题、判断题的列表, + * 以及计算剩余时间的方法,用于提供考试的详细信息。 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="考试详情", description="考试详情") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class ExamDetailRespDTO extends PaperDTO { // 继承自PaperDTO,表示考试详情响应DTO - @ApiModelProperty(value = "单选题列表", required=true) - private List radioList; + @ApiModelProperty(value = "单选题列表", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private List radioList; // 存储单选题的列表,使用PaperQuDTO表示单个试题 - @ApiModelProperty(value = "多选题列表", required=true) - private List multiList; + @ApiModelProperty(value = "多选题列表", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private List multiList; // 存储多选题的列表,使用PaperQuDTO表示单个试题 - @ApiModelProperty(value = "判断题", required=true) - private List judgeList; + @ApiModelProperty(value = "判断题", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private List judgeList; // 存储判断题的列表,使用PaperQuDTO表示单个试题 - - @ApiModelProperty(value = "剩余结束秒数", required=true) - public Long getLeftSeconds(){ + @ApiModelProperty(value = "剩余结束秒数", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + public Long getLeftSeconds(){ // 计算剩余时间的方法,返回剩余的秒数 // 结束时间 - Calendar cl = Calendar.getInstance(); - cl.setTime(this.getCreateTime()); - cl.add(Calendar.MINUTE, getTotalTime()); + Calendar cl = Calendar.getInstance(); // 获取当前时间的Calendar实例 + cl.setTime(this.getCreateTime()); // 设置Calendar的时间为试卷的创建时间 + cl.add(Calendar.MINUTE, getTotalTime()); // 在创建时间的基础上加上试卷的总时间(分钟) - return (cl.getTimeInMillis() - System.currentTimeMillis()) / 1000; + // 计算剩余时间(单位:秒) + return (cl.getTimeInMillis() - System.currentTimeMillis()) / 1000; // 返回剩余时间(当前时间到结束时间的差值,以秒为单位) } - } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamResultRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamResultRespDTO.java index 64af63d..26c9710 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamResultRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/ExamResultRespDTO.java @@ -1,18 +1,29 @@ -package com.yf.exam.modules.paper.dto.response; +package com.yf.exam.modules.paper.dto.response; // 定义当前类所在的包路径 +// 引入父类PaperDTO,用于继承基础字段和功能 import com.yf.exam.modules.paper.dto.PaperDTO; +// 引入PaperQuDetailDTO类,用于表示试题详细信息 import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入List集合,用于存储试题列表 import java.util.List; -@Data -@ApiModel(value="考试结果展示响应类", description="考试结果展示响应类") -public class ExamResultRespDTO extends PaperDTO { +/** + *

+ * 考试结果展示响应类 + *

+ * 该类继承自PaperDTO,扩展了问题列表字段,用于展示考试结果的详细信息。 + * 包含试题的详细信息列表,返回考试时各个问题的答案或状态。 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="考试结果展示响应类", description="考试结果展示响应类") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class ExamResultRespDTO extends PaperDTO { // 继承自PaperDTO,表示考试结果展示响应DTO - @ApiModelProperty(value = "问题列表", required=true) - private List quList; + @ApiModelProperty(value = "问题列表", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private List quList; // 存储试题详细信息的列表,使用PaperQuDetailDTO表示每个试题的详细数据 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/PaperListRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/PaperListRespDTO.java index 9e003e4..379de39 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/PaperListRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/dto/response/PaperListRespDTO.java @@ -1,26 +1,29 @@ -package com.yf.exam.modules.paper.dto.response; +package com.yf.exam.modules.paper.dto.response; // 定义当前类所在的包路径 +// 引入父类PaperDTO,用于继承基本的试卷信息 import com.yf.exam.modules.paper.dto.PaperDTO; +// 引入Swagger注解,用于API文档生成 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; /** -*

-* 试卷请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@ApiModel(value="试卷列表响应类", description="试卷列表响应类") -public class PaperListRespDTO extends PaperDTO { + *

+ * 试卷列表响应类 + *

+ * 该类继承自PaperDTO,扩展了人员(realName)字段,用于展示试卷列表响应数据。 + * 包含试卷的基本信息以及相关人员信息。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@ApiModel(value="试卷列表响应类", description="试卷列表响应类") // Swagger注解,用于描述该类在API文档中的作用和说明 +public class PaperListRespDTO extends PaperDTO { // 继承自PaperDTO,表示试卷列表响应DTO - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 - @ApiModelProperty(value = "人员", required=true) - private String realName; - - + @ApiModelProperty(value = "人员", required=true) // Swagger注解,描述该字段在API文档中的含义,并标注该字段为必填项 + private String realName; // 存储人员姓名,用于表示与该试卷相关的人员信息 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/entity/Paper.java b/src-源文件/main/java/com/yf/exam/modules/paper/entity/Paper.java index e219471..f6baaac 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/entity/Paper.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/entity/Paper.java @@ -1,125 +1,104 @@ -package com.yf.exam.modules.paper.entity; +package com.yf.exam.modules.paper.entity; // 定义当前类所在的包路径 +// 引入MyBatis Plus的相关注解 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; - +// 引入Date类,用于时间相关的字段 import java.util.Date; /** -*

-* 试卷实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@TableName("el_paper") -public class Paper extends Model { - - private static final long serialVersionUID = 1L; + *

+ * 试卷实体类 + *

+ * 该类对应数据库中的 `el_paper` 表,用于表示试卷的相关信息。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@TableName("el_paper") // MyBatis Plus注解,指定该实体类对应的数据库表名 +public class Paper extends Model { // 继承MyBatis Plus的Model类,提供了CRUD等基础操作 + + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 /** * 试卷ID */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定主键字段及其生成策略 + private String id; // 试卷ID,唯一标识符 /** * 用户ID */ - @TableField("user_id") - private String userId; + @TableField("user_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String userId; // 用户ID,表示创建该试卷的用户 /** * 部门ID */ - @TableField("depart_id") - private String departId; + @TableField("depart_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String departId; // 部门ID,表示该试卷所属的部门 /** * 规则ID */ - @TableField("exam_id") - private String examId; + @TableField("exam_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String examId; // 规则ID,表示该试卷所属的考试规则 /** * 考试标题 */ - private String title; + private String title; // 考试标题,表示试卷的名称或标题 /** * 考试时长 */ - @TableField("total_time") - private Integer totalTime; + @TableField("total_time") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer totalTime; // 考试时长,单位为分钟 /** * 用户时长 */ - @TableField("user_time") - private Integer userTime; + @TableField("user_time") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer userTime; // 用户实际用时,单位为分钟 /** * 试卷总分 */ - @TableField("total_score") - private Integer totalScore; + @TableField("total_score") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer totalScore; // 试卷的总分数 /** * 及格分 */ - @TableField("qualify_score") - private Integer qualifyScore; + @TableField("qualify_score") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer qualifyScore; // 及格分数,表示通过该试卷的最低分数 /** * 客观分 */ - @TableField("obj_score") - private Integer objScore; + @TableField("obj_score") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer objScore; // 客观题部分的得分 /** * 主观分 */ - @TableField("subj_score") - private Integer subjScore; + @TableField("subj_score") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer subjScore; // 主观题部分的得分 /** * 用户得分 */ - @TableField("user_score") - private Integer userScore; + @TableField("user_score") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer userScore; // 用户在该试卷上的得分 /** * 是否包含简答题 */ - @TableField("has_saq") - private Boolean hasSaq; - - /** - * 试卷状态 - */ - private Integer state; - - /** - * 创建时间 - */ - @TableField("create_time") - private Date createTime; - - /** - * 更新时间 - */ - @TableField("update_time") - private Date updateTime; - - /** - * 截止时间 - */ - @TableField("limit_time") - private Date limitTime; -} + @TableField("has_saq") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQu.java b/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQu.java index 3723791..f6be46d 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQu.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQu.java @@ -1,80 +1,82 @@ -package com.yf.exam.modules.paper.entity; +package com.yf.exam.modules.paper.entity; // 定义当前类所在的包路径 +// 引入MyBatis Plus的相关注解 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; /** -*

-* 试卷考题实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@TableName("el_paper_qu") -public class PaperQu extends Model { + *

+ * 试卷考题实体类 + *

+ * 该类对应数据库中的 `el_paper_qu` 表,用于表示与试卷相关的考题信息。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@TableName("el_paper_qu") // MyBatis Plus注解,指定该实体类对应的数据库表名 +public class PaperQu extends Model { // 继承MyBatis Plus的Model类,提供了基础的CRUD等操作 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 /** * ID */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定主键字段及其生成策略 + private String id; // 题目ID,唯一标识符 /** * 试卷ID */ - @TableField("paper_id") - private String paperId; + @TableField("paper_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String paperId; // 试卷ID,表示该题目所属的试卷ID /** * 题目ID */ - @TableField("qu_id") - private String quId; + @TableField("qu_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String quId; // 题目ID,唯一标识符 /** * 题目类型 */ - @TableField("qu_type") - private Integer quType; + @TableField("qu_type") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer quType; // 题目类型,表示该题目属于哪种类型(例如单选题、多选题、主观题等) /** * 是否已答 */ - private Boolean answered; + private Boolean answered; // 是否已经回答,布尔值,表示该题目是否已经被回答 /** * 主观答案 */ - private String answer; + private String answer; // 主观题的答案,保存用户的回答内容 /** * 问题排序 */ - private Integer sort; + private Integer sort; // 问题在试卷中的排序,决定题目的显示顺序 /** * 单题分分值 */ - private Integer score; + private Integer score; // 每道题的分值,表示该题目的得分值 /** * 实际得分(主观题) */ - @TableField("actual_score") - private Integer actualScore; + @TableField("actual_score") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Integer actualScore; // 主观题的实际得分,可能与用户给出的答案相关 /** * 是否答对 */ - @TableField("is_right") - private Boolean isRight; - + @TableField("is_right") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Boolean isRight; // 是否答对,布尔值,表示用户是否答对了该题目 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQuAnswer.java b/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQuAnswer.java index b3999da..78c17ce 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQuAnswer.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/entity/PaperQuAnswer.java @@ -1,68 +1,71 @@ -package com.yf.exam.modules.paper.entity; +package com.yf.exam.modules.paper.entity; // 定义当前类所在的包路径 +// 引入MyBatis Plus的相关注解 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +// 引入Lombok注解,用于自动生成getter、setter等方法 import lombok.Data; /** -*

-* 试卷考题备选答案实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 17:31 -*/ -@Data -@TableName("el_paper_qu_answer") -public class PaperQuAnswer extends Model { + *

+ * 试卷考题备选答案实体类 + *

+ * 该类对应数据库中的 `el_paper_qu_answer` 表,用于表示试卷考题的备选答案。 + * + * @author 聪明笨狗 + * @since 2020-05-25 17:31 + */ +@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode方法 +@TableName("el_paper_qu_answer") // MyBatis Plus注解,指定该实体类对应的数据库表名 +public class PaperQuAnswer extends Model { // 继承MyBatis Plus的Model类,提供了基础的CRUD等操作 + private static final long serialVersionUID = 1L; // 序列化版本ID,用于序列化和反序列化操作 /** * 自增ID */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定主键字段及其生成策略 + private String id; // 唯一标识符ID,数据库中的主键 /** * 试卷ID */ - @TableField("paper_id") - private String paperId; + @TableField("paper_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String paperId; // 该备选答案对应的试卷ID /** * 回答项ID */ - @TableField("answer_id") - private String answerId; + @TableField("answer_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String answerId; // 该备选答案的唯一标识符ID /** * 题目ID */ - @TableField("qu_id") - private String quId; + @TableField("qu_id") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private String quId; // 该备选答案所属的题目ID /** * 是否正确项 */ - @TableField("is_right") - private Boolean isRight; + @TableField("is_right") // MyBatis Plus注解,指定字段与数据库表字段的映射关系 + private Boolean isRight; // 是否是正确答案,布尔值(true 表示正确,false 表示错误) /** * 是否选中 */ - private Boolean checked; + private Boolean checked; // 该备选答案是否被选中,布尔值(true 表示已选中,false 表示未选中) /** * 排序 */ - private Integer sort; + private Integer sort; // 备选答案的排序,决定该答案在选项中的位置 /** * 选项标签 */ - private String abc; - + private String abc; // 备选答案的标签,通常为A、B、C、D等,用于显示选项 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/enums/ExamState.java b/src-源文件/main/java/com/yf/exam/modules/paper/enums/ExamState.java index a62f404..f681da9 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/enums/ExamState.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/enums/ExamState.java @@ -1,33 +1,38 @@ -package com.yf.exam.modules.paper.enums; - +package com.yf.exam.modules.paper.enums; // 定义当前类所在的包路径 /** - * 考试状态 - * @author bool + *

+ * 考试状态枚举接口 + *

+ * 该接口定义了考试的不同状态,作为常量使用,帮助系统在处理考试过程中进行状态标识。 + * + * @author bool * @date 2019-10-30 13:11 */ public interface ExamState { - /** * 考试中 + * 代表考试正在进行中,通常表示考试尚未结束,学生可以继续答题。 */ Integer ENABLE = 0; /** * 待阅卷 + * 代表考试已经结束,但还没有开始批阅试卷,通常表示考试已经提交,等待教师或系统自动阅卷。 */ Integer DISABLED = 1; /** * 已完成 + * 代表考试已经完成,阅卷完成,结果已公布,但没有开始考试。 */ Integer READY_START = 2; /** * 已结束 + * 代表考试已经结束,不再接受任何操作,考试时间已超出,无法继续答题。 */ Integer OVERDUE = 3; - } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/enums/PaperState.java b/src-源文件/main/java/com/yf/exam/modules/paper/enums/PaperState.java index ceed269..27e342c 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/enums/PaperState.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/enums/PaperState.java @@ -1,33 +1,38 @@ -package com.yf.exam.modules.paper.enums; - +package com.yf.exam.modules.paper.enums; // 定义当前类所在的包路径 /** - * 试卷状态 - * @author bool + *

+ * 试卷状态枚举接口 + *

+ * 该接口定义了试卷的不同状态,作为常量使用,帮助系统在处理试卷过程中进行状态标识。 + * + * @author bool * @date 2019-10-30 13:11 */ public interface PaperState { - /** * 考试中 + * 代表试卷正在进行中,学生正在参与考试,答题环节尚未结束。 */ Integer ING = 0; /** * 待阅卷 + * 代表考试已经结束,试卷已经提交,正在等待阅卷(人工或系统自动阅卷)。 */ Integer WAIT_OPT = 1; /** * 已完成 + * 代表试卷已完成,包括考试、阅卷等所有环节,成绩已经确定。 */ Integer FINISHED = 2; /** * 弃考 + * 代表学生中途放弃考试,考试未完成,可能是由于学生主动退出或其他原因(如时间到期)导致考试中止。 */ Integer BREAK = 3; - } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/job/BreakExamJob.java b/src-源文件/main/java/com/yf/exam/modules/paper/job/BreakExamJob.java index fb14f53..23a9762 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/job/BreakExamJob.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/job/BreakExamJob.java @@ -1,45 +1,61 @@ -package com.yf.exam.modules.paper.job; - -import com.yf.exam.ability.job.service.JobService; -import com.yf.exam.modules.paper.service.PaperService; -import lombok.extern.log4j.Log4j2; -import org.quartz.Job; -import org.quartz.JobDetail; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +package com.yf.exam.modules.paper.job; // 定义类所在的包路径 + +import com.yf.exam.ability.job.service.JobService; // 导入 JobService 类,用于获取任务数据 +import com.yf.exam.modules.paper.service.PaperService; // 导入 PaperService 类,用于处理试卷相关的业务逻辑 +import lombok.extern.log4j.Log4j2; // 引入 log4j2 日志工具 +import org.quartz.Job; // 导入 Quartz 作业接口 +import org.quartz.JobDetail; // 导入 Quartz JobDetail 类 +import org.quartz.JobExecutionContext; // 导入 Quartz JobExecutionContext 类 +import org.quartz.JobExecutionException; // 导入 Quartz JobExecutionException 类 +import org.springframework.beans.factory.annotation.Autowired; // 引入 Spring 注解,用于自动注入依赖 +import org.springframework.stereotype.Component; // 引入 Spring 组件注解,标识为 Spring Bean /** * 超时自动交卷任务 + *

+ * 该类是一个 Quartz 定时任务,用于在考试时间到期后强制交卷。 + * 它在定时任务触发时调用 PaperService 进行强制交卷操作。 + *

+ * * @author bool */ -@Log4j2 -@Component +@Log4j2 // 启用 log4j2 日志记录 +@Component // 标识该类为一个 Spring 组件,Spring 会自动将其注册为 Bean public class BreakExamJob implements Job { + // 自动注入 PaperService,用于处理与试卷相关的业务逻辑 @Autowired private PaperService paperService; + /** + * 定时任务执行的方法 + * + *

+ * Quartz 会在定时任务触发时调用此方法。该方法获取任务的详细信息, + * 并通过 PaperService 强制提交超时的考试。 + *

+ * + * @param jobExecutionContext 包含了 Quartz 定时任务的上下文信息 + * @throws JobExecutionException 如果任务执行过程中出现异常,将抛出该异常 + */ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - JobDetail detail = jobExecutionContext.getJobDetail(); - String name = detail.getKey().getName(); - String group = detail.getKey().getGroup(); + // 从 jobExecutionContext 中获取任务的详细信息 + JobDetail detail = jobExecutionContext.getJobDetail(); // 获取任务详情 + String name = detail.getKey().getName(); // 获取任务名称 + String group = detail.getKey().getGroup(); // 获取任务分组 + // 获取任务的附加数据,通常是任务触发时的相关参数 String data = String.valueOf(detail.getJobDataMap().get(JobService.TASK_DATA)); + // 打印任务执行日志,便于调试和跟踪 log.info("++++++++++定时任务:处理到期的交卷"); log.info("++++++++++jobName:{}", name); log.info("++++++++++jobGroup:{}", group); log.info("++++++++++taskData:{}", data); - - // 强制交卷 + // 调用 PaperService 进行强制交卷操作 + // data 参数通常是考试 ID 或者某种标识符,用于识别需要交卷的考试 paperService.handExam(data); - } - - - } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperMapper.java b/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperMapper.java index 1a52de5..833c518 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperMapper.java @@ -1,39 +1,46 @@ -package com.yf.exam.modules.paper.mapper; +package com.yf.exam.modules.paper.mapper; // 定义类所在的包路径 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yf.exam.modules.paper.dto.PaperDTO; -import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; -import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; -import com.yf.exam.modules.paper.entity.Paper; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 引入 MyBatis-Plus 的 BaseMapper +import com.baomidou.mybatisplus.core.metadata.IPage; // 引入分页结果接口 IPage +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 引入分页插件 Page +import com.yf.exam.modules.paper.dto.PaperDTO; // 引入 DTO 类,表示试卷数据传输对象 +import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; // 引入请求 DTO 类,表示查询试卷时的请求参数 +import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; // 引入响应 DTO 类,表示查询试卷时的响应结果 +import com.yf.exam.modules.paper.entity.Paper; // 引入实体类,表示试卷数据表中的记录 +import org.apache.ibatis.annotations.Param; // 引入 MyBatis 注解,用于指定 SQL 查询中的参数 import java.util.List; /** -*

-* 试卷Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 16:33 -*/ -public interface PaperMapper extends BaseMapper { + *

+ * 试卷Mapper接口,用于操作试卷数据表 + *

+ * + * @author 聪明笨狗 + * @since 2020-05-25 16:33 + */ +public interface PaperMapper extends BaseMapper { // 继承 MyBatis-Plus 提供的 BaseMapper,自动实现 CRUD 操作 /** * 查找试卷分页 - * @param page - * @param query - * @return + *

+ * 根据分页参数 `Page` 和查询条件 `PaperListReqDTO` 返回试卷的分页结果。 + *

+ * + * @param page 分页参数,包含当前页、每页大小等 + * @param query 查询条件,通常包含用户 ID、考试 ID 等信息 + * @return 返回一个分页结果 `IPage`,包含了试卷数据和分页信息 */ IPage paging(Page page, @Param("query") PaperListReqDTO query); - /** * 试卷列表响应类 - * @param query - * @return + *

+ * 根据查询条件返回试卷的列表数据,通常用于返回所有试卷的列表。 + *

+ * + * @param query 查询条件,通常是试卷的基本信息,如试卷 ID、考试 ID 等 + * @return 返回一个试卷列表 `List`,每一项是试卷的响应 DTO */ List list(@Param("query") PaperDTO query); } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuAnswerMapper.java b/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuAnswerMapper.java index e795ba9..8ab65ee 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuAnswerMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuAnswerMapper.java @@ -1,27 +1,33 @@ -package com.yf.exam.modules.paper.mapper; +package com.yf.exam.modules.paper.mapper; // 指定该类所在的包路径 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; -import com.yf.exam.modules.paper.entity.PaperQuAnswer; -import org.apache.ibatis.annotations.Param; +// 导入BaseMapper接口,提供通用的CRUD操作 +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +// 导入PaperQuAnswerExtDTO类,表示试卷考题备选答案的扩展数据传输对象 +import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; +// 导入PaperQuAnswer实体类,表示试卷考题备选答案的数据模型 +import com.yf.exam.modules.paper.entity.PaperQuAnswer; +// 导入MyBatis的注解,指定方法参数在SQL中的名称 +import org.apache.ibatis.annotations.Param; -import java.util.List; +// 导入List接口,表示返回类型为List集合,用于存储多个备选答案 +import java.util.List; /** *

-* 试卷考题备选答案Mapper +* 试卷考题备选答案Mapper接口 *

-* +* 该接口用于处理试卷考题备选答案的数据库操作,继承自MyBatis-Plus的BaseMapper,提供通用的CRUD方法。 +* * @author 聪明笨狗 * @since 2020-05-25 16:33 */ -public interface PaperQuAnswerMapper extends BaseMapper { +public interface PaperQuAnswerMapper extends BaseMapper { // 继承自BaseMapper接口,提供了所有的基本CRUD操作 /** * 查找试卷试题答案列表 - * @param paperId - * @param quId - * @return + * @param paperId 试卷ID,标识要查询的试卷 + * @param quId 题目ID,标识要查询的题目 + * @return 返回与试卷ID和题目ID相关的备选答案列表,包含更多的答案细节 */ - List list(@Param("paperId") String paperId, @Param("quId") String quId); + List list(@Param("paperId") String paperId, @Param("quId") String quId); // 根据试卷ID和题目ID查询对应的备选答案列表 } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuMapper.java b/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuMapper.java index f833a1b..a9b2257 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/mapper/PaperQuMapper.java @@ -1,42 +1,46 @@ -package com.yf.exam.modules.paper.mapper; +package com.yf.exam.modules.paper.mapper; // 定义该类所在的包路径 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; -import com.yf.exam.modules.paper.entity.PaperQu; -import org.apache.ibatis.annotations.Param; +// 导入BaseMapper接口,提供MyBatis-Plus的通用CRUD操作 +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +// 导入PaperQuDetailDTO类,表示试卷考题详细数据传输对象 +import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; +// 导入PaperQu实体类,表示试卷考题的数据模型 +import com.yf.exam.modules.paper.entity.PaperQu; +// 导入MyBatis的@Param注解,用于方法参数与SQL查询中的参数进行映射 +import org.apache.ibatis.annotations.Param; -import java.util.List; +// 导入List接口,用于返回多个试题 +import java.util.List; /** *

-* 试卷考题Mapper +* 试卷考题Mapper接口 *

-* +* 该接口用于处理与试卷考题相关的数据库操作,继承自MyBatis-Plus的BaseMapper,提供通用的CRUD操作。 +* * @author 聪明笨狗 * @since 2020-05-25 16:33 */ -public interface PaperQuMapper extends BaseMapper { +public interface PaperQuMapper extends BaseMapper { // 继承自BaseMapper接口,提供通用的CRUD操作 /** * 统计客观分 - * @param paperId - * @return + * @param paperId 试卷ID,用于查询指定试卷的客观分数 + * @return 返回试卷的客观分数总和 */ - int sumObjective(@Param("paperId") String paperId); + int sumObjective(@Param("paperId") String paperId); // 根据试卷ID统计所有客观题的分数总和 /** * 统计主观分 - * @param paperId - * @return + * @param paperId 试卷ID,用于查询指定试卷的主观分数 + * @return 返回试卷的主观分数总和 */ - int sumSubjective(@Param("paperId") String paperId); + int sumSubjective(@Param("paperId") String paperId); // 根据试卷ID统计所有主观题的分数总和 /** * 找出全部试题列表 - * @param paperId - * @return + * @param paperId 试卷ID,用于查询指定试卷的所有试题 + * @return 返回试卷中的所有试题列表,类型为PaperQuDetailDTO */ - List listByPaper(@Param("paperId") String paperId); + List listByPaper(@Param("paperId") String paperId); // 根据试卷ID查询所有试题的详细信息 } - - diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuAnswerService.java b/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuAnswerService.java index a1cfffa..3d2f1d5 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuAnswerService.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuAnswerService.java @@ -1,18 +1,20 @@ +// 导入所需的包 package com.yf.exam.modules.paper.service; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; -import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; -import com.yf.exam.modules.paper.entity.PaperQuAnswer; +import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 用于继承通用服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO +import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; // 试卷问题答案DTO +import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; // 扩展的试卷问题答案DTO +import com.yf.exam.modules.paper.entity.PaperQuAnswer; // 试卷问题答案实体类 -import java.util.List; +import java.util.List; // 导入List类,用于处理集合数据 /** *

* 试卷考题备选答案业务类 *

+* 该接口定义了与试卷考题备选答案相关的业务操作 * * @author 聪明笨狗 * @since 2020-05-25 16:33 @@ -21,24 +23,24 @@ public interface PaperQuAnswerService extends IService { /** * 分页查询数据 - * @param reqDTO - * @return + * @param reqDTO 分页请求DTO,包含查询的分页信息和条件 + * @return 返回分页查询结果,包含 PaperQuAnswerDTO 对象的数据 */ IPage paging(PagingReqDTO reqDTO); /** - * 查找试卷试题答案列表 - * @param paperId - * @param quId - * @return + * 查找试卷试题的答案列表 + * @param paperId 试卷ID,用于定位试卷 + * @param quId 试题ID,用于定位具体的试题 + * @return 返回该试卷和试题的所有答案列表,数据类型为 PaperQuAnswerExtDTO */ List listForExam(String paperId, String quId); /** - * 查找答案列表,用来填充 - * @param paperId - * @param quId - * @return + * 查找答案列表,用来填充试卷答案 + * @param paperId 试卷ID,用于定位试卷 + * @param quId 试题ID,用于定位具体试题的答案 + * @return 返回对应试题的答案列表,数据类型为 PaperQuAnswer 实体 */ List listForFill(String paperId, String quId); } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuService.java b/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuService.java index d0cc2e3..23d0af8 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuService.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperQuService.java @@ -1,18 +1,20 @@ +// 导入所需的包 package com.yf.exam.modules.paper.service; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.paper.dto.PaperQuDTO; -import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; -import com.yf.exam.modules.paper.entity.PaperQu; +import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 用于继承通用服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO +import com.yf.exam.modules.paper.dto.PaperQuDTO; // 试卷问题DTO +import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; // 试卷问题详情DTO +import com.yf.exam.modules.paper.entity.PaperQu; // 试卷问题实体类 -import java.util.List; +import java.util.List; // 导入List类,用于处理集合数据 /** *

* 试卷考题业务类 *

+* 该接口定义了与试卷考题相关的业务操作 * * @author 聪明笨狗 * @since 2020-05-25 16:33 @@ -21,50 +23,50 @@ public interface PaperQuService extends IService { /** * 分页查询数据 - * @param reqDTO - * @return + * @param reqDTO 分页请求DTO,包含查询的分页信息和条件 + * @return 返回分页查询结果,包含 PaperQuDTO 对象的数据 */ IPage paging(PagingReqDTO reqDTO); /** * 根据试卷找出题目列表 - * @param paperId - * @return + * @param paperId 试卷ID,用于定位试卷 + * @return 返回该试卷的所有题目列表,数据类型为 PaperQuDTO */ List listByPaper(String paperId); /** - * 查找详情 - * @param paperId - * @param quId - * @return + * 查找试卷中某个问题的详细信息 + * @param paperId 试卷ID + * @param quId 试题ID,用于定位具体的试题 + * @return 返回该试卷和试题的详细信息,数据类型为 PaperQu */ PaperQu findByKey(String paperId, String quId); /** - * 根据组合索引更新 - * @param qu + * 根据组合索引更新试题 + * @param qu 试题实体,用于更新试卷中的试题 */ void updateByKey(PaperQu qu); /** - * 统计客观分 - * @param paperId - * @return + * 统计试卷中所有客观题的总分 + * @param paperId 试卷ID + * @return 返回该试卷客观题的总分 */ int sumObjective(String paperId); /** - * 统计主观分 - * @param paperId - * @return + * 统计试卷中所有主观题的总分 + * @param paperId 试卷ID + * @return 返回该试卷主观题的总分 */ int sumSubjective(String paperId); /** - * 找出全部试题列表 - * @param paperId - * @return + * 查找试卷的全部试题列表(用于展示结果) + * @param paperId 试卷ID + * @return 返回该试卷的详细试题列表,数据类型为 PaperQuDetailDTO */ List listForPaperResult(String paperId); } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperService.java b/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperService.java index 042bb7d..ec5f724 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperService.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/service/PaperService.java @@ -1,21 +1,23 @@ +// 导入所需的包 package com.yf.exam.modules.paper.service; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.paper.dto.PaperDTO; -import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; -import com.yf.exam.modules.paper.dto.request.PaperAnswerDTO; -import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; -import com.yf.exam.modules.paper.dto.response.ExamDetailRespDTO; -import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO; -import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; -import com.yf.exam.modules.paper.entity.Paper; +import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 用于继承通用服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO +import com.yf.exam.modules.paper.dto.PaperDTO; // 试卷DTO +import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; // 试卷题目详情DTO +import com.yf.exam.modules.paper.dto.request.PaperAnswerDTO; // 提交答案请求DTO +import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; // 试卷列表请求DTO +import com.yf.exam.modules.paper.dto.response.ExamDetailRespDTO; // 考试详情响应DTO +import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO; // 考试结果响应DTO +import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; // 试卷列表响应DTO +import com.yf.exam.modules.paper.entity.Paper; // 试卷实体类 /** *

* 试卷业务类 *

+* 该接口定义了与试卷相关的所有业务操作 * * @author 聪明笨狗 * @since 2020-05-25 16:33 @@ -24,60 +26,57 @@ public interface PaperService extends IService { /** * 创建试卷 - * @param userId - * @param examId - * @return + * @param userId 用户ID,表示试卷创建者 + * @param examId 考试ID,表示该试卷属于哪个考试 + * @return 返回创建的试卷ID */ String createPaper(String userId, String examId); - /** - * 查找详情 - * @param paperId - * @return + * 查找试卷详情 + * @param paperId 试卷ID,表示要查找的试卷 + * @return 返回试卷的详细信息,数据类型为 ExamDetailRespDTO */ ExamDetailRespDTO paperDetail(String paperId); /** - * 考试结果 - * @param paperId - * @return + * 获取考试结果 + * @param paperId 试卷ID,表示要查询结果的试卷 + * @return 返回该试卷的考试结果,数据类型为 ExamResultRespDTO */ ExamResultRespDTO paperResult(String paperId); /** - * 查找题目详情 - * @param paperId - * @param quId - * @return + * 查找试卷题目详情 + * @param paperId 试卷ID + * @param quId 题目ID,表示要查询的具体题目 + * @return 返回该试卷和题目的详细信息,数据类型为 PaperQuDetailDTO */ PaperQuDetailDTO findQuDetail(String paperId, String quId); /** - * 填充答案 - * @param reqDTO + * 填充试卷答案 + * @param reqDTO 填写答案的请求DTO,包含试卷答案信息 */ void fillAnswer(PaperAnswerDTO reqDTO); /** - * 交卷操作 - * @param paperId - * @return + * 提交试卷(交卷) + * @param paperId 试卷ID,表示要交卷的试卷 */ void handExam(String paperId); /** - * 试卷列表响应类 - * @param reqDTO - * @return + * 分页查询试卷列表 + * @param reqDTO 分页请求DTO,包含分页信息和查询条件 + * @return 返回分页后的试卷列表,数据类型为 IPage */ IPage paging(PagingReqDTO reqDTO); /** - * 检测是否有进行中的考试 - * @param userId - * @return + * 检查用户是否有正在进行的考试 + * @param userId 用户ID,用于查找该用户是否有未完成的考试 + * @return 返回该用户正在进行的考试试卷信息,数据类型为 PaperDTO */ PaperDTO checkProcess(String userId); - } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuAnswerServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuAnswerServiceImpl.java index c2dc0b7..14e8306 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuAnswerServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuAnswerServiceImpl.java @@ -1,61 +1,95 @@ -package com.yf.exam.modules.paper.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; -import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; -import com.yf.exam.modules.paper.entity.PaperQuAnswer; -import com.yf.exam.modules.paper.mapper.PaperQuAnswerMapper; -import com.yf.exam.modules.paper.service.PaperQuAnswerService; -import org.springframework.stereotype.Service; - -import java.util.List; +package com.yf.exam.modules.paper.service.impl; // 指定该类所在的包路径 + +// 导入FastJSON库,用于处理JSON格式数据的转换 +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +// 导入MyBatis-Plus的条件查询构造器 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +// 导入分页接口 +import com.baomidou.mybatisplus.core.metadata.IPage; +// 导入分页Page类 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +// 导入MyBatis-Plus的服务实现类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +// 导入分页请求DTO,用于分页查询 +import com.yf.exam.core.api.dto.PagingReqDTO; +// 导入试卷考题备选答案DTO类 +import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; +// 导入试卷考题备选答案扩展DTO类 +import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; +// 导入试卷考题备选答案实体类 +import com.yf.exam.modules.paper.entity.PaperQuAnswer; +// 导入试卷考题备选答案Mapper接口 +import com.yf.exam.modules.paper.mapper.PaperQuAnswerMapper; +// 导入试卷考题备选答案服务接口 +import com.yf.exam.modules.paper.service.PaperQuAnswerService; +// 导入Spring的Service注解,表示这是一个服务实现类 +import org.springframework.stereotype.Service; + +import java.util.List; // 导入List接口,用于返回多个结果 /** *

-* 语言设置 服务实现类 +* 试卷考题备选答案 服务实现类 *

-* +* 该类实现了PaperQuAnswerService接口,处理与试卷考题备选答案相关的业务逻辑。 +* * @author 聪明笨狗 * @since 2020-05-25 16:33 */ -@Service -public class PaperQuAnswerServiceImpl extends ServiceImpl implements PaperQuAnswerService { +@Service // 标注为Spring的服务类 +public class PaperQuAnswerServiceImpl extends ServiceImpl implements PaperQuAnswerService { // 继承ServiceImpl类,提供基本的数据库操作功能 + /** + * 分页查询试卷考题备选答案 + * @param reqDTO 分页请求参数,包括当前页和页面大小 + * @return 分页后的试卷考题备选答案列表 + */ @Override public IPage paging(PagingReqDTO reqDTO) { - //创建分页对象 + // 创建分页对象 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 查询条件,可以根据需要添加更多过滤条件 QueryWrapper wrapper = new QueryWrapper<>(); - //获得数据 + // 执行分页查询操作 IPage page = this.page(query, wrapper); - //转换结果 + + // 将查询结果转换为DTO对象,返回分页后的结果 IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); - return pageData; - } + + return pageData; // 返回分页结果 + } + /** + * 根据试卷ID和题目ID查询试题的备选答案列表 + * @param paperId 试卷ID + * @param quId 题目ID + * @return 试卷考题备选答案的扩展DTO列表 + */ @Override public List listForExam(String paperId, String quId) { + // 调用Mapper中的list方法,查询并返回试题的备选答案列表 return baseMapper.list(paperId, quId); } + /** + * 查询填空题的备选答案 + * @param paperId 试卷ID + * @param quId 题目ID + * @return 填空题的备选答案列表 + */ @Override public List listForFill(String paperId, String quId) { - //查询条件 + // 创建查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .eq(PaperQuAnswer::getPaperId, paperId) - .eq(PaperQuAnswer::getQuId, quId); + wrapper.lambda() // 使用Lambda表达式,进行条件构造 + .eq(PaperQuAnswer::getPaperId, paperId) // 通过试卷ID过滤 + .eq(PaperQuAnswer::getQuId, quId); // 通过题目ID过滤 + // 查询并返回符合条件的结果列表 return this.list(wrapper); } } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuServiceImpl.java index a0d9a1d..46c9635 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperQuServiceImpl.java @@ -1,94 +1,150 @@ -package com.yf.exam.modules.paper.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.paper.dto.PaperQuDTO; -import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; -import com.yf.exam.modules.paper.entity.PaperQu; -import com.yf.exam.modules.paper.mapper.PaperQuMapper; -import com.yf.exam.modules.paper.service.PaperQuService; -import org.springframework.stereotype.Service; - -import java.util.List; +package com.yf.exam.modules.paper.service.impl; // 指定该类所在的包路径 + +// 导入FastJSON库,用于处理JSON格式数据的转换 +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +// 导入MyBatis-Plus的条件查询构造器 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +// 导入分页接口 +import com.baomidou.mybatisplus.core.metadata.IPage; +// 导入分页Page类 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +// 导入MyBatis-Plus的服务实现类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +// 导入分页请求DTO,用于分页查询 +import com.yf.exam.core.api.dto.PagingReqDTO; +// 导入BeanMapper工具类,用于对象间的转换 +import com.yf.exam.core.utils.BeanMapper; +// 导入试卷考题DTO类 +import com.yf.exam.modules.paper.dto.PaperQuDTO; +// 导入试卷考题详情DTO类 +import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; +// 导入试卷考题实体类 +import com.yf.exam.modules.paper.entity.PaperQu; +// 导入试卷考题Mapper接口 +import com.yf.exam.modules.paper.mapper.PaperQuMapper; +// 导入试卷考题服务接口 +import com.yf.exam.modules.paper.service.PaperQuService; +// 导入Spring的Service注解,表示这是一个服务实现类 +import org.springframework.stereotype.Service; + +import java.util.List; // 导入List接口,用于返回多个结果 /** *

-* 语言设置 服务实现类 +* 试卷考题 服务实现类 *

-* +* 该类实现了PaperQuService接口,处理与试卷考题相关的业务逻辑。 +* * @author 聪明笨狗 * @since 2020-05-25 16:33 */ -@Service -public class PaperQuServiceImpl extends ServiceImpl implements PaperQuService { - +@Service // 标注为Spring的服务类 +public class PaperQuServiceImpl extends ServiceImpl implements PaperQuService { // 继承ServiceImpl类,提供基本的数据库操作功能 + + /** + * 分页查询试卷考题 + * @param reqDTO 分页请求参数,包括当前页和页面大小 + * @return 分页后的试卷考题列表 + */ @Override public IPage paging(PagingReqDTO reqDTO) { - //创建分页对象 + // 创建分页对象 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - //获得数据 + // 执行分页查询操作 IPage page = this.page(query, wrapper); - //转换结果 + + // 将查询结果转换为DTO对象,返回分页后的结果 IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); - return pageData; - } + + return pageData; // 返回分页结果 + } + /** + * 根据试卷ID查询试卷考题列表 + * @param paperId 试卷ID + * @return 试卷考题DTO列表 + */ @Override public List listByPaper(String paperId) { - //查询条件 + // 查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(PaperQu::getPaperId, paperId) - .orderByAsc(PaperQu::getSort); + wrapper.lambda().eq(PaperQu::getPaperId, paperId) // 通过试卷ID过滤 + .orderByAsc(PaperQu::getSort); // 按照题目排序字段升序排列 + // 执行查询,获取试卷考题列表 List list = this.list(wrapper); + + // 使用BeanMapper工具类将实体对象列表转换为DTO对象列表 return BeanMapper.mapList(list, PaperQuDTO.class); } + /** + * 根据试卷ID和题目ID查找单个试卷考题 + * @param paperId 试卷ID + * @param quId 题目ID + * @return 找到的试卷考题对象 + */ @Override public PaperQu findByKey(String paperId, String quId) { - //查询条件 + // 查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(PaperQu::getPaperId, paperId) - .eq(PaperQu::getQuId, quId); + wrapper.lambda().eq(PaperQu::getPaperId, paperId) // 通过试卷ID过滤 + .eq(PaperQu::getQuId, quId); // 通过题目ID过滤 - return this.getOne(wrapper, false); + // 获取匹配的单个试卷考题对象 + return this.getOne(wrapper, false); // 返回查询到的结果,false表示未查询到时返回null } + /** + * 根据试卷ID和题目ID更新试卷考题 + * @param qu 需要更新的试卷考题对象 + */ @Override public void updateByKey(PaperQu qu) { - //查询条件 + // 查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(PaperQu::getPaperId, qu.getPaperId()) - .eq(PaperQu::getQuId, qu.getQuId()); + wrapper.lambda().eq(PaperQu::getPaperId, qu.getPaperId()) // 通过试卷ID过滤 + .eq(PaperQu::getQuId, qu.getQuId()); // 通过题目ID过滤 - this.update(qu, wrapper); + // 执行更新操作 + this.update(qu, wrapper); // 更新满足条件的试卷考题 } + /** + * 统计试卷中的客观题分数 + * @param paperId 试卷ID + * @return 客观题的总分 + */ @Override public int sumObjective(String paperId) { - return baseMapper.sumObjective(paperId); + return baseMapper.sumObjective(paperId); // 调用Mapper方法,统计客观题总分 } + /** + * 统计试卷中的主观题分数 + * @param paperId 试卷ID + * @return 主观题的总分 + */ @Override public int sumSubjective(String paperId) { - return baseMapper.sumSubjective(paperId); + return baseMapper.sumSubjective(paperId); // 调用Mapper方法,统计主观题总分 } + /** + * 根据试卷ID查询试卷考题的详细信息 + * @param paperId 试卷ID + * @return 试卷考题详细信息列表 + */ @Override public List listForPaperResult(String paperId) { - return baseMapper.listByPaper(paperId); + return baseMapper.listByPaper(paperId); // 调用Mapper方法,获取试卷考题详细信息 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperServiceImpl.java index 2eefec8..8f28028 100644 --- a/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/paper/service/impl/PaperServiceImpl.java @@ -1,103 +1,167 @@ +// 定义包名,表示该类属于com.yf.exam.modules.paper.service.impl包下 package com.yf.exam.modules.paper.service.impl; +// 导入MyBatis Plus框架的核心类,用于构建查询条件 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +// 导入MyBatis Plus框架的分页功能相关类 import com.baomidou.mybatisplus.core.metadata.IPage; +// 导入MyBatis Plus框架的工具类,用于生成唯一ID import com.baomidou.mybatisplus.core.toolkit.IdWorker; +// 导入MyBatis Plus框架的服务实现类 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +// 导入项目中定义的作业组枚举 import com.yf.exam.ability.job.enums.JobGroup; +// 导入项目中定义的作业前缀枚举 import com.yf.exam.ability.job.enums.JobPrefix; +// 导入项目中的作业服务接口 import com.yf.exam.ability.job.service.JobService; +// 导入项目中定义的API错误码类 import com.yf.exam.core.api.ApiError; +// 导入项目中定义的DTO类,用于分页请求 import com.yf.exam.core.api.dto.PagingReqDTO; +// 导入项目中的服务异常类 import com.yf.exam.core.exception.ServiceException; +// 导入项目中定义的Bean映射工具类 import com.yf.exam.core.utils.BeanMapper; +// 导入项目中定义的Cron表达式工具类 import com.yf.exam.core.utils.CronUtils; +// 导入项目中定义的考试DTO类 import com.yf.exam.modules.exam.dto.ExamDTO; +// 导入项目中定义的考试题库DTO类 import com.yf.exam.modules.exam.dto.ExamRepoDTO; +// 导入项目中定义的扩展考试题库DTO类 import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; +// 导入项目中的考试服务接口 import com.yf.exam.modules.exam.service.ExamRepoService; +// 导入项目中的考试服务接口 import com.yf.exam.modules.exam.service.ExamService; +// 导入项目中定义的试卷DTO类 import com.yf.exam.modules.paper.dto.PaperDTO; +// 导入项目中定义的试卷题目DTO类 import com.yf.exam.modules.paper.dto.PaperQuDTO; +// 导入项目中定义的扩展试卷题目答案DTO类 import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; +// 导入项目中定义的试卷题目详情DTO类 import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; +// 导入项目中定义的试卷答案DTO类 import com.yf.exam.modules.paper.dto.request.PaperAnswerDTO; +// 导入项目中定义的试卷列表请求DTO类 import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; +// 导入项目中定义的试卷列表响应DTO类 import com.yf.exam.modules.paper.dto.response.ExamDetailRespDTO; +// 导入项目中定义的考试结果响应DTO类 import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO; +// 导入项目中定义的试卷列表响应DTO类 import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; +// 导入项目中定义的试卷实体类 import com.yf.exam.modules.paper.entity.Paper; +// 导入项目中定义的试卷题目实体类 import com.yf.exam.modules.paper.entity.PaperQu; +// 导入项目中定义的试卷题目答案实体类 import com.yf.exam.modules.paper.entity.PaperQuAnswer; +// 导入项目中定义的考试状态枚举 import com.yf.exam.modules.paper.enums.ExamState; +// 导入项目中定义的试卷状态枚举 import com.yf.exam.modules.paper.enums.PaperState; +// 导入项目中定义的强制交卷作业类 import com.yf.exam.modules.paper.job.BreakExamJob; +// 导入项目中定义的试卷Mapper接口 import com.yf.exam.modules.paper.mapper.PaperMapper; +// 导入项目中定义的试卷题目服务接口 import com.yf.exam.modules.paper.service.PaperQuAnswerService; +// 导入项目中定义的试卷题目服务接口 import com.yf.exam.modules.paper.service.PaperQuService; +// 导入项目中定义的试卷服务接口 import com.yf.exam.modules.paper.service.PaperService; +// 导入项目中定义的题目实体类 import com.yf.exam.modules.qu.entity.Qu; +// 导入项目中定义的题目答案实体类 import com.yf.exam.modules.qu.entity.QuAnswer; +// 导入项目中定义的题目类型枚举 import com.yf.exam.modules.qu.enums.QuType; +// 导入项目中定义的题目服务接口 import com.yf.exam.modules.qu.service.QuAnswerService; +// 导入项目中定义的题目服务接口 import com.yf.exam.modules.qu.service.QuService; +// 导入项目中定义的系统用户实体类 import com.yf.exam.modules.sys.user.entity.SysUser; +// 导入项目中定义的系统用户服务接口 import com.yf.exam.modules.sys.user.service.SysUserService; +// 导入项目中定义的用户书籍服务接口 import com.yf.exam.modules.user.book.service.UserBookService; +// 导入项目中定义的用户考试服务接口 import com.yf.exam.modules.user.exam.service.UserExamService; +// 导入Apache Commons Lang库中的StringUtils类,用于字符串操作 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架中的注解,用于自动注入依赖 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架中的注解,用于声明服务组件 import org.springframework.stereotype.Service; +// 导入Spring框架中的注解,用于声明事务管理 import org.springframework.transaction.annotation.Transactional; +// 导入Spring框架中的类,用于工具操作 import org.springframework.util.CollectionUtils; +// 导入Java.util包下的类,用于集合操作 import java.util.*; +// 定义语言设置服务实现类,继承自ServiceImpl,并实现PaperService接口 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 16:33 -*/ + *

+ * 语言设置 服务实现类 + *

+ * + * @author 聪明笨狗 + * @since 2020-05-25 16:33 + */ @Service public class PaperServiceImpl extends ServiceImpl implements PaperService { - + // 自动注入系统用户服务 @Autowired private SysUserService sysUserService; + // 自动注入考试服务 @Autowired private ExamService examService; + // 自动注入题目服务 @Autowired private QuService quService; + // 自动注入题目答案服务 @Autowired private QuAnswerService quAnswerService; + // 自动注入试卷服务 @Autowired private PaperService paperService; + // 自动注入试卷题目服务 @Autowired private PaperQuService paperQuService; + // 自动注入试卷题目答案服务 @Autowired private PaperQuAnswerService paperQuAnswerService; + // 自动注入用户书籍服务 @Autowired private UserBookService userBookService; + // 自动注入考试题库服务 @Autowired private ExamRepoService examRepoService; + // 自动注入用户考试服务 @Autowired private UserExamService userExamService; + // 自动注入作业服务 @Autowired private JobService jobService; + // 定义展示的选项,如ABC这样的选项列表 /** * 展示的选项,ABC这样 */ @@ -106,437 +170,503 @@ public class PaperServiceImpl extends ServiceImpl implements ,"Y","Z" }); - - - - + // 声明创建试卷的方法,使用事务管理,如果发生异常则回滚 + /** + * 创建试卷的方法 + * @param userId 用户ID + * @param examId 考试ID + * @return 返回试卷ID + */ @Transactional(rollbackFor = Exception.class) @Override public String createPaper(String userId, String examId) { - // 校验是否有正在考试的试卷 + // 构建查询条件,查询是否有正在考试的试卷 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(Paper::getUserId, userId) .eq(Paper::getState, PaperState.ING); + // 统计符合条件的试卷数量 int exists = this.count(wrapper); - + // 如果存在正在考试的试卷,则抛出服务异常 if (exists > 0) { throw new ServiceException(ApiError.ERROR_20010002); } - // 查找考试 + // 根据考试ID查询考试信息 ExamDTO exam = examService.findById(examId); + // 如果考试信息不存在,则抛出服务异常 if(exam == null){ throw new ServiceException(1, "考试不存在!"); } + // 如果考试状态不正确,则抛出服务异常 if(!ExamState.ENABLE.equals(exam.getState())){ throw new ServiceException(1, "考试状态不正确!"); } - // 考试题目列表 - List quList = this.generateByRepo(examId); - - if(CollectionUtils.isEmpty(quList)){ - throw new ServiceException(1, "规则不正确,无对应的考题!"); - } - - //保存试卷内容 - Paper paper = this.savePaper(userId, exam, quList); + // 根据考试ID生成试卷题目列表 - // 强制交卷任务 - String jobName = JobPrefix.BREAK_EXAM + paper.getId(); - jobService.addCronJob(BreakExamJob.class, jobName, CronUtils.dateToCron(paper.getLimitTime()), paper.getId()); + List quList = this.generateByRepo(examId); - return paper.getId(); + // 如果题目列表为空,则抛出服务异常 + if(CollectionUtils.isEmpty(quList)){ + throw new ServiceException(1, "规则不正确,无对应的考题!"); } - @Override - public ExamDetailRespDTO paperDetail(String paperId) { - - - ExamDetailRespDTO respDTO = new ExamDetailRespDTO(); + // 保存试卷内容,并返回试卷ID + Paper paper = this.savePaper(userId, exam, quList); - // 试题基本信息 - Paper paper = paperService.getById(paperId); - BeanMapper.copy(paper, respDTO); + // 添加强制交卷任务 + String jobName = JobPrefix.BREAK_EXAM + paper.getId(); + jobService.addCronJob(BreakExamJob.class, jobName, CronUtils.dateToCron(paper.getLimitTime()), paper.getId()); - // 查找题目列表 - List list = paperQuService.listByPaper(paperId); + return paper.getId(); +} - List radioList = new ArrayList<>(); - List multiList = new ArrayList<>(); - List judgeList = new ArrayList<>(); - for(PaperQuDTO item: list){ - if(QuType.RADIO.equals(item.getQuType())){ - radioList.add(item); - } - if(QuType.MULTI.equals(item.getQuType())){ - multiList.add(item); - } - if(QuType.JUDGE.equals(item.getQuType())){ - judgeList.add(item); - } +// 声明查询试卷详情的方法 +/** + * 查询试卷详情的方法 + * @param paperId 试卷ID + * @return 返回考试详情响应DTO + */ +@Override +public ExamDetailRespDTO paperDetail(String paperId) { + + // 创建考试详情响应DTO对象 + ExamDetailRespDTO respDTO = new ExamDetailRespDTO(); + + // 根据试卷ID查询试卷基本信息,并复制到响应DTO中 + Paper paper = paperService.getById(paperId); + BeanMapper.copy(paper, respDTO); + + // 根据试卷ID查询题目列表 + List list = paperQuService.listByPaper(paperId); + + // 分类题目列表 + List radioList = new ArrayList<>(); + List multiList = new ArrayList<>(); + List judgeList = new ArrayList<>(); + for(PaperQuDTO item: list){ + if(QuType.RADIO.equals(item.getQuType())){ + radioList.add(item); + } + if(QuType.MULTI.equals(item.getQuType())){ + multiList.add(item); + } + if(QuType.JUDGE.equals(item.getQuType())){ + judgeList.add(item); } - - respDTO.setRadioList(radioList); - respDTO.setMultiList(multiList); - respDTO.setJudgeList(judgeList); - return respDTO; - } - - @Override - public ExamResultRespDTO paperResult(String paperId) { - - ExamResultRespDTO respDTO = new ExamResultRespDTO(); - - // 试题基本信息 - Paper paper = paperService.getById(paperId); - BeanMapper.copy(paper, respDTO); - - List quList = paperQuService.listForPaperResult(paperId); - respDTO.setQuList(quList); - - return respDTO; } - @Override - public PaperQuDetailDTO findQuDetail(String paperId, String quId) { - - PaperQuDetailDTO respDTO = new PaperQuDetailDTO(); - // 问题 - Qu qu = quService.getById(quId); - - // 基本信息 - PaperQu paperQu = paperQuService.findByKey(paperId, quId); - BeanMapper.copy(paperQu, respDTO); - respDTO.setContent(qu.getContent()); - respDTO.setImage(qu.getImage()); - - // 答案列表 - List list = paperQuAnswerService.listForExam(paperId, quId); - respDTO.setAnswerList(list); - - return respDTO; - } + // 设置分类后的题目列表到响应DTO中 + respDTO.setRadioList(radioList); + respDTO.setMultiList(multiList); + respDTO.setJudgeList(judgeList); + return respDTO; +} +// 声明查询试卷结果的方法 +/** + * 查询试卷结果的方法 + * @param paperId 试卷ID + * @return 返回考试结果响应DTO + */ +@Override +public ExamResultRespDTO paperResult(String paperId) { - /** - * 题库组题方式产生题目列表 - * @param examId - * @return - */ - private List generateByRepo(String examId){ + // 创建考试结果响应DTO对象 + ExamResultRespDTO respDTO = new ExamResultRespDTO(); - // 查找规则指定的题库 - List list = examRepoService.listByExam(examId); + // 根据试卷ID查询试卷基本信息,并复制到响应DTO中 + Paper paper = paperService.getById(paperId); + BeanMapper.copy(paper, respDTO); - //最终的题目列表 - List quList = new ArrayList<>(); + // 根据试卷ID查询题目列表 + List quList = paperQuService.listForPaperResult(paperId); + respDTO.setQuList(quList); - //排除ID,避免题目重复 - List excludes = new ArrayList<>(); - excludes.add("none"); + return respDTO; +} - if (!CollectionUtils.isEmpty(list)) { - for (ExamRepoExtDTO item : list) { +// 声明查询题目详情的方法 +/** + * 查询题目详情的方法 + * @param paperId 试卷ID + * @param quId 题目ID + * @return 返回题目详情DTO + */ +@Override +public PaperQuDetailDTO findQuDetail(String paperId, String quId) { + + // 创建题目详情DTO对象 + PaperQuDetailDTO respDTO = new PaperQuDetailDTO(); + // 根据题目ID查询题目信息 + Qu qu = quService.getById(quId); + + // 根据试卷ID和题目ID查询试卷题目信息,并复制到响应DTO中 + PaperQu paperQu = paperQuService.findByKey(paperId, quId); + BeanMapper.copy(paperQu, respDTO); + respDTO.setContent(qu.getContent()); + respDTO.setImage(qu.getImage()); + + // 根据试卷ID和题目ID查询答案列表,并设置到响应DTO中 + List list = paperQuAnswerService.listForExam(paperId, quId); + respDTO.setAnswerList(list); + + return respDTO; +} - // 单选题 - if(item.getRadioCount() > 0){ - List radioList = quService.listByRandom(item.getRepoId(), QuType.RADIO, excludes, item.getRadioCount()); - for (Qu qu : radioList) { - PaperQu paperQu = this.processPaperQu(item, qu); - quList.add(paperQu); - excludes.add(qu.getId()); - } +// 声明题库组题方式产生题目列表的私有方法 +/** + * 题库组题方式产生题目列表的方法 + * @param examId 考试ID + * @return 返回题目列表 + */ +private List generateByRepo(String examId){ + + // 查询规则指定的题库 + List list = examRepoService.listByExam(examId); + + // 最终的题目列表 + List quList = new ArrayList<>(); + + // 排除ID,避免题目重复 + List excludes = new ArrayList<>(); + excludes.add("none"); + + // 如果题库列表不为空,则进行题目抽取 + if (!CollectionUtils.isEmpty(list)) { + for (ExamRepoExtDTO item : list) { + + // 抽取单选题 + if(item.getRadioCount() > 0){ + List radioList = quService.listByRandom(item.getRepoId(), QuType.RADIO, excludes, item.getRadioCount()); + for (Qu qu : radioList) { + PaperQu paperQu = this.processPaperQu(item, qu); + quList.add(paperQu); + excludes.add(qu.getId()); } + } - //多选题 - if(item.getMultiCount() > 0) { - List multiList = quService.listByRandom(item.getRepoId(), QuType.MULTI, excludes, - item.getMultiCount()); - for (Qu qu : multiList) { - PaperQu paperQu = this.processPaperQu(item, qu); - quList.add(paperQu); - excludes.add(qu.getId()); - } + // 抽取多选题 + if(item.getMultiCount() > 0) { + List multiList = quService.listByRandom(item.getRepoId(), QuType.MULTI, excludes, + item.getMultiCount()); + for (Qu qu : multiList) { + PaperQu paperQu = this.processPaperQu(item, qu); + quList.add(paperQu); + excludes.add(qu.getId()); } + } - // 判断题 - if(item.getJudgeCount() > 0) { - List judgeList = quService.listByRandom(item.getRepoId(), QuType.JUDGE, excludes, - item.getJudgeCount()); - for (Qu qu : judgeList) { - PaperQu paperQu = this.processPaperQu(item, qu); - quList.add(paperQu); - excludes.add(qu.getId()); - } + // 抽取判断题 + if(item.getJudgeCount() > 0) { + List judgeList = quService.listByRandom(item.getRepoId(), QuType.JUDGE, excludes, + item.getJudgeCount()); + for (Qu qu : judgeList) { + PaperQu paperQu = this.processPaperQu(item, qu); + quList.add(paperQu); + excludes.add(qu.getId()); } } } - return quList; } + return quList; +} +// 声明填充试题题目信息的私有方法 +/** + * 填充试题题目信息的方法 + * @param repo 考试题库DTO + * @param qu 题目实体 + * @return 返回试卷题目实体 + */ +private PaperQu processPaperQu(ExamRepoDTO repo, Qu qu) { + + // 创建试卷题目实体 + PaperQu paperQu = new PaperQu(); + paperQu.setQuId(qu.getId()); + paperQu.setAnswered(false); + paperQu.setIsRight(false); + paperQu.setQuType(qu.getQuType()); + + // 设置单选题分数 + if (QuType.RADIO.equals(qu.getQuType())) { + paperQu.setScore(repo.getRadioScore()); + paperQu.setActualScore(repo.getRadioScore()); + } - - /** - * 填充试题题目信息 - * @param repo - * @param qu - * @return - */ - private PaperQu processPaperQu(ExamRepoDTO repo, Qu qu) { - - //保存试题信息 - PaperQu paperQu = new PaperQu(); - paperQu.setQuId(qu.getId()); - paperQu.setAnswered(false); - paperQu.setIsRight(false); - paperQu.setQuType(qu.getQuType()); - - if (QuType.RADIO.equals(qu.getQuType())) { - paperQu.setScore(repo.getRadioScore()); - paperQu.setActualScore(repo.getRadioScore()); - } - - if (QuType.MULTI.equals(qu.getQuType())) { - paperQu.setScore(repo.getMultiScore()); - paperQu.setActualScore(repo.getMultiScore()); - } - - if (QuType.JUDGE.equals(qu.getQuType())) { - paperQu.setScore(repo.getJudgeScore()); - paperQu.setActualScore(repo.getJudgeScore()); - } - - return paperQu; + // 设置多选题分数 + if (QuType.MULTI.equals(qu.getQuType())) { + paperQu.setScore(repo.getMultiScore()); + paperQu.setActualScore(repo.getMultiScore()); } + // 设置判断题分数 + if (QuType.JUDGE.equals(qu.getQuType())) { + paperQu.setScore(repo.getJudgeScore()); + paperQu.setActualScore(repo.getJudgeScore()); + } - /** - * 保存试卷 - * @param userId - * @param exam - * @param quList - * @return - */ - private Paper savePaper(String userId, ExamDTO exam, List quList) { - - - // 查找用户 - SysUser user = sysUserService.getById(userId); - - //保存试卷基本信息 - Paper paper = new Paper(); - paper.setDepartId(user.getDepartId()); - paper.setExamId(exam.getId()); - paper.setTitle(exam.getTitle()); - paper.setTotalScore(exam.getTotalScore()); - paper.setTotalTime(exam.getTotalTime()); - paper.setUserScore(0); - paper.setUserId(userId); - paper.setCreateTime(new Date()); - paper.setUpdateTime(new Date()); - paper.setQualifyScore(exam.getQualifyScore()); - paper.setState(PaperState.ING); - paper.setHasSaq(false); - - // 截止时间 - Calendar cl = Calendar.getInstance(); - cl.setTimeInMillis(System.currentTimeMillis()); - cl.add(Calendar.MINUTE, exam.getTotalTime()); - paper.setLimitTime(cl.getTime()); - - paperService.save(paper); - - if (!CollectionUtils.isEmpty(quList)) { - this.savePaperQu(paper.getId(), quList); - } + return paperQu; +} - return paper; +// 声明保存试卷的私有方法 +/** + * 保存试卷的方法 + * @param userId 用户ID + * @param exam 考试DTO + * @param quList 题目列表 + * @return 返回试卷实体 + */ +private Paper savePaper(String userId, ExamDTO exam, List quList) { + + + // 根据用户ID查询用户信息 + SysUser user = sysUserService.getById(userId); + + // 创建试卷基本信息,并设置属性 + Paper paper = new Paper(); + paper.setDepartId(user.getDepartId()); + paper.setExamId(exam.getId()); + paper.setTitle(exam.getTitle()); + paper.setTotalScore(exam.getTotalScore()); + paper.setTotalTime(exam.getTotalTime()); + paper.setUserScore(0); + paper.setUserId(userId); + paper.setCreateTime(new Date()); + paper.setUpdateTime(new Date()); + paper.setQualifyScore(exam.getQualifyScore()); + paper.setState(PaperState.ING); + paper.setHasSaq(false); + + // 计算截止时间 + Calendar cl = Calendar.getInstance(); + cl.setTimeInMillis(System.currentTimeMillis()); + cl.add(Calendar.MINUTE, exam.getTotalTime()); + paper.setLimitTime(cl.getTime()); + + // 保存试卷基本信息 + paperService.save(paper); + + // 如果题目列表不为空,则保存试卷题目列表 + if (!CollectionUtils.isEmpty(quList)) { + this.savePaperQu(paper.getId(), quList); } + return paper; +} - - /** - * 保存试卷试题列表 - * @param paperId - * @param quList - */ - private void savePaperQu(String paperId, List quList){ - - List batchQuList = new ArrayList<>(); - List batchAnswerList = new ArrayList<>(); - - int sort = 0; - for (PaperQu item : quList) { - - item.setPaperId(paperId); - item.setSort(sort); - item.setId(IdWorker.getIdStr()); - - //回答列表 - List answerList = quAnswerService.listAnswerByRandom(item.getQuId()); - - if (!CollectionUtils.isEmpty(answerList)) { - - int ii = 0; - for (QuAnswer answer : answerList) { - PaperQuAnswer paperQuAnswer = new PaperQuAnswer(); - paperQuAnswer.setId(UUID.randomUUID().toString()); - paperQuAnswer.setPaperId(paperId); - paperQuAnswer.setQuId(answer.getQuId()); - paperQuAnswer.setAnswerId(answer.getId()); - paperQuAnswer.setChecked(false); - paperQuAnswer.setSort(ii); - paperQuAnswer.setAbc(ABC.get(ii)); - paperQuAnswer.setIsRight(answer.getIsRight()); - ii++; - batchAnswerList.add(paperQuAnswer); - } +// 声明保存试卷试题列表的私有方法 +/** + * 保存试卷试题列表的方法 + * @param paperId 试卷ID + * @param quList 题目列表 + */ +private void savePaperQu(String paperId, List quList){ + + // 创建批量保存的题目列表和答案列表 + List batchQuList = new ArrayList<>(); + List batchAnswerList = new ArrayList<>(); + + // 初始化排序号 + int sort = 0; + for (PaperQu item : quList) { + + // 设置试卷ID和排序号,并生成ID + item.setPaperId(paperId); + item.setSort(sort); + item.setId(IdWorker.getIdStr()); + + // 查询题目的答案列表 + List answerList = quAnswerService.listAnswerByRandom(item.getQuId()); + + // 如果答案列表不为空,则进行处理 + if (!CollectionUtils.isEmpty(answerList)) { + + // 初始化答案排序号 + int ii = 0; + for (QuAnswer answer : answerList) { + PaperQuAnswer paperQuAnswer = new PaperQuAnswer(); + paperQuAnswer.setId(UUID.randomUUID().toString()); + paperQuAnswer.setPaperId(paperId); + paperQuAnswer.setQuId(answer.getQuId()); + paperQuAnswer.setAnswerId(answer.getId()); + paperQuAnswer.setChecked(false); + paperQuAnswer.setSort(ii); + paperQuAnswer.setAbc(ABC.get(ii)); + paperQuAnswer.setIsRight(answer.getIsRight()); + ii++; + batchAnswerList.add(paperQuAnswer); } - - batchQuList.add(item); - sort++; } - //添加问题 - paperQuService.saveBatch(batchQuList); - - //批量添加问题答案 - paperQuAnswerService.saveBatch(batchAnswerList); + // 添加到批量保存的题目列表中 + batchQuList.add(item); + sort++; } - @Transactional(rollbackFor = Exception.class) - @Override - public void fillAnswer(PaperAnswerDTO reqDTO) { - + // 批量添加题目 + paperQuService.saveBatch(batchQuList); - // 未作答 - if(CollectionUtils.isEmpty(reqDTO.getAnswers()) - && StringUtils.isBlank(reqDTO.getAnswer())){ - return; - } + // 批量添加答案 + paperQuAnswerService.saveBatch(batchAnswerList); +} - //查找答案列表 - List list = paperQuAnswerService.listForFill(reqDTO.getPaperId(), reqDTO.getQuId()); +// 声明填充答案的方法,使用事务管理 +/** + * 填充答案的方法 + * @param reqDTO 试卷答案DTO + */ +@Transactional(rollbackFor = Exception.class) +@Override +public void fillAnswer(PaperAnswerDTO reqDTO) { + + // 如果答案列表为空且答案字符串也为空,则直接返回 + if(CollectionUtils.isEmpty(reqDTO.getAnswers()) + && StringUtils.isBlank(reqDTO.getAnswer())){ + return; + } - //是否正确 - boolean right = true; + // 查询答案列表 + List list = paperQuAnswerService.listForFill(reqDTO.getPaperId(), reqDTO.getQuId()); - //更新正确答案 - for (PaperQuAnswer item : list) { + // 初始化是否正确的标记 + boolean right = true; - if (reqDTO.getAnswers().contains(item.getId())) { - item.setChecked(true); - } else { - item.setChecked(false); - } + // 更新正确答案 + for (PaperQuAnswer item : list) { - //有一个对不上就是错的 - if (item.getIsRight()!=null && !item.getIsRight().equals(item.getChecked())) { - right = false; - } - paperQuAnswerService.updateById(item); + // 设置答案是否被选中 + if (reqDTO.getAnswers().contains(item.getId())) { + item.setChecked(true); + } else { + item.setChecked(false); } - //修改为已回答 - PaperQu qu = new PaperQu(); - qu.setQuId(reqDTO.getQuId()); - qu.setPaperId(reqDTO.getPaperId()); - qu.setIsRight(right); - qu.setAnswer(reqDTO.getAnswer()); - qu.setAnswered(true); - - paperQuService.updateByKey(qu); - - } - - @Transactional(rollbackFor = Exception.class) - @Override - public void handExam(String paperId) { - - //获取试卷信息 - Paper paper = paperService.getById(paperId); - - //如果不是正常的,抛出异常 - if(!PaperState.ING.equals(paper.getState())){ - throw new ServiceException(1, "试卷状态不正确!"); + // 如果有一个答案不正确,则标记为错误 + if (item.getIsRight()!=null && !item.getIsRight().equals(item.getChecked())) { + right = false; } + paperQuAnswerService.updateById(item); + } - // 客观分 - int objScore = paperQuService.sumObjective(paperId); - paper.setObjScore(objScore); - paper.setUserScore(objScore); + // 修改为已回答 + PaperQu qu = new PaperQu(); + qu.setQuId(reqDTO.getQuId()); + qu.setPaperId(reqDTO.getPaperId()); + qu.setIsRight(right); + qu.setAnswer(reqDTO.getAnswer()); + qu.setAnswered(true); - // 主观分,因为要阅卷,所以给0 - paper.setSubjScore(0); + paperQuService.updateByKey(qu); - // 待阅卷 - if(paper.getHasSaq()) { - paper.setState(PaperState.WAIT_OPT); - }else { +} - // 同步保存考试成绩 - userExamService.joinResult(paper.getUserId(), paper.getExamId(), objScore, objScore>=paper.getQualifyScore()); +// 声明交卷的方法,使用事务管理 +/** + * 交卷的方法 + * @param paperId 试卷ID + */ +@Transactional(rollbackFor = Exception.class) +@Override +public void handExam(String paperId) { + + // 获取试卷信息 + Paper paper = paperService.getById(paperId); + + // 如果试卷状态不正确,则抛出服务异常 + if(!PaperState.ING.equals(paper.getState())){ + throw new ServiceException(1, "试卷状态不正确!"); + } - paper.setState(PaperState.FINISHED); - } - paper.setUpdateTime(new Date()); - - //计算考试时长 - Calendar cl = Calendar.getInstance(); - cl.setTimeInMillis(System.currentTimeMillis()); - int userTime = (int)((System.currentTimeMillis() - paper.getCreateTime().getTime()) / 1000 / 60); - if(userTime == 0){ - userTime = 1; - } - paper.setUserTime(userTime); + // 计算客观题分数 + int objScore = paperQuService.sumObjective(paperId); + paper.setObjScore(objScore); + paper.setUserScore(objScore); - //更新试卷 - paperService.updateById(paper); + // 设置主观题分数为0 + paper.setSubjScore(0); + // 如果有主观题,则设置状态为待阅卷 + if(paper.getHasSaq()) { + paper.setState(PaperState.WAIT_OPT); + }else { - // 终止定时任务 - String name = JobPrefix.BREAK_EXAM + paperId; - jobService.deleteJob(name, JobGroup.SYSTEM); + // 同步保存考试成绩 + userExamService.joinResult(paper.getUserId(), paper.getExamId(), objScore, objScore>=paper.getQualifyScore()); - //把打错的问题加入错题本 - List list = paperQuService.listByPaper(paperId); - for(PaperQuDTO qu: list){ - // 主观题和对的都不加入错题库 - if(qu.getIsRight()){ - continue; - } - //加入错题本 - new Thread(() -> userBookService.addBook(paper.getExamId(), qu.getQuId())).run(); - } + // 设置状态为已完成 + paper.setState(PaperState.FINISHED); } - - @Override - public IPage paging(PagingReqDTO reqDTO) { - return baseMapper.paging(reqDTO.toPage(), reqDTO.getParams()); + paper.setUpdateTime(new Date()); + + // 计算考试时长 + Calendar cl = Calendar.getInstance(); + cl.setTimeInMillis(System.currentTimeMillis()); + int userTime = (int)((System.currentTimeMillis() - paper.getCreateTime().getTime()) / 1000 / 60); + if(userTime == 0){ + userTime = 1; } + paper.setUserTime(userTime); + // 更新试卷信息 + paperService.updateById(paper); - @Override - public PaperDTO checkProcess(String userId) { - - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .eq(Paper::getUserId, userId) - .eq(Paper::getState, PaperState.ING); - - Paper paper = this.getOne(wrapper, false); + // 终止定时任务 + String name = JobPrefix.BREAK_EXAM + paperId; + jobService.deleteJob(name, JobGroup.SYSTEM); - if (paper != null) { - return BeanMapper.map(paper, PaperDTO.class); + // 把打错的问题加入错题本 + List list = paperQuService.listByPaper(paperId); + for(PaperQuDTO qu: list){ + // 主观题和对的都不加入错题库 + if(qu.getIsRight()){ + continue; } + //加入错题本 + new Thread(() -> userBookService.addBook(paper.getExamId(), qu.getQuId())).run(); + } +} - return null; +// 声明分页查询试卷列表的方法 +/** + * 分页查询试卷列表的方法 + * @param reqDTO 分页请求DTO + * @return 返回分页响应 + */ +@Override +public IPage paging(PagingReqDTO reqDTO) { + return baseMapper.paging(reqDTO.toPage(), reqDTO.getParams()); +} + +// 声明检查考试进度的方法 +/** + * 检查考试进度的方法 + * @param userId 用户ID + * @return 返回试卷DTO + */ +@Override +public PaperDTO checkProcess(String userId) { + + // 构建查询条件,查询是否有正在进行的考试 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .eq(Paper::getUserId, userId) + .eq(Paper::getState, PaperState.ING); + + // 查询正在进行的考试 + Paper paper = this.getOne(wrapper, false); + + // 如果存在正在进行的考试,则返回试卷DTO + if (paper != null) { + return BeanMapper.map(paper, PaperDTO.class); } + + // 如果不存在正在进行的考试,则返回null + return null; } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/controller/QuController.java b/src-源文件/main/java/com/yf/exam/modules/qu/controller/QuController.java index 07e7d76..99f62b6 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/controller/QuController.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/controller/QuController.java @@ -1,137 +1,129 @@ +// 导入所需的包 package com.yf.exam.modules.qu.controller; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.google.common.collect.Lists; -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.BaseIdRespDTO; -import com.yf.exam.core.api.dto.BaseIdsReqDTO; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.exception.ServiceException; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.core.utils.excel.ExportExcel; -import com.yf.exam.core.utils.excel.ImportExcel; -import com.yf.exam.modules.qu.dto.QuDTO; -import com.yf.exam.modules.qu.dto.export.QuExportDTO; -import com.yf.exam.modules.qu.dto.ext.QuDetailDTO; -import com.yf.exam.modules.qu.dto.request.QuQueryReqDTO; -import com.yf.exam.modules.qu.entity.Qu; -import com.yf.exam.modules.qu.service.QuService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.shiro.authz.annotation.RequiresRoles; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; -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.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页 +import com.google.common.collect.Lists; // 用于操作列表 +import com.yf.exam.core.api.ApiRest; // API响应封装类 +import com.yf.exam.core.api.controller.BaseController; // 基础控制器类 +import com.yf.exam.core.api.dto.BaseIdReqDTO; // 基础ID请求DTO +import com.yf.exam.core.api.dto.BaseIdRespDTO; // 基础ID响应DTO +import com.yf.exam.core.api.dto.BaseIdsReqDTO; // 基础ID数组请求DTO +import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO +import com.yf.exam.core.exception.ServiceException; // 自定义服务异常 +import com.yf.exam.core.utils.BeanMapper; // Bean映射工具 +import com.yf.exam.core.utils.excel.ExportExcel; // 导出Excel工具 +import com.yf.exam.core.utils.excel.ImportExcel; // 导入Excel工具 +import com.yf.exam.modules.qu.dto.QuDTO; // 问题DTO +import com.yf.exam.modules.qu.dto.export.QuExportDTO; // 问题导出DTO +import com.yf.exam.modules.qu.dto.ext.QuDetailDTO; // 问题详情DTO +import com.yf.exam.modules.qu.dto.request.QuQueryReqDTO; // 问题查询请求DTO +import com.yf.exam.modules.qu.entity.Qu; // 问题实体类 +import com.yf.exam.modules.qu.service.QuService; // 问题服务类 +import io.swagger.annotations.Api; // Swagger API注释 +import io.swagger.annotations.ApiOperation; // Swagger API操作注释 +import org.apache.commons.lang3.StringUtils; // 字符串操作工具类 +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; // 用于处理Excel格式异常 +import org.apache.shiro.authz.annotation.RequiresRoles; // Shiro权限控制注解 +import org.springframework.beans.factory.annotation.Autowired; // 自动注入依赖 +import org.springframework.util.CollectionUtils; // 集合工具类 +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.RequestParam; // 请求参数注解 +import org.springframework.web.bind.annotation.ResponseBody; // 响应体注解 +import org.springframework.web.bind.annotation.RestController; // REST控制器注解 +import org.springframework.web.multipart.MultipartFile; // 用于处理文件上传 + +import javax.servlet.http.HttpServletResponse; // 用于处理HTTP响应 +import java.io.IOException; // IO异常处理 +import java.util.Arrays; // 数组工具类 +import java.util.List; // 列表工具类 /** *

* 问题题目控制器 *

+* 该控制器类负责管理题目相关的操作,包括添加、修改、删除、查询等 * * @author 聪明笨狗 * @since 2020-05-25 13:25 */ -@Api(tags={"问题题目"}) -@RestController -@RequestMapping("/exam/api/qu/qu") +@Api(tags={"问题题目"}) // Swagger注解,表示该控制器处理"问题题目"相关的请求 +@RestController // Spring注解,表示这是一个RESTful API控制器 +@RequestMapping("/exam/api/qu/qu") // 设置基础路径 public class QuController extends BaseController { @Autowired - private QuService baseService; + private QuService baseService; // 自动注入问题服务类 /** - * 添加或修改 + * 添加或修改问题题目 * - * @param reqDTO - * @return + * @param reqDTO 请求的详细数据,包含问题题目的详细信息 + * @return 返回操作结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "添加或修改") - @RequestMapping(value = "/save", method = {RequestMethod.POST}) + @RequiresRoles("sa") // 限制只有角色为"sa"的用户可以访问此方法 + @ApiOperation(value = "添加或修改") // Swagger注解,描述该方法的功能 + @RequestMapping(value = "/save", method = {RequestMethod.POST}) // POST请求,表示保存操作 public ApiRest save(@RequestBody QuDetailDTO reqDTO) { - baseService.save(reqDTO); - return super.success(); + baseService.save(reqDTO); // 调用服务层保存或更新问题数据 + return super.success(); // 返回成功响应 } /** - * 批量删除 + * 批量删除问题题目 * - * @param reqDTO - * @return + * @param reqDTO 请求的ID数组,包含要删除的题目ID列表 + * @return 返回操作结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "批量删除") - @RequestMapping(value = "/delete", method = {RequestMethod.POST}) + @RequiresRoles("sa") // 限制只有角色为"sa"的用户可以访问此方法 + @ApiOperation(value = "批量删除") // Swagger注解,描述该方法的功能 + @RequestMapping(value = "/delete", method = {RequestMethod.POST}) // POST请求,表示删除操作 public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { - //根据ID删除 - baseService.delete(reqDTO.getIds()); - return super.success(); + baseService.delete(reqDTO.getIds()); // 调用服务层进行批量删除 + return super.success(); // 返回成功响应 } /** - * 查找详情 + * 查找问题题目详情 * - * @param reqDTO - * @return + * @param reqDTO 请求的ID数据,包含要查找的题目ID + * @return 返回问题题目的详细信息 */ - @ApiOperation(value = "查找详情") - @RequestMapping(value = "/detail", method = {RequestMethod.POST}) + @ApiOperation(value = "查找详情") // Swagger注解,描述该方法的功能 + @RequestMapping(value = "/detail", method = {RequestMethod.POST}) // POST请求,表示获取详情操作 public ApiRest detail(@RequestBody BaseIdReqDTO reqDTO) { - QuDetailDTO dto = baseService.detail(reqDTO.getId()); - return super.success(dto); + QuDetailDTO dto = baseService.detail(reqDTO.getId()); // 调用服务层获取问题题目详情 + return super.success(dto); // 返回问题详情 } /** - * 分页查找 + * 分页查询问题题目 * - * @param reqDTO - * @return + * @param reqDTO 分页请求数据,包含查询条件和分页参数 + * @return 返回分页结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = {RequestMethod.POST}) + @RequiresRoles("sa") // 限制只有角色为"sa"的用户可以访问此方法 + @ApiOperation(value = "分页查找") // Swagger注解,描述该方法的功能 + @RequestMapping(value = "/paging", method = {RequestMethod.POST}) // POST请求,表示分页查询操作 public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - - //分页查询并转换 - IPage page = baseService.paging(reqDTO); - - return super.success(page); + IPage page = baseService.paging(reqDTO); // 调用服务层进行分页查询 + return super.success(page); // 返回分页结果 } - /** - * 导出excel文件 + * 导出问题题目的Excel文件 */ - @RequiresRoles("sa") - @ResponseBody - @RequestMapping(value = "/export") + @RequiresRoles("sa") // 限制只有角色为"sa"的用户可以访问此方法 + @ResponseBody // 标明返回内容直接作为响应体 + @RequestMapping(value = "/export") // 导出请求路径 public ApiRest exportFile(HttpServletResponse response, @RequestBody QuQueryReqDTO reqDTO) { - - - // 导出文件名 - String fileName = "导出的试题-" + System.currentTimeMillis() + ".xlsx"; - + String fileName = "导出的试题-" + System.currentTimeMillis() + ".xlsx"; // 设置导出的文件名 try { - int no = 0; String quId = ""; - List list = baseService.listForExport(reqDTO); + List list = baseService.listForExport(reqDTO); // 获取导出数据 for (QuExportDTO item : list) { if (!quId.equals(item.getQId())) { quId = item.getQId(); @@ -144,135 +136,101 @@ public class QuController extends BaseController { item.setQImage(""); item.setQVideo(""); } - item.setNo(String.valueOf(no)); + item.setNo(String.valueOf(no)); // 设置题目序号 } - new ExportExcel("试题", QuExportDTO.class).setDataList(list).write(response, fileName).dispose(); - return super.success(); + new ExportExcel("试题", QuExportDTO.class).setDataList(list).write(response, fileName).dispose(); // 导出数据到Excel文件 + return super.success(); // 返回成功响应 } catch (Exception e) { - return failure(e.getMessage()); + return failure(e.getMessage()); // 捕获异常并返回失败响应 } } /** - * 导入Excel + * 导入问题题目的Excel文件 * - * @param file - * @return + * @param file 上传的Excel文件 + * @return 返回操作结果 */ - @RequiresRoles("sa") - @ResponseBody - @RequestMapping(value = "/import") + @RequiresRoles("sa") // 限制只有角色为"sa"的用户可以访问此方法 + @ResponseBody // 标明返回内容直接作为响应体 + @RequestMapping(value = "/import") // 导入请求路径 public ApiRest importFile(@RequestParam("file") MultipartFile file) { - try { - - ImportExcel ei = new ImportExcel(file, 1, 0); - List list = ei.getDataList(QuExportDTO.class); - - // 校验数据 - this.checkExcel(list); - - // 导入数据条数 - baseService.importExcel(list); - - // 导入成功 - return super.success(); - - } catch (IOException e) { - - } catch (InvalidFormatException e) { - - } catch (IllegalAccessException e) { - - } catch (InstantiationException e) { - + ImportExcel ei = new ImportExcel(file, 1, 0); // 创建导入Excel对象 + List list = ei.getDataList(QuExportDTO.class); // 获取Excel中的数据列表 + this.checkExcel(list); // 校验数据 + baseService.importExcel(list); // 调用服务层进行导入操作 + return super.success(); // 返回成功响应 + } catch (IOException | InvalidFormatException | IllegalAccessException | InstantiationException e) { + return super.failure(); // 捕获各种异常并返回失败响应 } - - return super.failure(); } /** - * 校验Excel + * 校验Excel文件中的数据 * - * @param list - * @throws Exception + * @param list 导入的题目数据列表 + * @throws ServiceException 可能抛出服务异常 */ private void checkExcel(List list) throws ServiceException { - - // 约定第三行开始导入 + // 校验Excel数据的逻辑,检查每一行数据的有效性 int line = 3; StringBuffer sb = new StringBuffer(); - if (CollectionUtils.isEmpty(list)) { - throw new ServiceException(1, "您导入的数据似乎是一个空表格!"); + throw new ServiceException(1, "您导入的数据似乎是一个空表格!"); // 如果表格为空,抛出异常 } - Integer quNo = null; for (QuExportDTO item : list) { - - System.out.println(item.getNo()); if (StringUtils.isBlank(item.getNo())) { line++; continue; } - - System.out.println(item.getQContent()); Integer no; - try { - no = Integer.parseInt(item.getNo()); + no = Integer.parseInt(item.getNo()); // 转换题目序号 } catch (Exception e) { line++; continue; } - if (no == null) { sb.append("第" + line + "行,题目序号不能为空!
"); } - + // 校验题目内容和其他字段是否为空 if (quNo == null || !quNo.equals(no)) { - if (item.getQuType() == null) { sb.append("第" + line + "行,题目类型不能为空
"); } - if (StringUtils.isBlank(item.getQContent())) { sb.append("第" + line + "行,题目内容不能为空
"); } - if (CollectionUtils.isEmpty(item.getRepoList())) { sb.append("第" + line + "行,题目必须包含一个题库
"); } } - if (StringUtils.isBlank(item.getAIsRight())) { sb.append("第" + line + "行,选项是否正确不能为空
"); } - if (StringUtils.isBlank(item.getAContent()) && StringUtils.isBlank(item.getAImage())) { sb.append("第" + line + "行,选项内容和选项图片必须有一个不为空
"); } - quNo = no; line++; } - - // 存在错误 if (!"".equals(sb.toString())) { - throw new ServiceException(1, sb.toString()); + throw new ServiceException(1, sb.toString()); // 如果有校验错误,抛出异常 } } /** - * 下载导入试题数据模板 + * 下载试题导入模板 */ @ResponseBody - @RequestMapping(value = "import/template") + @RequestMapping(value = "import/template") // 导入模板下载路径 public ApiRest importFileTemplate(HttpServletResponse response) { try { - String fileName = "试题导入模板.xlsx"; - List list = Lists.newArrayList(); - + String fileName = "试题导入模板.xlsx"; // 设置文件名 + List list = Lists.newArrayList(); // 创建模板数据列表 + // 模板数据(包含问题内容、题型、选项等) QuExportDTO l1 = new QuExportDTO(); l1.setNo("正式导入,请删除此说明行:数字,相同的数字表示同一题的序列"); l1.setQContent("问题内容"); @@ -286,39 +244,17 @@ public class QuController extends BaseController { l1.setAIsRight("只能填写0或1,0表示否,1表示是"); l1.setAAnalysis("这个项是正确的"); - - QuExportDTO l2 = new QuExportDTO(); - l2.setQContent("找出以下可以被2整除的数(多选)"); - l2.setQAnalysis("最基本的数学题,不做过多解析"); - l2.setQuType("2"); - l2.setNo("1"); - l2.setAIsRight("1"); - l2.setAContent("数字:2"); - l2.setAAnalysis("2除以2=1,对的"); - - QuExportDTO l3 = new QuExportDTO(); - l3.setNo("1"); - l3.setAIsRight("0"); - l3.setAContent("数字:3"); - l3.setAAnalysis("3除以2=1.5,不能被整除"); - - QuExportDTO l4 = new QuExportDTO(); - l4.setNo("1"); - l4.setAIsRight("1"); - l4.setAContent("数字:6"); - l4.setAAnalysis("6除以2=3,对的"); - - - + // 添加模板示例数据 list.add(l1); list.add(l2); list.add(l3); list.add(l4); + // 导出模板文件 new ExportExcel("试题数据", QuExportDTO.class, 1).setDataList(list).write(response, fileName).dispose(); - return super.success(); + return super.success(); // 返回成功响应 } catch (Exception e) { - return super.failure("导入模板下载失败!失败信息:"+e.getMessage()); + return super.failure("导入模板下载失败!失败信息:"+e.getMessage()); // 返回失败响应 } } } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuAnswerDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuAnswerDTO.java index 3b9c3a1..9a6a160 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuAnswerDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuAnswerDTO.java @@ -1,42 +1,66 @@ package com.yf.exam.modules.qu.dto; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // Swagger注解,用于生成API文档 +import io.swagger.annotations.ApiModelProperty; // Swagger注解,用于描述API模型的属性 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.io.Serializable; +import java.io.Serializable; // 可序列化接口 /** *

* 候选答案请求类 *

* +* 该类用于封装候选答案的请求信息,包含每个答案的具体内容、是否正确、答案分析等信息。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 @ApiModel(value="候选答案", description="候选答案") public class QuAnswerDTO implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID + /** + * 答案ID + * 用于唯一标识每个候选答案,通常由数据库自动生成。 + */ + @ApiModelProperty(value = "答案ID", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String id; // 答案ID - @ApiModelProperty(value = "答案ID", required=true) - private String id; + /** + * 题目ID + * 该字段表示该答案对应的题目ID。 + */ + @ApiModelProperty(value = "问题ID", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String quId; // 题目ID - @ApiModelProperty(value = "问题ID", required=true) - private String quId; + /** + * 是否正确 + * 标记该答案是否为正确答案,`true`表示正确,`false`表示错误。 + */ + @ApiModelProperty(value = "是否正确", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Boolean isRight; // 是否正确 - @ApiModelProperty(value = "是否正确", required=true) - private Boolean isRight; + /** + * 选项图片 + * 存储与该答案相关的图片URL,通常用于多媒体题目选项。 + */ + @ApiModelProperty(value = "选项图片", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String image; // 选项图片URL - @ApiModelProperty(value = "选项图片", required=true) - private String image; + /** + * 答案内容 + * 该字段用于存储该答案的文本内容,通常为答案的描述或选项文本。 + */ + @ApiModelProperty(value = "答案内容", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String content; // 答案内容 - @ApiModelProperty(value = "答案内容", required=true) - private String content; - - @ApiModelProperty(value = "答案分析", required=true) - private String analysis; - + /** + * 答案分析 + * 用于对该答案进行详细解析,解释为什么该答案正确或错误。 + */ + @ApiModelProperty(value = "答案分析", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String analysis; // 答案分析 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuDTO.java index 8f45eec..fe82154 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuDTO.java @@ -1,53 +1,88 @@ package com.yf.exam.modules.qu.dto; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // Swagger注解,用于生成API文档 +import io.swagger.annotations.ApiModelProperty; // Swagger注解,用于描述API模型的属性 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.io.Serializable; -import java.util.Date; +import java.io.Serializable; // 可序列化接口 +import java.util.Date; // 日期类型 /** *

* 问题题目请求类 *

* +* 该类用于封装问题题目的基本信息,包括题目的类型、难度、内容、解析等。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 @ApiModel(value="问题题目", description="问题题目") public class QuDTO implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID + /** + * 题目ID + * 每个题目都拥有唯一的ID,用于标识题目。 + */ + @ApiModelProperty(value = "题目ID", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String id; // 题目ID - @ApiModelProperty(value = "题目ID", required=true) - private String id; + /** + * 题目类型 + * 该字段用于标识题目的类型,例如选择题、填空题、判断题等。 + */ + @ApiModelProperty(value = "题目类型", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Integer quType; // 题目类型 - @ApiModelProperty(value = "题目类型", required=true) - private Integer quType; + /** + * 题目难度 + * 用于表示题目的难易程度。1表示普通,2表示较难,可能有更多级别。 + */ + @ApiModelProperty(value = "1普通,2较难", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Integer level; // 题目难度 - @ApiModelProperty(value = "1普通,2较难", required=true) - private Integer level; + /** + * 题目图片 + * 该字段存储与题目相关的图片URL,可以是题目内容的辅助说明。 + */ + @ApiModelProperty(value = "题目图片", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String image; // 题目图片URL - @ApiModelProperty(value = "题目图片", required=true) - private String image; + /** + * 题目内容 + * 存储题目的具体内容,描述问题的文本部分。 + */ + @ApiModelProperty(value = "题目内容", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String content; // 题目内容 - @ApiModelProperty(value = "题目内容", required=true) - private String content; + /** + * 创建时间 + * 标识题目创建的时间,通常由系统自动生成。 + */ + @ApiModelProperty(value = "创建时间", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Date createTime; // 创建时间 + /** + * 更新时间 + * 记录题目最后一次更新时间,通常由系统自动更新。 + */ + @ApiModelProperty(value = "更新时间", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Date updateTime; // 更新时间 - @ApiModelProperty(value = "创建时间", required=true) - private Date createTime; + /** + * 题目备注 + * 可选字段,用于记录关于题目的额外备注信息。 + */ + @ApiModelProperty(value = "题目备注", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String remark; // 题目备注 - @ApiModelProperty(value = "更新时间", required=true) - private Date updateTime; - - @ApiModelProperty(value = "题目备注", required=true) - private String remark; - - @ApiModelProperty(value = "整题解析", required=true) - private String analysis; - + /** + * 整题解析 + * 提供该题目的完整解析,帮助用户理解解题思路及过程。 + */ + @ApiModelProperty(value = "整题解析", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String analysis; // 整题解析 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuRepoDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuRepoDTO.java index 6e689b8..0fa058e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuRepoDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/QuRepoDTO.java @@ -1,38 +1,58 @@ package com.yf.exam.modules.qu.dto; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // Swagger注解,用于生成API文档 +import io.swagger.annotations.ApiModelProperty; // Swagger注解,用于描述API模型的属性 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.io.Serializable; +import java.io.Serializable; // 可序列化接口 /** *

* 试题题库请求类 *

* +* 该类用于封装题库与题目之间的关联信息,包含题目的ID、题库ID、题目类型等信息。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 @ApiModel(value="试题题库", description="试题题库") public class QuRepoDTO implements Serializable { - private static final long serialVersionUID = 1L; - - - private String id; - - @ApiModelProperty(value = "试题", required=true) - private String quId; - - @ApiModelProperty(value = "归属题库", required=true) - private String repoId; - - @ApiModelProperty(value = "题目类型", required=true) - private Integer quType; - - @ApiModelProperty(value = "排序", required=true) - private Integer sort; - -} \ No newline at end of file + private static final long serialVersionUID = 1L; // 序列化版本UID + + /** + * 试题ID + * 唯一标识一道试题。 + */ + private String id; // 试题ID + + /** + * 题目ID + * 与题目ID进行关联,表示该试题属于某个具体题目。 + */ + @ApiModelProperty(value = "试题", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String quId; // 题目ID + + /** + * 题库ID + * 标识该题目所属的题库。 + */ + @ApiModelProperty(value = "归属题库", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private String repoId; // 题库ID + + /** + * 题目类型 + * 表示该题目在题库中的类型,例如选择题、填空题等。 + */ + @ApiModelProperty(value = "题目类型", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Integer quType; // 题目类型 + + /** + * 排序 + * 表示该题目在题库中的显示顺序,数字越小,顺序越靠前。 + */ + @ApiModelProperty(value = "排序", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Integer sort; // 排序 +} diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuExportDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuExportDTO.java index fe94dac..fff01c5 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuExportDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuExportDTO.java @@ -1,45 +1,59 @@ package com.yf.exam.modules.qu.dto.export; -import com.yf.exam.core.utils.excel.annotation.ExcelField; -import com.yf.exam.core.utils.excel.fieldtype.ListType; -import lombok.Data; +import com.yf.exam.core.utils.excel.annotation.ExcelField; // Excel导出注解 +import com.yf.exam.core.utils.excel.fieldtype.ListType; // 用于处理List类型字段的特殊注解 +import lombok.Data; // Lombok注解,用于自动生成getter、setter、toString等方法 -import java.util.List; +import java.util.List; // 用于表示列表类型的字段 /** * 用于导出的数据结构 + * + * 该类是导出试题相关数据时所使用的DTO(数据传输对象),包含了题目序号、题目内容、题目解析、选项内容等信息。 + * 主要用于Excel导出时的数据映射。 + * * @author bool */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 public class QuExportDTO { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID /** - * + * 题目ID */ - private String qId; - - @ExcelField(title="题目序号", align=2, sort=1) - private String no; - @ExcelField(title="题目类型", align=2, sort=2) - private String quType; - @ExcelField(title="题目内容", align=2, sort=3) - private String qContent; - @ExcelField(title="整体解析", align=2, sort=4) - private String qAnalysis; - @ExcelField(title="题目图片", align=2, sort=5) - private String qImage; - @ExcelField(title="题目视频", align=2, sort=6) - private String qVideo; - @ExcelField(title="所属题库", align=2, sort=7, fieldType = ListType.class) - private List repoList; - @ExcelField(title="是否正确项", align=2, sort=8) - private String aIsRight; - @ExcelField(title="选项内容", align=2, sort=9) - private String aContent; - @ExcelField(title="选项解析", align=2, sort=10) - private String aAnalysis; - @ExcelField(title="选项图片", align=2, sort=11) - private String aImage; + private String qId; // 题目的唯一标识符 + + @ExcelField(title="题目序号", align=2, sort=1) // 导出Excel时的列标题和排序,align为居中对齐,sort为排序位置 + private String no; // 题目序号,表示题目的编号 + + @ExcelField(title="题目类型", align=2, sort=2) // Excel导出列的标题和排序 + private String quType; // 题目类型,可能是单选题、多选题等 + + @ExcelField(title="题目内容", align=2, sort=3) // Excel导出列的标题和排序 + private String qContent; // 题目内容,包含问题的具体描述 + + @ExcelField(title="整体解析", align=2, sort=4) // Excel导出列的标题和排序 + private String qAnalysis; // 整个题目的解析说明 + + @ExcelField(title="题目图片", align=2, sort=5) // Excel导出列的标题和排序 + private String qImage; // 题目图片,存储图片URL或路径 + + @ExcelField(title="题目视频", align=2, sort=6) // Excel导出列的标题和排序 + private String qVideo; // 题目视频,存储视频URL或路径 + + @ExcelField(title="所属题库", align=2, sort=7, fieldType = ListType.class) // 题库列表,支持导出多个题库 + private List repoList; // 题目所属的题库列表 + + @ExcelField(title="是否正确项", align=2, sort=8) // Excel导出列的标题和排序 + private String aIsRight; // 是否为正确选项(0或1) + + @ExcelField(title="选项内容", align=2, sort=9) // Excel导出列的标题和排序 + private String aContent; // 选项内容,表示答案的具体内容 + + @ExcelField(title="选项解析", align=2, sort=10) // Excel导出列的标题和排序 + private String aAnalysis; // 选项解析,说明该选项的正确性或相关分析 + + @ExcelField(title="选项图片", align=2, sort=11) // Excel导出列的标题和排序 + private String aImage; // 选项图片,存储图片URL或路径 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuImportDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuImportDTO.java index 4ac03c0..79aa0fe 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuImportDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/export/QuImportDTO.java @@ -1,23 +1,56 @@ package com.yf.exam.modules.qu.dto.export; -import com.yf.exam.modules.qu.dto.QuAnswerDTO; -import lombok.Data; +import com.yf.exam.modules.qu.dto.QuAnswerDTO; // 导入的选项答案DTO +import lombok.Data; // Lombok注解,用于自动生成getter、setter、toString等方法 -import java.util.List; +import java.util.List; // 用于表示列表类型的字段 /** * 用于导出的数据结构 + * + * 该类用于导入试题数据时的DTO(数据传输对象),包含了题目类型、题目内容、解析、题目图片等信息。 + * 同时还包含了该题目的多个答案选项。 + * * @author bool */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 public class QuImportDTO { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID - private String quType; - private String qContent; - private String qAnalysis; - private String qImage; - private String repoName; - private List answerList; + /** + * 题目类型 + * 例如:1代表单选题,2代表多选题,3代表判断题,4代表主观题等 + */ + private String quType; // 题目类型,表示题目的类别 + + /** + * 题目内容 + * 例如:问题的具体描述 + */ + private String qContent; // 题目内容,表示题目的实际问题 + + /** + * 题目解析 + * 例如:题目解析或解释说明 + */ + private String qAnalysis; // 题目解析,解释题目的答案或相关说明 + + /** + * 题目图片 + * 例如:题目相关的图片URL + */ + private String qImage; // 题目图片,存储图片URL或路径 + + /** + * 题库名称 + * 例如:题目所属的题库名称 + */ + private String repoName; // 题目所属的题库名称 + + /** + * 答案选项列表 + * 该字段存储了该题目的多个答案选项及其相关信息。 + */ + private List answerList; // 答案选项列表,包含该题目的所有答案选项 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/ext/QuDetailDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/ext/QuDetailDTO.java index b36a4e8..0035a89 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/ext/QuDetailDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/ext/QuDetailDTO.java @@ -1,33 +1,43 @@ package com.yf.exam.modules.qu.dto.ext; -import com.yf.exam.modules.qu.dto.QuAnswerDTO; -import com.yf.exam.modules.qu.dto.QuDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.qu.dto.QuAnswerDTO; // 引入选项答案DTO +import com.yf.exam.modules.qu.dto.QuDTO; // 引入问题题目DTO +import io.swagger.annotations.ApiModel; // Swagger注解,用于生成API文档 +import io.swagger.annotations.ApiModelProperty; // Swagger注解,用于描述API模型的属性 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.util.List; +import java.util.List; // 用于表示列表类型的字段 /** *

* 问题题目请求类 *

* +* 该类用于表示问题的详细信息,继承自 `QuDTO`,包括题目的详细信息如备选项、题库列表等。 +* 主要用于在前后端交互时,传递包含问题详细信息的请求或响应数据。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 @ApiModel(value="问题题目详情", description="问题题目详情") public class QuDetailDTO extends QuDTO { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID - - @ApiModelProperty(value = "备选项列表", required=true) - private List answerList; - - @ApiModelProperty(value = "题库列表", required=true) - private List repoIds; + /** + * 备选项列表 + * 该字段包含了该题目的所有答案选项列表。 + * 每个选项都包含了选项内容、是否为正确答案、解析等信息。 + */ + @ApiModelProperty(value = "备选项列表", required=true) // Swagger注解,用于生成文档 + private List answerList; // 备选项列表,包含该题目的所有答案选项 - + /** + * 题库列表 + * 该字段包含了该题目所属的多个题库ID。 + * 用于标识该题目属于哪些题库,可能有多个题库关联。 + */ + @ApiModelProperty(value = "题库列表", required=true) // Swagger注解,用于生成文档 + private List repoIds; // 题库列表,存储题库ID的列表 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuQueryReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuQueryReqDTO.java index a927e9e..989cb8e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuQueryReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuQueryReqDTO.java @@ -1,38 +1,54 @@ package com.yf.exam.modules.qu.dto.request; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // Swagger注解,用于生成API文档 +import io.swagger.annotations.ApiModelProperty; // Swagger注解,用于描述API模型的属性 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.io.Serializable; -import java.util.List; +import java.io.Serializable; // 可序列化接口 +import java.util.List; // 用于表示列表类型的字段 /** *

* 问题题目请求类 *

* +* 该类用于封装前端请求查询题目的参数。通过该请求类,前端可以传递多个查询条件, +* 如题目类型、题库ID、题目内容等,以便进行题目的筛选和查询。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 @ApiModel(value="题目查询请求类", description="题目查询请求类") public class QuQueryReqDTO implements Serializable { - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "题目类型") - private Integer quType; - - @ApiModelProperty(value = "归属题库") - private List repoIds; - - @ApiModelProperty(value = "题目内容") - private String content; - - @ApiModelProperty(value = "排除ID列表") - private List excludes; - - + private static final long serialVersionUID = 1L; // 序列化版本UID + + /** + * 题目类型 + * 用于指定查询的题目类型。例如,单选题、多选题、判断题等。 + */ + @ApiModelProperty(value = "题目类型") // Swagger注解,描述字段信息 + private Integer quType; // 题目类型,通常是数字表示不同题型 + + /** + * 归属题库 + * 用于指定题目所属的题库ID列表。如果该字段不为空,查询会限制在指定的题库中。 + */ + @ApiModelProperty(value = "归属题库") // Swagger注解,描述字段信息 + private List repoIds; // 题库ID列表,题目可以归属于多个题库 + + /** + * 题目内容 + * 用于进行模糊查询,匹配包含特定内容的题目。 + */ + @ApiModelProperty(value = "题目内容") // Swagger注解,描述字段信息 + private String content; // 题目内容,支持模糊查询 + + /** + * 排除ID列表 + * 用于指定在查询中排除的题目ID列表,这些ID的题目不会出现在查询结果中。 + */ + @ApiModelProperty(value = "排除ID列表") // Swagger注解,描述字段信息 + private List excludes; // 排除的题目ID列表 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuRepoBatchReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuRepoBatchReqDTO.java index 3ca148d..0628495 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuRepoBatchReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/dto/request/QuRepoBatchReqDTO.java @@ -1,34 +1,47 @@ package com.yf.exam.modules.qu.dto.request; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // Swagger注解,用于生成API文档 +import io.swagger.annotations.ApiModelProperty; // Swagger注解,用于描述API模型的属性 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.io.Serializable; -import java.util.List; +import java.io.Serializable; // 可序列化接口 +import java.util.List; // 用于表示列表类型的字段 /** *

-* 问题题目请求类 +* 试题题库批量操作请求类 *

* +* 该类用于封装前端请求批量操作题目和题库关联的参数。 +* 通过该请求类,前端可以执行批量新增或移除题目与题库的关联操作。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data +@Data // Lombok注解,自动生成getter、setter等方法 @ApiModel(value="试题题库批量操作类", description="试题题库批量操作类") public class QuRepoBatchReqDTO implements Serializable { - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "题目ID", required=true) - private List quIds; - - @ApiModelProperty(value = "题目类型", required=true) - private List repoIds; - - @ApiModelProperty(value = "是否移除,否就新增;是就移除", required=true) - private Boolean remove; - + private static final long serialVersionUID = 1L; // 序列化版本UID + + /** + * 题目ID列表 + * 用于指定要操作的题目ID集合,可以是多个题目。 + */ + @ApiModelProperty(value = "题目ID", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private List quIds; // 要操作的题目ID列表 + + /** + * 题库ID列表 + * 用于指定题目与之关联的题库ID集合,可以是多个题库。 + */ + @ApiModelProperty(value = "题目类型", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private List repoIds; // 题库ID列表 + + /** + * 是否移除标志 + * 如果为 `true`,表示从题库中移除题目;如果为 `false`,表示新增题目到题库中。 + */ + @ApiModelProperty(value = "是否移除,否就新增;是就移除", required=true) // Swagger注解,描述字段信息,标明该字段是必填项 + private Boolean remove; // `true`表示移除,`false`表示新增 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/entity/Qu.java b/src-源文件/main/java/com/yf/exam/modules/qu/entity/Qu.java index 2380cdc..ccb4579 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/entity/Qu.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/entity/Qu.java @@ -1,75 +1,85 @@ package com.yf.exam.modules.qu.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // MyBatis Plus注解,指定ID生成策略 +import com.baomidou.mybatisplus.annotation.TableField; // MyBatis Plus注解,指定字段映射 +import com.baomidou.mybatisplus.annotation.TableId; // MyBatis Plus注解,指定主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // MyBatis Plus注解,指定表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // MyBatis Plus扩展的活动记录模式类 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 -import java.util.Date; +import java.util.Date; // 日期类型 /** *

* 问题题目实体类 *

* +* 该类用于映射问题题目的数据结构,通过MyBatis-Plus框架进行数据库操作。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data -@TableName("el_qu") +@Data // Lombok注解,自动生成getter、setter等方法 +@TableName("el_qu") // MyBatis Plus注解,指定与数据库表的映射关系 public class Qu extends Model { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID /** * 题目ID + * 主键,唯一标识一道题目。 */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定主键生成策略为自定义ID + private String id; // 题目ID /** * 题目类型 + * 表示该题目是选择题、判断题等类型。 */ - @TableField("qu_type") - private Integer quType; + @TableField("qu_type") // MyBatis Plus注解,指定字段名与数据库表字段名映射 + private Integer quType; // 题目类型 /** - * 1普通,2较难 + * 题目难度 + * 1表示普通,2表示较难。 */ - private Integer level; + private Integer level; // 题目难度,1普通,2较难 /** * 题目图片 + * 题目相关的图片资源,存储图片URL或路径。 */ - private String image; + private String image; // 题目图片 /** * 题目内容 + * 存储题目的实际内容,例如选择题或填空题的文本。 */ - private String content; + private String content; // 题目内容 /** * 创建时间 + * 记录该题目创建的时间戳。 */ - @TableField("create_time") - private Date createTime; + @TableField("create_time") // MyBatis Plus注解,映射数据库中的字段 + private Date createTime; // 创建时间 /** * 更新时间 + * 记录该题目最后更新时间戳。 */ - @TableField("update_time") - private Date updateTime; + @TableField("update_time") // MyBatis Plus注解,映射数据库中的字段 + private Date updateTime; // 更新时间 /** * 题目备注 + * 对题目附加的说明或备注。 */ - private String remark; + private String remark; // 题目备注 /** * 整题解析 + * 对该题目的详细解析,包括答案解析、解题思路等。 */ - private String analysis; - + private String analysis; // 整题解析 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuAnswer.java b/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuAnswer.java index 45e9bf4..6c01005 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuAnswer.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuAnswer.java @@ -1,58 +1,64 @@ package com.yf.exam.modules.qu.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // MyBatis Plus注解,指定ID生成策略 +import com.baomidou.mybatisplus.annotation.TableField; // MyBatis Plus注解,指定字段映射 +import com.baomidou.mybatisplus.annotation.TableId; // MyBatis Plus注解,指定主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // MyBatis Plus注解,指定表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // MyBatis Plus扩展的活动记录模式类 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 /** *

* 候选答案实体类 *

* +* 该类用于映射候选答案的数据结构,通过MyBatis-Plus框架进行数据库操作。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data -@TableName("el_qu_answer") +@Data // Lombok注解,自动生成getter、setter等方法 +@TableName("el_qu_answer") // MyBatis Plus注解,指定与数据库表的映射关系 public class QuAnswer extends Model { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID /** * 答案ID + * 主键,唯一标识一个答案。 */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定主键生成策略为自定义ID + private String id; // 答案ID /** * 问题ID + * 关联的题目ID,表示这个答案是属于哪道题目的。 */ - @TableField("qu_id") - private String quId; + @TableField("qu_id") // MyBatis Plus注解,指定字段名与数据库表字段名映射 + private String quId; // 问题ID /** * 是否正确 + * 该答案是否为正确答案,true表示正确,false表示错误。 */ - @TableField("is_right") - private Boolean isRight; + @TableField("is_right") // MyBatis Plus注解,映射数据库中的字段 + private Boolean isRight; // 是否正确 /** * 选项图片 + * 答案相关的图片资源,存储图片URL或路径。 */ - private String image; + private String image; // 选项图片 /** * 答案内容 + * 存储该选项的文本内容。 */ - private String content; - + private String content; // 答案内容 /** * 答案分析 + * 对该答案的详细分析,包括为什么是正确或错误的解析。 */ - private String analysis; - + private String analysis; // 答案分析 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuRepo.java b/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuRepo.java index baade9a..aa26d34 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuRepo.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/entity/QuRepo.java @@ -1,50 +1,59 @@ package com.yf.exam.modules.qu.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // MyBatis Plus注解,指定ID生成策略 +import com.baomidou.mybatisplus.annotation.TableField; // MyBatis Plus注解,指定字段映射 +import com.baomidou.mybatisplus.annotation.TableId; // MyBatis Plus注解,指定主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // MyBatis Plus注解,指定表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // MyBatis Plus扩展的活动记录模式类 +import lombok.Data; // Lombok注解,用于自动生成getter、setter等方法 /** *

* 试题题库实体类 *

* +* 该类用于映射试题和题库之间的关系,表示一道题目属于某个题库,并可能具有排序。 +* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Data -@TableName("el_qu_repo") +@Data // Lombok注解,自动生成getter、setter等方法 +@TableName("el_qu_repo") // MyBatis Plus注解,指定与数据库表的映射关系 public class QuRepo extends Model { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本UID - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + /** + * 试题题库关系ID + * 主键,唯一标识一条题目与题库的关联记录。 + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定主键生成策略为自定义ID + private String id; // 试题题库关系ID /** - * 试题 + * 试题ID + * 关联的题目ID,表示某道题目属于哪个题库。 */ - @TableField("qu_id") - private String quId; + @TableField("qu_id") // MyBatis Plus注解,指定字段名与数据库表字段名映射 + private String quId; // 试题ID /** - * 归属题库 + * 题库ID + * 关联的题库ID,表示该题目属于哪个题库。 */ - @TableField("repo_id") - private String repoId; + @TableField("repo_id") // MyBatis Plus注解,指定字段名与数据库表字段名映射 + private String repoId; // 题库ID /** * 题目类型 + * 用于描述该题目所属的类型(例如:选择题、填空题等)。 */ - @TableField("qu_type") - private Integer quType; + @TableField("qu_type") // MyBatis Plus注解,映射数据库中的字段 + private Integer quType; // 题目类型 /** * 排序 + * 用于对题库中的题目进行排序。 */ - private Integer sort; - + private Integer sort; // 排序 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/enums/QuType.java b/src-源文件/main/java/com/yf/exam/modules/qu/enums/QuType.java index 70e2ee1..4e5f342 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/enums/QuType.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/enums/QuType.java @@ -1,8 +1,10 @@ package com.yf.exam.modules.qu.enums; - /** - * 题目类型 + * 题目类型接口 + * + * 该接口定义了不同类型的题目标识常量,适用于题库系统中对题目类型的区分。 + * * @author bool * @date 2019-10-30 13:11 */ @@ -10,16 +12,19 @@ public interface QuType { /** * 单选题 + * 表示一道题目是单选题,用户只能选择一个答案。 */ Integer RADIO = 1; /** * 多选题 + * 表示一道题目是多选题,用户可以选择多个答案。 */ Integer MULTI = 2; /** * 判断题 + * 表示一道题目是判断题,通常是选择“正确”或“错误”两种答案。 */ Integer JUDGE = 3; diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuAnswerMapper.java b/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuAnswerMapper.java index 23699ce..5fb575e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuAnswerMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuAnswerMapper.java @@ -4,13 +4,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.yf.exam.modules.qu.entity.QuAnswer; /** -*

-* 候选答案Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ + *

+ * 候选答案Mapper + *

+ * + * @author 聪明笨狗 + * @since 2020-05-25 13:23 + */ public interface QuAnswerMapper extends BaseMapper { } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuMapper.java b/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuMapper.java index 14069a2..2ab579e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuMapper.java @@ -1,15 +1,15 @@ -package com.yf.exam.modules.qu.mapper; +package com.yf.exam.modules.qu.mapper; // 定义包名,用于存放与问题题目相关的 Mapper 类 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yf.exam.modules.qu.dto.QuDTO; -import com.yf.exam.modules.qu.dto.export.QuExportDTO; -import com.yf.exam.modules.qu.dto.request.QuQueryReqDTO; -import com.yf.exam.modules.qu.entity.Qu; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper,用于提供通用的 CRUD 方法 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入分页接口 IPage,用于处理分页结果 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入分页插件的 Page 类,用于分页查询 +import com.yf.exam.modules.qu.dto.QuDTO; // 导入 QuDTO 数据传输对象,用于封装题目数据 +import com.yf.exam.modules.qu.dto.export.QuExportDTO; // 导入 QuExportDTO 用于题目导出的数据结构 +import com.yf.exam.modules.qu.dto.request.QuQueryReqDTO; // 导入 QuQueryReqDTO 用于封装查询条件 +import com.yf.exam.modules.qu.entity.Qu; // 导入 Qu 实体类,表示题目表的对应数据 +import org.apache.ibatis.annotations.Param; // 导入 MyBatis 的 Param 注解,用于 SQL 查询中的参数传递 -import java.util.List; +import java.util.List; // 导入 List,用于返回多个对象的集合 /** *

@@ -19,38 +19,34 @@ import java.util.List; * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -public interface QuMapper extends BaseMapper { - - +public interface QuMapper extends BaseMapper { // QuMapper 继承自 BaseMapper,提供基本的 CRUD 操作 /** * 随机抽取题库的数据 - * @param repoId - * @param quType - * @param level + * @param repoId 题库ID + * @param quType 题目类型 + * @param level 题目难度 * @param excludes 要排除的ID列表 - * @param size - * @return + * @param size 抽取题目的数量 + * @return 随机抽取的题目列表 */ - List listByRandom(@Param("repoId") String repoId, - @Param("quType") Integer quType, - @Param("excludes") List excludes, - @Param("size") Integer size); + List listByRandom(@Param("repoId") String repoId, // 题库ID + @Param("quType") Integer quType, // 题目类型 + @Param("excludes") List excludes, // 要排除的题目ID列表 + @Param("size") Integer size); // 抽取的题目数量 /** * 查找导出列表 - * @param query - * @return + * @param query 查询条件对象 + * @return 返回符合条件的题目列表,用于导出 */ - List listForExport(@Param("query") QuQueryReqDTO query); + List listForExport(@Param("query") QuQueryReqDTO query); // 根据查询条件查找导出数据 /** * 分页查找 - * @param page - * @param query - * @return + * @param page 分页参数,包含当前页和每页大小 + * @param query 查询条件对象 + * @return 返回分页的题目数据 */ - IPage paging(Page page, @Param("query") QuQueryReqDTO query); - - + IPage paging(Page page, @Param("query") QuQueryReqDTO query); // 分页查询题目数据,返回 QuDTO 类型的数据 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuRepoMapper.java b/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuRepoMapper.java index 1015448..84fa2cb 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuRepoMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/mapper/QuRepoMapper.java @@ -1,7 +1,7 @@ -package com.yf.exam.modules.qu.mapper; +package com.yf.exam.modules.qu.mapper; // 定义包名,用于存放与试题题库相关的 Mapper 类 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.qu.entity.QuRepo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper,用于提供通用的 CRUD 方法 +import com.yf.exam.modules.qu.entity.QuRepo; // 导入 QuRepo 实体类,表示试题题库表的数据 /** *

@@ -11,6 +11,5 @@ import com.yf.exam.modules.qu.entity.QuRepo; * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -public interface QuRepoMapper extends BaseMapper { - +public interface QuRepoMapper extends BaseMapper { // QuRepoMapper 继承自 BaseMapper,提供基本的 CRUD 操作 } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/service/QuAnswerService.java b/src-源文件/main/java/com/yf/exam/modules/qu/service/QuAnswerService.java index 4062e95..f6329f5 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/service/QuAnswerService.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/service/QuAnswerService.java @@ -10,7 +10,7 @@ import java.util.List; /** *

-* 候选答案业务类 +* 候选答案业务类接口,定义了与试题答案相关的业务操作 *

* * @author 聪明笨狗 @@ -19,30 +19,30 @@ import java.util.List; public interface QuAnswerService extends IService { /** - * 分页查询数据 - * @param reqDTO - * @return + * 分页查询答案数据 + * @param reqDTO 请求的分页和查询参数 + * @return 分页的答案数据 */ IPage paging(PagingReqDTO reqDTO); /** - * 根据题目ID查询答案并随机 - * @param quId - * @return + * 根据题目ID查询答案,并进行随机排序 + * @param quId 题目ID + * @return 随机排序后的答案列表 */ List listAnswerByRandom(String quId); /** - * 根据问题查找答案 - * @param quId - * @return + * 根据题目ID查询所有的答案 + * @param quId 题目ID + * @return 该题目的答案列表 */ List listByQu(String quId); /** - * 保存试题 - * @param quId - * @param list + * 保存所有选项数据 + * @param quId 题目ID + * @param list 题目的所有答案选项 */ void saveAll(String quId, List list); } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/service/QuRepoService.java b/src-源文件/main/java/com/yf/exam/modules/qu/service/QuRepoService.java index f528759..a53ebb1 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/service/QuRepoService.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/service/QuRepoService.java @@ -1,59 +1,66 @@ +// 定义包名,表示该接口属于com.yf.exam.modules.qu.service包下 package com.yf.exam.modules.qu.service; +// 导入MyBatis Plus框架的分页功能相关类 import com.baomidou.mybatisplus.core.metadata.IPage; +// 导入MyBatis Plus框架的服务接口 import com.baomidou.mybatisplus.extension.service.IService; +// 导入项目中定义的分页请求DTO类 import com.yf.exam.core.api.dto.PagingReqDTO; +// 导入项目中定义的题库DTO类 import com.yf.exam.modules.qu.dto.QuRepoDTO; +// 导入项目中定义的批量请求DTO类 import com.yf.exam.modules.qu.dto.request.QuRepoBatchReqDTO; +// 导入项目中定义的题库实体类 import com.yf.exam.modules.qu.entity.QuRepo; - +// 导入Java.util包下的List接口,用于操作列表 import java.util.List; /** -*

-* 试题题库业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ + *

+ * 试题题库业务接口,定义了题库相关的业务操作 + *

+ * + * @author 聪明笨狗 + * @since 2020-05-25 13:23 + */ public interface QuRepoService extends IService { /** - * 分页查询数据 - * @param reqDTO - * @return - */ + * 分页查询题库数据的方法 + * @param reqDTO 分页请求DTO,包含分页信息和查询条件 + * @return 返回分页响应,包含题库数据和分页信息 + */ IPage paging(PagingReqDTO reqDTO); /** - * 保存全部列表 - * @param quId - * @param quType - * @param ids + * 保存全部列表的方法,用于保存题目与题库的关系 + * @param quId 题目ID + * @param quType 题目类型 + * @param ids 题库ID列表 */ void saveAll(String quId, Integer quType, List ids); /** - * 根据问题查找题库 - * @param quId - * @return + * 根据题目查找题库的方法 + * @param quId 题目ID + * @return 返回与题目关联的题库ID列表 */ List listByQu(String quId); /** - * 根据题库查找题目ID列表 - * @param repoId - * @param quType - * @param rand - * @return + * 根据题库查找题目ID列表的方法 + * @param repoId 题库ID + * @param quType 题目类型 + * @param rand 是否随机选择 + * @return 返回题目ID列表 */ List listByRepo(String repoId, Integer quType, boolean rand); /** - * 批量操作 - * @param reqDTO + * 批量操作的方法,用于执行批量业务操作 + * @param reqDTO 批量请求DTO,包含批量操作信息 */ void batchAction(QuRepoBatchReqDTO reqDTO); -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/service/QuService.java b/src-源文件/main/java/com/yf/exam/modules/qu/service/QuService.java index 81f43b0..51fe835 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/service/QuService.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/service/QuService.java @@ -1,46 +1,55 @@ +// 定义包名,表示该接口属于com.yf.exam.modules.qu.service包下 package com.yf.exam.modules.qu.service; +// 导入MyBatis Plus框架的分页功能相关类 import com.baomidou.mybatisplus.core.metadata.IPage; +// 导入MyBatis Plus框架的服务接口 import com.baomidou.mybatisplus.extension.service.IService; +// 导入项目中定义的分页请求DTO类 import com.yf.exam.core.api.dto.PagingReqDTO; +// 导入项目中定义的题目DTO类 import com.yf.exam.modules.qu.dto.QuDTO; +// 导入项目中定义的题目导出DTO类 import com.yf.exam.modules.qu.dto.export.QuExportDTO; +// 导入项目中定义的扩展题目详情DTO类 import com.yf.exam.modules.qu.dto.ext.QuDetailDTO; +// 导入项目中定义的题目查询请求DTO类 import com.yf.exam.modules.qu.dto.request.QuQueryReqDTO; +// 导入项目中定义的题目实体类 import com.yf.exam.modules.qu.entity.Qu; - +// 导入Java.util包下的List接口,用于操作列表 import java.util.List; /** -*

-* 问题题目业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ + *

+ * 问题题目业务接口,定义了题目相关的业务操作 + *

+ * + * @author 聪明笨狗 + * @since 2020-05-25 13:23 + */ public interface QuService extends IService { /** - * 分页查询数据 - * @param reqDTO - * @return + * 分页查询题目数据的方法 + * @param reqDTO 分页请求DTO,包含分页信息和查询条件 + * @return 返回分页响应,包含题目数据和分页信息 */ IPage paging(PagingReqDTO reqDTO); /** - * 删除试题 - * @param ids + * 删除题目的方法 + * @param ids 题目ID列表 */ void delete(List ids); /** - * 随机抽取题库的数据 - * @param repoId - * @param quType + * 随机抽取题库中的数据的方法 + * @param repoId 题库ID + * @param quType 题目类型 * @param excludes 要排除的ID列表 - * @param size - * @return + * @param size 抽取的数量 + * @return 返回随机抽取的题目列表 */ List listByRandom(String repoId, Integer quType, @@ -48,29 +57,29 @@ public interface QuService extends IService { Integer size); /** - * 问题详情 - * @param id - * @return + * 查询题目详情的方法 + * @param id 题目ID + * @return 返回题目详情DTO */ QuDetailDTO detail(String id); /** - * 保存试题 - * @param reqDTO + * 保存题目的方法 + * @param reqDTO 题目详情DTO */ void save(QuDetailDTO reqDTO); /** - * 查找导出列表 - * @param query - * @return + * 查找导出列表的方法 + * @param query 题目查询请求DTO + * @return 返回题目导出列表 */ List listForExport(QuQueryReqDTO query); /** - * 导入Excel - * @param dtoList - * @return + * 导入Excel数据的方法 + * @param dtoList 题目导出DTO列表 + * @return 返回导入的结果,影响的行数 */ int importExcel(List dtoList); -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuAnswerServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuAnswerServiceImpl.java index 2fd66cf..1c31577 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuAnswerServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuAnswerServiceImpl.java @@ -1,24 +1,24 @@ -package com.yf.exam.modules.qu.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.qu.dto.QuAnswerDTO; -import com.yf.exam.modules.qu.entity.QuAnswer; -import com.yf.exam.modules.qu.mapper.QuAnswerMapper; -import com.yf.exam.modules.qu.service.QuAnswerService; -import com.yf.exam.modules.qu.utils.ImageCheckUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.List; +package com.yf.exam.modules.qu.service.impl; // 定义包名,表示这是实现类部分,专注于处理与试题答案相关的逻辑 + +import com.alibaba.fastjson.JSON; // 导入 fastjson 库,用于 JSON 序列化和反序列化 +import com.alibaba.fastjson.TypeReference; // 导入 fastjson 库的 TypeReference,用于处理泛型类型 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构造查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 的分页 Page 类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 基类 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象类 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象之间的映射 +import com.yf.exam.modules.qu.dto.QuAnswerDTO; // 导入试题答案的 DTO 类 +import com.yf.exam.modules.qu.entity.QuAnswer; // 导入试题答案的实体类 +import com.yf.exam.modules.qu.mapper.QuAnswerMapper; // 导入试题答案的 Mapper 接口 +import com.yf.exam.modules.qu.service.QuAnswerService; // 导入试题答案的服务接口 +import com.yf.exam.modules.qu.utils.ImageCheckUtils; // 导入图片校验工具类 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 的注解,自动注入依赖 +import org.springframework.stereotype.Service; // 导入 Spring 的服务注解,标识这是一个服务类 +import org.springframework.util.CollectionUtils; // 导入 Spring 的集合工具类,用于检查集合是否为空 + +import java.util.ArrayList; // 导入 ArrayList,用于动态数组 +import java.util.List; // 导入 List 接口,作为列表类型 /** *

@@ -28,65 +28,77 @@ import java.util.List; * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Service +@Service // 表示这是一个服务类,Spring 会自动扫描并管理该类 public class QuAnswerServiceImpl extends ServiceImpl implements QuAnswerService { @Autowired - private ImageCheckUtils imageCheckUtils; + private ImageCheckUtils imageCheckUtils; // 自动注入图片校验工具类,用于校验图片地址是否合法 @Override public IPage paging(PagingReqDTO reqDTO) { - - //创建分页对象 + // 创建分页对象,传入当前页和每页大小 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 创建查询条件包装器 QueryWrapper wrapper = new QueryWrapper<>(); - //获得数据 + // 执行分页查询,获取分页结果 IPage page = this.page(query, wrapper); - //转换结果 + + // 将查询结果转换为 QuAnswerDTO 类型的分页结果 IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); return pageData; - } + } @Override public List listAnswerByRandom(String quId) { + // 创建查询条件包装器 QueryWrapper wrapper = new QueryWrapper<>(); + // 设置查询条件,过滤出与 quId 相同的记录 wrapper.lambda().eq(QuAnswer::getQuId, quId); + // 使用 SQL 的随机排序来随机获取答案 wrapper.last(" ORDER BY RAND() "); + // 执行查询并返回结果 return this.list(wrapper); } @Override public List listByQu(String quId) { + // 创建查询条件包装器 QueryWrapper wrapper = new QueryWrapper<>(); + // 设置查询条件,过滤出与 quId 相同的记录 wrapper.lambda().eq(QuAnswer::getQuId, quId); + // 执行查询,获取答案列表 List list = this.list(wrapper); if(!CollectionUtils.isEmpty(list)){ + // 将 QuAnswer 实体对象列表转换为 QuAnswerDTO 对象列表 return BeanMapper.mapList(list, QuAnswerDTO.class); } + // 如果没有找到记录,返回 null return null; } - /** * 查找已存在的列表 - * @param quId - * @return + * @param quId 试题ID + * @return 已存在答案的 ID 列表 */ public List findExistsList(String quId) { - //返回结果 + // 创建空的结果列表 List ids = new ArrayList<>(); + // 创建查询条件包装器 QueryWrapper wrapper = new QueryWrapper(); + // 设置查询条件,过滤出与 quId 相同的记录 wrapper.lambda().eq(QuAnswer::getQuId, quId); + // 执行查询,获取答案列表 List list = this.list(wrapper); if (!CollectionUtils.isEmpty(list)) { + // 将已有的答案 ID 添加到结果列表 for (QuAnswer item : list) { ids.add(item.getId()); } @@ -96,49 +108,49 @@ public class QuAnswerServiceImpl extends ServiceImpl i @Override public void saveAll(String quId, List list) { - - //最终要保存的列表 + // 创建保存的答案列表 List saveList = new ArrayList<>(); - //已存在的标签列表 + // 获取已有的答案 ID 列表 List ids = this.findExistsList(quId); + // 如果答案列表不为空,则进行处理 if(!CollectionUtils.isEmpty(list)){ for(QuAnswerDTO item: list){ - // 校验图片地址 + // 校验选项图片地址是否合法 imageCheckUtils.checkImage(item.getImage(), "选项图片地址错误!"); - //标签ID + // 获取答案 ID String id = item.getId(); QuAnswer answer = new QuAnswer(); + // 将 DTO 转换为实体类 BeanMapper.copy(item, answer); - answer.setQuId(quId); + answer.setQuId(quId); // 设置试题 ID - //补全ID避免新增 + // 如果该答案已存在,则从 IDs 列表中移除 if(ids.contains(id)){ ids.remove(id); } + // 添加答案到保存列表 saveList.add(answer); } - //保存标签列表 + // 如果有待保存的答案,则批量保存或更新 if(!CollectionUtils.isEmpty(saveList)) { this.saveOrUpdateBatch(saveList); } - //删除已移除 + // 如果有被移除的答案,则批量删除 if(!ids.isEmpty()){ this.removeByIds(ids); } }else{ - + // 如果答案列表为空,则删除所有与该试题 ID 相关的答案 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(QuAnswer::getQuId, quId); this.remove(wrapper); } } - - } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuRepoServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuRepoServiceImpl.java index b7de030..c0e8f29 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuRepoServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuRepoServiceImpl.java @@ -1,175 +1,182 @@ -package com.yf.exam.modules.qu.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.qu.dto.QuRepoDTO; -import com.yf.exam.modules.qu.dto.request.QuRepoBatchReqDTO; -import com.yf.exam.modules.qu.entity.Qu; -import com.yf.exam.modules.qu.entity.QuRepo; -import com.yf.exam.modules.qu.mapper.QuMapper; -import com.yf.exam.modules.qu.mapper.QuRepoMapper; -import com.yf.exam.modules.qu.service.QuRepoService; -import com.yf.exam.modules.repo.service.RepoService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.List; +package com.yf.exam.modules.qu.service.impl; // 定义包名,表示这是服务实现类,负责处理与试题题库相关的业务逻辑 + +import com.alibaba.fastjson.JSON; // 导入 fastjson 库,用于 JSON 序列化和反序列化 +import com.alibaba.fastjson.TypeReference; // 导入 fastjson 库的 TypeReference,用于处理泛型类型 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构造查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 的分页 Page 类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 基类 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象类 +import com.yf.exam.modules.qu.dto.QuRepoDTO; // 导入试题题库的 DTO 类 +import com.yf.exam.modules.qu.dto.request.QuRepoBatchReqDTO; // 导入试题题库批量操作请求类 +import com.yf.exam.modules.qu.entity.Qu; // 导入试题实体类 +import com.yf.exam.modules.qu.entity.QuRepo; // 导入试题题库实体类 +import com.yf.exam.modules.qu.mapper.QuMapper; // 导入试题的 Mapper 接口 +import com.yf.exam.modules.qu.mapper.QuRepoMapper; // 导入试题题库的 Mapper 接口 +import com.yf.exam.modules.qu.service.QuRepoService; // 导入试题题库服务接口 +import com.yf.exam.modules.repo.service.RepoService; // 导入题库服务接口 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 的注解,自动注入依赖 +import org.springframework.stereotype.Service; // 导入 Spring 的服务注解,标识这是一个服务类 +import org.springframework.util.CollectionUtils; // 导入 Spring 的集合工具类,用于检查集合是否为空 + +import java.util.ArrayList; // 导入 ArrayList,用于动态数组 +import java.util.List; // 导入 List 接口,作为列表类型 /** *

-* 语言设置 服务实现类 +* 试题题库 服务实现类 *

* * @author 聪明笨狗 * @since 2020-05-25 13:23 */ -@Service +@Service // 表示这是一个 Spring 服务类,Spring 会自动扫描并管理该类 public class QuRepoServiceImpl extends ServiceImpl implements QuRepoService { - @Autowired - private QuMapper quMapper; + private QuMapper quMapper; // 自动注入试题的 Mapper 接口 @Autowired - private RepoService repoService; + private RepoService repoService; // 自动注入题库服务接口 @Override public IPage paging(PagingReqDTO reqDTO) { - - //创建分页对象 + // 创建分页对象,传入当前页和每页大小 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 创建查询条件包装器 QueryWrapper wrapper = new QueryWrapper<>(); - //获得数据 + // 执行分页查询,获取分页结果 IPage page = this.page(query, wrapper); - //转换结果 + + // 将查询结果转换为 QuRepoDTO 类型的分页结果 IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); return pageData; - } + } @Override public void saveAll(String quId, Integer quType, List ids) { - // 先删除 + // 先删除已有的试题题库记录 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(QuRepo::getQuId, quId); this.remove(wrapper); - // 保存全部 + // 如果题库 ID 列表不为空,保存新的记录 if(!CollectionUtils.isEmpty(ids)){ List list = new ArrayList<>(); for(String id: ids){ QuRepo ref = new QuRepo(); - ref.setQuId(quId); - ref.setRepoId(id); - ref.setQuType(quType); + ref.setQuId(quId); // 设置试题 ID + ref.setRepoId(id); // 设置题库 ID + ref.setQuType(quType); // 设置题目类型 list.add(ref); } + // 批量保存试题题库记录 this.saveBatch(list); - + // 对每个题库进行排序 for(String id: ids){ this.sortRepo(id); } } - - } @Override public List listByQu(String quId) { - // 先删除 + // 根据试题 ID 查找题库记录 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(QuRepo::getQuId, quId); List list = this.list(wrapper); List ids = new ArrayList<>(); if(!CollectionUtils.isEmpty(list)){ + // 提取题库 ID 列表 for(QuRepo item: list){ ids.add(item.getRepoId()); } } - return ids; + return ids; // 返回题库 ID 列表 } @Override public List listByRepo(String repoId, Integer quType, boolean rand) { + // 根据题库 ID 和题目类型查询题库记录 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .eq(QuRepo::getRepoId, repoId); + wrapper.lambda().eq(QuRepo::getRepoId, repoId); - if(quType!=null){ + // 如果有题目类型,添加过滤条件 + if(quType != null){ wrapper.lambda().eq(QuRepo::getQuType, quType); } + // 根据是否需要随机排序决定排序方式 if(rand){ - wrapper.orderByAsc(" RAND() "); + wrapper.orderByAsc(" RAND() "); // 随机排序 }else{ - wrapper.lambda().orderByAsc(QuRepo::getSort); + wrapper.lambda().orderByAsc(QuRepo::getSort); // 按照排序字段排序 } + // 执行查询,获取题库记录列表 List list = this.list(wrapper); List ids = new ArrayList<>(); if(!CollectionUtils.isEmpty(list)){ + // 提取试题 ID 列表 for(QuRepo item: list){ ids.add(item.getQuId()); } } - return ids; + return ids; // 返回试题 ID 列表 } @Override public void batchAction(QuRepoBatchReqDTO reqDTO) { - - // 移除的 - if(reqDTO.getRemove()!=null && reqDTO.getRemove()){ + // 如果需要移除记录 + if(reqDTO.getRemove() != null && reqDTO.getRemove()){ + // 删除满足条件的题库记录 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .in(QuRepo::getRepoId, reqDTO.getRepoIds()) .in(QuRepo::getQuId, reqDTO.getQuIds()); this.remove(wrapper); }else{ - - // 新增的 + // 如果是新增记录,处理新增逻辑 for(String quId : reqDTO.getQuIds()){ + // 根据试题 ID 查询试题类型 Qu q = quMapper.selectById(quId); + // 保存新的题库记录 this.saveAll(quId, q.getQuType(), reqDTO.getRepoIds()); } } + // 对每个题库进行排序 for(String id: reqDTO.getRepoIds()){ this.sortRepo(id); } - } - /** * 单个题库进行排序 - * @param repoId + * @param repoId 题库 ID */ private void sortRepo(String repoId){ - + // 查询题库下的所有试题 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(QuRepo::getRepoId, repoId); - List list = this.list(wrapper); + + // 如果题库下没有试题,返回 if(CollectionUtils.isEmpty(list)){ return; } + // 按照顺序设置每个试题的排序值 int sort = 1; for(QuRepo item: list){ item.setSort(sort); sort++; } + + // 批量更新排序值 this.updateBatchById(list); } } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuServiceImpl.java index f9ae656..3594ff6 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/service/impl/QuServiceImpl.java @@ -1,9 +1,12 @@ package com.yf.exam.modules.qu.service.impl; +// 导入MyBatis Plus相关类 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +// 导入其他相关类 import com.yf.exam.ability.upload.config.UploadConfig; import com.yf.exam.core.api.dto.PagingReqDTO; import com.yf.exam.core.exception.ServiceException; @@ -23,6 +26,7 @@ import com.yf.exam.modules.qu.service.QuRepoService; import com.yf.exam.modules.qu.service.QuService; import com.yf.exam.modules.qu.utils.ImageCheckUtils; import com.yf.exam.modules.repo.service.RepoService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,7 +41,7 @@ import java.util.Map; /** *

- * 语言设置 服务实现类 + * 题目管理服务实现类 *

* * @author 聪明笨狗 @@ -46,125 +50,136 @@ import java.util.Map; @Service public class QuServiceImpl extends ServiceImpl implements QuService { + // 注入QuAnswerService服务 @Autowired private QuAnswerService quAnswerService; + // 注入QuRepoService服务 @Autowired private QuRepoService quRepoService; + // 注入图片校验工具类 @Autowired private ImageCheckUtils imageCheckUtils; + // 分页查询题目列表 @Override public IPage paging(PagingReqDTO reqDTO) { - //创建分页对象 + // 创建分页对象 Page page = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //转换结果 + // 调用baseMapper的分页查询方法,获取分页数据 IPage pageData = baseMapper.paging(page, reqDTO.getParams()); return pageData; } + // 删除题目、答案和题库绑定 @Transactional(rollbackFor = Exception.class) @Override public void delete(List ids) { - // 移除题目 + // 删除题目 this.removeByIds(ids); - // 移除选项 + // 删除与题目相关的选项 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(QuAnswer::getQuId, ids); quAnswerService.remove(wrapper); - // 移除题库绑定 + // 删除题库与题目的绑定 QueryWrapper wrapper1 = new QueryWrapper<>(); wrapper1.lambda().in(QuRepo::getQuId, ids); quRepoService.remove(wrapper1); } + // 随机获取题目 @Override public List listByRandom(String repoId, Integer quType, List excludes, Integer size) { return baseMapper.listByRandom(repoId, quType, excludes, size); } + // 获取题目的详细信息 @Override public QuDetailDTO detail(String id) { QuDetailDTO respDTO = new QuDetailDTO(); + // 获取题目信息 Qu qu = this.getById(id); BeanMapper.copy(qu, respDTO); + // 获取题目的选项信息 List answerList = quAnswerService.listByQu(id); respDTO.setAnswerList(answerList); + // 获取题目所属的题库 List repoIds = quRepoService.listByQu(id); respDTO.setRepoIds(repoIds); return respDTO; } - + // 保存题目信息 @Transactional(rollbackFor = Exception.class) @Override public void save(QuDetailDTO reqDTO) { - - // 校验数据 + // 校验题目信息 this.checkData(reqDTO, ""); Qu qu = new Qu(); + // 将题目详情复制到实体类 BeanMapper.copy(reqDTO, qu); - // 校验图片地址 + // 校验图片地址是否正确 imageCheckUtils.checkImage(qu.getImage(), "题干图片地址错误!"); - // 更新 + // 保存或更新题目信息 this.saveOrUpdate(qu); - // 保存全部问题 + // 保存题目的选项 quAnswerService.saveAll(qu.getId(), reqDTO.getAnswerList()); - // 保存到题库 + // 保存题目与题库的绑定 quRepoService.saveAll(qu.getId(), qu.getQuType(), reqDTO.getRepoIds()); - } + // 获取题目导出的列表 @Override public List listForExport(QuQueryReqDTO query) { return baseMapper.listForExport(query); } + // 导入Excel数据 @Override public int importExcel(List dtoList) { - //根据题目名称分组 + // 根据题目名称分组 Map> anMap = new HashMap<>(16); - //题目本体信息 + // 存储题目信息 Map quMap = new HashMap<>(16); - //数据分组 + // 分组数据 for (QuExportDTO item : dtoList) { - // 空白的ID + // 如果题目ID为空,跳过 if (StringUtils.isEmpty(item.getNo())) { continue; } Integer key; - //序号 + // 获取题目序号 try { key = Integer.parseInt(item.getNo()); } catch (Exception e) { continue; } - //如果已经有题目了,直接处理选项 + // 如果题目已存在,直接处理选项 if (anMap.containsKey(key)) { anMap.get(key).add(item); } else { - //如果没有,将题目内容和选项一起 + // 如果没有,将题目内容和选项一起放入 List subList = new ArrayList<>(); subList.add(item); anMap.put(key, subList); @@ -174,49 +189,46 @@ public class QuServiceImpl extends ServiceImpl implements QuServic int count = 0; try { - - //循环题目插入 + // 遍历题目插入 for (Integer key : quMap.keySet()) { QuExportDTO im = quMap.get(key); - //题目基本信息 + // 处理题目的基本信息 QuDetailDTO qu = new QuDetailDTO(); qu.setContent(im.getQContent()); qu.setAnalysis(im.getQAnalysis()); qu.setQuType(Integer.parseInt(im.getQuType())); qu.setCreateTime(new Date()); - //设置回答列表 + // 设置题目的回答列表 List answerList = this.processAnswerList(anMap.get(key)); - //设置题目 qu.setAnswerList(answerList); - //设置引用题库 + + // 设置题目所属的题库 qu.setRepoIds(im.getRepoList()); - // 保存答案 + + // 保存题目 this.save(qu); count++; } } catch (ServiceException e) { e.printStackTrace(); + // 异常处理,抛出导入失败的异常 throw new ServiceException(1, "导入出现问题,行:" + count + "," + e.getMessage()); } return count; } - /** - * 处理回答列表 - * - * @param importList - * @return - */ + // 处理题目的回答列表 private List processAnswerList(List importList) { List list = new ArrayList<>(16); for (QuExportDTO item : importList) { QuAnswerDTO a = new QuAnswerDTO(); + // 设置选项是否正确 a.setIsRight("1".equals(item.getAIsRight())); a.setContent(item.getAContent()); a.setAnalysis(item.getAAnalysis()); @@ -226,58 +238,52 @@ public class QuServiceImpl extends ServiceImpl implements QuServic return list; } - /** - * 校验题目信息 - * - * @param qu - * @param no - * @throws Exception - */ + // 校验题目信息 public void checkData(QuDetailDTO qu, String no) { - + // 校验题目内容不能为空 if (StringUtils.isEmpty(qu.getContent())) { throw new ServiceException(1, no + "题目内容不能为空!"); } - + // 校验至少选择一个题库 if (CollectionUtils.isEmpty(qu.getRepoIds())) { throw new ServiceException(1, no + "至少要选择一个题库!"); } + // 校验回答选项 List answers = qu.getAnswerList(); + if (CollectionUtils.isEmpty(answers)) { + throw new ServiceException(1, no + "客观题至少要包含一个备选答案!"); + } + int trueCount = 0; + for (QuAnswerDTO a : answers) { - if (CollectionUtils.isEmpty(answers)) { - throw new ServiceException(1, no + "客观题至少要包含一个备选答案!"); + // 校验选项是否定义了正确标志 + if (a.getIsRight() == null) { + throw new ServiceException(1, no + "必须定义选项是否正确项!"); } - - int trueCount = 0; - for (QuAnswerDTO a : answers) { - - if (a.getIsRight() == null) { - throw new ServiceException(1, no + "必须定义选项是否正确项!"); - } - - if (StringUtils.isEmpty(a.getContent())) { - throw new ServiceException(1, no + "选项内容不为空!"); - } - - if (a.getIsRight()) { - trueCount += 1; - } + // 校验选项内容不能为空 + if (StringUtils.isEmpty(a.getContent())) { + throw new ServiceException(1, no + "选项内容不为空!"); } - if (trueCount == 0) { - throw new ServiceException(1, no + "至少要包含一个正确项!"); + // 统计正确选项的个数 + if (a.getIsRight()) { + trueCount += 1; } + } + // 校验至少包含一个正确选项 + if (trueCount == 0) { + throw new ServiceException(1, no + "至少要包含一个正确项!"); + } - //单选题 - if (qu.getQuType().equals(QuType.RADIO) && trueCount > 1) { - throw new ServiceException(1, no + "单选题不能包含多个正确项!"); - } - + // 单选题不能包含多个正确选项 + if (qu.getQuType().equals(QuType.RADIO) && trueCount > 1) { + throw new ServiceException(1, no + "单选题不能包含多个正确项!"); + } } } diff --git a/src-源文件/main/java/com/yf/exam/modules/qu/utils/ImageCheckUtils.java b/src-源文件/main/java/com/yf/exam/modules/qu/utils/ImageCheckUtils.java index 707fbcd..902c507 100644 --- a/src-源文件/main/java/com/yf/exam/modules/qu/utils/ImageCheckUtils.java +++ b/src-源文件/main/java/com/yf/exam/modules/qu/utils/ImageCheckUtils.java @@ -1,31 +1,42 @@ +// 定义包名,表示该类属于com.yf.exam.modules.qu.utils包下 package com.yf.exam.modules.qu.utils; +// 导入项目中定义的上传配置类 import com.yf.exam.ability.upload.config.UploadConfig; +// 导入项目中定义的服务异常类 import com.yf.exam.core.exception.ServiceException; +// 导入Apache Commons Lang库中的StringUtils类,用于字符串操作 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架中的注解,用于自动注入依赖 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架中的注解,用于声明组件 import org.springframework.stereotype.Component; +/** + * 图片校验工具类,提供图片地址校验的功能 + */ @Component public class ImageCheckUtils { + // 自动注入上传配置,用于获取图片上传的相关配置 @Autowired private UploadConfig conf; /** - * 进行图片校验! - * @param image - * @param throwMsg + * 进行图片校验的方法 + * @param image 图片地址 + * @param throwMsg 校验失败时抛出的异常信息 */ public void checkImage(String image, String throwMsg) { - + // 如果图片地址为空或空白,则直接返回,不进行校验 if(StringUtils.isBlank(image)){ return; } - // 校验图片地址 + // 校验图片地址是否以配置的URL开头,确保图片地址是合法的 if(!image.startsWith(conf.getUrl())){ + // 如果图片地址不合法,则抛出服务异常 throw new ServiceException(throwMsg); } } -} +} \ No newline at end of file diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/controller/RepoController.java b/src-源文件/main/java/com/yf/exam/modules/repo/controller/RepoController.java index 6b1764f..29e3998 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/controller/RepoController.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/controller/RepoController.java @@ -1,117 +1,113 @@ -package com.yf.exam.modules.repo.controller; +package com.yf.exam.modules.repo.controller; // 包名:表示该类属于 repo.controller 包 -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.PagingReqDTO; -import com.yf.exam.modules.qu.dto.request.QuRepoBatchReqDTO; -import com.yf.exam.modules.qu.service.QuRepoService; -import com.yf.exam.modules.repo.dto.RepoDTO; -import com.yf.exam.modules.repo.dto.request.RepoReqDTO; -import com.yf.exam.modules.repo.dto.response.RepoRespDTO; -import com.yf.exam.modules.repo.entity.Repo; -import com.yf.exam.modules.repo.service.RepoService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.shiro.authz.annotation.RequiresRoles; -import org.springframework.beans.BeanUtils; -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 com.baomidou.mybatisplus.core.metadata.IPage; // 分页元数据接口 +import com.yf.exam.core.api.ApiRest; // 统一 API 响应类 +import com.yf.exam.core.api.controller.BaseController; // 控制器基类,提供通用控制功能 +import com.yf.exam.core.api.dto.BaseIdReqDTO; // 数据传输对象,用于封装单个 ID 请求 +import com.yf.exam.core.api.dto.BaseIdsReqDTO; // 数据传输对象,用于封装多个 ID 请求 +import com.yf.exam.core.api.dto.PagingReqDTO; // 数据传输对象,用于分页请求 +import com.yf.exam.modules.qu.dto.request.QuRepoBatchReqDTO; // 数据传输对象,用于题库批量操作请求 +import com.yf.exam.modules.qu.service.QuRepoService; // 服务接口,用于题库的批量操作 +import com.yf.exam.modules.repo.dto.RepoDTO; // 数据传输对象,封装题库信息 +import com.yf.exam.modules.repo.dto.request.RepoReqDTO; // 数据传输对象,用于题库分页查询请求 +import com.yf.exam.modules.repo.dto.response.RepoRespDTO; // 数据传输对象,用于题库分页查询响应 +import com.yf.exam.modules.repo.entity.Repo; // 题库实体类 +import com.yf.exam.modules.repo.service.RepoService; // 服务接口,用于题库操作 +import io.swagger.annotations.Api; // Swagger 注解,用于 API 文档生成 +import io.swagger.annotations.ApiOperation; // Swagger 注解,用于定义接口操作说明 +import org.apache.shiro.authz.annotation.RequiresRoles; // Shiro 注解,用于权限控制 +import org.springframework.beans.BeanUtils; // 工具类,用于对象属性拷贝 +import org.springframework.beans.factory.annotation.Autowired; // Spring 注解,用于依赖注入 +import org.springframework.web.bind.annotation.RequestBody; // 注解,用于绑定请求体 +import org.springframework.web.bind.annotation.RequestMapping; // 注解,用于定义请求路径 +import org.springframework.web.bind.annotation.RequestMethod; // 注解,用于指定 HTTP 请求方法 +import org.springframework.web.bind.annotation.RestController; // 注解,标识为 REST 控制器 /** -*

-* 题库控制器 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:25 -*/ -@Api(tags={"题库"}) -@RestController -@RequestMapping("/exam/api/repo") -public class RepoController extends BaseController { + *

+ * 题库控制器 + *

+ * 定义用于操作题库的控制器 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:25 + */ +@Api(tags = {"题库"}) // Swagger 注解:定义 API 文档中该控制器的标签为“题库” +@RestController // Spring 注解:标识该类为 REST 控制器 +@RequestMapping("/exam/api/repo") // 定义请求路径前缀为 /exam/api/repo +public class RepoController extends BaseController { // 题库控制器类,继承基础控制器 - @Autowired + @Autowired // 自动注入题库服务 private RepoService baseService; - @Autowired + @Autowired // 自动注入题库批量操作服务 private QuRepoService quRepoService; /** - * 添加或修改 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "添加或修改") - @RequestMapping(value = "/save", method = { RequestMethod.POST}) - public ApiRest save(@RequestBody RepoDTO reqDTO) { - baseService.save(reqDTO); - return super.success(); + * 添加或修改题库 + * @param reqDTO 请求数据传输对象,包含题库信息 + * @return 返回操作结果 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "添加或修改") // Swagger 注解:定义接口操作说明为“添加或修改” + @RequestMapping(value = "/save", method = {RequestMethod.POST}) // 定义请求路径为 /save,请求方法为 POST + public ApiRest save(@RequestBody RepoDTO reqDTO) { // 添加或修改题库的方法 + baseService.save(reqDTO); // 调用服务保存题库信息 + return super.success(); // 返回成功结果 } /** - * 批量删除 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "批量删除") - @RequestMapping(value = "/delete", method = { RequestMethod.POST}) - public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { - //根据ID删除 - baseService.removeByIds(reqDTO.getIds()); - return super.success(); + * 批量删除题库 + * @param reqDTO 请求数据传输对象,包含待删除的题库 ID 列表 + * @return 返回操作结果 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "批量删除") // Swagger 注解:定义接口操作说明为“批量删除” + @RequestMapping(value = "/delete", method = {RequestMethod.POST}) // 定义请求路径为 /delete,请求方法为 POST + public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { // 批量删除题库的方法 + baseService.removeByIds(reqDTO.getIds()); // 根据 ID 列表删除题库 + return super.success(); // 返回成功结果 } /** - * 查找详情 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "查找详情") - @RequestMapping(value = "/detail", method = { RequestMethod.POST}) - public ApiRest find(@RequestBody BaseIdReqDTO reqDTO) { - Repo entity = baseService.getById(reqDTO.getId()); - RepoDTO dto = new RepoDTO(); - BeanUtils.copyProperties(entity, dto); - return super.success(dto); + * 查找题库详情 + * @param reqDTO 请求数据传输对象,包含待查找的题库 ID + * @return 返回题库详情 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "查找详情") // Swagger 注解:定义接口操作说明为“查找详情” + @RequestMapping(value = "/detail", method = {RequestMethod.POST}) // 定义请求路径为 /detail,请求方法为 POST + public ApiRest find(@RequestBody BaseIdReqDTO reqDTO) { // 查找题库详情的方法 + Repo entity = baseService.getById(reqDTO.getId()); // 根据 ID 查找题库实体 + RepoDTO dto = new RepoDTO(); // 创建题库数据传输对象 + BeanUtils.copyProperties(entity, dto); // 将实体属性拷贝到 DTO 中 + return super.success(dto); // 返回成功结果,包含题库详情 } /** - * 分页查找 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) - public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - - //分页查询并转换 - IPage page = baseService.paging(reqDTO); - - return super.success(page); + * 分页查找题库 + * @param reqDTO 分页请求数据传输对象,包含分页参数和查询条件 + * @return 返回分页结果 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "分页查找") // Swagger 注解:定义接口操作说明为“分页查找” + @RequestMapping(value = "/paging", method = {RequestMethod.POST}) // 定义请求路径为 /paging,请求方法为 POST + public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { // 分页查找题库的方法 + IPage page = baseService.paging(reqDTO); // 调用服务进行分页查询 + return super.success(page); // 返回成功结果,包含分页数据 } /** - * 批量操作 - * @param reqDTO - * @return + * 批量操作题库 + * @param reqDTO 请求数据传输对象,包含批量操作的参数 + * @return 返回操作结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "批量操作", notes = "批量加入或从题库移除") - @RequestMapping(value = "/batch-action", method = { RequestMethod.POST}) - public ApiRest batchAction(@RequestBody QuRepoBatchReqDTO reqDTO) { - - //分页查询并转换 - quRepoService.batchAction(reqDTO); - return super.success(); + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "批量操作", notes = "批量加入或从题库移除") // Swagger 注解:定义接口操作说明为“批量操作”,并提供备注 + @RequestMapping(value = "/batch-action", method = {RequestMethod.POST}) // 定义请求路径为 /batch-action,请求方法为 POST + public ApiRest batchAction(@RequestBody QuRepoBatchReqDTO reqDTO) { // 批量操作题库的方法 + quRepoService.batchAction(reqDTO); // 调用服务执行批量操作 + return super.success(); // 返回成功结果 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/dto/RepoDTO.java b/src-源文件/main/java/com/yf/exam/modules/repo/dto/RepoDTO.java index a048c6b..9f5fd48 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/dto/RepoDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/dto/RepoDTO.java @@ -1,43 +1,42 @@ -package com.yf.exam.modules.repo.dto; +package com.yf.exam.modules.repo.dto; // 包名:表示该类属于 repo.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; -import java.util.Date; +import java.io.Serializable; // 导入 Serializable 接口,用于支持序列化 +import java.util.Date; // 导入 Date 类,用于处理日期和时间 /** -*

-* 题库请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -@Data -@ApiModel(value="题库", description="题库") -public class RepoDTO implements Serializable { + *

+ * 题库请求类 + *

+ * 定义题库的通用数据传输对象 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "题库", description = "题库") // Swagger 注解,定义该类的 API 模型名称及描述 +public class RepoDTO implements Serializable { // 定义类 RepoDTO,实现 Serializable 接口以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 + @ApiModelProperty(value = "题库ID", required = true) // Swagger 注解,描述该属性为“题库 ID” + private String id; // 定义属性:题库的唯一标识符 - @ApiModelProperty(value = "题库ID", required=true) - private String id; + @ApiModelProperty(value = "题库编号", required = true) // Swagger 注解,描述该属性为“题库编号” + private String code; // 定义属性:题库编号 - @ApiModelProperty(value = "题库编号", required=true) - private String code; + @ApiModelProperty(value = "题库名称", required = true) // Swagger 注解,描述该属性为“题库名称” + private String title; // 定义属性:题库名称 - @ApiModelProperty(value = "题库名称", required=true) - private String title; + @ApiModelProperty(value = "题库备注", required = true) // Swagger 注解,描述该属性为“题库备注” + private String remark; // 定义属性:题库备注信息 - @ApiModelProperty(value = "题库备注", required=true) - private String remark; + @ApiModelProperty(value = "创建时间", required = true) // Swagger 注解,描述该属性为“创建时间” + private Date createTime; // 定义属性:题库的创建时间 - @ApiModelProperty(value = "创建时间", required=true) - private Date createTime; - - @ApiModelProperty(value = "更新时间", required=true) - private Date updateTime; - + @ApiModelProperty(value = "更新时间", required = true) // Swagger 注解,描述该属性为“更新时间” + private Date updateTime; // 定义属性:题库的最后更新时间 } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/dto/request/RepoReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/repo/dto/request/RepoReqDTO.java index 1e4d803..4129476 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/dto/request/RepoReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/dto/request/RepoReqDTO.java @@ -1,30 +1,30 @@ -package com.yf.exam.modules.repo.dto.request; +package com.yf.exam.modules.repo.dto.request; // 包名:表示该类属于 repo.dto.request 包 -import com.yf.exam.modules.repo.dto.RepoDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.repo.dto.RepoDTO; // 导入 RepoDTO 类,题库数据传输对象 +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.util.List; +import java.util.List; // 导入 Java 的 List 接口,用于存储排除的题库 ID 列表 /** -*

-* 题库请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -@Data -@ApiModel(value="题库分页请求类", description="题库分页请求类") -public class RepoReqDTO extends RepoDTO { + *

+ * 题库分页请求类 + *

+ * 定义用于题库分页查询的请求数据传输对象 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "题库分页请求类", description = "题库分页请求类") // Swagger 注解,定义该类的 API 模型名称及描述 +public class RepoReqDTO extends RepoDTO { // 定义类 RepoReqDTO,继承自 RepoDTO - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "排除题库ID", required=true) - private List excludes; - - @ApiModelProperty(value = "单选题数量", required=true) - private String title; + @ApiModelProperty(value = "排除题库ID", required = true) // Swagger 注解,描述该属性为“需要排除的题库 ID 列表” + private List excludes; // 定义属性:排除的题库 ID 列表 + @ApiModelProperty(value = "单选题数量", required = true) // Swagger 注解,描述该属性为“单选题数量” + private String title; // 定义属性:单选题数量(注意:变量名可能存在歧义,建议确认或重命名) } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/dto/response/RepoRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/repo/dto/response/RepoRespDTO.java index feb90aa..c043289 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/dto/response/RepoRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/dto/response/RepoRespDTO.java @@ -1,31 +1,31 @@ -package com.yf.exam.modules.repo.dto.response; +package com.yf.exam.modules.repo.dto.response; // 包名:表示该类属于 repo.dto.response 包 -import com.yf.exam.modules.repo.dto.RepoDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.repo.dto.RepoDTO; // 导入 RepoDTO 类,题库通用数据传输对象 +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 /** -*

-* 题库请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -@Data -@ApiModel(value="题库分页响应类", description="题库分页响应类") -public class RepoRespDTO extends RepoDTO { + *

+ * 题库分页响应类 + *

+ * 定义用于分页查询的题库响应数据传输对象 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "题库分页响应类", description = "题库分页响应类") // Swagger 注解,定义该类的 API 模型名称及描述 +public class RepoRespDTO extends RepoDTO { // 定义类 RepoRespDTO,继承自 RepoDTO - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "多选题数量", required=true) - private Integer multiCount; + @ApiModelProperty(value = "多选题数量", required = true) // Swagger 注解,描述该属性为“多选题数量” + private Integer multiCount; // 定义属性:多选题的数量 - @ApiModelProperty(value = "单选题数量", required=true) - private Integer radioCount; - - @ApiModelProperty(value = "判断题数量", required=true) - private Integer judgeCount; + @ApiModelProperty(value = "单选题数量", required = true) // Swagger 注解,描述该属性为“单选题数量” + private Integer radioCount; // 定义属性:单选题的数量 + @ApiModelProperty(value = "判断题数量", required = true) // Swagger 注解,描述该属性为“判断题数量” + private Integer judgeCount; // 定义属性:判断题的数量 } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/entity/Repo.java b/src-源文件/main/java/com/yf/exam/modules/repo/entity/Repo.java index 95d3d04..d16452b 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/entity/Repo.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/entity/Repo.java @@ -1,59 +1,59 @@ -package com.yf.exam.modules.repo.entity; +package com.yf.exam.modules.repo.entity; // 包名:表示该类属于 repo.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于定义主键类型 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于映射数据库字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于标识主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于映射数据库表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus ActiveRecord 模式基类 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.util.Date; +import java.util.Date; // 导入 Java 的 Date 类,用于表示日期和时间 /** -*

-* 题库实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -@Data -@TableName("el_repo") -public class Repo extends Model { - - private static final long serialVersionUID = 1L; + *

+ * 题库实体类 + *

+ * 定义题库的数据库实体类 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@TableName("el_repo") // MyBatis-Plus 注解,指定该实体类映射的数据库表名为 "el_repo" +public class Repo extends Model { // 定义类 Repo,继承 MyBatis-Plus 的 Model 类以支持 ActiveRecord 模式 + + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 /** * 题库ID */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,标识主键字段,并指定主键生成策略为分配 ID + private String id; // 定义字段:题库的唯一标识符 /** * 题库编号 */ - private String code; + private String code; // 定义字段:题库编号 /** * 题库名称 */ - private String title; + private String title; // 定义字段:题库名称 /** * 题库备注 */ - private String remark; + private String remark; // 定义字段:题库备注信息 /** * 创建时间 */ - @TableField("create_time") - private Date createTime; + @TableField("create_time") // MyBatis-Plus 注解,指定该字段映射数据库中的 "create_time" 列 + private Date createTime; // 定义字段:题库的创建时间 /** * 更新时间 */ - @TableField("update_time") - private Date updateTime; - + @TableField("update_time") // MyBatis-Plus 注解,指定该字段映射数据库中的 "update_time" 列 + private Date updateTime; // 定义字段:题库的最后更新时间 } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/mapper/RepoMapper.java b/src-源文件/main/java/com/yf/exam/modules/repo/mapper/RepoMapper.java index af39177..d28d223 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/mapper/RepoMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/mapper/RepoMapper.java @@ -1,29 +1,29 @@ -package com.yf.exam.modules.repo.mapper; +package com.yf.exam.modules.repo.mapper; // 包名:表示该类属于 repo.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yf.exam.modules.repo.dto.request.RepoReqDTO; -import com.yf.exam.modules.repo.dto.response.RepoRespDTO; -import com.yf.exam.modules.repo.entity.Repo; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,用于基本的数据库操作 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 分页插件中的 Page 类 +import com.yf.exam.modules.repo.dto.request.RepoReqDTO; // 导入用于分页查询的请求数据传输对象 RepoReqDTO +import com.yf.exam.modules.repo.dto.response.RepoRespDTO; // 导入用于分页查询的响应数据传输对象 RepoRespDTO +import com.yf.exam.modules.repo.entity.Repo; // 导入题库实体类 Repo +import org.apache.ibatis.annotations.Param; // 导入 MyBatis 注解,用于标注参数 /** -*

-* 题库Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -public interface RepoMapper extends BaseMapper { + *

+ * 题库Mapper + *

+ * 定义题库的 Mapper 接口,用于执行与题库相关的数据库操作 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +public interface RepoMapper extends BaseMapper { // RepoMapper 接口,继承自 MyBatis-Plus 的 BaseMapper,提供常见的数据库操作 /** * 分页查询题库 - * @param page - * @param query - * @return + * @param page 分页对象,包含当前页码和每页大小 + * @param query 查询条件,封装了题库分页查询的参数 + * @return 返回分页查询结果,包含多个题库的响应数据 */ - IPage paging(Page page, @Param("query") RepoReqDTO query); - + IPage paging(Page page, @Param("query") RepoReqDTO query); // 自定义分页查询方法,返回题库分页响应数据 } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/service/RepoService.java b/src-源文件/main/java/com/yf/exam/modules/repo/service/RepoService.java index 867a283..d4f989a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/service/RepoService.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/service/RepoService.java @@ -1,34 +1,34 @@ -package com.yf.exam.modules.repo.service; +package com.yf.exam.modules.repo.service; // 包名:表示该类属于 repo.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.repo.dto.RepoDTO; -import com.yf.exam.modules.repo.dto.request.RepoReqDTO; -import com.yf.exam.modules.repo.dto.response.RepoRespDTO; -import com.yf.exam.modules.repo.entity.Repo; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 服务接口,提供通用的数据库操作 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.modules.repo.dto.RepoDTO; // 导入 RepoDTO 类,题库数据传输对象 +import com.yf.exam.modules.repo.dto.request.RepoReqDTO; // 导入 RepoReqDTO 类,用于封装分页查询条件 +import com.yf.exam.modules.repo.dto.response.RepoRespDTO; // 导入 RepoRespDTO 类,题库分页响应数据传输对象 +import com.yf.exam.modules.repo.entity.Repo; // 导入 Repo 实体类,表示题库 /** -*

-* 题库业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -public interface RepoService extends IService { + *

+ * 题库业务类 + *

+ * 该接口定义了题库的业务逻辑,继承自 MyBatis-Plus 提供的 IService 接口,简化了数据库操作 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +public interface RepoService extends IService { // RepoService 接口,继承 MyBatis-Plus 的 IService,提供常见数据库操作 /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); - + * 分页查询数据 + * @param reqDTO 请求数据传输对象,包含分页信息和查询条件 + * @return 返回分页查询结果,包含题库响应数据 + */ + IPage paging(PagingReqDTO reqDTO); // 分页查询方法,接收分页请求数据对象,并返回分页结果 /** - * 保存 - * @param reqDTO + * 保存题库 + * @param reqDTO 请求数据传输对象,包含题库信息 */ - void save(RepoDTO reqDTO); + void save(RepoDTO reqDTO); // 保存题库方法,用于保存或更新题库信息 } diff --git a/src-源文件/main/java/com/yf/exam/modules/repo/service/impl/RepoServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/repo/service/impl/RepoServiceImpl.java index df67301..44ca86f 100644 --- a/src-源文件/main/java/com/yf/exam/modules/repo/service/impl/RepoServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/repo/service/impl/RepoServiceImpl.java @@ -1,39 +1,49 @@ -package com.yf.exam.modules.repo.service.impl; +package com.yf.exam.modules.repo.service.impl; // 包名:表示该类属于 repo.service.impl 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.repo.dto.RepoDTO; -import com.yf.exam.modules.repo.dto.request.RepoReqDTO; -import com.yf.exam.modules.repo.dto.response.RepoRespDTO; -import com.yf.exam.modules.repo.entity.Repo; -import com.yf.exam.modules.repo.mapper.RepoMapper; -import com.yf.exam.modules.repo.service.RepoService; -import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 服务实现类,用于提供通用的数据库操作 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象属性拷贝 +import com.yf.exam.modules.repo.dto.RepoDTO; // 导入 RepoDTO,题库数据传输对象 +import com.yf.exam.modules.repo.dto.request.RepoReqDTO; // 导入 RepoReqDTO,封装分页查询条件的请求数据传输对象 +import com.yf.exam.modules.repo.dto.response.RepoRespDTO; // 导入 RepoRespDTO,题库分页响应数据传输对象 +import com.yf.exam.modules.repo.entity.Repo; // 导入 Repo 实体类,表示题库实体 +import com.yf.exam.modules.repo.mapper.RepoMapper; // 导入 RepoMapper,数据访问层接口 +import com.yf.exam.modules.repo.service.RepoService; // 导入 RepoService,题库服务接口 +import org.springframework.stereotype.Service; // 导入 Spring 的 Service 注解,标识该类为服务层组件 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-25 13:23 -*/ -@Service -public class RepoServiceImpl extends ServiceImpl implements RepoService { + *

+ * 题库服务实现类 + *

+ * 该类实现了 RepoService 接口,处理题库相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-05-25 13:23 + */ +@Service // Spring 注解,标识该类为服务层组件 +public class RepoServiceImpl extends ServiceImpl implements RepoService { // 继承 MyBatis-Plus 提供的 ServiceImpl,简化数据库操作 + /** + * 分页查询题库 + * @param reqDTO 请求数据传输对象,包含分页信息和查询条件 + * @return 返回分页查询结果 + */ @Override public IPage paging(PagingReqDTO reqDTO) { - return baseMapper.paging(reqDTO.toPage(), reqDTO.getParams()); + return baseMapper.paging(reqDTO.toPage(), reqDTO.getParams()); // 调用 Mapper 的分页查询方法,传入分页信息和查询条件 } + /** + * 添加或修改题库 + * @param reqDTO 请求数据传输对象,包含题库信息 + */ @Override public void save(RepoDTO reqDTO) { - //复制参数 - Repo entity = new Repo(); - BeanMapper.copy(reqDTO, entity); - this.saveOrUpdate(entity); + // 复制参数,将请求数据传输对象的属性复制到实体类中 + Repo entity = new Repo(); // 创建 Repo 实体对象 + BeanMapper.copy(reqDTO, entity); // 使用 BeanMapper 工具类复制属性 + this.saveOrUpdate(entity); // 调用 MyBatis-Plus 提供的 saveOrUpdate 方法,保存或更新实体 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/config/controller/SysConfigController.java b/src-源文件/main/java/com/yf/exam/modules/sys/config/controller/SysConfigController.java index b62603b..a812944 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/config/controller/SysConfigController.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/config/controller/SysConfigController.java @@ -1,70 +1,71 @@ -package com.yf.exam.modules.sys.config.controller; +package com.yf.exam.modules.sys.config.controller; // 包名:表示该类属于 sys.config.controller 包 -import com.yf.exam.core.api.ApiRest; -import com.yf.exam.core.api.controller.BaseController; -import com.yf.exam.core.api.dto.BaseIdRespDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.qu.utils.ImageCheckUtils; -import com.yf.exam.modules.sys.config.dto.SysConfigDTO; -import com.yf.exam.modules.sys.config.entity.SysConfig; -import com.yf.exam.modules.sys.config.service.SysConfigService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.shiro.authz.annotation.RequiresRoles; -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 com.yf.exam.core.api.ApiRest; // 导入统一的 API 响应类 +import com.yf.exam.core.api.controller.BaseController; // 导入控制器基类,提供通用的控制器功能 +import com.yf.exam.core.api.dto.BaseIdRespDTO; // 导入基础响应 DTO,用于返回 ID 响应 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象属性拷贝 +import com.yf.exam.modules.qu.utils.ImageCheckUtils; // 导入图片检查工具类,用于校验图片地址 +import com.yf.exam.modules.sys.config.dto.SysConfigDTO; // 导入 SysConfigDTO 类,用于封装系统配置的数据传输对象 +import com.yf.exam.modules.sys.config.entity.SysConfig; // 导入 SysConfig 实体类,表示系统配置 +import com.yf.exam.modules.sys.config.service.SysConfigService; // 导入 SysConfigService 服务接口 +import io.swagger.annotations.Api; // 导入 Swagger 注解,用于 API 文档生成 +import io.swagger.annotations.ApiOperation; // 导入 Swagger 注解,用于定义接口操作说明 +import org.apache.shiro.authz.annotation.RequiresRoles; // 导入 Shiro 权限控制注解,限制角色访问 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 注解,用于依赖注入 +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; // 导入注解,标识该类为 REST 控制器 /** -*

-* 通用配置控制器 -*

-* -* @author 聪明笨狗 -* @since 2020-04-17 09:12 -*/ -@Api(tags={"通用配置"}) -@RestController -@RequestMapping("/exam/api/sys/config") -public class SysConfigController extends BaseController { + *

+ * 通用配置控制器 + *

+ * 提供与系统配置相关的操作接口,包括添加、修改、查找配置等 + * + * @作者 聪明笨狗 + * @版本 2020-04-17 09:12 + */ +@Api(tags = {"通用配置"}) // Swagger 注解:定义该类的 API 文档标签为“通用配置” +@RestController // Spring 注解:标识该类为 REST 控制器 +@RequestMapping("/exam/api/sys/config") // 定义请求路径前缀为 /exam/api/sys/config +public class SysConfigController extends BaseController { // SysConfigController 类,继承自 BaseController,提供通用功能 - @Autowired + @Autowired // 自动注入 SysConfigService 服务 private SysConfigService baseService; - @Autowired + @Autowired // 自动注入 ImageCheckUtils 工具类 private ImageCheckUtils imageCheckUtils; /** - * 添加或修改 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "添加或修改") - @RequestMapping(value = "/save", method = { RequestMethod.POST}) - public ApiRest save(@RequestBody SysConfigDTO reqDTO) { + * 添加或修改系统配置 + * @param reqDTO 请求数据传输对象,包含系统配置的信息 + * @return 返回包含新增或修改的系统配置 ID 的响应 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "添加或修改") // Swagger 注解:定义接口操作说明为“添加或修改” + @RequestMapping(value = "/save", method = { RequestMethod.POST}) // 定义请求路径为 /save,方法为 POST + public ApiRest save(@RequestBody SysConfigDTO reqDTO) { // 定义保存或修改系统配置的方法 - //复制参数 - SysConfig entity = new SysConfig(); - BeanMapper.copy(reqDTO, entity); + // 复制请求参数到实体对象 + SysConfig entity = new SysConfig(); // 创建 SysConfig 实体对象 + BeanMapper.copy(reqDTO, entity); // 使用 BeanMapper 工具类将 DTO 的属性拷贝到实体对象 - // 校验图片地址 - imageCheckUtils.checkImage(entity.getBackLogo(), "系统LOGO地址错误!"); + // 校验图片地址是否有效 + imageCheckUtils.checkImage(entity.getBackLogo(), "系统LOGO地址错误!"); // 检查系统LOGO地址是否有效 - baseService.saveOrUpdate(entity); - return super.success(new BaseIdRespDTO(entity.getId())); + baseService.saveOrUpdate(entity); // 调用服务的保存或更新方法 + return super.success(new BaseIdRespDTO(entity.getId())); // 返回成功响应,并包含系统配置 ID } /** - * 查找详情 - * @return - */ - @ApiOperation(value = "查找详情") - @RequestMapping(value = "/detail", method = { RequestMethod.POST}) - public ApiRest find() { - SysConfigDTO dto = baseService.find(); - return super.success(dto); + * 查找系统配置详情 + * @return 返回系统配置详情 + */ + @ApiOperation(value = "查找详情") // Swagger 注解:定义接口操作说明为“查找详情” + @RequestMapping(value = "/detail", method = { RequestMethod.POST}) // 定义请求路径为 /detail,方法为 POST + public ApiRest find() { // 定义查找系统配置详情的方法 + SysConfigDTO dto = baseService.find(); // 调用服务查找系统配置详情 + return super.success(dto); // 返回成功响应,包含系统配置详情 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/config/dto/SysConfigDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/config/dto/SysConfigDTO.java index ef7c179..615c61a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/config/dto/SysConfigDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/config/dto/SysConfigDTO.java @@ -1,39 +1,38 @@ -package com.yf.exam.modules.sys.config.dto; +package com.yf.exam.modules.sys.config.dto; // 包名:表示该类属于 sys.config.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于对象序列化 /** -*

-* 通用配置请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-17 09:12 -*/ -@Data -@ApiModel(value="通用配置", description="通用配置") -public class SysConfigDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "ID", required=true) - private String id; - - @ApiModelProperty(value = "系统名称") - private String siteName; - - @ApiModelProperty(value = "前端LOGO") - private String frontLogo; - - @ApiModelProperty(value = "后台LOGO") - private String backLogo; - - @ApiModelProperty(value = "版权信息") - private String copyRight; - + *

+ * 通用配置请求类 + *

+ * 该类封装了通用配置的数据传输对象,用于在 API 请求中传递系统配置数据 + * + * @作者 聪明笨狗 + * @版本 2020-04-17 09:12 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "通用配置", description = "通用配置") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysConfigDTO implements Serializable { // 定义 SysConfigDTO 类,实现 Serializable 接口以支持序列化 + + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 + + @ApiModelProperty(value = "ID", required = true) // Swagger 注解:描述该属性为“ID”,并标记为必填 + private String id; // 定义字段:系统配置的唯一标识符 + + @ApiModelProperty(value = "系统名称") // Swagger 注解:描述该属性为“系统名称” + private String siteName; // 定义字段:系统名称 + + @ApiModelProperty(value = "前端LOGO") // Swagger 注解:描述该属性为“前端LOGO” + private String frontLogo; // 定义字段:前端展示用的 LOGO 图片地址 + + @ApiModelProperty(value = "后台LOGO") // Swagger 注解:描述该属性为“后台LOGO” + private String backLogo; // 定义字段:后台管理用的 LOGO 图片地址 + + @ApiModelProperty(value = "版权信息") // Swagger 注解:描述该属性为“版权信息” + private String copyRight; // 定义字段:版权信息 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/config/entity/SysConfig.java b/src-源文件/main/java/com/yf/exam/modules/sys/config/entity/SysConfig.java index 070ab06..16fc25b 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/config/entity/SysConfig.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/config/entity/SysConfig.java @@ -1,53 +1,54 @@ -package com.yf.exam.modules.sys.config.entity; +package com.yf.exam.modules.sys.config.entity; // 包名:表示该类属于 sys.config.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于定义主键类型 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于映射数据库字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于标识主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于映射数据库表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus ActiveRecord 模式基类 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 /** -*

-* 通用配置实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-17 09:12 -*/ -@Data -@TableName("sys_config") -public class SysConfig extends Model { - - private static final long serialVersionUID = 1L; + *

+ * 通用配置实体类 + *

+ * 表示系统配置的数据模型,映射数据库表 `sys_config` + * + * @作者 聪明笨狗 + * @版本 2020-04-17 09:12 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@TableName("sys_config") // MyBatis-Plus 注解,指定该实体类映射数据库表名为 `sys_config` +public class SysConfig extends Model { // SysConfig 类继承自 MyBatis-Plus 的 Model 类,启用 ActiveRecord 模式 + + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 /** * ID */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,标识主键字段,并指定主键生成策略为分配 ID + private String id; // 定义字段:系统配置的唯一标识符 /** * 系统名称 */ - @TableField("site_name") - private String siteName; + @TableField("site_name") // MyBatis-Plus 注解,指定该字段映射数据库中的 "site_name" 列 + private String siteName; // 定义字段:系统名称 /** * 前端LOGO */ - @TableField("front_logo") - private String frontLogo; + @TableField("front_logo") // MyBatis-Plus 注解,指定该字段映射数据库中的 "front_logo" 列 + private String frontLogo; // 定义字段:前端展示的 LOGO 图片地址 /** * 后台LOGO */ - @TableField("back_logo") - private String backLogo; + @TableField("back_logo") // MyBatis-Plus 注解,指定该字段映射数据库中的 "back_logo" 列 + private String backLogo; // 定义字段:后台管理系统的 LOGO 图片地址 /** * 版权信息 */ - @TableField("copy_right") - private String copyRight; + @TableField("copy_right") // MyBatis-Plus 注解,指定该字段映射数据库中的 "copy_right" 列 + private String copyRight; // 定义字段:版权信息 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/config/mapper/SysConfigMapper.java b/src-源文件/main/java/com/yf/exam/modules/sys/config/mapper/SysConfigMapper.java index 512ae1b..443686a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/config/mapper/SysConfigMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/config/mapper/SysConfigMapper.java @@ -1,16 +1,18 @@ -package com.yf.exam.modules.sys.config.mapper; +package com.yf.exam.modules.sys.config.mapper; // 包名:表示该类属于 sys.config.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.sys.config.entity.SysConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,用于基本的数据库操作 +import com.yf.exam.modules.sys.config.entity.SysConfig; // 导入 SysConfig 实体类,表示系统配置 /** -*

-* 通用配置Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-04-17 09:12 -*/ -public interface SysConfigMapper extends BaseMapper { + *

+ * 通用配置Mapper + *

+ * 该接口继承自 MyBatis-Plus 的 BaseMapper,提供通用的数据库操作 + * + * @作者 聪明笨狗 + * @版本 2020-04-17 09:12 + */ +public interface SysConfigMapper extends BaseMapper { // SysConfigMapper 接口,继承自 MyBatis-Plus 的 BaseMapper + // 该接口继承了 BaseMapper,因此自动具备了 CRUD 方法,无需手动实现 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/config/service/SysConfigService.java b/src-源文件/main/java/com/yf/exam/modules/sys/config/service/SysConfigService.java index 224b09d..7248a90 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/config/service/SysConfigService.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/config/service/SysConfigService.java @@ -1,22 +1,23 @@ -package com.yf.exam.modules.sys.config.service; +package com.yf.exam.modules.sys.config.service; // 包名:表示该类属于 sys.config.service 包 -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.modules.sys.config.dto.SysConfigDTO; -import com.yf.exam.modules.sys.config.entity.SysConfig; +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 提供的 IService 接口,提供通用的数据库操作 +import com.yf.exam.modules.sys.config.dto.SysConfigDTO; // 导入 SysConfigDTO 类,封装系统配置的数据传输对象 +import com.yf.exam.modules.sys.config.entity.SysConfig; // 导入 SysConfig 实体类,表示系统配置 /** -*

-* 通用配置业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-17 09:12 -*/ -public interface SysConfigService extends IService { + *

+ * 通用配置业务类 + *

+ * 该接口定义了与系统配置相关的业务逻辑方法 + * + * @作者 聪明笨狗 + * @版本 2020-04-17 09:12 + */ +public interface SysConfigService extends IService { // SysConfigService 接口继承 MyBatis-Plus 的 IService 接口,提供 CRUD 操作 /** * 查找配置信息 - * @return + * @return 返回系统配置的 DTO 对象 */ - SysConfigDTO find(); + SysConfigDTO find(); // 定义查找系统配置信息的方法,返回一个 SysConfigDTO 对象 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/config/service/impl/SysConfigServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/sys/config/service/impl/SysConfigServiceImpl.java index d91880c..071f2e6 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/config/service/impl/SysConfigServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/config/service/impl/SysConfigServiceImpl.java @@ -1,34 +1,44 @@ -package com.yf.exam.modules.sys.config.service.impl; +package com.yf.exam.modules.sys.config.service.impl; // 包名:表示该类属于 sys.config.service.impl 包 -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.sys.config.dto.SysConfigDTO; -import com.yf.exam.modules.sys.config.entity.SysConfig; -import com.yf.exam.modules.sys.config.mapper.SysConfigMapper; -import com.yf.exam.modules.sys.config.service.SysConfigService; -import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 类,用于提供常见的数据库操作 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象属性拷贝 +import com.yf.exam.modules.sys.config.dto.SysConfigDTO; // 导入 SysConfigDTO 类,封装系统配置的数据传输对象 +import com.yf.exam.modules.sys.config.entity.SysConfig; // 导入 SysConfig 实体类,表示系统配置 +import com.yf.exam.modules.sys.config.mapper.SysConfigMapper; // 导入 SysConfigMapper,数据访问层接口 +import com.yf.exam.modules.sys.config.service.SysConfigService; // 导入 SysConfigService,系统配置服务接口 +import org.springframework.stereotype.Service; // 导入 Spring 注解,用于标识该类为服务层组件 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-17 09:12 -*/ -@Service -public class SysConfigServiceImpl extends ServiceImpl implements SysConfigService { + *

+ * 语言设置 服务实现类 + *

+ * 该类实现了 SysConfigService 接口,提供与系统配置相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-17 09:12 + */ +@Service // Spring 注解,标识该类为服务层组件 +public class SysConfigServiceImpl extends ServiceImpl implements SysConfigService { // 继承 MyBatis-Plus 的 ServiceImpl 类,简化数据库操作 + /** + * 查找系统配置详情 + * @return 返回系统配置的 DTO 对象 + */ @Override public SysConfigDTO find() { + // 创建 QueryWrapper 对象,用于构建查询条件 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.last(" LIMIT 1"); + wrapper.last(" LIMIT 1"); // 限制查询结果为一条记录 - SysConfig entity = this.getOne(wrapper, false); - SysConfigDTO dto = new SysConfigDTO(); - BeanMapper.copy(entity, dto); - return dto; + // 使用 getOne 方法查询系统配置的第一条记录 + SysConfig entity = this.getOne(wrapper, false); // false 表示不抛出异常,如果没有结果会返回 null + + // 将查询到的实体对象复制到 DTO 对象 + SysConfigDTO dto = new SysConfigDTO(); // 创建 SysConfigDTO 对象 + BeanMapper.copy(entity, dto); // 使用 BeanMapper 工具类将 SysConfig 实体对象的属性复制到 DTO 中 + + return dto; // 返回系统配置 DTO } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/controller/SysDepartController.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/controller/SysDepartController.java index 486fa9a..1565a96 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/controller/SysDepartController.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/controller/SysDepartController.java @@ -1,150 +1,136 @@ -package com.yf.exam.modules.sys.depart.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.PagingReqDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; -import com.yf.exam.modules.sys.depart.dto.request.DepartSortReqDTO; -import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; -import com.yf.exam.modules.sys.depart.entity.SysDepart; -import com.yf.exam.modules.sys.depart.service.SysDepartService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.shiro.authz.annotation.RequiresRoles; -import org.springframework.beans.BeanUtils; -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.List; +package com.yf.exam.modules.sys.depart.controller; // 包名:表示该类属于 sys.depart.controller 包 + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.yf.exam.core.api.ApiRest; // 导入统一的 API 响应类 +import com.yf.exam.core.api.controller.BaseController; // 导入控制器基类,提供通用的控制器功能 +import com.yf.exam.core.api.dto.BaseIdReqDTO; // 导入基本请求 DTO,用于单个 ID 请求 +import com.yf.exam.core.api.dto.BaseIdsReqDTO; // 导入基本请求 DTO,用于多个 ID 请求 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象属性拷贝 +import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; // 导入 SysDepartDTO 数据传输对象 +import com.yf.exam.modules.sys.depart.dto.request.DepartSortReqDTO; // 导入部门排序请求 DTO +import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; // 导入部门树状结构响应 DTO +import com.yf.exam.modules.sys.depart.entity.SysDepart; // 导入 SysDepart 实体类,表示部门 +import com.yf.exam.modules.sys.depart.service.SysDepartService; // 导入部门服务接口 +import io.swagger.annotations.Api; // 导入 Swagger 注解,用于 API 文档生成 +import io.swagger.annotations.ApiOperation; // 导入 Swagger 注解,用于定义接口操作说明 +import org.apache.shiro.authz.annotation.RequiresRoles; // 导入 Shiro 权限控制注解,限制角色访问 +import org.springframework.beans.BeanUtils; // 导入 Spring 的 BeanUtils,用于对象属性拷贝 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 注解,用于依赖注入 +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; // 导入注解,标识该类为 REST 控制器 /** -*

-* 部门信息控制器 -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -@Api(tags={"部门信息"}) -@RestController -@RequestMapping("/exam/api/sys/depart") -public class SysDepartController extends BaseController { - - @Autowired + *

+ * 部门信息控制器 + *

+ * 提供与部门相关的操作接口,包括添加、修改、删除、查找等 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +@Api(tags = {"部门信息"}) // Swagger 注解:定义该类的 API 文档标签为“部门信息” +@RestController // Spring 注解:标识该类为 REST 控制器 +@RequestMapping("/exam/api/sys/depart") // 定义请求路径前缀为 /exam/api/sys/depart +public class SysDepartController extends BaseController { // SysDepartController 类,继承自 BaseController,提供通用功能 + + @Autowired // 自动注入 SysDepartService 服务 private SysDepartService baseService; /** - * 添加或修改 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "添加或修改") - @RequestMapping(value = "/save", method = { RequestMethod.POST}) - public ApiRest save(@RequestBody SysDepartDTO reqDTO) { - baseService.save(reqDTO); - return super.success(); + * 添加或修改部门 + * @param reqDTO 请求数据传输对象,包含部门信息 + * @return 返回操作结果 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "添加或修改") // Swagger 注解:定义接口操作说明为“添加或修改” + @RequestMapping(value = "/save", method = {RequestMethod.POST}) // 定义请求路径为 /save,方法为 POST + public ApiRest save(@RequestBody SysDepartDTO reqDTO) { // 添加或修改部门的方法 + baseService.save(reqDTO); // 调用服务保存或更新部门信息 + return super.success(); // 返回成功响应 } /** - * 批量删除 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "批量删除") - @RequestMapping(value = "/delete", method = { RequestMethod.POST}) - public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { - //根据ID删除 - baseService.removeByIds(reqDTO.getIds()); - return super.success(); + * 批量删除部门 + * @param reqDTO 请求数据传输对象,包含待删除的部门 ID 列表 + * @return 返回操作结果 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "批量删除") // Swagger 注解:定义接口操作说明为“批量删除” + @RequestMapping(value = "/delete", method = {RequestMethod.POST}) // 定义请求路径为 /delete,方法为 POST + public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { // 批量删除部门的方法 + baseService.removeByIds(reqDTO.getIds()); // 根据 ID 列表删除部门 + return super.success(); // 返回成功响应 } /** - * 查找详情 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "查找详情") - @RequestMapping(value = "/detail", method = { RequestMethod.POST}) - public ApiRest find(@RequestBody BaseIdReqDTO reqDTO) { - SysDepart entity = baseService.getById(reqDTO.getId()); - SysDepartDTO dto = new SysDepartDTO(); - BeanUtils.copyProperties(entity, dto); - return super.success(dto); + * 查找部门详情 + * @param reqDTO 请求数据传输对象,包含部门 ID + * @return 返回部门详情 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "查找详情") // Swagger 注解:定义接口操作说明为“查找详情” + @RequestMapping(value = "/detail", method = {RequestMethod.POST}) // 定义请求路径为 /detail,方法为 POST + public ApiRest find(@RequestBody BaseIdReqDTO reqDTO) { // 查找部门详情的方法 + SysDepart entity = baseService.getById(reqDTO.getId()); // 根据 ID 查找部门实体 + SysDepartDTO dto = new SysDepartDTO(); // 创建部门数据传输对象 + BeanUtils.copyProperties(entity, dto); // 将实体对象属性拷贝到 DTO 对象 + return super.success(dto); // 返回成功响应,包含部门详情 } /** - * 分页查找 - * @param reqDTO - * @return - */ - @RequiresRoles("sa") - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) - public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - - //分页查询并转换 - IPage page = baseService.paging(reqDTO); - - return super.success(page); + * 分页查找部门 + * @param reqDTO 分页请求数据传输对象,包含分页信息和查询条件 + * @return 返回分页查询结果 + */ + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "分页查找") // Swagger 注解:定义接口操作说明为“分页查找” + @RequestMapping(value = "/paging", method = {RequestMethod.POST}) // 定义请求路径为 /paging,方法为 POST + public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { // 分页查找部门的方法 + IPage page = baseService.paging(reqDTO); // 调用服务进行分页查询 + return super.success(page); // 返回成功响应,包含分页数据 } /** - * 查找列表,每次最多返回200条数据 - * @param reqDTO - * @return + * 查找部门列表,每次最多返回200条数据 + * @param reqDTO 请求数据传输对象,包含查询条件 + * @return 返回部门列表 */ - @RequiresRoles("sa") - @ApiOperation(value = "查找列表") - @RequestMapping(value = "/list", method = { RequestMethod.POST}) - public ApiRest> list(@RequestBody SysDepartDTO reqDTO) { - - //分页查询并转换 - QueryWrapper wrapper = new QueryWrapper<>(); - - //转换并返回 - List list = baseService.list(wrapper); - - //转换数据 - List dtoList = BeanMapper.mapList(list, SysDepartDTO.class); - - return super.success(dtoList); + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "查找列表") // Swagger 注解:定义接口操作说明为“查找列表” + @RequestMapping(value = "/list", method = {RequestMethod.POST}) // 定义请求路径为 /list,方法为 POST + public ApiRest> list(@RequestBody SysDepartDTO reqDTO) { // 查找部门列表的方法 + QueryWrapper wrapper = new QueryWrapper<>(); // 创建查询条件 + List list = baseService.list(wrapper); // 获取部门列表 + List dtoList = BeanMapper.mapList(list, SysDepartDTO.class); // 将部门实体列表转换为 DTO 列表 + return super.success(dtoList); // 返回成功响应,包含部门列表 } - /** - * 树列表 - * @return + * 查找部门树状结构 + * @return 返回部门树状结构 */ - @RequiresRoles("sa") - @ApiOperation(value = "树列表") - @RequestMapping(value = "/tree", method = { RequestMethod.POST}) - public ApiRest> tree() { - List dtoList = baseService.findTree(); - return super.success(dtoList); + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "树列表") // Swagger 注解:定义接口操作说明为“树列表” + @RequestMapping(value = "/tree", method = {RequestMethod.POST}) // 定义请求路径为 /tree,方法为 POST + public ApiRest> tree() { // 查找部门树状结构的方法 + List dtoList = baseService.findTree(); // 获取部门树状结构 + return super.success(dtoList); // 返回成功响应,包含部门树状结构 } - /** - * 分类排序 - * @param reqDTO - * @return + * 部门排序 + * @param reqDTO 请求数据传输对象,包含排序信息 + * @return 返回操作结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "分类排序") - @RequestMapping(value = "/sort", method = { RequestMethod.POST}) - public ApiRest sort(@RequestBody DepartSortReqDTO reqDTO) { - baseService.sort(reqDTO.getId(), reqDTO.getSort()); - return super.success(); + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "分类排序") // Swagger 注解:定义接口操作说明为“分类排序” + @RequestMapping(value = "/sort", method = {RequestMethod.POST}) // 定义请求路径为 /sort,方法为 POST + public ApiRest sort(@RequestBody DepartSortReqDTO reqDTO) { // 部门排序的方法 + baseService.sort(reqDTO.getId(), reqDTO.getSort()); // 调用服务进行排序 + return super.success(); // 返回成功响应 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/SysDepartDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/SysDepartDTO.java index ac34b50..0c407b8 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/SysDepartDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/SysDepartDTO.java @@ -1,42 +1,41 @@ -package com.yf.exam.modules.sys.depart.dto; +package com.yf.exam.modules.sys.depart.dto; // 包名:表示该类属于 sys.depart.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象序列化 /** -*

-* 部门信息数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -@Data -@ApiModel(value="部门信息", description="部门信息") -public class SysDepartDTO implements Serializable { + *

+ * 部门信息数据传输类 + *

+ * 用于传递部门相关的数据 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "部门信息", description = "部门信息") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysDepartDTO implements Serializable { // 实现 Serializable 接口以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 + @ApiModelProperty(value = "ID", required = true) // Swagger 注解:描述该属性为“ID”,并标记为必填 + private String id; // 定义字段:部门的唯一标识符 - @ApiModelProperty(value = "ID", required=true) - private String id; + @ApiModelProperty(value = "1公司2部门", required = true) // Swagger 注解:描述该属性为“1公司2部门”,并标记为必填 + private Integer deptType; // 定义字段:部门类型,1 表示公司,2 表示部门 - @ApiModelProperty(value = "1公司2部门", required=true) - private Integer deptType; + @ApiModelProperty(value = "所属上级", required = true) // Swagger 注解:描述该属性为“所属上级”,并标记为必填 + private String parentId; // 定义字段:上级部门的 ID - @ApiModelProperty(value = "所属上级", required=true) - private String parentId; + @ApiModelProperty(value = "部门名称", required = true) // Swagger 注解:描述该属性为“部门名称”,并标记为必填 + private String deptName; // 定义字段:部门名称 - @ApiModelProperty(value = "部门名称", required=true) - private String deptName; - - @ApiModelProperty(value = "部门编码", required=true) - private String deptCode; - - @ApiModelProperty(value = "排序", required=true) - private Integer sort; + @ApiModelProperty(value = "部门编码", required = true) // Swagger 注解:描述该属性为“部门编码”,并标记为必填 + private String deptCode; // 定义字段:部门的唯一编码,用于标识部门 + @ApiModelProperty(value = "排序", required = true) // Swagger 注解:描述该属性为“排序”,并标记为必填 + private Integer sort; // 定义字段:部门排序序号,用于定义显示顺序 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/request/DepartSortReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/request/DepartSortReqDTO.java index 92d90ab..e2d61e0 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/request/DepartSortReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/request/DepartSortReqDTO.java @@ -1,28 +1,29 @@ -package com.yf.exam.modules.sys.depart.dto.request; +package com.yf.exam.modules.sys.depart.dto.request; // 包名:表示该类属于 sys.depart.dto.request 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于对象序列化 /** -*

-* 部门排序请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-03-14 10:37 -*/ -@Data -@ApiModel(value="部门排序请求类", description="部门排序请求类") -public class DepartSortReqDTO implements Serializable { + *

+ * 部门排序请求类 + *

+ * 封装部门排序请求的数据传输对象 + * + * @作者 聪明笨狗 + * @版本 2020-03-14 10:37 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "部门排序请求类", description = "部门排序请求类") // Swagger 注解:定义该类的 API 模型名称和描述 +public class DepartSortReqDTO implements Serializable { // 实现 Serializable 接口以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "分类ID") - private String id; + @ApiModelProperty(value = "分类ID") // Swagger 注解:描述该属性为“分类ID” + private String id; // 定义字段:分类的唯一标识符 - @ApiModelProperty(value = "排序,0下降,1上升") - private Integer sort; + @ApiModelProperty(value = "排序,0下降,1上升") // Swagger 注解:描述该属性为“排序”,0 表示下降,1 表示上升 + private Integer sort; // 定义字段:排序方式,0 为下降排序,1 为上升排序 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/response/SysDepartTreeDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/response/SysDepartTreeDTO.java index ab6b9d3..4b4cb06 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/response/SysDepartTreeDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/dto/response/SysDepartTreeDTO.java @@ -1,28 +1,27 @@ -package com.yf.exam.modules.sys.depart.dto.response; +package com.yf.exam.modules.sys.depart.dto.response; // 包名:表示该类属于 sys.depart.dto.response 包 -import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; // 导入 SysDepartDTO 类,表示部门的基本信息 +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.util.List; +import java.util.List; // 导入 List 接口,用于存储子部门列表 /** -*

-* 部门树结构响应类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -@Data -@ApiModel(value="部门树结构响应类", description="部门树结构响应类") -public class SysDepartTreeDTO extends SysDepartDTO { + *

+ * 部门树结构响应类 + *

+ * 用于返回树形结构的部门数据 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "部门树结构响应类", description = "部门树结构响应类") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysDepartTreeDTO extends SysDepartDTO { // 继承 SysDepartDTO,扩展支持树形结构 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "子列表", required=true) - private List children; - - + @ApiModelProperty(value = "子列表", required = true) // Swagger 注解:描述该属性为“子列表”,标记为必填 + private List children; // 定义字段:子部门列表,支持递归嵌套表示树形结构 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/entity/SysDepart.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/entity/SysDepart.java index 71ca156..beeea32 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/entity/SysDepart.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/entity/SysDepart.java @@ -1,59 +1,59 @@ -package com.yf.exam.modules.sys.depart.entity; +package com.yf.exam.modules.sys.depart.entity; // 包名:表示该类属于 sys.depart.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于定义主键类型 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于映射数据库字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于标识主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于映射数据库表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus 的 Model 基类,用于支持 ActiveRecord 模式 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 /** -*

-* 部门信息实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -@Data -@TableName("sys_depart") -public class SysDepart extends Model { + *

+ * 部门信息实体类 + *

+ * 表示数据库中部门信息的实体类,与 `sys_depart` 表对应 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@TableName("sys_depart") // MyBatis-Plus 注解,指定该类映射的数据库表名为 `sys_depart` +public class SysDepart extends Model { // 继承 MyBatis-Plus 的 Model 类,支持 ActiveRecord 模式 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 /** - * ID - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + * ID + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,指定主键字段及其生成策略为 ASSIGN_ID + private String id; // 部门的唯一标识符 /** - * 1公司2部门 - */ - @TableField("dept_type") - private Integer deptType; + * 1公司2部门 + */ + @TableField("dept_type") // MyBatis-Plus 注解,指定该字段映射数据库中的 `dept_type` 列 + private Integer deptType; // 部门类型,1 表示公司,2 表示部门 /** - * 所属上级 - */ - @TableField("parent_id") - private String parentId; + * 所属上级 + */ + @TableField("parent_id") // MyBatis-Plus 注解,指定该字段映射数据库中的 `parent_id` 列 + private String parentId; // 上级部门的 ID,用于定义层级关系 /** - * 部门名称 - */ - @TableField("dept_name") - private String deptName; + * 部门名称 + */ + @TableField("dept_name") // MyBatis-Plus 注解,指定该字段映射数据库中的 `dept_name` 列 + private String deptName; // 部门的名称,用于显示和标识部门 /** - * 部门编码 - */ - @TableField("dept_code") - private String deptCode; + * 部门编码 + */ + @TableField("dept_code") // MyBatis-Plus 注解,指定该字段映射数据库中的 `dept_code` 列 + private String deptCode; // 部门的唯一编码,用于标识部门 /** - * 排序 - */ - private Integer sort; - + * 排序 + */ + private Integer sort; // 排序字段,用于定义部门显示的顺序 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/mapper/SysDepartMapper.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/mapper/SysDepartMapper.java index 221ab89..e26b893 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/mapper/SysDepartMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/mapper/SysDepartMapper.java @@ -1,28 +1,29 @@ -package com.yf.exam.modules.sys.depart.mapper; +package com.yf.exam.modules.sys.depart.mapper; // 包名:表示该类属于 sys.depart.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; -import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; -import com.yf.exam.modules.sys.depart.entity.SysDepart; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,用于提供基础的数据库操作 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的分页接口 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 的分页插件中的 Page 类 +import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; // 导入部门数据传输对象,用于封装查询条件 +import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; // 导入部门树形结构响应对象 +import com.yf.exam.modules.sys.depart.entity.SysDepart; // 导入部门实体类 +import org.apache.ibatis.annotations.Param; // 导入 MyBatis 注解,用于标注参数 /** -*

-* 部门信息Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -public interface SysDepartMapper extends BaseMapper { + *

+ * 部门信息Mapper + *

+ * 定义部门信息的数据库操作接口 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +public interface SysDepartMapper extends BaseMapper { // SysDepartMapper 接口,继承 MyBatis-Plus 的 BaseMapper /** * 部门树分页 - * @param page - * @param query - * @return + * @param page 分页对象,包含当前页码和每页大小 + * @param query 查询条件,封装了部门查询的参数 + * @return 返回分页结果,包含部门树形结构数据 */ - IPage paging(Page page, @Param("query") SysDepartDTO query); + IPage paging(Page page, @Param("query") SysDepartDTO query); // 自定义分页查询方法,返回部门树形结构的分页数据 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/SysDepartService.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/SysDepartService.java index 1b70e83..9f8aa8c 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/SysDepartService.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/SysDepartService.java @@ -1,62 +1,62 @@ -package com.yf.exam.modules.sys.depart.service; +package com.yf.exam.modules.sys.depart.service; // 包名:表示该接口属于 sys.depart.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; -import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; -import com.yf.exam.modules.sys.depart.entity.SysDepart; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的分页接口,用于返回分页查询结果 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 的 IService 接口,用于提供通用的数据库操作 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; // 导入 SysDepartDTO 数据传输对象,用于封装部门数据 +import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; // 导入 SysDepartTreeDTO 类,用于表示部门树形结构 +import com.yf.exam.modules.sys.depart.entity.SysDepart; // 导入 SysDepart 实体类,表示部门 -import java.util.List; +import java.util.List; // 导入 List 接口,用于存储部门 ID 或部门列表 /** -*

-* 部门信息业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -public interface SysDepartService extends IService { + *

+ * 部门信息业务类 + *

+ * 该接口定义了与部门相关的业务逻辑操作,如保存、分页查询、排序、查找部门树等 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +public interface SysDepartService extends IService { // SysDepartService 接口继承 MyBatis-Plus 的 IService 接口,提供 CRUD 操作 /** - * 保存 - * @param reqDTO + * 保存部门信息 + * @param reqDTO 部门数据传输对象 */ - void save(SysDepartDTO reqDTO); + void save(SysDepartDTO reqDTO); // 保存部门信息方法,接收部门数据传输对象 /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); + * 分页查询部门树形结构 + * @param reqDTO 分页请求数据传输对象,包含分页信息和查询条件 + * @return 返回分页查询结果,包含部门树形结构数据 + */ + IPage paging(PagingReqDTO reqDTO); // 分页查询部门树的方法 /** - * 查找部门树结构 - * @return + * 查找所有部门的树形结构 + * @return 返回所有部门的树形结构列表 */ - List findTree(); + List findTree(); // 查找所有部门树的方法,返回树形结构数据 /** - * 查找部门树 - * @param ids - * @return + * 查找指定部门ID列表下的部门树 + * @param ids 部门ID列表,用于筛选特定部门的树形结构 + * @return 返回部门树形结构列表 */ - List findTree(List ids); + List findTree(List ids); // 查找指定部门ID列表下的部门树的方法 /** - * 排序 - * @param id - * @param sort + * 排序部门 + * @param id 部门ID + * @param sort 排序方式,0为上升,1为下降 */ - void sort(String id, Integer sort); - + void sort(String id, Integer sort); // 排序部门的方法,支持上升和下降排序 /** * 获取某个部门ID下的所有子部门ID - * @param id - * @return + * @param id 部门ID + * @return 返回该部门下所有子部门的ID列表 */ - List listAllSubIds( String id); + List listAllSubIds(String id); // 获取某个部门下所有子部门ID的方法 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/impl/SysDepartServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/impl/SysDepartServiceImpl.java index 1ba267f..4d36279 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/impl/SysDepartServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/depart/service/impl/SysDepartServiceImpl.java @@ -1,227 +1,233 @@ -package com.yf.exam.modules.sys.depart.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; -import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; -import com.yf.exam.modules.sys.depart.entity.SysDepart; -import com.yf.exam.modules.sys.depart.mapper.SysDepartMapper; -import com.yf.exam.modules.sys.depart.service.SysDepartService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +package com.yf.exam.modules.sys.depart.service.impl; // 包名:表示该类属于 sys.depart.service.impl 包 + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 分页插件中的 Page 类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 类,用于提供通用的数据库操作 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象属性拷贝 +import com.yf.exam.modules.sys.depart.dto.SysDepartDTO; // 导入 SysDepartDTO 类,封装部门数据传输对象 +import com.yf.exam.modules.sys.depart.dto.response.SysDepartTreeDTO; // 导入 SysDepartTreeDTO 类,用于部门树形结构 +import com.yf.exam.modules.sys.depart.entity.SysDepart; // 导入 SysDepart 实体类,表示部门 +import com.yf.exam.modules.sys.depart.mapper.SysDepartMapper; // 导入部门的 Mapper 接口,用于数据库交互 +import com.yf.exam.modules.sys.depart.service.SysDepartService; // 导入部门服务接口 +import org.apache.commons.lang3.StringUtils; // 导入 Apache Commons Lang3 库中的 StringUtils,用于字符串操作 +import org.springframework.stereotype.Service; // 导入 Spring 注解,用于标识该类为服务层组件 +import org.springframework.util.CollectionUtils; // 导入 Spring 的 CollectionUtils 工具类,用于集合操作 + +import java.util.ArrayList; // 导入 ArrayList 类,用于列表数据存储 +import java.util.HashMap; // 导入 HashMap 类,用于映射键值对 +import java.util.List; // 导入 List 接口,用于存储列表数据 +import java.util.Map; // 导入 Map 接口,用于映射键值对 /** -*

-* 部门信息业务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-02 17:25 -*/ -@Service -public class SysDepartServiceImpl extends ServiceImpl implements SysDepartService { - + *

+ * 部门信息业务实现类 + *

+ * 该类实现了 SysDepartService 接口,提供与部门相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-09-02 17:25 + */ +@Service // Spring 注解,标识该类为服务层组件 +public class SysDepartServiceImpl extends ServiceImpl implements SysDepartService { // 继承 MyBatis-Plus 的 ServiceImpl 类,简化数据库操作 /** * 0标识为顶级分类 */ - private static final String ROOT_TAG = "0"; - + private static final String ROOT_TAG = "0"; // 顶级部门标识符 + /** + * 保存或更新部门信息 + * @param reqDTO 部门数据传输对象 + */ @Override public void save(SysDepartDTO reqDTO) { + // 如果部门ID为空,生成部门编码 if(StringUtils.isBlank(reqDTO.getId())) { - this.fillCode(reqDTO); - }else{ - reqDTO.setSort(null); - reqDTO.setDeptCode(null); + this.fillCode(reqDTO); // 填充部门编码 + } else { + reqDTO.setSort(null); // 如果有ID,则清空排序字段 + reqDTO.setDeptCode(null); // 清空部门编码 } - SysDepart entity = new SysDepart(); - BeanMapper.copy(reqDTO, entity); - this.saveOrUpdate(entity); + SysDepart entity = new SysDepart(); // 创建部门实体对象 + BeanMapper.copy(reqDTO, entity); // 将 DTO 数据拷贝到实体对象 + this.saveOrUpdate(entity); // 保存或更新部门信息 } + /** + * 分页查询部门树形结构 + * @param reqDTO 分页请求数据传输对象 + * @return 返回分页查询结果 + */ @Override public IPage paging(PagingReqDTO reqDTO) { // 创建分页对象 Page query = new Page(reqDTO.getCurrent(), reqDTO.getSize()); - // 请求参数 + // 获取查询条件 SysDepartDTO params = reqDTO.getParams(); - //转换结果 + // 执行分页查询 IPage pageData = baseMapper.paging(query, params); - return pageData; - } - + return pageData; // 返回分页结果 + } + /** + * 查找所有部门树 + * @return 返回部门树形结构 + */ @Override public List findTree() { - return this.findTree(null); + return this.findTree(null); // 默认查找所有部门 } + /** + * 查找指定ID的部门树 + * @param ids 部门ID列表 + * @return 返回部门树形结构 + */ @Override public List findTree(List ids) { + QueryWrapper wrapper = new QueryWrapper<>(); // 创建查询条件 + wrapper.lambda().orderByAsc(SysDepart::getSort); // 按照排序字段升序排列 - QueryWrapper wrapper = new QueryWrapper(); - wrapper.lambda().orderByAsc(SysDepart::getSort); - + // 如果传入了部门ID列表,递归获取所有父级部门 if(!CollectionUtils.isEmpty(ids)){ - List fullIds = new ArrayList<>(); + List fullIds = new ArrayList<>(); // 用于存储所有父部门ID for(String id: ids){ - this.cycleAllParent(fullIds, id); + this.cycleAllParent(fullIds, id); // 递归获取所有父部门ID } if(!CollectionUtils.isEmpty(fullIds)){ - wrapper.lambda().in(SysDepart::getId, fullIds); + wrapper.lambda().in(SysDepart::getId, fullIds); // 根据部门ID列表查询 } } - //全部列表 - List list = this.list(wrapper); - List dtoList = BeanMapper.mapList(list, SysDepartTreeDTO.class); - - //子结构的列表 - Map> map = new HashMap<>(16); + // 获取所有部门数据 + List list = this.list(wrapper); + List dtoList = BeanMapper.mapList(list, SysDepartTreeDTO.class); // 将部门实体列表转换为部门树形结构DTO列表 + // 构建子部门的映射关系 + Map> map = new HashMap<>(16); for(SysDepartTreeDTO item: dtoList){ - - //如果存在 + // 如果当前部门已经有子部门,直接添加 if(map.containsKey(item.getParentId())){ map.get(item.getParentId()).add(item); continue; } - //增加新的结构 + // 如果没有子部门,则新建一个子部门列表 List a = new ArrayList<>(); a.add(item); map.put(item.getParentId(), a); } - //注意,第0级为顶级的 + // 获取顶级部门(parentId 为 ROOT_TAG) List topList = map.get(ROOT_TAG); if(!CollectionUtils.isEmpty(topList)){ for(SysDepartTreeDTO item: topList){ - this.fillChildren(map, item); + this.fillChildren(map, item); // 填充子部门 } } - return topList; + return topList; // 返回顶级部门及其子部门树 } + /** + * 排序部门 + * @param id 部门ID + * @param sort 排序方式,0为上升,1为下降 + */ @Override public void sort(String id, Integer sort) { - SysDepart depart = this.getById(id); + SysDepart depart = this.getById(id); // 获取部门实体 SysDepart exchange = null; - QueryWrapper wrapper = new QueryWrapper<>(); - // 同级排序 - wrapper.lambda() - .eq(SysDepart::getParentId, depart.getParentId()); + QueryWrapper wrapper = new QueryWrapper<>(); // 创建查询条件 + // 根据部门的父ID查询同级别的部门 + wrapper.lambda().eq(SysDepart::getParentId, depart.getParentId()); wrapper.last("LIMIT 1"); - // 上升 + // 上升排序 if(sort == 0){ - // 同级排序 - wrapper.lambda() - .lt(SysDepart::getSort, depart.getSort()) - .orderByDesc(SysDepart::getSort); - exchange = this.getOne(wrapper, false); + wrapper.lambda().lt(SysDepart::getSort, depart.getSort()).orderByDesc(SysDepart::getSort); // 查找排序小于当前部门的部门 + exchange = this.getOne(wrapper, false); // 获取交换部门 } - // 下降 + // 下降排序 if(sort == 1){ - // 同级排序 - wrapper.lambda() - .gt(SysDepart::getSort, depart.getSort()) - .orderByAsc(SysDepart::getSort); - exchange = this.getOne(wrapper, false); + wrapper.lambda().gt(SysDepart::getSort, depart.getSort()).orderByAsc(SysDepart::getSort); // 查找排序大于当前部门的部门 + exchange = this.getOne(wrapper, false); // 获取交换部门 } - - if(exchange!=null) { + // 如果找到了交换的部门,进行交换排序 + if(exchange != null) { SysDepart a = new SysDepart(); a.setId(id); a.setSort(exchange.getSort()); SysDepart b = new SysDepart(); b.setId(exchange.getId()); b.setSort(depart.getSort()); - this.updateById(a); - this.updateById(b); + this.updateById(a); // 更新部门a的排序 + this.updateById(b); // 更新部门b的排序 } } /** - * 获取部门编号 - * @param reqDTO - * @return + * 填充部门编码 + * @param reqDTO 部门数据传输对象 */ private void fillCode(SysDepartDTO reqDTO){ - // 前缀 String code = ""; - if(StringUtils.isNotBlank(reqDTO.getParentId()) - && !ROOT_TAG.equals(reqDTO.getParentId())){ + // 获取上级部门编码 + if(StringUtils.isNotBlank(reqDTO.getParentId()) && !ROOT_TAG.equals(reqDTO.getParentId())){ SysDepart parent = this.getById(reqDTO.getParentId()); - code = parent.getDeptCode(); + code = parent.getDeptCode(); // 获取上级部门的编码 } QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(SysDepart::getParentId, reqDTO.getParentId()).orderByDesc(SysDepart::getSort); // 查询同级部门 - // 同级排序 - wrapper.lambda() - .eq(SysDepart::getParentId, reqDTO.getParentId()) - .orderByDesc(SysDepart::getSort); - wrapper.last("LIMIT 1"); SysDepart depart = this.getOne(wrapper, false); - - if(depart !=null){ - code += this.formatCode(depart.getSort()+1); - reqDTO.setSort(depart.getSort()+1); - }else{ - code += this.formatCode(1); - reqDTO.setSort(1); + if(depart != null){ + code += this.formatCode(depart.getSort() + 1); // 根据排序生成部门编码 + reqDTO.setSort(depart.getSort() + 1); // 设置部门的排序 + } else { + code += this.formatCode(1); // 如果没有同级部门,则从1开始 + reqDTO.setSort(1); // 设置部门的排序为1 } - reqDTO.setDeptCode(code); + reqDTO.setDeptCode(code); // 设置部门编码 } /** - * 根式化加0 - * @param sort - * @return + * 格式化部门编码 + * @param sort 排序值 + * @return 返回格式化后的部门编码 */ private String formatCode(Integer sort){ if(sort < 10){ - return "A0"+sort; + return "A0" + sort; // 排序小于10时,返回带前导零的编码 } - return "A"+sort; + return "A" + sort; // 排序大于或等于10时,返回正常编码 } /** - * 递归去做填充数据 - * @param map - * @param item + * 填充子部门列表 + * @param map 部门映射关系 + * @param item 当前部门对象 */ - private void fillChildren(Map> map, SysDepartTreeDTO item){ + private void fillChildren(Map> map, SysDepartTreeDTO item){ //设置子类 if(map.containsKey(item.getId())){ @@ -229,60 +235,61 @@ public class SysDepartServiceImpl extends ServiceImpl children = map.get(item.getId()); if(!CollectionUtils.isEmpty(children)){ for(SysDepartTreeDTO sub: children){ - this.fillChildren(map, sub); + this.fillChildren(map, sub); // 递归填充子部门 } } - item.setChildren(children); + item.setChildren(children); // 设置子部门列表 } } - + /** + * 获取所有子部门的ID列表 + * @param id 部门ID + * @return 返回所有子部门的ID列表 + */ @Override - public List listAllSubIds( String id){ + public List listAllSubIds(String id){ List ids = new ArrayList<>(); - this.cycleAllSubs(ids, id); + this.cycleAllSubs(ids, id); // 递归获取所有子部门的ID return ids; } - /** - * 递归所有子级别ID - * @param list - * @param id + * 递归获取所有子部门的ID + * @param list 用于存储子部门ID的列表 + * @param id 当前部门ID */ private void cycleAllSubs(List list, String id){ - // 添加ID + // 添加当前部门ID list.add(id); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(SysDepart::getParentId, id) - .orderByDesc(SysDepart::getSort); + .orderByDesc(SysDepart::getSort); // 查询当前部门的所有子部门 List subList = this.list(wrapper); if(!CollectionUtils.isEmpty(subList)){ for(SysDepart item: subList){ - this.cycleAllSubs(list, item.getId()); + this.cycleAllSubs(list, item.getId()); // 递归查询子部门 } } } /** - * 递归所有子级别ID - * @param list - * @param id + * 递归获取所有父部门的ID + * @param list 用于存储父部门ID的列表 + * @param id 当前部门ID */ private void cycleAllParent(List list, String id){ - // 往上递归获得父类 + // 往上递归获取父部门 list.add(id); SysDepart depart = this.getById(id); - if(StringUtils.isNotBlank(depart.getParentId()) - && !ROOT_TAG.equals(depart.getParentId())){ - this.cycleAllParent(list, depart.getParentId()); + if(StringUtils.isNotBlank(depart.getParentId()) && !ROOT_TAG.equals(depart.getParentId())){ + this.cycleAllParent(list, depart.getParentId()); // 递归查询父部门 } - } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/system/mapper/SysDictMapper.java b/src-源文件/main/java/com/yf/exam/modules/sys/system/mapper/SysDictMapper.java index 7910881..85494ef 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/system/mapper/SysDictMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/system/mapper/SysDictMapper.java @@ -1,29 +1,30 @@ -package com.yf.exam.modules.sys.system.mapper; +package com.yf.exam.modules.sys.system.mapper; // 包名:表示该接口属于 sys.system.mapper 包 -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Mapper; // 导入 MyBatis 的 @Mapper 注解,表示这是一个 Mapper 接口 +import org.apache.ibatis.annotations.Param; // 导入 MyBatis 的 @Param 注解,用于指定参数名称 /** -*

-* 机主信息Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-08-22 13:46 -*/ -@Mapper + *

+ * 机主信息Mapper + *

+ * 该接口用于操作数据字典,提供查找数据字典的方法 + * + * @作者 聪明笨狗 + * @版本 2020-08-22 13:46 + */ +@Mapper // MyBatis 注解,表示该接口为 Mapper 接口,MyBatis 会自动生成相应的实现 public interface SysDictMapper { /** * 查找数据字典 - * @param table - * @param text - * @param key - * @param value - * @return + * @param table 数据表名称 + * @param text 字段文本 + * @param key 字段键值 + * @param value 字段值 + * @return 返回字典数据的对应值 */ - String findDict(@Param("table") String table, - @Param("text") String text, - @Param("key") String key, - @Param("value") String value); + String findDict(@Param("table") String table, // 使用 @Param 注解绑定 SQL 参数名 + @Param("text") String text, // 绑定 SQL 参数 text + @Param("key") String key, // 绑定 SQL 参数 key + @Param("value") String value); // 绑定 SQL 参数 value } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/system/service/SysDictService.java b/src-源文件/main/java/com/yf/exam/modules/sys/system/service/SysDictService.java index ab8abd2..6e933ec 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/system/service/SysDictService.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/system/service/SysDictService.java @@ -1,21 +1,25 @@ -package com.yf.exam.modules.sys.system.service; +package com.yf.exam.modules.sys.system.service; // 包名:表示该接口属于 sys.system.service 包 /** * 数据字典工具类 - * @author bool + * 提供与数据字典相关的业务方法 + * + * @作者 bool */ -public interface SysDictService { +public interface SysDictService { // 定义 SysDictService 接口,提供数据字典的服务 /** * 查找数据字典 - * @param table - * @param text - * @param key - * @param value - * @return + * 根据给定的表、字段文本、键和值查找数据字典中的对应数据 + * + * @param table 数据表名称 + * @param text 字段文本,用于描述字段内容 + * @param key 字段键值,用于匹配字典数据 + * @param value 字段值,用于匹配字典数据 + * @return 返回数据字典中的对应值 */ - String findDict(String table, - String text, - String key, - String value); + String findDict(String table, // 表示字典数据的表名 + String text, // 字段文本,用于描述字段 + String key, // 字段的键 + String value); // 字段的值,查询条件之一 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/system/service/impl/SysDictServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/sys/system/service/impl/SysDictServiceImpl.java index 033ed67..623ce4b 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/system/service/impl/SysDictServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/system/service/impl/SysDictServiceImpl.java @@ -1,21 +1,30 @@ -package com.yf.exam.modules.sys.system.service.impl; +package com.yf.exam.modules.sys.system.service.impl; // 包名:表示该类属于 sys.system.service.impl 包 -import com.yf.exam.modules.sys.system.mapper.SysDictMapper; -import com.yf.exam.modules.sys.system.service.SysDictService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import com.yf.exam.modules.sys.system.mapper.SysDictMapper; // 导入 SysDictMapper 接口,用于操作数据字典 +import com.yf.exam.modules.sys.system.service.SysDictService; // 导入 SysDictService 接口,定义数据字典的业务逻辑 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 的 @Autowired 注解,用于自动注入依赖 +import org.springframework.stereotype.Service; // 导入 Spring 的 @Service 注解,用于标识该类为服务层组件 /** + * SysDictServiceImpl 类提供了数据字典的业务逻辑实现 * @author bool */ -@Service -public class SysDictServiceImpl implements SysDictService { +@Service // Spring 注解,标识该类为服务层组件 +public class SysDictServiceImpl implements SysDictService { // 实现 SysDictService 接口 - @Autowired + @Autowired // 自动注入 SysDictMapper private SysDictMapper sysDictMapper; + /** + * 查找数据字典 + * @param table 数据表名称 + * @param text 字段文本 + * @param key 字段键值 + * @param value 字段值 + * @return 返回字典数据的对应值 + */ @Override public String findDict(String table, String text, String key, String value) { - return sysDictMapper.findDict(table, text, key, value); + return sysDictMapper.findDict(table, text, key, value); // 调用 Mapper 层的方法查找字典数据 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysRoleController.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysRoleController.java index dab2bc2..de3402e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysRoleController.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysRoleController.java @@ -1,77 +1,75 @@ -package com.yf.exam.modules.sys.user.controller; +package com.yf.exam.modules.sys.user.controller; // 包名:表示该类属于 sys.user.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.PagingReqDTO; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.modules.sys.user.dto.SysRoleDTO; -import com.yf.exam.modules.sys.user.entity.SysRole; -import com.yf.exam.modules.sys.user.service.SysRoleService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.shiro.authz.annotation.RequiresRoles; -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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.yf.exam.core.api.ApiRest; // 导入统一的 API 响应类 +import com.yf.exam.core.api.controller.BaseController; // 导入基类控制器,提供通用功能 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象属性拷贝 +import com.yf.exam.modules.sys.user.dto.SysRoleDTO; // 导入 SysRoleDTO 数据传输对象 +import com.yf.exam.modules.sys.user.entity.SysRole; // 导入 SysRole 实体类,表示角色 +import com.yf.exam.modules.sys.user.service.SysRoleService; // 导入 SysRoleService 服务接口 +import io.swagger.annotations.Api; // 导入 Swagger 注解,用于定义 API 文档 +import io.swagger.annotations.ApiOperation; // 导入 Swagger 注解,用于描述接口操作 +import org.apache.shiro.authz.annotation.RequiresRoles; // 导入 Shiro 注解,用于权限控制,限制访问角色 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 注解,用于自动注入依赖 +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; // 导入注解,标识该类为 REST 控制器 -import java.util.List; +import java.util.List; // 导入 List 接口,用于存储角色列表 /** *

* 管理用户控制器 *

- * - * @author 聪明笨狗 - * @since 2020-04-13 16:57 + * 该类用于处理角色管理相关的请求 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 */ -@Api(tags = {"管理用户"}) -@RestController -@RequestMapping("/exam/api/sys/role") -public class SysRoleController extends BaseController { +@Api(tags = {"管理用户"}) // Swagger 注解:定义该类的 API 文档标签为“管理用户” +@RestController // Spring 注解:标识该类为 REST 控制器,处理 HTTP 请求 +@RequestMapping("/exam/api/sys/role") // 定义请求路径前缀为 /exam/api/sys/role +public class SysRoleController extends BaseController { // SysRoleController 继承自 BaseController,提供通用功能 - @Autowired + @Autowired // 自动注入 SysRoleService 服务 private SysRoleService baseService; - - - /** - * 分页查找 - * @param reqDTO - * @return + * 分页查找角色信息 + * @param reqDTO 分页请求数据传输对象,包含分页信息和查询条件 + * @return 返回分页查询结果,包含角色数据 */ - @RequiresRoles("sa") - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "分页查找") // Swagger 注解:描述接口操作为“分页查找” + @RequestMapping(value = "/paging", method = { RequestMethod.POST}) // 请求路径为 /paging,方法为 POST public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - //分页查询并转换 - IPage page = baseService.paging(reqDTO); - return super.success(page); + // 调用服务层进行分页查询,并返回角色数据 + IPage page = baseService.paging(reqDTO); + return super.success(page); // 返回成功响应,包含分页数据 } /** - * 查找列表,每次最多返回200条数据 - * @return + * 查找所有角色列表,每次最多返回200条数据 + * @return 返回角色列表 */ - @RequiresRoles("sa") - @ApiOperation(value = "查找列表") - @RequestMapping(value = "/list", method = { RequestMethod.POST}) + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "查找列表") // Swagger 注解:描述接口操作为“查找列表” + @RequestMapping(value = "/list", method = { RequestMethod.POST}) // 请求路径为 /list,方法为 POST public ApiRest> list() { - //分页查询并转换 - QueryWrapper wrapper = new QueryWrapper<>(); + // 创建查询条件 + QueryWrapper wrapper = new QueryWrapper<>(); - //转换并返回 - List list = baseService.list(wrapper); + // 获取所有角色数据 + List list = baseService.list(wrapper); - //转换数据 + // 将角色实体数据转换为角色数据传输对象 List dtoList = BeanMapper.mapList(list, SysRoleDTO.class); - return super.success(dtoList); + return super.success(dtoList); // 返回成功响应,包含角色列表 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysUserController.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysUserController.java index 757c5e3..3c6aef1 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysUserController.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/controller/SysUserController.java @@ -1,182 +1,185 @@ -package com.yf.exam.modules.sys.user.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.BaseIdsReqDTO; -import com.yf.exam.core.api.dto.BaseStateReqDTO; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.sys.user.dto.SysUserDTO; -import com.yf.exam.modules.sys.user.dto.request.SysUserLoginReqDTO; -import com.yf.exam.modules.sys.user.dto.request.SysUserSaveReqDTO; -import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; -import com.yf.exam.modules.sys.user.entity.SysUser; -import com.yf.exam.modules.sys.user.service.SysUserService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.shiro.authz.annotation.RequiresRoles; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -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.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; +package com.yf.exam.modules.sys.user.controller; // 包名:表示该类属于 sys.user.controller 包 + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.yf.exam.core.api.ApiRest; // 导入统一的 API 响应类 +import com.yf.exam.core.api.controller.BaseController; // 导入基类控制器,提供通用功能 +import com.yf.exam.core.api.dto.BaseIdsReqDTO; // 导入基本请求 DTO,用于处理多个 ID 请求 +import com.yf.exam.core.api.dto.BaseStateReqDTO; // 导入基本状态请求 DTO,用于更新状态 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO +import com.yf.exam.modules.sys.user.dto.SysUserDTO; // 导入 SysUserDTO 数据传输对象 +import com.yf.exam.modules.sys.user.dto.request.SysUserLoginReqDTO; // 导入 SysUserLoginReqDTO 登录请求 DTO +import com.yf.exam.modules.sys.user.dto.request.SysUserSaveReqDTO; // 导入 SysUserSaveReqDTO 保存请求 DTO +import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; // 导入 SysUserLoginDTO 登录响应 DTO +import com.yf.exam.modules.sys.user.entity.SysUser; // 导入 SysUser 实体类,表示系统用户 +import com.yf.exam.modules.sys.user.service.SysUserService; // 导入 SysUserService 服务接口 +import io.swagger.annotations.Api; // 导入 Swagger 注解,用于定义 API 文档 +import io.swagger.annotations.ApiOperation; // 导入 Swagger 注解,用于描述接口操作 +import org.apache.shiro.authz.annotation.RequiresRoles; // 导入 Shiro 注解,用于角色权限控制 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 注解,用于自动注入依赖 +import org.springframework.web.bind.annotation.CrossOrigin; // 导入 Spring 注解,用于启用跨域请求 +import org.springframework.web.bind.annotation.RequestBody; // 导入 Spring 注解,用于请求体绑定 +import org.springframework.web.bind.annotation.RequestMapping; // 导入 Spring 注解,用于指定请求路径 +import org.springframework.web.bind.annotation.RequestMethod; // 导入 Spring 注解,用于指定请求方法 +import org.springframework.web.bind.annotation.RequestParam; // 导入 Spring 注解,用于请求参数绑定 +import org.springframework.web.bind.annotation.RestController; // 导入 Spring 注解,标识该类为 REST 控制器 + +import javax.servlet.http.HttpServletRequest; // 导入 HttpServletRequest 类,用于获取 HTTP 请求 /** *

* 管理用户控制器 *

- * - * @author 聪明笨狗 - * @since 2020-04-13 16:57 + * 该类用于处理用户相关的请求,包括登录、注册、修改用户资料等 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 */ -@Api(tags = {"管理用户"}) -@RestController -@RequestMapping("/exam/api/sys/user") -public class SysUserController extends BaseController { +@Api(tags = {"管理用户"}) // Swagger 注解:定义该类的 API 文档标签为“管理用户” +@RestController // Spring 注解:标识该类为 REST 控制器,处理 HTTP 请求 +@RequestMapping("/exam/api/sys/user") // 定义请求路径前缀为 /exam/api/sys/user +public class SysUserController extends BaseController { // SysUserController 类继承 BaseController,提供通用功能 - @Autowired + @Autowired // 自动注入 SysUserService 服务 private SysUserService baseService; /** * 用户登录 - * @return + * @param reqDTO 登录请求 DTO,包含用户名和密码 + * @return 返回用户登录信息 */ - @CrossOrigin - @ApiOperation(value = "用户登录") - @RequestMapping(value = "/login", method = {RequestMethod.POST}) + @CrossOrigin // 允许跨域请求 + @ApiOperation(value = "用户登录") // Swagger 注解:描述接口操作为“用户登录” + @RequestMapping(value = "/login", method = {RequestMethod.POST}) // 请求路径为 /login,方法为 POST public ApiRest login(@RequestBody SysUserLoginReqDTO reqDTO) { - SysUserLoginDTO respDTO = baseService.login(reqDTO.getUsername(), reqDTO.getPassword()); - return super.success(respDTO); + SysUserLoginDTO respDTO = baseService.login(reqDTO.getUsername(), reqDTO.getPassword()); // 调用服务层的登录方法 + return super.success(respDTO); // 返回成功响应,包含用户登录信息 } /** - * 用户登录 - * @return + * 用户登出 + * @param request HTTP 请求对象,用于获取请求头中的 token + * @return 返回成功响应 */ - @CrossOrigin - @ApiOperation(value = "用户登录") - @RequestMapping(value = "/logout", method = {RequestMethod.POST}) + @CrossOrigin // 允许跨域请求 + @ApiOperation(value = "用户登出") // Swagger 注解:描述接口操作为“用户登出” + @RequestMapping(value = "/logout", method = {RequestMethod.POST}) // 请求路径为 /logout,方法为 POST public ApiRest logout(HttpServletRequest request) { - String token = request.getHeader("token"); - System.out.println("+++++当前会话为:"+token); - baseService.logout(token); - return super.success(); + String token = request.getHeader("token"); // 获取请求头中的 token + System.out.println("+++++当前会话为:" + token); // 打印当前会话的 token + baseService.logout(token); // 调用服务层的登出方法 + return super.success(); // 返回成功响应 } /** - * 获取会话 - * @return + * 获取当前会话信息 + * @param token 会话 token + * @return 返回当前会话信息 */ - @ApiOperation(value = "获取会话") - @RequestMapping(value = "/info", method = {RequestMethod.POST}) + @ApiOperation(value = "获取会话") // Swagger 注解:描述接口操作为“获取会话” + @RequestMapping(value = "/info", method = {RequestMethod.POST}) // 请求路径为 /info,方法为 POST public ApiRest info(@RequestParam("token") String token) { - SysUserLoginDTO respDTO = baseService.token(token); - return success(respDTO); + SysUserLoginDTO respDTO = baseService.token(token); // 根据 token 获取当前会话信息 + return success(respDTO); // 返回会话信息 } /** * 修改用户资料 - * @return + * @param reqDTO 用户资料 DTO,包含修改后的用户信息 + * @return 返回成功响应 */ - @ApiOperation(value = "修改用户资料") - @RequestMapping(value = "/update", method = {RequestMethod.POST}) + @ApiOperation(value = "修改用户资料") // Swagger 注解:描述接口操作为“修改用户资料” + @RequestMapping(value = "/update", method = {RequestMethod.POST}) // 请求路径为 /update,方法为 POST public ApiRest update(@RequestBody SysUserDTO reqDTO) { - baseService.update(reqDTO); - return success(); + baseService.update(reqDTO); // 调用服务层的更新方法 + return success(); // 返回成功响应 } - /** * 保存或修改系统用户 - * @return + * @param reqDTO 用户保存或修改请求 DTO + * @return 返回成功响应 */ - @RequiresRoles("sa") - @ApiOperation(value = "保存或修改") - @RequestMapping(value = "/save", method = {RequestMethod.POST}) + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "保存或修改") // Swagger 注解:描述接口操作为“保存或修改” + @RequestMapping(value = "/save", method = {RequestMethod.POST}) // 请求路径为 /save,方法为 POST public ApiRest save(@RequestBody SysUserSaveReqDTO reqDTO) { - baseService.save(reqDTO); - return success(); + baseService.save(reqDTO); // 调用服务层的保存方法 + return success(); // 返回成功响应 } - /** - * 批量删除 - * @param reqDTO - * @return + * 批量删除用户 + * @param reqDTO 批量删除请求 DTO,包含待删除用户的 ID 列表 + * @return 返回成功响应 */ - @RequiresRoles("sa") - @ApiOperation(value = "批量删除") - @RequestMapping(value = "/delete", method = { RequestMethod.POST}) + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "批量删除") // Swagger 注解:描述接口操作为“批量删除” + @RequestMapping(value = "/delete", method = {RequestMethod.POST}) // 请求路径为 /delete,方法为 POST public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) { - //根据ID删除 - baseService.removeByIds(reqDTO.getIds()); - return super.success(); + baseService.removeByIds(reqDTO.getIds()); // 根据 ID 列表删除用户 + return super.success(); // 返回成功响应 } /** - * 分页查找 - * @param reqDTO - * @return + * 分页查找用户 + * @param reqDTO 分页请求 DTO,包含分页信息和查询条件 + * @return 返回分页查询结果 */ - @RequiresRoles("sa") - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "分页查找") // Swagger 注解:描述接口操作为“分页查找” + @RequestMapping(value = "/paging", method = {RequestMethod.POST}) // 请求路径为 /paging,方法为 POST public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { - //分页查询并转换 + // 调用服务层的分页查询方法 IPage page = baseService.paging(reqDTO); - return super.success(page); + return super.success(page); // 返回成功响应,包含分页数据 } /** - * 修改状态 - * @param reqDTO - * @return + * 修改用户状态 + * @param reqDTO 状态请求 DTO,包含用户 ID 列表和状态 + * @return 返回成功响应 */ - @RequiresRoles("sa") - @ApiOperation(value = "修改状态") - @RequestMapping(value = "/state", method = { RequestMethod.POST}) + @RequiresRoles("sa") // 权限控制:要求用户具有 "sa" 角色 + @ApiOperation(value = "修改状态") // Swagger 注解:描述接口操作为“修改状态” + @RequestMapping(value = "/state", method = {RequestMethod.POST}) // 请求路径为 /state,方法为 POST public ApiRest state(@RequestBody BaseStateReqDTO reqDTO) { - // 条件 + // 构建查询条件:排除 admin 用户 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() - .in(SysUser::getId, reqDTO.getIds()) - .ne(SysUser::getUserName, "admin"); - + .in(SysUser::getId, reqDTO.getIds()) // 根据 ID 列表查询 + .ne(SysUser::getUserName, "admin"); // 排除用户名为 admin 的用户 SysUser record = new SysUser(); - record.setState(reqDTO.getState()); - baseService.update(record, wrapper); + record.setState(reqDTO.getState()); // 设置用户状态 + baseService.update(record, wrapper); // 更新状态 - return super.success(); + return super.success(); // 返回成功响应 } - /** - * 保存或修改系统用户 - * @return + * 用户注册 + * @param reqDTO 用户注册请求 DTO,包含用户注册信息 + * @return 返回用户登录信息 */ - @ApiOperation(value = "学员注册") - @RequestMapping(value = "/reg", method = {RequestMethod.POST}) + @ApiOperation(value = "学员注册") // Swagger 注解:描述接口操作为“学员注册” + @RequestMapping(value = "/reg", method = {RequestMethod.POST}) // 请求路径为 /reg,方法为 POST public ApiRest reg(@RequestBody SysUserDTO reqDTO) { - SysUserLoginDTO respDTO = baseService.reg(reqDTO); - return success(respDTO); + SysUserLoginDTO respDTO = baseService.reg(reqDTO); // 调用服务层的注册方法 + return success(respDTO); // 返回注册后的用户登录信息 } /** - * 快速注册,如果手机号存在则登录,不存在就注册 - * @return + * 快速注册 + * @param reqDTO 用户注册请求 DTO,包含用户信息 + * @return 返回用户登录信息 */ - @ApiOperation(value = "快速注册") - @RequestMapping(value = "/quick-reg", method = {RequestMethod.POST}) + @ApiOperation(value = "快速注册") // Swagger 注解:描述接口操作为“快速注册” + @RequestMapping(value = "/quick-reg", method = {RequestMethod.POST}) // 请求路径为 /quick-reg,方法为 POST public ApiRest quick(@RequestBody SysUserDTO reqDTO) { - SysUserLoginDTO respDTO = baseService.quickReg(reqDTO); - return success(respDTO); + SysUserLoginDTO respDTO = baseService.quickReg(reqDTO); // 调用服务层的快速注册方法 + return success(respDTO); // 返回快速注册后的用户登录信息 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysRoleDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysRoleDTO.java index d138569..8532147 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysRoleDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysRoleDTO.java @@ -1,30 +1,29 @@ -package com.yf.exam.modules.sys.user.dto; +package com.yf.exam.modules.sys.user.dto; // 包名:表示该类属于 sys.user.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 /** -*

-* 角色请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="角色", description="角色") -public class SysRoleDTO implements Serializable { + *

+ * 角色请求类 + *

+ * 用于封装角色请求的数据,包括角色的ID和名称 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "角色", description = "角色") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysRoleDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "角色ID", required=true) - private String id; - - @ApiModelProperty(value = "角色名称", required=true) - private String roleName; - + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 + + @ApiModelProperty(value = "角色ID", required = true) // Swagger 注解:描述该属性为“角色ID”,并标记为必填 + private String id; // 定义字段:角色的唯一标识符 + + @ApiModelProperty(value = "角色名称", required = true) // Swagger 注解:描述该属性为“角色名称”,并标记为必填 + private String roleName; // 定义字段:角色的名称 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserDTO.java index e8831b3..d74db93 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserDTO.java @@ -1,55 +1,54 @@ -package com.yf.exam.modules.sys.user.dto; +package com.yf.exam.modules.sys.user.dto; // 包名:表示该类属于 sys.user.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; -import java.util.Date; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 +import java.util.Date; // 导入 Date 类,用于表示日期和时间 /** -*

-* 管理用户请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="管理用户", description="管理用户") -public class SysUserDTO implements Serializable { + *

+ * 管理用户请求类 + *

+ * 用于封装管理员用户的相关数据,包括用户的基本信息 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "管理用户", description = "管理用户") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysUserDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 + @ApiModelProperty(value = "ID", required = true) // Swagger 注解:描述该属性为“ID”,并标记为必填 + private String id; // 定义字段:用户的唯一标识符 - @ApiModelProperty(value = "ID", required=true) - private String id; + @ApiModelProperty(value = "用户名", required = true) // Swagger 注解:描述该属性为“用户名”,并标记为必填 + private String userName; // 定义字段:管理员的用户名,用于登录和身份验证 - @ApiModelProperty(value = "用户名", required=true) - private String userName; + @ApiModelProperty(value = "真实姓名", required = true) // Swagger 注解:描述该属性为“真实姓名”,并标记为必填 + private String realName; // 定义字段:管理员的真实姓名 - @ApiModelProperty(value = "真实姓名", required=true) - private String realName; + @ApiModelProperty(value = "密码", required = true) // Swagger 注解:描述该属性为“密码”,并标记为必填 + private String password; // 定义字段:管理员的密码 - @ApiModelProperty(value = "密码", required=true) - private String password; + @ApiModelProperty(value = "密码盐", required = true) // Swagger 注解:描述该属性为“密码盐”,并标记为必填 + private String salt; // 定义字段:用于加密密码的盐值 - @ApiModelProperty(value = "密码盐", required=true) - private String salt; + @ApiModelProperty(value = "角色列表", required = true) // Swagger 注解:描述该属性为“角色列表”,并标记为必填 + private String roleIds; // 定义字段:用户的角色ID列表,用于权限控制 - @ApiModelProperty(value = "角色列表", required=true) - private String roleIds; + @ApiModelProperty(value = "部门ID", required = true) // Swagger 注解:描述该属性为“部门ID”,并标记为必填 + private String departId; // 定义字段:用户所属的部门ID - @ApiModelProperty(value = "部门ID", required=true) - private String departId; + @ApiModelProperty(value = "创建时间", required = true) // Swagger 注解:描述该属性为“创建时间”,并标记为必填 + private Date createTime; // 定义字段:管理员账号的创建时间 - @ApiModelProperty(value = "创建时间", required=true) - private Date createTime; + @ApiModelProperty(value = "更新时间", required = true) // Swagger 注解:描述该属性为“更新时间”,并标记为必填 + private Date updateTime; // 定义字段:管理员账号的最后更新时间 - @ApiModelProperty(value = "更新时间", required=true) - private Date updateTime; - - @ApiModelProperty(value = "状态", required=true) - private Integer state; - + @ApiModelProperty(value = "状态", required = true) // Swagger 注解:描述该属性为“状态”,并标记为必填 + private Integer state; // 定义字段:管理员账号的状态,如启用或禁用 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserRoleDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserRoleDTO.java index 0973302..d18eca4 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserRoleDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/SysUserRoleDTO.java @@ -1,33 +1,32 @@ -package com.yf.exam.modules.sys.user.dto; +package com.yf.exam.modules.sys.user.dto; // 包名:表示该类属于 sys.user.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 /** -*

-* 用户角色请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="用户角色", description="用户角色") -public class SysUserRoleDTO implements Serializable { + *

+ * 用户角色请求类 + *

+ * 用于封装用户角色信息的请求数据,包括用户与角色的映射关系 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "用户角色", description = "用户角色") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysUserRoleDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "ID", required=true) - private String id; - - @ApiModelProperty(value = "用户ID", required=true) - private String userId; - - @ApiModelProperty(value = "角色ID", required=true) - private String roleId; - + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 + + @ApiModelProperty(value = "ID", required = true) // Swagger 注解:描述该属性为“ID”,并标记为必填 + private String id; // 定义字段:用户角色关系的唯一标识符 + + @ApiModelProperty(value = "用户ID", required = true) // Swagger 注解:描述该属性为“用户ID”,并标记为必填 + private String userId; // 定义字段:用户的唯一标识符,关联到特定的用户 + + @ApiModelProperty(value = "角色ID", required = true) // Swagger 注解:描述该属性为“角色ID”,并标记为必填 + private String roleId; // 定义字段:角色的唯一标识符,关联到特定的角色 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserLoginReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserLoginReqDTO.java index 35f00a7..c7275a9 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserLoginReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserLoginReqDTO.java @@ -1,29 +1,29 @@ -package com.yf.exam.modules.sys.user.dto.request; +package com.yf.exam.modules.sys.user.dto.request; // 包名:表示该类属于 sys.user.dto.request 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 /** -*

-* 管理员登录请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="管理员登录请求类", description="管理员登录请求类") -public class SysUserLoginReqDTO implements Serializable { + *

+ * 管理员登录请求类 + *

+ * 用于封装管理员登录请求的数据,包括用户名和密码 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "管理员登录请求类", description = "管理员登录请求类") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysUserLoginReqDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "用户名", required=true) - private String username; + @ApiModelProperty(value = "用户名", required = true) // Swagger 注解:描述该属性为“用户名”,并标记为必填 + private String username; // 定义字段:用户名,登录时使用 - @ApiModelProperty(value = "密码", required=true) - private String password; - + @ApiModelProperty(value = "密码", required = true) // Swagger 注解:描述该属性为“密码”,并标记为必填 + private String password; // 定义字段:密码,登录时使用 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserSaveReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserSaveReqDTO.java index e3fb9f4..280a545 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserSaveReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserSaveReqDTO.java @@ -1,43 +1,43 @@ -package com.yf.exam.modules.sys.user.dto.request; +package com.yf.exam.modules.sys.user.dto.request; // 包名:表示该类属于 sys.user.dto.request 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; -import java.util.List; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 +import java.util.List; // 导入 List 接口,用于存储角色列表 /** -*

-* 管理员登录请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="管理员保存请求类", description="管理员保存请求类") -public class SysUserSaveReqDTO implements Serializable { - - @ApiModelProperty(value = "ID", required=true) - private String id; - - @ApiModelProperty(value = "用户名", required=true) - private String userName; - - @ApiModelProperty(value = "头像", required=true) - private String avatar; - - @ApiModelProperty(value = "真实姓名", required=true) - private String realName; - - @ApiModelProperty(value = "密码", required=true) - private String password; - - @ApiModelProperty(value = "部门", required=true) - private String departId; - - @ApiModelProperty(value = "角色列表", required=true) - private List roles; - + *

+ * 管理员保存请求类 + *

+ * 用于封装保存管理员信息的请求数据 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "管理员保存请求类", description = "管理员保存请求类") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysUserSaveReqDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 + + @ApiModelProperty(value = "ID", required = true) // Swagger 注解:描述该属性为“ID”,并标记为必填 + private String id; // 定义字段:管理员的唯一标识符,通常用于更新操作 + + @ApiModelProperty(value = "用户名", required = true) // Swagger 注解:描述该属性为“用户名”,并标记为必填 + private String userName; // 定义字段:管理员的用户名,用于登录 + + @ApiModelProperty(value = "头像", required = true) // Swagger 注解:描述该属性为“头像”,并标记为必填 + private String avatar; // 定义字段:管理员的头像 URL + + @ApiModelProperty(value = "真实姓名", required = true) // Swagger 注解:描述该属性为“真实姓名”,并标记为必填 + private String realName; // 定义字段:管理员的真实姓名 + + @ApiModelProperty(value = "密码", required = true) // Swagger 注解:描述该属性为“密码”,并标记为必填 + private String password; // 定义字段:管理员的登录密码 + + @ApiModelProperty(value = "部门", required = true) // Swagger 注解:描述该属性为“部门”,并标记为必填 + private String departId; // 定义字段:管理员所属的部门ID + + @ApiModelProperty(value = "角色列表", required = true) // Swagger 注解:描述该属性为“角色列表”,并标记为必填 + private List roles; // 定义字段:管理员的角色列表,每个角色的 ID 组成的列表 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserTokenReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserTokenReqDTO.java index 5e830a9..c309dc1 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserTokenReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/request/SysUserTokenReqDTO.java @@ -1,26 +1,26 @@ -package com.yf.exam.modules.sys.user.dto.request; +package com.yf.exam.modules.sys.user.dto.request; // 包名:表示该类属于 sys.user.dto.request 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 /** -*

-* 会话检查请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="会话检查请求类", description="会话检查请求类") -public class SysUserTokenReqDTO implements Serializable { + *

+ * 会话检查请求类 + *

+ * 用于封装会话检查请求的数据,包含会话的 token 信息 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "会话检查请求类", description = "会话检查请求类") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysUserTokenReqDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "用户名", required=true) - private String token; - + @ApiModelProperty(value = "用户名", required = true) // Swagger 注解:描述该属性为“用户名”,并标记为必填 + private String token; // 定义字段:会话的 token,用于标识当前会话 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/response/SysUserLoginDTO.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/response/SysUserLoginDTO.java index 17362b5..80b375f 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/response/SysUserLoginDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/dto/response/SysUserLoginDTO.java @@ -1,55 +1,55 @@ -package com.yf.exam.modules.sys.user.dto.response; +package com.yf.exam.modules.sys.user.dto.response; // 包名:表示该类属于 sys.user.dto.response 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于定义 API 模型 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述 API 模型的属性 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.io.Serializable; -import java.util.Date; -import java.util.List; +import java.io.Serializable; // 导入 Serializable 接口,用于支持对象的序列化 +import java.util.Date; // 导入 Date 类,用于表示日期和时间 +import java.util.List; // 导入 List 接口,用于存储角色列表 /** -*

-* 管理用户请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@ApiModel(value="管理用户登录响应类", description="管理用户登录响应类") -public class SysUserLoginDTO implements Serializable { + *

+ * 管理用户登录响应类 + *

+ * 用于封装管理员登录后的响应数据,包括用户信息和登录令牌 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@ApiModel(value = "管理用户登录响应类", description = "管理用户登录响应类") // Swagger 注解:定义该类的 API 模型名称和描述 +public class SysUserLoginDTO implements Serializable { // 实现 Serializable 接口,以支持序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - @ApiModelProperty(value = "ID", required=true) - private String id; + @ApiModelProperty(value = "ID", required = true) // Swagger 注解:描述该属性为“ID”,并标记为必填 + private String id; // 定义字段:管理员的唯一标识符 - @ApiModelProperty(value = "用户名", required=true) - private String userName; + @ApiModelProperty(value = "用户名", required = true) // Swagger 注解:描述该属性为“用户名”,并标记为必填 + private String userName; // 定义字段:管理员的用户名 - @ApiModelProperty(value = "真实姓名", required=true) - private String realName; + @ApiModelProperty(value = "真实姓名", required = true) // Swagger 注解:描述该属性为“真实姓名”,并标记为必填 + private String realName; // 定义字段:管理员的真实姓名 - @ApiModelProperty(value = "角色列表", required=true) - private String roleIds; + @ApiModelProperty(value = "角色列表", required = true) // Swagger 注解:描述该属性为“角色列表”,并标记为必填 + private String roleIds; // 定义字段:管理员的角色ID列表,用于权限控制 - @ApiModelProperty(value = "部门ID", required=true) - private String departId; + @ApiModelProperty(value = "部门ID", required = true) // Swagger 注解:描述该属性为“部门ID”,并标记为必填 + private String departId; // 定义字段:管理员所属部门的ID - @ApiModelProperty(value = "创建时间", required=true) - private Date createTime; + @ApiModelProperty(value = "创建时间", required = true) // Swagger 注解:描述该属性为“创建时间”,并标记为必填 + private Date createTime; // 定义字段:管理员账号的创建时间 - @ApiModelProperty(value = "更新时间", required=true) - private Date updateTime; + @ApiModelProperty(value = "更新时间", required = true) // Swagger 注解:描述该属性为“更新时间”,并标记为必填 + private Date updateTime; // 定义字段:管理员账号的最后更新时间 - @ApiModelProperty(value = "状态", required=true) - private Integer state; + @ApiModelProperty(value = "状态", required = true) // Swagger 注解:描述该属性为“状态”,并标记为必填 + private Integer state; // 定义字段:管理员账号的状态,如启用或禁用 - @ApiModelProperty(value = "角色列表", required=true) - private List roles; + @ApiModelProperty(value = "角色列表", required = true) // Swagger 注解:描述该属性为“角色列表”,并标记为必填 + private List roles; // 定义字段:管理员角色的列表,每个角色的名称或ID - @ApiModelProperty(value = "登录令牌", required=true) - private String token; - + @ApiModelProperty(value = "登录令牌", required = true) // Swagger 注解:描述该属性为“登录令牌”,并标记为必填 + private String token; // 定义字段:管理员登录后的令牌,用于身份验证 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysRole.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysRole.java index b5d328f..ff90c1f 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysRole.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysRole.java @@ -1,36 +1,38 @@ -package com.yf.exam.modules.sys.user.entity; +package com.yf.exam.modules.sys.user.entity; // 包名:表示该类属于 sys.user.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于指定主键生成策略 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于指定表字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于指定表主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于指定表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus 扩展的 Model 类,支持 ActiveRecord 模式 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 /** -*

-* 角色实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@TableName("sys_role") -public class SysRole extends Model { + *

+ * 角色实体类 + *

+ * 该类用于封装角色实体的数据,与数据库中的 `sys_role` 表对应 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@TableName("sys_role") // MyBatis-Plus 注解,指定该实体类对应数据库表名为 "sys_role" +public class SysRole extends Model { // SysRole 类继承自 Model 类,支持 ActiveRecord 模式 + + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - private static final long serialVersionUID = 1L; - /** - * 角色ID - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; - + * 角色ID + * 主键,使用 MyBatis-Plus 的自增策略 + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,指定主键字段及生成策略 + private String id; // 定义字段:角色的唯一标识符 + /** - * 角色名称 - */ - @TableField("role_name") - private String roleName; - + * 角色名称 + * 对应数据库中的 "role_name" 字段 + */ + @TableField("role_name") // MyBatis-Plus 注解,指定该字段对应数据库中的 "role_name" 字段 + private String roleName; // 定义字段:角色的名称 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUser.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUser.java index 7651f68..ec5f429 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUser.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUser.java @@ -1,83 +1,93 @@ -package com.yf.exam.modules.sys.user.entity; +package com.yf.exam.modules.sys.user.entity; // 包名:表示该类属于 sys.user.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于指定主键生成策略 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于指定表字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于指定表主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于指定表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus 扩展的 Model 类,支持 ActiveRecord 模式 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 -import java.util.Date; +import java.util.Date; // 导入 Date 类,用于表示日期和时间 /** -*

-* 管理用户实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@TableName("sys_user") -public class SysUser extends Model { + *

+ * 管理用户实体类 + *

+ * 该类用于封装管理员用户的数据,与数据库中的 `sys_user` 表对应 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@TableName("sys_user") // MyBatis-Plus 注解,指定该实体类对应数据库表名为 "sys_user" +public class SysUser extends Model { // SysUser 类继承自 Model 类,支持 ActiveRecord 模式 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 /** * ID + * 主键,使用 MyBatis-Plus 的自增策略 */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,指定主键字段及生成策略 + private String id; // 定义字段:用户的唯一标识符 /** * 用户名 + * 对应数据库中的 "user_name" 字段 */ - @TableField("user_name") - private String userName; + @TableField("user_name") // MyBatis-Plus 注解,指定该字段对应数据库中的 "user_name" 字段 + private String userName; // 定义字段:管理员的用户名,用于登录和身份验证 /** * 真实姓名 + * 对应数据库中的 "real_name" 字段 */ - @TableField("real_name") - private String realName; + @TableField("real_name") // MyBatis-Plus 注解,指定该字段对应数据库中的 "real_name" 字段 + private String realName; // 定义字段:管理员的真实姓名 /** * 密码 + * 存储管理员的密码 */ - private String password; + private String password; // 定义字段:管理员的登录密码 /** * 密码盐 + * 用于加密密码的盐值 */ - private String salt; + private String salt; // 定义字段:用于加密密码的盐值 /** * 角色列表 + * 对应数据库中的 "role_ids" 字段,存储角色的ID列表 */ - @TableField("role_ids") - private String roleIds; + @TableField("role_ids") // MyBatis-Plus 注解,指定该字段对应数据库中的 "role_ids" 字段 + private String roleIds; // 定义字段:用户的角色ID列表,用于权限控制 /** * 部门ID + * 对应数据库中的 "depart_id" 字段 */ - @TableField("depart_id") - private String departId; + @TableField("depart_id") // MyBatis-Plus 注解,指定该字段对应数据库中的 "depart_id" 字段 + private String departId; // 定义字段:管理员所属的部门ID /** * 创建时间 + * 对应数据库中的 "create_time" 字段 */ - @TableField("create_time") - private Date createTime; + @TableField("create_time") // MyBatis-Plus 注解,指定该字段对应数据库中的 "create_time" 字段 + private Date createTime; // 定义字段:管理员账号的创建时间 /** * 更新时间 + * 对应数据库中的 "update_time" 字段 */ - @TableField("update_time") - private Date updateTime; + @TableField("update_time") // MyBatis-Plus 注解,指定该字段对应数据库中的 "update_time" 字段 + private Date updateTime; // 定义字段:管理员账号的最后更新时间 /** * 状态 + * 表示管理员账号的状态,如启用或禁用 */ - private Integer state; - + private Integer state; // 定义字段:管理员账号的状态(如启用或禁用) } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUserRole.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUserRole.java index 1006e0f..ecea83c 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUserRole.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/entity/SysUserRole.java @@ -1,42 +1,45 @@ -package com.yf.exam.modules.sys.user.entity; +package com.yf.exam.modules.sys.user.entity; // 包名:表示该类属于 sys.user.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于指定主键生成策略 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于指定表字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于指定表主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于指定表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus 扩展的 Model 类,支持 ActiveRecord 模式 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 Getter、Setter、toString 等方法 /** -*

-* 用户角色实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Data -@TableName("sys_user_role") -public class SysUserRole extends Model { + *

+ * 用户角色实体类 + *

+ * 该类用于封装用户角色的关系数据,与数据库中的 `sys_user_role` 表对应 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Data // Lombok 注解,自动生成 Getter、Setter 和其他方法 +@TableName("sys_user_role") // MyBatis-Plus 注解,指定该实体类对应数据库表名为 "sys_user_role" +public class SysUserRole extends Model { // SysUserRole 类继承自 Model 类,支持 ActiveRecord 模式 + + private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化的一致性检查 - private static final long serialVersionUID = 1L; - /** - * ID - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; - + * ID + * 主键,使用 MyBatis-Plus 的自增策略 + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,指定主键字段及生成策略 + private String id; // 定义字段:用户角色关系的唯一标识符 + /** - * 用户ID - */ - @TableField("user_id") - private String userId; - + * 用户ID + * 对应数据库中的 "user_id" 字段 + */ + @TableField("user_id") // MyBatis-Plus 注解,指定该字段对应数据库中的 "user_id" 字段 + private String userId; // 定义字段:用户的唯一标识符,关联到特定的用户 + /** - * 角色ID - */ - @TableField("role_id") - private String roleId; - + * 角色ID + * 对应数据库中的 "role_id" 字段 + */ + @TableField("role_id") // MyBatis-Plus 注解,指定该字段对应数据库中的 "role_id" 字段 + private String roleId; // 定义字段:角色的唯一标识符,关联到特定的角色 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysRoleMapper.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysRoleMapper.java index 05763a3..71dad7e 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysRoleMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysRoleMapper.java @@ -1,15 +1,17 @@ -package com.yf.exam.modules.sys.user.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.sys.user.entity.SysRole; +package com.yf.exam.modules.sys.user.mapper; // 包名:表示该类属于 sys.user.mapper 包 + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,提供基本的数据库操作方法 +import com.yf.exam.modules.sys.user.entity.SysRole; // 导入 SysRole 实体类,表示角色实体 /** -*

-* 角色Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -public interface SysRoleMapper extends BaseMapper { + *

+ * 角色Mapper + *

+ * 该接口继承自 MyBatis-Plus 的 BaseMapper,用于提供对 `SysRole` 实体的数据库操作 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +public interface SysRoleMapper extends BaseMapper { // 继承 MyBatis-Plus 的 BaseMapper,自动提供对 SysRole 实体的 CRUD 操作 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserMapper.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserMapper.java index de7ae4f..4200719 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserMapper.java @@ -1,16 +1,17 @@ -package com.yf.exam.modules.sys.user.mapper; +package com.yf.exam.modules.sys.user.mapper; // 包名:表示该类属于 sys.user.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.sys.user.entity.SysUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,提供基本的数据库操作方法 +import com.yf.exam.modules.sys.user.entity.SysUser; // 导入 SysUser 实体类,表示管理员用户实体 /** -*

-* 管理用户Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -public interface SysUserMapper extends BaseMapper { + *

+ * 管理用户Mapper + *

+ * 该接口继承自 MyBatis-Plus 的 BaseMapper,用于提供对 `SysUser` 实体的数据库操作 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +public interface SysUserMapper extends BaseMapper { // 继承 MyBatis-Plus 的 BaseMapper,自动提供对 SysUser 实体的 CRUD 操作 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserRoleMapper.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserRoleMapper.java index 3055949..e8ec341 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserRoleMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/mapper/SysUserRoleMapper.java @@ -1,16 +1,17 @@ -package com.yf.exam.modules.sys.user.mapper; +package com.yf.exam.modules.sys.user.mapper; // 包名:表示该类属于 sys.user.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.sys.user.entity.SysUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,提供基本的数据库操作方法 +import com.yf.exam.modules.sys.user.entity.SysUserRole; // 导入 SysUserRole 实体类,表示用户角色实体 /** -*

-* 用户角色Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -public interface SysUserRoleMapper extends BaseMapper { + *

+ * 用户角色Mapper + *

+ * 该接口继承自 MyBatis-Plus 的 BaseMapper,用于提供对 `SysUserRole` 实体的数据库操作 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +public interface SysUserRoleMapper extends BaseMapper { // 继承 MyBatis-Plus 的 BaseMapper,自动提供对 SysUserRole 实体的 CRUD 操作 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysRoleService.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysRoleService.java index b0a87f9..f6b50d2 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysRoleService.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysRoleService.java @@ -1,25 +1,26 @@ -package com.yf.exam.modules.sys.user.service; +package com.yf.exam.modules.sys.user.service; // 包名:表示该类属于 sys.user.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.modules.sys.user.dto.SysRoleDTO; -import com.yf.exam.modules.sys.user.entity.SysRole; -import com.yf.exam.core.api.dto.PagingReqDTO; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 的 IService 接口,提供基本的服务方法 +import com.yf.exam.modules.sys.user.dto.SysRoleDTO; // 导入 SysRoleDTO 数据传输对象,用于封装角色数据 +import com.yf.exam.modules.sys.user.entity.SysRole; // 导入 SysRole 实体类,表示角色 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO,用于封装分页请求参数 /** -*

-* 角色业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -public interface SysRoleService extends IService { + *

+ * 角色业务类 + *

+ * 该接口定义了与角色相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +public interface SysRoleService extends IService { // 继承 MyBatis-Plus 的 IService 接口,提供基本的 CRUD 操作 /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); + * 分页查询数据 + * @param reqDTO 分页请求数据传输对象 + * @return 返回分页查询的结果 + */ + IPage paging(PagingReqDTO reqDTO); // 定义分页查询方法,返回角色的分页数据 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserRoleService.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserRoleService.java index 76fb6f2..2f637f7 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserRoleService.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserRoleService.java @@ -1,61 +1,64 @@ -package com.yf.exam.modules.sys.user.service; +package com.yf.exam.modules.sys.user.service; // 包名:表示该类属于 sys.user.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.modules.sys.user.dto.SysUserRoleDTO; -import com.yf.exam.modules.sys.user.entity.SysUserRole; -import com.yf.exam.core.api.dto.PagingReqDTO; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 的 IService 接口,提供基本的服务方法 +import com.yf.exam.modules.sys.user.dto.SysUserRoleDTO; // 导入 SysUserRoleDTO 数据传输对象,用于封装用户角色数据 +import com.yf.exam.modules.sys.user.entity.SysUserRole; // 导入 SysUserRole 实体类,表示用户角色 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO,用于封装分页请求参数 -import java.util.List; +import java.util.List; // 导入 List 接口,用于存储多个角色ID /** -*

-* 用户角色业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -public interface SysUserRoleService extends IService { + *

+ * 用户角色业务类 + *

+ * 该接口定义了与用户角色相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +public interface SysUserRoleService extends IService { // 继承 MyBatis-Plus 的 IService 接口,提供基本的 CRUD 操作 /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); + * 分页查询数据 + * @param reqDTO 分页请求数据传输对象 + * @return 返回分页查询的结果 + */ + IPage paging(PagingReqDTO reqDTO); // 定义分页查询用户角色数据的方法,返回角色的分页数据 /** * 查找用户角色列表 - * @param userId - * @return + * @param userId 用户ID + * @return 返回该用户的角色ID列表 */ - List listRoles(String userId); + List listRoles(String userId); // 根据用户ID查找该用户的角色ID列表 /** * 保存全部角色 - * @param userId - * @param ids - * @return + * @param userId 用户ID + * @param ids 角色ID列表 + * @return 返回角色ID的拼接字符串 */ - String saveRoles(String userId, List ids); + String saveRoles(String userId, List ids); // 保存指定用户的角色 /** * 是否学生 - * @param userId - * @return + * @param userId 用户ID + * @return 返回用户是否为学生,true表示是学生,false表示不是学生 */ - boolean isStudent(String userId); + boolean isStudent(String userId); // 判断指定用户是否为学生 /** * 是否老师 + * @param userId 用户ID + * @return 返回用户是否为老师,true表示是老师,false表示不是老师 */ - boolean isTeacher(String userId); + boolean isTeacher(String userId); // 判断指定用户是否为老师 /** - * 是否管理 - * @param userId - * @return + * 是否管理员 + * @param userId 用户ID + * @return 返回用户是否为管理员,true表示是管理员,false表示不是管理员 */ - boolean isAdmin(String userId); + boolean isAdmin(String userId); // 判断指定用户是否为管理员 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserService.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserService.java index 52a1818..f562771 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserService.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/SysUserService.java @@ -1,72 +1,75 @@ -package com.yf.exam.modules.sys.user.service; +package com.yf.exam.modules.sys.user.service; // 包名:表示该类属于 sys.user.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.modules.sys.user.dto.SysUserDTO; -import com.yf.exam.modules.sys.user.dto.request.SysUserSaveReqDTO; -import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; -import com.yf.exam.modules.sys.user.entity.SysUser; -import com.yf.exam.core.api.dto.PagingReqDTO; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 的 IService 接口,提供基本的服务方法 +import com.yf.exam.modules.sys.user.dto.SysUserDTO; // 导入 SysUserDTO 数据传输对象,用于封装用户数据 +import com.yf.exam.modules.sys.user.dto.request.SysUserSaveReqDTO; // 导入 SysUserSaveReqDTO 请求 DTO,用于保存用户信息 +import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; // 导入 SysUserLoginDTO 响应 DTO,用于返回登录信息 +import com.yf.exam.modules.sys.user.entity.SysUser; // 导入 SysUser 实体类,表示管理员用户 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO,用于封装分页请求参数 /** -*

-* 管理用户业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -public interface SysUserService extends IService { + *

+ * 管理用户业务类 + *

+ * 该接口定义了与管理用户相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +public interface SysUserService extends IService { // 继承 MyBatis-Plus 的 IService 接口,提供基本的 CRUD 操作 /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); + * 分页查询数据 + * @param reqDTO 分页请求数据传输对象 + * @return 返回分页查询的结果 + */ + IPage paging(PagingReqDTO reqDTO); // 定义分页查询用户数据的方法,返回用户的分页数据 /** * 登录 - * @param userName - * @param password - * @return + * @param userName 用户名 + * @param password 密码 + * @return 返回登录信息,包括 token 等数据 */ - SysUserLoginDTO login(String userName, String password); + SysUserLoginDTO login(String userName, String password); // 实现用户登录,验证用户名和密码 /** * 获取管理会话 - * @param token - * @return + * @param token 用户的 JWT token + * @return 返回用户的登录信息和角色信息 */ - SysUserLoginDTO token(String token); + SysUserLoginDTO token(String token); // 根据 token 获取用户的会话信息并验证 /** * 退出登录 - * @param token + * @param token 用户的 JWT token */ - void logout(String token); + void logout(String token); // 退出登录,销毁当前会话 /** * 修改用户资料 - * @param reqDTO + * @param reqDTO 用户资料数据传输对象 */ - void update(SysUserDTO reqDTO); + void update(SysUserDTO reqDTO); // 修改用户资料,包括密码等信息 /** * 保存添加系统用户 - * @param reqDTO + * @param reqDTO 保存用户信息的请求数据传输对象 */ - void save(SysUserSaveReqDTO reqDTO); + void save(SysUserSaveReqDTO reqDTO); // 保存或更新系统用户 /** * 用户注册 - * @param reqDTO + * @param reqDTO 注册用户的数据传输对象 + * @return 返回用户登录信息和 token */ - SysUserLoginDTO reg(SysUserDTO reqDTO); + SysUserLoginDTO reg(SysUserDTO reqDTO); // 用户注册,保存用户信息并返回登录数据 /** * 快速注册 - * @param reqDTO + * @param reqDTO 快速注册用户的数据传输对象 + * @return 返回用户登录信息和 token */ - SysUserLoginDTO quickReg(SysUserDTO reqDTO); + SysUserLoginDTO quickReg(SysUserDTO reqDTO); // 快速注册,如果用户已存在则直接登录,否则进行注册 } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysRoleServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysRoleServiceImpl.java index 8593f55..f2cd262 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysRoleServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysRoleServiceImpl.java @@ -1,42 +1,46 @@ -package com.yf.exam.modules.sys.user.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.modules.sys.user.dto.SysRoleDTO; -import com.yf.exam.modules.sys.user.entity.SysRole; -import com.yf.exam.modules.sys.user.mapper.SysRoleMapper; -import com.yf.exam.modules.sys.user.service.SysRoleService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import org.springframework.stereotype.Service; +package com.yf.exam.modules.sys.user.service.impl; // 包名:表示该类属于 sys.user.service.impl 包 + +import com.alibaba.fastjson.JSON; // 导入 Fastjson 库,用于 JSON 处理 +import com.alibaba.fastjson.TypeReference; // 导入 Fastjson 的 TypeReference,用于泛型类型的转换 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 分页类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl,实现基本的服务层操作 +import com.yf.exam.modules.sys.user.dto.SysRoleDTO; // 导入 SysRoleDTO 数据传输对象,用于封装角色数据 +import com.yf.exam.modules.sys.user.entity.SysRole; // 导入 SysRole 实体类,表示角色 +import com.yf.exam.modules.sys.user.mapper.SysRoleMapper; // 导入 SysRoleMapper,用于数据库操作 +import com.yf.exam.modules.sys.user.service.SysRoleService; // 导入 SysRoleService 服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO +import org.springframework.stereotype.Service; // 导入 Spring 的 Service 注解,标识该类为服务层组件 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Service -public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + *

+ * 语言设置 服务实现类 + *

+ * 该类实现了 SysRoleService 接口,提供了角色相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Service // 标识该类为服务层组件 +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { // 继承 MyBatis-Plus 的 ServiceImpl,自动提供基础的 CRUD 操作 @Override - public IPage paging(PagingReqDTO reqDTO) { + public IPage paging(PagingReqDTO reqDTO) { // 重写分页查询方法 - //创建分页对象 + // 创建分页对象,设置当前页和每页显示的条数 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 创建查询条件对象(此处没有具体条件,查询所有数据) QueryWrapper wrapper = new QueryWrapper<>(); - //获得数据 + // 查询数据,获取分页结果 IPage page = this.page(query, wrapper); - //转换结果 - IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); + + // 将查询结果转换为 SysRoleDTO 类型的分页结果 + IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>() {}); + + // 返回分页数据 return pageData; - } + } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserRoleServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserRoleServiceImpl.java index 794457b..6d3d34a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserRoleServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserRoleServiceImpl.java @@ -1,128 +1,144 @@ -package com.yf.exam.modules.sys.user.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.modules.sys.user.dto.SysUserRoleDTO; -import com.yf.exam.modules.sys.user.entity.SysUserRole; -import com.yf.exam.modules.sys.user.mapper.SysUserRoleMapper; -import com.yf.exam.modules.sys.user.service.SysUserRoleService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -import java.util.ArrayList; -import java.util.List; +package com.yf.exam.modules.sys.user.service.impl; // 包名:表示该类属于 sys.user.service.impl 包 + +import com.alibaba.fastjson.JSON; // 导入 Fastjson 库,用于 JSON 处理 +import com.alibaba.fastjson.TypeReference; // 导入 Fastjson 的 TypeReference,用于泛型类型的转换 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 分页类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 类,提供基础的数据库操作 +import com.yf.exam.modules.sys.user.dto.SysUserRoleDTO; // 导入 SysUserRoleDTO 数据传输对象,用于封装用户角色数据 +import com.yf.exam.modules.sys.user.entity.SysUserRole; // 导入 SysUserRole 实体类,表示用户角色 +import com.yf.exam.modules.sys.user.mapper.SysUserRoleMapper; // 导入 SysUserRoleMapper,用于数据库操作 +import com.yf.exam.modules.sys.user.service.SysUserRoleService; // 导入 SysUserRoleService 服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO +import org.springframework.stereotype.Service; // 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.util.CollectionUtils; // 导入 Spring 的 CollectionUtils 工具类,用于判断集合是否为空 +import org.springframework.util.StringUtils; // 导入 Spring 的 StringUtils 工具类,用于判断字符串是否为空 + +import java.util.ArrayList; // 导入 ArrayList 类,用于创建列表 +import java.util.List; // 导入 List 接口,用于存储角色列表 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Service -public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { + *

+ * 用户角色服务实现类 + *

+ * 该类实现了 SysUserRoleService 接口,提供了用户角色相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Service // 标识该类为服务层组件 +public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { // 继承 MyBatis-Plus 的 ServiceImpl,自动提供基础的 CRUD 操作 @Override - public IPage paging(PagingReqDTO reqDTO) { + public IPage paging(PagingReqDTO reqDTO) { // 实现分页查询方法 - //创建分页对象 + // 创建分页对象,设置当前页和每页显示的条数 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 创建查询条件对象 QueryWrapper wrapper = new QueryWrapper<>(); - //获得数据 + // 查询数据,获取分页结果 IPage page = this.page(query, wrapper); - //转换结果 - IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); + + // 将查询结果转换为 SysUserRoleDTO 类型的分页结果 + IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>() {}); + + // 返回分页数据 return pageData; - } + } @Override - public List listRoles(String userId) { + public List listRoles(String userId) { // 根据用户ID获取该用户的角色列表 + // 创建查询条件对象,筛选出指定用户的角色 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId); + // 查询角色列表 List list = this.list(wrapper); List roles = new ArrayList<>(); - if(!CollectionUtils.isEmpty(list)){ - for(SysUserRole item: list){ + + // 如果查询结果不为空,将角色ID添加到列表中 + if (!CollectionUtils.isEmpty(list)) { + for (SysUserRole item : list) { roles.add(item.getRoleId()); } } + // 返回角色ID列表 return roles; } @Override - public String saveRoles(String userId, List ids) { + public String saveRoles(String userId, List ids) { // 保存用户角色方法 - // 删除全部角色 + // 删除该用户所有角色 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId); this.remove(wrapper); - - if(!CollectionUtils.isEmpty(ids)){ + // 如果角色列表不为空,保存新的角色 + if (!CollectionUtils.isEmpty(ids)) { List list = new ArrayList<>(); String roleIds = null; - for(String item: ids){ + // 将角色ID列表转为 SysUserRole 实体对象列表 + for (String item : ids) { SysUserRole role = new SysUserRole(); role.setRoleId(item); role.setUserId(userId); list.add(role); - if(StringUtils.isEmpty(roleIds)){ + if (StringUtils.isEmpty(roleIds)) { roleIds = item; - }else{ - roleIds+=","+item; + } else { + roleIds += "," + item; // 将角色ID拼接成字符串 } } + // 批量保存角色数据 this.saveBatch(list); - return roleIds; + return roleIds; // 返回拼接后的角色ID字符串 } - return ""; + return ""; // 如果角色列表为空,返回空字符串 } @Override - public boolean isStudent(String userId) { + public boolean isStudent(String userId) { // 检查用户是否为学生 - // 学生角色 + // 查询用户是否拥有学生角色 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId) .eq(SysUserRole::getRoleId, "student"); + // 如果查询结果数量大于0,则表示该用户是学生 return this.count(wrapper) > 0; } @Override - public boolean isTeacher(String userId) { - // 学生角色 + public boolean isTeacher(String userId) { // 检查用户是否为教师 + + // 查询用户是否拥有教师角色 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId) .eq(SysUserRole::getRoleId, "teacher"); + // 如果查询结果数量大于0,则表示该用户是教师 return this.count(wrapper) > 0; } @Override - public boolean isAdmin(String userId) { - // 学生角色 + public boolean isAdmin(String userId) { // 检查用户是否为管理员 + + // 查询用户是否拥有管理员角色(角色ID为 "sa") QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId) .eq(SysUserRole::getRoleId, "sa"); + // 如果查询结果数量大于0,则表示该用户是管理员 return this.count(wrapper) > 0; } } diff --git a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserServiceImpl.java index 4370e56..0fdba23 100644 --- a/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/sys/user/service/impl/SysUserServiceImpl.java @@ -1,176 +1,185 @@ -package com.yf.exam.modules.sys.user.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.ApiError; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.core.enums.CommonState; -import com.yf.exam.core.exception.ServiceException; -import com.yf.exam.core.utils.BeanMapper; -import com.yf.exam.core.utils.passwd.PassHandler; -import com.yf.exam.core.utils.passwd.PassInfo; -import com.yf.exam.ability.shiro.jwt.JwtUtils; -import com.yf.exam.modules.sys.user.dto.SysUserDTO; -import com.yf.exam.modules.sys.user.dto.request.SysUserSaveReqDTO; -import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; -import com.yf.exam.modules.sys.user.entity.SysUser; -import com.yf.exam.modules.sys.user.mapper.SysUserMapper; -import com.yf.exam.modules.sys.user.service.SysUserRoleService; -import com.yf.exam.modules.sys.user.service.SysUserService; -import com.yf.exam.modules.user.UserUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.SecurityUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.List; +package com.yf.exam.modules.sys.user.service.impl; // 包名:表示该类属于 sys.user.service.impl 包 + +import com.alibaba.fastjson.JSON; // 导入 Fastjson 库,用于 JSON 处理 +import com.alibaba.fastjson.TypeReference; // 导入 Fastjson 的 TypeReference,用于泛型类型的转换 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.baomidou.mybatisplus.core.toolkit.IdWorker; // 导入 MyBatis-Plus 的 IdWorker,用于生成唯一ID +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 分页类 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 类,提供基础的数据库操作 +import com.yf.exam.core.api.ApiError; // 导入 ApiError 用于错误码定义 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO +import com.yf.exam.core.enums.CommonState; // 导入公共状态枚举,定义正常与异常状态 +import com.yf.exam.core.exception.ServiceException; // 导入 ServiceException,用于抛出自定义异常 +import com.yf.exam.core.utils.BeanMapper; // 导入 BeanMapper 工具类,用于对象之间的属性拷贝 +import com.yf.exam.core.utils.passwd.PassHandler; // 导入 PassHandler 用于密码处理 +import com.yf.exam.core.utils.passwd.PassInfo; // 导入 PassInfo 用于存储密码和盐 +import com.yf.exam.ability.shiro.jwt.JwtUtils; // 导入 JwtUtils 用于生成和验证 JWT +import com.yf.exam.modules.sys.user.dto.SysUserDTO; // 导入 SysUserDTO 数据传输对象,用于封装用户数据 +import com.yf.exam.modules.sys.user.dto.request.SysUserSaveReqDTO; // 导入 SysUserSaveReqDTO 请求 DTO,用于保存用户信息 +import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; // 导入 SysUserLoginDTO 响应 DTO,用于返回登录信息 +import com.yf.exam.modules.sys.user.entity.SysUser; // 导入 SysUser 实体类,表示管理员用户 +import com.yf.exam.modules.sys.user.mapper.SysUserMapper; // 导入 SysUserMapper,用于数据库操作 +import com.yf.exam.modules.sys.user.service.SysUserRoleService; // 导入 SysUserRoleService 服务接口,用于角色操作 +import com.yf.exam.modules.sys.user.service.SysUserService; // 导入 SysUserService 服务接口,用于用户操作 +import com.yf.exam.modules.user.UserUtils; // 导入 UserUtils 工具类,用于获取当前用户信息 +import org.apache.commons.lang3.StringUtils; // 导入 StringUtils 工具类,用于判断字符串是否为空 +import org.apache.shiro.SecurityUtils; // 导入 Shiro 的 SecurityUtils,用于获取和处理用户会话 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 注解,用于自动注入依赖 +import org.springframework.stereotype.Service; // 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.transaction.annotation.Transactional; // 导入 Spring 的事务注解,支持事务管理 +import org.springframework.util.CollectionUtils; // 导入 Spring 的 CollectionUtils 工具类,用于判断集合是否为空 + +import java.util.ArrayList; // 导入 ArrayList 类,用于创建列表 +import java.util.List; // 导入 List 接口,用于存储角色列表 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-04-13 16:57 -*/ -@Service -public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + *

+ * 用户服务实现类 + *

+ * 该类实现了 SysUserService 接口,提供了与用户相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-04-13 16:57 + */ +@Service // 标识该类为服务层组件 +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { // 继承 MyBatis-Plus 的 ServiceImpl,自动提供基础的 CRUD 操作 @Autowired - private SysUserRoleService sysUserRoleService; - + private SysUserRoleService sysUserRoleService; // 注入 SysUserRoleService,用于用户角色管理 @Override - public IPage paging(PagingReqDTO reqDTO) { + public IPage paging(PagingReqDTO reqDTO) { // 实现分页查询方法 - //创建分页对象 + // 创建分页对象,设置当前页和每页显示的条数 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 创建查询条件对象 QueryWrapper wrapper = new QueryWrapper<>(); SysUserDTO params = reqDTO.getParams(); - if(params!=null){ - if(!StringUtils.isBlank(params.getUserName())){ + // 根据传入的参数设置查询条件 + if (params != null) { + if (!StringUtils.isBlank(params.getUserName())) { wrapper.lambda().like(SysUser::getUserName, params.getUserName()); } - if(!StringUtils.isBlank(params.getRealName())){ + if (!StringUtils.isBlank(params.getRealName())) { wrapper.lambda().like(SysUser::getRealName, params.getRealName()); } } - //获得数据 + // 查询数据,获取分页结果 IPage page = this.page(query, wrapper); - //转换结果 - IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); + + // 将查询结果转换为 SysUserDTO 类型的分页结果 + IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>() {}); + + // 返回分页数据 return pageData; - } + } @Override - public SysUserLoginDTO login(String userName, String password) { + public SysUserLoginDTO login(String userName, String password) { // 用户登录方法 + // 查询用户是否存在 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUser::getUserName, userName); SysUser user = this.getOne(wrapper, false); - if(user == null){ - throw new ServiceException(ApiError.ERROR_90010002); + if (user == null) { + throw new ServiceException(ApiError.ERROR_90010002); // 用户不存在,抛出异常 } - // 被禁用 - if(user.getState().equals(CommonState.ABNORMAL)){ - throw new ServiceException(ApiError.ERROR_90010005); + // 检查用户是否被禁用 + if (user.getState().equals(CommonState.ABNORMAL)) { + throw new ServiceException(ApiError.ERROR_90010005); // 用户被禁用,抛出异常 } - boolean check = PassHandler.checkPass(password,user.getSalt(), user.getPassword()); - if(!check){ - throw new ServiceException(ApiError.ERROR_90010002); + // 校验密码 + boolean check = PassHandler.checkPass(password, user.getSalt(), user.getPassword()); + if (!check) { + throw new ServiceException(ApiError.ERROR_90010002); // 密码不正确,抛出异常 } + // 设置 JWT token 并返回登录信息 return this.setToken(user); } @Override - public SysUserLoginDTO token(String token) { + public SysUserLoginDTO token(String token) { // 根据 token 获取用户会话信息 - // 获得会话 + // 获取 token 中的用户名 String username = JwtUtils.getUsername(token); - // 校验结果 + // 校验 token 是否有效 boolean check = JwtUtils.verify(token, username); - if(!check){ - throw new ServiceException(ApiError.ERROR_90010002); + if (!check) { + throw new ServiceException(ApiError.ERROR_90010002); // token 无效,抛出异常 } + // 查询用户信息 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUser::getUserName, username); SysUser user = this.getOne(wrapper, false); - if(user == null){ - throw new ServiceException(ApiError.ERROR_10010002); + if (user == null) { + throw new ServiceException(ApiError.ERROR_10010002); // 用户不存在,抛出异常 } - // 被禁用 - if(user.getState().equals(CommonState.ABNORMAL)){ - throw new ServiceException(ApiError.ERROR_90010005); + // 检查用户是否被禁用 + if (user.getState().equals(CommonState.ABNORMAL)) { + throw new ServiceException(ApiError.ERROR_90010005); // 用户被禁用,抛出异常 } + // 设置 JWT token 并返回登录信息 return this.setToken(user); } @Override - public void logout(String token) { + public void logout(String token) { // 用户登出方法 - // 仅退出当前会话 + // 退出当前会话 SecurityUtils.getSubject().logout(); } @Override - public void update(SysUserDTO reqDTO) { - - - String pass = reqDTO.getPassword(); - if(!StringUtils.isBlank(pass)){ - PassInfo passInfo = PassHandler.buildPassword(pass); - SysUser user = this.getById(UserUtils.getUserId()); - user.setPassword(passInfo.getPassword()); - user.setSalt(passInfo.getSalt()); - this.updateById(user); - } + public void update(SysUserDTO reqDTO) { // 更新用户信息 + + String pass = reqDTO.getPassword(); + if (!StringUtils.isBlank(pass)) { + // 如果提供了新密码,则更新密码 + PassInfo passInfo = PassHandler.buildPassword(pass); + SysUser user = this.getById(UserUtils.getUserId()); + user.setPassword(passInfo.getPassword()); + user.setSalt(passInfo.getSalt()); + this.updateById(user); // 更新用户数据 + } } - @Transactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) // 启用事务管理,保证数据一致性 @Override - public void save(SysUserSaveReqDTO reqDTO) { + public void save(SysUserSaveReqDTO reqDTO) { // 保存或修改用户信息 List roles = reqDTO.getRoles(); - if(CollectionUtils.isEmpty(roles)){ - throw new ServiceException(ApiError.ERROR_90010003); + if (CollectionUtils.isEmpty(roles)) { + throw new ServiceException(ApiError.ERROR_90010003); // 角色列表不能为空,抛出异常 } // 保存基本信息 SysUser user = new SysUser(); BeanMapper.copy(reqDTO, user); - // 添加模式 - if(StringUtils.isBlank(user.getId())){ + // 添加模式,生成新的 ID + if (StringUtils.isBlank(user.getId())) { user.setId(IdWorker.getIdStr()); } - // 修改密码 - if(!StringUtils.isBlank(reqDTO.getPassword())){ + // 如果提供了密码,则加密并保存 + if (!StringUtils.isBlank(reqDTO.getPassword())) { PassInfo pass = PassHandler.buildPassword(reqDTO.getPassword()); user.setPassword(pass.getPassword()); user.setSalt(pass.getSalt()); @@ -179,23 +188,23 @@ public class SysUserServiceImpl extends ServiceImpl impl // 保存角色信息 String roleIds = sysUserRoleService.saveRoles(user.getId(), roles); user.setRoleIds(roleIds); - this.saveOrUpdate(user); + + this.saveOrUpdate(user); // 保存或更新用户信息 } - @Transactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) // 启用事务管理 @Override - public SysUserLoginDTO reg(SysUserDTO reqDTO) { + public SysUserLoginDTO reg(SysUserDTO reqDTO) { // 用户注册方法 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUser::getUserName, reqDTO.getUserName()); int count = this.count(wrapper); - if(count > 0){ - throw new ServiceException(1, "用户名已存在,换一个吧!"); + if (count > 0) { + throw new ServiceException(1, "用户名已存在,换一个吧!"); // 用户名已存在,抛出异常 } - // 保存用户 SysUser user = new SysUser(); user.setId(IdWorker.getIdStr()); @@ -212,21 +221,22 @@ public class SysUserServiceImpl extends ServiceImpl impl user.setRoleIds(roleIds); this.save(user); + // 返回生成的 token return this.setToken(user); } @Override - public SysUserLoginDTO quickReg(SysUserDTO reqDTO) { + public SysUserLoginDTO quickReg(SysUserDTO reqDTO) { // 快速注册方法 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUser::getUserName, reqDTO.getUserName()); wrapper.last(" LIMIT 1 "); SysUser user = this.getOne(wrapper); - if(user!=null){ - return this.setToken(user); + if (user != null) { + return this.setToken(user); // 如果用户已存在,直接返回登录信息 } - return this.reg(reqDTO); + return this.reg(reqDTO); // 如果用户不存在,进行注册 } @@ -235,16 +245,16 @@ public class SysUserServiceImpl extends ServiceImpl impl * @param user * @return */ - private SysUserLoginDTO setToken(SysUser user){ + private SysUserLoginDTO setToken(SysUser user) { // 生成并设置用户的 JWT token SysUserLoginDTO respDTO = new SysUserLoginDTO(); BeanMapper.copy(user, respDTO); - // 生成Token + // 生成 JWT token String token = JwtUtils.sign(user.getUserName()); respDTO.setToken(token); - // 填充角色 + // 填充角色信息 List roles = sysUserRoleService.listRoles(user.getId()); respDTO.setRoles(roles); diff --git a/src-源文件/main/java/com/yf/exam/modules/user/UserUtils.java b/src-源文件/main/java/com/yf/exam/modules/user/UserUtils.java index 4477ecb..cb8d96d 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/UserUtils.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/UserUtils.java @@ -1,56 +1,56 @@ -package com.yf.exam.modules.user; +package com.yf.exam.modules.user; // 包名:表示该类属于 user 包 -import com.yf.exam.core.api.ApiError; -import com.yf.exam.core.exception.ServiceException; -import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; -import org.apache.shiro.SecurityUtils; +import com.yf.exam.core.api.ApiError; // 导入 ApiError 类,定义 API 错误码 +import com.yf.exam.core.exception.ServiceException; // 导入 ServiceException 类,定义自定义服务异常 +import com.yf.exam.modules.sys.user.dto.response.SysUserLoginDTO; // 导入用户登录响应 DTO 类 +import org.apache.shiro.SecurityUtils; // 导入 Shiro 的 SecurityUtils 类,用于获取当前登录用户的信息 /** * 用户静态工具类 - * @author bool + * 提供当前登录用户的相关工具方法 + * @作者 bool */ public class UserUtils { - /** * 获取当前登录用户的ID - * @param throwable - * @return + * @param throwable 如果发生异常,是否抛出异常 + * @return 当前登录用户的ID */ - public static String getUserId(boolean throwable){ + public static String getUserId(boolean throwable) { // 获取当前登录用户 ID 的方法 try { + // 使用 Shiro 获取当前用户的主体对象,然后从中提取用户 ID return ((SysUserLoginDTO) SecurityUtils.getSubject().getPrincipal()).getId(); - }catch (Exception e){ - if(throwable){ - throw new ServiceException(ApiError.ERROR_10010002); + } catch (Exception e) { // 捕获异常 + if (throwable) { // 如果 throwable 为 true,则抛出自定义服务异常 + throw new ServiceException(ApiError.ERROR_10010002); // 异常码:10010002 } - return null; + return null; // 如果发生异常且 throwable 为 false,则返回 null } } /** * 获取当前登录用户的ID - * @param throwable - * @return + * @param throwable 如果发生异常,是否抛出异常 + * @return 当前登录用户的ID */ - public static boolean isAdmin(boolean throwable){ + public static boolean isAdmin(boolean throwable) { // 判断当前用户是否为管理员的方法 try { - SysUserLoginDTO dto = ((SysUserLoginDTO) SecurityUtils.getSubject().getPrincipal()); - return dto.getRoles().contains("sa"); - }catch (Exception e){ - if(throwable){ - throw new ServiceException(ApiError.ERROR_10010002); + SysUserLoginDTO dto = ((SysUserLoginDTO) SecurityUtils.getSubject().getPrincipal()); // 获取当前用户的登录信息 + return dto.getRoles().contains("sa"); // 判断用户角色中是否包含管理员角色 "sa" + } catch (Exception e) { // 捕获异常 + if (throwable) { // 如果 throwable 为 true,则抛出自定义服务异常 + throw new ServiceException(ApiError.ERROR_10010002); // 异常码:10010002 } } - - return false; + return false; // 如果发生异常且 throwable 为 false,则返回 false } /** * 获取当前登录用户的ID,默认是会抛异常的 - * @return + * @return 当前登录用户的ID */ - public static String getUserId(){ - return getUserId(true); + public static String getUserId() { // 默认抛出异常的获取用户 ID 方法 + return getUserId(true); // 调用带有 throwable 参数的方法,默认抛出异常 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/book/controller/UserBookController.java b/src-源文件/main/java/com/yf/exam/modules/user/book/controller/UserBookController.java index 9300493..6ece464 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/book/controller/UserBookController.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/book/controller/UserBookController.java @@ -1,76 +1,79 @@ -package com.yf.exam.modules.user.book.controller; +package com.yf.exam.modules.user.book.controller; // 包名:表示该类属于 user.book.controller 包 -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.BaseIdRespDTO; -import com.yf.exam.core.api.dto.BaseIdsReqDTO; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.user.book.dto.UserBookDTO; -import com.yf.exam.modules.user.book.service.UserBookService; -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 com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 分页接口 +import com.yf.exam.core.api.ApiRest; // 导入 ApiRest 类,定义接口返回的统一格式 +import com.yf.exam.core.api.controller.BaseController; // 导入 BaseController 基础控制器类,提供一些基础功能 +import com.yf.exam.core.api.dto.BaseIdRespDTO; // 导入 BaseIdRespDTO 数据传输对象,用于返回 ID 响应 +import com.yf.exam.core.api.dto.BaseIdsReqDTO; // 导入 BaseIdsReqDTO 数据传输对象,用于接收 ID 列表请求 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入 PagingReqDTO 数据传输对象,用于分页请求 +import com.yf.exam.modules.user.book.dto.UserBookDTO; // 导入 UserBookDTO 数据传输对象,用于封装错题本数据 +import com.yf.exam.modules.user.book.service.UserBookService; // 导入 UserBookService 服务接口,用于处理业务逻辑 +import io.swagger.annotations.Api; // 导入 Swagger 的 Api 注解,用于生成 API 文档 +import io.swagger.annotations.ApiOperation; // 导入 Swagger 的 ApiOperation 注解,用于描述 API 操作 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 注解,用于自动注入依赖 +import org.springframework.web.bind.annotation.RequestBody; // 导入 RequestBody 注解,用于接收请求体数据 +import org.springframework.web.bind.annotation.RequestMapping; // 导入 RequestMapping 注解,用于映射请求路径 +import org.springframework.web.bind.annotation.RequestMethod; // 导入 RequestMethod 枚举,表示请求方法类型 +import org.springframework.web.bind.annotation.RestController; // 导入 RestController 注解,表示这是一个控制器类 /** -*

-* 错题本控制器 -*

-* -* @author 聪明笨狗 -* @since 2020-05-27 17:56 -*/ -@Api(tags={"错题本"}) -@RestController -@RequestMapping("/exam/api/user/wrong-book") -public class UserBookController extends BaseController { + *

+ * 错题本控制器 + *

+ * 该控制器处理与错题本相关的 API 请求 + * + * @作者 聪明笨狗 + * @版本 2020-05-27 17:56 + */ +@Api(tags={"错题本"}) // 为这个控制器定义一个标签,用于生成 API 文档 +@RestController // 标识该类为 Spring 的控制器类,自动注入到 Spring 上下文 +@RequestMapping("/exam/api/user/wrong-book") // 设置该类的请求路径前缀 +public class UserBookController extends BaseController { // 继承自 BaseController,享受基础功能 @Autowired - private UserBookService baseService; + private UserBookService baseService; // 注入 UserBookService,用于处理错题本的相关逻辑 /** - * 批量删除 - * @param reqDTO - * @return - */ - @ApiOperation(value = "批量删除") - @RequestMapping(value = "/delete", method = { RequestMethod.POST}) - public ApiRest delete(@RequestBody BaseIdsReqDTO reqDTO) { - //根据ID删除 + * 批量删除 + * @param reqDTO 请求数据传输对象,包含多个 ID + * @return 返回成功的响应 + */ + @ApiOperation(value = "批量删除") // 为该方法生成 Swagger 的文档描述 + @RequestMapping(value = "/delete", method = { RequestMethod.POST }) // 映射 POST 请求路径 "/delete" + public ApiRest delete(@RequestBody BaseIdsReqDTO reqDTO) { // 接收请求体中的 ID 列表 + + // 根据 ID 删除错题本数据 baseService.removeByIds(reqDTO.getIds()); - return super.success(); + return super.success(); // 返回成功的响应 } /** - * 分页查找 - * @param reqDTO - * @return - */ - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) - public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { + * 分页查找 + * @param reqDTO 请求数据传输对象,包含分页参数和查询条件 + * @return 返回分页查询的结果 + */ + @ApiOperation(value = "分页查找") // 为该方法生成 Swagger 的文档描述 + @RequestMapping(value = "/paging", method = { RequestMethod.POST }) // 映射 POST 请求路径 "/paging" + public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { // 接收分页请求数据 - //分页查询并转换 + // 调用服务层的分页查询方法 IPage page = baseService.paging(reqDTO); - return super.success(page); + return super.success(page); // 返回分页查询的结果 } /** * 查找列表,每次最多返回200条数据 - * @param reqDTO - * @return + * @param reqDTO 请求数据传输对象,包含考试 ID 和题目 ID + * @return 返回下一题的 ID */ - @ApiOperation(value = "查找列表") - @RequestMapping(value = "/next", method = { RequestMethod.POST}) - public ApiRest nextQu(@RequestBody UserBookDTO reqDTO) { - //转换并返回 + @ApiOperation(value = "查找列表") // 为该方法生成 Swagger 的文档描述 + @RequestMapping(value = "/next", method = { RequestMethod.POST }) // 映射 POST 请求路径 "/next" + public ApiRest nextQu(@RequestBody UserBookDTO reqDTO) { // 接收包含考试 ID 和题目 ID 的请求数据 + + // 调用服务层的 findNext 方法查找下一题 String quId = baseService.findNext(reqDTO.getExamId(), reqDTO.getQuId()); - return super.success(new BaseIdRespDTO(quId)); + return super.success(new BaseIdRespDTO(quId)); // 返回下一题的 ID } } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/book/dto/UserBookDTO.java b/src-源文件/main/java/com/yf/exam/modules/user/book/dto/UserBookDTO.java index 582b415..0a6668a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/book/dto/UserBookDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/book/dto/UserBookDTO.java @@ -1,52 +1,51 @@ -package com.yf.exam.modules.user.book.dto; +package com.yf.exam.modules.user.book.dto; // 包名:表示该类属于 user.book.dto 包 -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import io.swagger.annotations.ApiModel; // 导入 Swagger 的 ApiModel 注解,用于生成 API 文档中的模型描述 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 的 ApiModelProperty 注解,用于描述模型的属性 +import lombok.Data; // 导入 Lombok 的 Data 注解,自动生成 getters、setters、toString 等方法 -import java.io.Serializable; -import java.util.Date; +import java.io.Serializable; // 导入 Serializable 接口,用于对象序列化 +import java.util.Date; // 导入 Date 类,用于处理日期数据 /** -*

-* 错题本请求类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-27 17:56 -*/ -@Data -@ApiModel(value="错题本", description="错题本") -public class UserBookDTO implements Serializable { + *

+ * 错题本请求类 + *

+ * 用于封装错题本相关的数据请求 + * + * @作者 聪明笨狗 + * @版本 2020-05-27 17:56 + */ +@Data // Lombok 注解,自动生成常用的 getter、setter、toString、equals 和 hashCode 方法 +@ApiModel(value="错题本", description="错题本") // Swagger 注解,定义该类用于描述错题本 +public class UserBookDTO implements Serializable { // 实现 Serializable 接口,支持对象序列化 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 定义序列化版本 UID + @ApiModelProperty(value = "ID", required=true) // Swagger 注解,描述属性的含义和是否必填 + private String id; // 错题本 ID - @ApiModelProperty(value = "ID", required=true) - private String id; + @ApiModelProperty(value = "考试ID", required=true) // Swagger 注解,描述考试 ID + private String examId; // 关联的考试 ID - @ApiModelProperty(value = "考试ID", required=true) - private String examId; + @ApiModelProperty(value = "用户ID", required=true) // Swagger 注解,描述用户 ID + private String userId; // 关联的用户 ID - @ApiModelProperty(value = "用户ID", required=true) - private String userId; + @ApiModelProperty(value = "题目ID", required=true) // Swagger 注解,描述题目 ID + private String quId; // 关联的题目 ID - @ApiModelProperty(value = "题目ID", required=true) - private String quId; + @ApiModelProperty(value = "加入时间", required=true) // Swagger 注解,描述错题本的加入时间 + private Date createTime; // 错题本加入时间 - @ApiModelProperty(value = "加入时间", required=true) - private Date createTime; + @ApiModelProperty(value = "最近错误时间", required=true) // Swagger 注解,描述最近一次错误的时间 + private Date updateTime; // 最近一次错题的时间 - @ApiModelProperty(value = "最近错误时间", required=true) - private Date updateTime; + @ApiModelProperty(value = "错误次数", required=true) // Swagger 注解,描述错题的错误次数 + private Integer wrongCount; // 错题的错误次数 - @ApiModelProperty(value = "错误时间", required=true) - private Integer wrongCount; + @ApiModelProperty(value = "题目标题", required=true) // Swagger 注解,描述题目标题 + private String title; // 题目的标题 - @ApiModelProperty(value = "题目标题", required=true) - private String title; - - @ApiModelProperty(value = "错题序号", required=true) - private Integer sort; - -} \ No newline at end of file + @ApiModelProperty(value = "错题序号", required=true) // Swagger 注解,描述错题的序号 + private Integer sort; // 错题的序号,用于排序 +} diff --git a/src-源文件/main/java/com/yf/exam/modules/user/book/entity/UserBook.java b/src-源文件/main/java/com/yf/exam/modules/user/book/entity/UserBook.java index f163425..d339083 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/book/entity/UserBook.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/book/entity/UserBook.java @@ -1,78 +1,78 @@ -package com.yf.exam.modules.user.book.entity; +package com.yf.exam.modules.user.book.entity; // 包名:表示该类属于 user.book.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 的 IdType,用于设置 ID 类型 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 TableField 注解,用于标识表字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 TableId 注解,用于标识表的主键 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 TableName 注解,用于标识表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 Model 类,用于支持 Active Record 模式 +import lombok.Data; // 导入 Lombok 的 Data 注解,自动生成 getter、setter、toString 等方法 -import java.util.Date; +import java.util.Date; // 导入 Date 类,用于处理日期类型数据 /** -*

-* 错题本实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-27 17:56 -*/ -@Data -@TableName("el_user_book") -public class UserBook extends Model { + *

+ * 错题本实体类 + *

+ * 该类表示错题本数据表中的记录 + * + * @作者 聪明笨狗 + * @版本 2020-05-27 17:56 + */ +@Data // Lombok 注解,自动为类生成 getter、setter、toString、equals 和 hashCode 方法 +@TableName("el_user_book") // 表示该类对应数据库中的 el_user_book 表 +public class UserBook extends Model { // 继承自 MyBatis-Plus 的 Model 类,支持 Active Record 模式 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本 UID /** * ID */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "id", type = IdType.ASSIGN_ID) // 设置表的主键 ID 类型为 ASSIGN_ID,表示数据库自增长 + private String id; // 错题本记录的 ID /** * 考试ID */ - @TableField("exam_id") - private String examId; + @TableField("exam_id") // 映射数据库表的 exam_id 字段 + private String examId; // 关联的考试 ID /** * 用户ID */ - @TableField("user_id") - private String userId; + @TableField("user_id") // 映射数据库表的 user_id 字段 + private String userId; // 关联的用户 ID /** * 题目ID */ - @TableField("qu_id") - private String quId; + @TableField("qu_id") // 映射数据库表的 qu_id 字段 + private String quId; // 关联的题目 ID /** * 加入时间 */ - @TableField("create_time") - private Date createTime; + @TableField("create_time") // 映射数据库表的 create_time 字段 + private Date createTime; // 错题加入时间 /** * 最近错误时间 */ - @TableField("update_time") - private Date updateTime; + @TableField("update_time") // 映射数据库表的 update_time 字段 + private Date updateTime; // 最近一次错误的时间 /** * 错误时间 */ - @TableField("wrong_count") - private Integer wrongCount; + @TableField("wrong_count") // 映射数据库表的 wrong_count 字段 + private Integer wrongCount; // 错误的次数 /** * 题目标题 */ - private String title; + private String title; // 题目的标题 /** * 错题序号 */ - private Integer sort; - + private Integer sort; // 错题的序号,用于排序 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/book/mapper/UserBookMapper.java b/src-源文件/main/java/com/yf/exam/modules/user/book/mapper/UserBookMapper.java index 67c3cca..ad403de 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/book/mapper/UserBookMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/book/mapper/UserBookMapper.java @@ -1,16 +1,17 @@ -package com.yf.exam.modules.user.book.mapper; +package com.yf.exam.modules.user.book.mapper; // 包名:表示该接口属于 user.book.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yf.exam.modules.user.book.entity.UserBook; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,提供基本的 CRUD 操作 +import com.yf.exam.modules.user.book.entity.UserBook; // 导入 UserBook 实体类,表示错题本数据 /** -*

-* 错题本Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-05-27 17:56 -*/ -public interface UserBookMapper extends BaseMapper { + *

+ * 错题本Mapper + *

+ * 该接口用于操作错题本相关的数据,继承 MyBatis-Plus 提供的 BaseMapper + * + * @作者 聪明笨狗 + * @版本 2020-05-27 17:56 + */ +public interface UserBookMapper extends BaseMapper { // 继承 MyBatis-Plus 的 BaseMapper 接口,自动具备对 UserBook 实体的基本 CRUD 操作 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/book/service/UserBookService.java b/src-源文件/main/java/com/yf/exam/modules/user/book/service/UserBookService.java index 726a070..0755c7f 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/book/service/UserBookService.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/book/service/UserBookService.java @@ -1,40 +1,41 @@ -package com.yf.exam.modules.user.book.service; +package com.yf.exam.modules.user.book.service; // 包名:表示该接口属于 user.book.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.user.book.dto.UserBookDTO; -import com.yf.exam.modules.user.book.entity.UserBook; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 的 IService 接口,提供常用的 CRUD 操作 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求数据传输对象 +import com.yf.exam.modules.user.book.dto.UserBookDTO; // 导入错题本 DTO 类,用于封装错题本的数据 +import com.yf.exam.modules.user.book.entity.UserBook; // 导入错题本实体类,映射数据库中的错题本表 /** -*

-* 错题本业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-27 17:56 -*/ -public interface UserBookService extends IService { + *

+ * 错题本业务类 + *

+ * 提供与错题本相关的业务逻辑方法 + * + * @作者 聪明笨狗 + * @版本 2020-05-27 17:56 + */ +public interface UserBookService extends IService { // 继承 MyBatis-Plus 的 IService 接口,提供基本的 CRUD 操作 /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); + * 分页查询错题本数据 + * @param reqDTO 分页请求数据传输对象 + * @return 返回分页查询结果 + */ + IPage paging(PagingReqDTO reqDTO); // 分页查询错题本数据 /** - * 加入错题本 - * @param quId - * @param examId + * 将错题添加到错题本 + * @param examId 考试 ID + * @param quId 题目 ID */ - void addBook(String examId, String quId); + void addBook(String examId, String quId); // 将指定的错题添加到错题本 /** - * 查找第一个错题 - * @param quId - * @param examId - * @return + * 查找下一个错题 + * @param quId 当前题目 ID + * @param examId 当前考试 ID + * @return 返回下一个错题的 ID */ - String findNext(String examId, String quId); + String findNext(String examId, String quId); // 查找下一个错题 ID } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/book/service/impl/UserBookServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/user/book/service/impl/UserBookServiceImpl.java index e1f7de6..a02f0a4 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/book/service/impl/UserBookServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/book/service/impl/UserBookServiceImpl.java @@ -1,155 +1,153 @@ -package com.yf.exam.modules.user.book.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.qu.entity.Qu; -import com.yf.exam.modules.qu.service.QuService; -import com.yf.exam.modules.user.UserUtils; -import com.yf.exam.modules.user.book.dto.UserBookDTO; -import com.yf.exam.modules.user.book.entity.UserBook; -import com.yf.exam.modules.user.book.mapper.UserBookMapper; -import com.yf.exam.modules.user.book.service.UserBookService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; +package com.yf.exam.modules.user.book.service.impl; // 包名:表示该类属于 user.book.service.impl 包 + +import com.alibaba.fastjson.JSON; // 导入 fastjson,用于将对象转换为 JSON 字符串 +import com.alibaba.fastjson.TypeReference; // 导入 TypeReference 用于反序列化复杂类型 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper 类,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 的分页插件 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 的 ServiceImpl 基类 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求的 DTO 类 +import com.yf.exam.modules.qu.entity.Qu; // 导入题目实体类 +import com.yf.exam.modules.qu.service.QuService; // 导入题目服务接口 +import com.yf.exam.modules.user.UserUtils; // 导入用户工具类,用于获取当前用户信息 +import com.yf.exam.modules.user.book.dto.UserBookDTO; // 导入错题本 DTO +import com.yf.exam.modules.user.book.entity.UserBook; // 导入错题本实体类 +import com.yf.exam.modules.user.book.mapper.UserBookMapper; // 导入错题本 Mapper 类 +import com.yf.exam.modules.user.book.service.UserBookService; // 导入错题本服务接口 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 注解,用于自动注入依赖 +import org.springframework.stereotype.Service; // 导入 Service 注解,标识该类为 Spring 服务层组件 +import org.springframework.util.StringUtils; // 导入 StringUtils 工具类,用于字符串操作 /** -*

-* 语言设置 服务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-05-27 17:56 -*/ -@Service -public class UserBookServiceImpl extends ServiceImpl implements UserBookService { + *

+ * 错题本服务实现类 + *

+ * 实现了错题本相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-05-27 17:56 + */ +@Service // 标识该类为 Spring 的服务类 +public class UserBookServiceImpl extends ServiceImpl implements UserBookService { // 继承 MyBatis-Plus 的 ServiceImpl,实现 UserBookService 接口 @Autowired - private QuService quService; + private QuService quService; // 注入题目服务,用于获取题目内容 @Override - public IPage paging(PagingReqDTO reqDTO) { + public IPage paging(PagingReqDTO reqDTO) { // 分页查询错题本数据 - //创建分页对象 + // 创建分页对象 Page query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); - //查询条件 + // 查询条件 QueryWrapper wrapper = new QueryWrapper<>(); // 查找用户的错题 wrapper.lambda().eq(UserBook::getUserId, UserUtils.getUserId(true)); UserBookDTO params = reqDTO.getParams(); - if(params!=null){ - if(!StringUtils.isEmpty(params.getTitle())){ + if(params != null) { + // 根据题目标题查询 + if(!StringUtils.isEmpty(params.getTitle())) { wrapper.lambda().like(UserBook::getTitle, params.getTitle()); } - if(!StringUtils.isEmpty(params.getExamId())){ + // 根据考试 ID 查询 + if(!StringUtils.isEmpty(params.getExamId())) { wrapper.lambda().eq(UserBook::getExamId, params.getExamId()); } } - //获得数据 + // 执行分页查询 IPage page = this.page(query, wrapper); - //转换结果 - IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); + // 转换结果为 DTO + IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>() {}); return pageData; - } - - + } @Override - public void addBook(String examId, String quId) { + public void addBook(String examId, String quId) { // 添加错题到错题本 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() - .eq(UserBook::getUserId, UserUtils.getUserId()) - .eq(UserBook::getExamId, examId) - .eq(UserBook::getQuId, quId); + .eq(UserBook::getUserId, UserUtils.getUserId()) // 查找当前用户的错题 + .eq(UserBook::getExamId, examId) // 查找特定考试的错题 + .eq(UserBook::getQuId, quId); // 查找特定题目的错题 - //查找已有的错题信息 + // 查找已有的错题信息 UserBook book = this.getOne(wrapper, false); - - // 问题 + // 获取题目信息 Qu qu = quService.getById(quId); - if (book == null) { + if (book == null) { // 如果错题本中没有该题目,则添加 book = new UserBook(); book.setExamId(examId); - book.setUserId(UserUtils.getUserId()); - book.setTitle(qu.getContent()); + book.setUserId(UserUtils.getUserId()); // 设置当前用户的 ID + book.setTitle(qu.getContent()); // 设置题目内容 book.setQuId(quId); - book.setWrongCount(1); - Integer maxSort = this.findMaxSort(examId, UserUtils.getUserId()); - book.setSort(maxSort+1); - - this.save(book); - } else { - book.setWrongCount(book.getWrongCount()+1); - this.updateById(book); + book.setWrongCount(1); // 错误次数初始化为 1 + Integer maxSort = this.findMaxSort(examId, UserUtils.getUserId()); // 查找当前用户的最大排序号 + book.setSort(maxSort + 1); // 设置错题的排序号 + + this.save(book); // 保存错题记录 + } else { // 如果错题本中已有该题目,则更新错误次数 + book.setWrongCount(book.getWrongCount() + 1); // 错误次数加 1 + this.updateById(book); // 更新错题记录 } } @Override - public String findNext(String examId, String quId) { - + public String findNext(String examId, String quId) { // 查找下一个错题 Integer sort = 999999; - if(!StringUtils.isEmpty(quId)){ + if(!StringUtils.isEmpty(quId)) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() - .eq(UserBook::getUserId, UserUtils.getUserId()) - .eq(UserBook::getExamId, examId) - .eq(UserBook::getQuId, quId); - wrapper.last(" ORDER BY `sort` DESC"); + .eq(UserBook::getUserId, UserUtils.getUserId()) // 查找当前用户的错题 + .eq(UserBook::getExamId, examId) // 查找特定考试的错题 + .eq(UserBook::getQuId, quId); // 查找特定题目的错题 + wrapper.last(" ORDER BY `sort` DESC"); // 按照排序降序排列 UserBook last = this.getOne(wrapper, false); - if(last!=null){ - sort = last.getSort(); + if(last != null) { + sort = last.getSort(); // 获取当前错题的排序号 } } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() - .eq(UserBook::getUserId, UserUtils.getUserId()) - .eq(UserBook::getExamId, examId) - .lt(UserBook::getSort, sort); - wrapper.last(" ORDER BY `sort` DESC"); - - UserBook next = this.getOne(wrapper, false); - if(next != null){ - return next.getQuId(); + .eq(UserBook::getUserId, UserUtils.getUserId()) // 查找当前用户的错题 + .eq(UserBook::getExamId, examId) // 查找特定考试的错题 + .lt(UserBook::getSort, sort); // 查找排序号小于当前错题的错题 + wrapper.last(" ORDER BY `sort` DESC"); // 按照排序降序排列 + + UserBook next = this.getOne(wrapper, false); // 查找下一个错题 + if(next != null) { + return next.getQuId(); // 返回下一个错题的 ID } - return null; + return null; // 如果没有下一个错题,返回 null } /** * 查找最大的排序 - * @param userId - * @return + * @param examId 考试 ID + * @param userId 用户 ID + * @return 返回最大的排序号 */ - private Integer findMaxSort(String examId, String userId){ + private Integer findMaxSort(String examId, String userId) { // 查找当前用户在某个考试中的最大排序号 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() - .eq(UserBook::getExamId, examId) - .eq(UserBook::getUserId, userId); - wrapper.last(" ORDER BY `sort` DESC"); + .eq(UserBook::getExamId, examId) // 查找特定考试的错题 + .eq(UserBook::getUserId, userId); // 查找当前用户的错题 + wrapper.last(" ORDER BY `sort` DESC"); // 按照排序号降序排列 - UserBook book = this.getOne(wrapper, false); - if(book == null){ - return 0; + UserBook book = this.getOne(wrapper, false); // 获取最大排序号的错题 + if(book == null) { + return 0; // 如果没有错题,返回 0 } - return book.getSort(); + return book.getSort(); // 返回最大排序号 } - - } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/controller/UserExamController.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/controller/UserExamController.java index 65cf11c..f848356 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/controller/UserExamController.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/controller/UserExamController.java @@ -1,65 +1,64 @@ -package com.yf.exam.modules.user.exam.controller; +package com.yf.exam.modules.user.exam.controller; // 包名:表示该类属于 user.exam.controller 包 -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.PagingReqDTO; -import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; -import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; -import com.yf.exam.modules.user.exam.service.UserExamService; -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 com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.yf.exam.core.api.ApiRest; // 导入 API 响应封装类,用于统一返回格式 +import com.yf.exam.core.api.controller.BaseController; // 导入基础控制器类,提供通用的接口方法 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO 类,用于封装分页参数 +import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; // 导入用户考试请求 DTO 类,用于封装考试查询参数 +import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; // 导入用户考试响应 DTO 类,用于封装查询结果 +import com.yf.exam.modules.user.exam.service.UserExamService; // 导入用户考试服务接口,用于处理考试相关的业务逻辑 +import io.swagger.annotations.Api; // 导入 Swagger 注解,用于生成 API 文档中的标签 +import io.swagger.annotations.ApiOperation; // 导入 Swagger 注解,用于描述接口方法 +import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 注解,用于自动注入依赖 +import org.springframework.web.bind.annotation.RequestBody; // 导入 RequestBody 注解,用于绑定请求体参数 +import org.springframework.web.bind.annotation.RequestMapping; // 导入 RequestMapping 注解,用于映射请求路径 +import org.springframework.web.bind.annotation.RequestMethod; // 导入 RequestMethod 枚举,用于指定请求方法类型 +import org.springframework.web.bind.annotation.RestController; // 导入 RestController 注解,标识该类为 RESTful 风格的控制器 /** -*

-* 考试记录控制器 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -@Api(tags={"考试记录"}) -@RestController -@RequestMapping("/exam/api/user/exam") -public class UserExamController extends BaseController { + *

+ * 考试记录控制器 + *

+ * 用于处理用户的考试记录相关请求 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +@Api(tags={"考试记录"}) // Swagger 注解,定义该类在 API 文档中的标签 +@RestController // 标识该类为 RESTful 风格的控制器 +@RequestMapping("/exam/api/user/exam") // 映射请求路径,所有接口都以 "/exam/api/user/exam" 开头 +public class UserExamController extends BaseController { // 继承 BaseController,提供基础的响应方法 @Autowired - private UserExamService baseService; - + private UserExamService baseService; // 自动注入 UserExamService 服务,处理考试记录相关业务 /** - * 分页查找 - * @param reqDTO - * @return + * 分页查找考试记录 + * @param reqDTO 分页请求数据传输对象 + * @return 返回分页查询的考试记录结果 */ - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/paging", method = { RequestMethod.POST}) - public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { + @ApiOperation(value = "分页查找") // Swagger 注解,描述接口方法的作用 + @RequestMapping(value = "/paging", method = { RequestMethod.POST}) // 映射 POST 请求路径 "/exam/api/user/exam/paging" + public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) { // 接收分页请求,返回分页结果 - //分页查询并转换 + // 调用服务层方法进行分页查询,并将结果转换为响应 DTO IPage page = baseService.paging(reqDTO); - return super.success(page); + return super.success(page); // 调用父类的 success 方法返回查询结果 } - /** - * 分页查找 - * @param reqDTO - * @return - */ - @ApiOperation(value = "分页查找") - @RequestMapping(value = "/my-paging", method = { RequestMethod.POST}) - public ApiRest> myPaging(@RequestBody PagingReqDTO reqDTO) { + * 分页查找用户自己的考试记录 + * @param reqDTO 分页请求数据传输对象 + * @return 返回用户的分页考试记录 + */ + @ApiOperation(value = "分页查找") // Swagger 注解,描述接口方法的作用 + @RequestMapping(value = "/my-paging", method = { RequestMethod.POST}) // 映射 POST 请求路径 "/exam/api/user/exam/my-paging" + public ApiRest> myPaging(@RequestBody PagingReqDTO reqDTO) { // 接收分页请求,返回用户的分页考试记录 - //分页查询并转换 + // 调用服务层方法进行分页查询,并将结果转换为响应 DTO IPage page = baseService.myPaging(reqDTO); - return super.success(page); + return super.success(page); // 调用父类的 success 方法返回查询结果 } } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/UserExamDTO.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/UserExamDTO.java index 61a0c23..b10110d 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/UserExamDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/UserExamDTO.java @@ -1,50 +1,72 @@ -package com.yf.exam.modules.user.exam.dto; +package com.yf.exam.modules.user.exam.dto; // 包名:表示该类属于 user.exam.dto 包 -import com.yf.exam.core.annon.Dict; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import java.util.Date; - -import java.io.Serializable; +import com.yf.exam.core.annon.Dict; // 导入 Dict 注解,用于字段的字典数据转换 +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于生成 API 文档中的描述 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述类字段 +import lombok.Data; // 导入 Lombok 的 Data 注解,用于自动生成 getter、setter 等方法 +import java.util.Date; // 导入 Date 类,用于处理时间 +import java.io.Serializable; // 导入 Serializable 接口,确保该类可以序列化 /** -*

-* 考试记录数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -@Data -@ApiModel(value="考试记录", description="考试记录") -public class UserExamDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - - private String id; - - @ApiModelProperty(value = "用户ID", required=true) - private String userId; - - @Dict(dictTable = "el_exam", dicText = "title", dicCode = "id") - @ApiModelProperty(value = "考试ID", required=true) - private String examId; - - @ApiModelProperty(value = "考试次数", required=true) - private Integer tryCount; - - @ApiModelProperty(value = "最高分数", required=true) - private Integer maxScore; - - @ApiModelProperty(value = "是否通过", required=true) - private Boolean passed; - - @ApiModelProperty(value = "创建时间") - private Date createTime; - - @ApiModelProperty(value = "更新时间") - private Date updateTime; - + *

+ * 考试记录数据传输类 + *

+ * 用于封装考试记录相关数据 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +@Data // Lombok 注解,自动为类生成 getter、setter、toString 等方法 +@ApiModel(value="考试记录", description="考试记录") // Swagger 注解,描述该类的作用,生成 API 文档时使用 +public class UserExamDTO implements Serializable { // 实现 Serializable 接口,使该类可以序列化 + + private static final long serialVersionUID = 1L; // 序列化版本 UID + + /** + * 用户ID + */ + private String id; // 用户ID字段 + + /** + * 用户ID + */ + @ApiModelProperty(value = "用户ID", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private String userId; // 用户ID字段 + + /** + * 考试ID + */ + @Dict(dictTable = "el_exam", dicText = "title", dicCode = "id") // 使用 Dict 注解,指定字典表及映射字段 + @ApiModelProperty(value = "考试ID", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private String examId; // 考试ID字段 + + /** + * 考试次数 + */ + @ApiModelProperty(value = "考试次数", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private Integer tryCount; // 考试次数字段 + + /** + * 最高分数 + */ + @ApiModelProperty(value = "最高分数", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private Integer maxScore; // 最高分数字段 + + /** + * 是否通过 + */ + @ApiModelProperty(value = "是否通过", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private Boolean passed; // 是否通过字段 + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") // Swagger 注解,描述字段的作用 + private Date createTime; // 创建时间字段 + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") // Swagger 注解,描述字段的作用 + private Date updateTime; // 更新时间字段 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/request/UserExamReqDTO.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/request/UserExamReqDTO.java index e554837..d792bc2 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/request/UserExamReqDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/request/UserExamReqDTO.java @@ -1,30 +1,34 @@ -package com.yf.exam.modules.user.exam.dto.request; +package com.yf.exam.modules.user.exam.dto.request; // 包名:表示该类属于 user.exam.dto.request 包 -import com.yf.exam.modules.user.exam.dto.UserExamDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.user.exam.dto.UserExamDTO; // 导入 UserExamDTO 类,作为父类,包含通用的考试记录信息 +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于生成 API 文档中的描述 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述类字段 +import lombok.Data; // 导入 Lombok 的 Data 注解,用于自动生成 getter、setter 等方法 /** -*

-* 考试记录数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -@Data -@ApiModel(value="考试记录", description="考试记录") -public class UserExamReqDTO extends UserExamDTO { - - private static final long serialVersionUID = 1L; - - - @ApiModelProperty(value = "考试名称", required=true) - private String title; - - @ApiModelProperty(value = "人员名称", required=true) - private String realName; - - + *

+ * 考试记录数据传输类 + *

+ * 用于封装请求中的考试记录数据 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +@Data // Lombok 注解,自动为类生成 getter、setter、toString 等方法 +@ApiModel(value="考试记录", description="考试记录") // Swagger 注解,描述该类的作用,生成 API 文档时使用 +public class UserExamReqDTO extends UserExamDTO { // 继承 UserExamDTO 类,扩展额外的请求字段 + + private static final long serialVersionUID = 1L; // 序列化版本 UID + + /** + * 考试名称 + */ + @ApiModelProperty(value = "考试名称", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private String title; // 考试名称字段 + + /** + * 人员名称 + */ + @ApiModelProperty(value = "人员名称", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private String realName; // 人员名称字段 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/response/UserExamRespDTO.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/response/UserExamRespDTO.java index 0ad1d39..13a11c5 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/response/UserExamRespDTO.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/dto/response/UserExamRespDTO.java @@ -1,29 +1,34 @@ -package com.yf.exam.modules.user.exam.dto.response; +package com.yf.exam.modules.user.exam.dto.response; // 包名:表示该类属于 user.exam.dto.response 包 -import com.yf.exam.modules.user.exam.dto.UserExamDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import com.yf.exam.modules.user.exam.dto.UserExamDTO; // 导入 UserExamDTO 类,作为父类,包含通用的考试记录信息 +import io.swagger.annotations.ApiModel; // 导入 Swagger 注解,用于生成 API 文档中的描述 +import io.swagger.annotations.ApiModelProperty; // 导入 Swagger 注解,用于描述类字段 +import lombok.Data; // 导入 Lombok 的 Data 注解,用于自动生成 getter、setter 等方法 /** -*

-* 考试记录数据传输类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -@Data -@ApiModel(value="考试记录", description="考试记录") -public class UserExamRespDTO extends UserExamDTO { + *

+ * 考试记录数据传输类 + *

+ * 用于封装响应中的考试记录数据 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +@Data // Lombok 注解,自动为类生成 getter、setter、toString 等方法 +@ApiModel(value="考试记录", description="考试记录") // Swagger 注解,描述该类的作用,生成 API 文档时使用 +public class UserExamRespDTO extends UserExamDTO { // 继承 UserExamDTO 类,扩展额外的响应字段 - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; // 序列化版本 UID + /** + * 考试名称 + */ + @ApiModelProperty(value = "考试名称", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private String title; // 考试名称字段 - @ApiModelProperty(value = "考试名称", required=true) - private String title; - - @ApiModelProperty(value = "人员名称", required=true) - private String realName; - + /** + * 人员名称 + */ + @ApiModelProperty(value = "人员名称", required=true) // Swagger 注解,描述字段的作用,设置为必填项 + private String realName; // 人员名称字段 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/entity/UserExam.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/entity/UserExam.java index 7721d40..499ce37 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/entity/UserExam.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/entity/UserExam.java @@ -1,69 +1,72 @@ -package com.yf.exam.modules.user.exam.entity; +package com.yf.exam.modules.user.exam.entity; // 包名:表示该类属于 user.exam.entity 包 -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.activerecord.Model; -import lombok.Data; -import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; // 导入 MyBatis-Plus 注解,用于指定主键策略 +import com.baomidou.mybatisplus.annotation.TableField; // 导入 MyBatis-Plus 注解,用于指定数据库表字段 +import com.baomidou.mybatisplus.annotation.TableId; // 导入 MyBatis-Plus 注解,用于指定主键字段 +import com.baomidou.mybatisplus.annotation.TableName; // 导入 MyBatis-Plus 注解,用于指定数据库表名 +import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入 MyBatis-Plus 提供的 Model 类,用于增强实体类 +import lombok.Data; // 导入 Lombok 注解,用于自动生成 getter、setter 等方法 +import java.util.Date; // 导入 Date 类,用于处理时间 /** -*

-* 考试记录实体类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -@Data -@TableName("el_user_exam") -public class UserExam extends Model { + *

+ * 考试记录实体类 + *

+ * 用于映射数据库中的考试记录表 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +@Data // Lombok 注解,自动为类生成 getter、setter、toString 等方法 +@TableName("el_user_exam") // MyBatis-Plus 注解,指定该实体类对应的数据库表名为 "el_user_exam" +public class UserExam extends Model { // 继承 Model 类,提供额外的 MyBatis-Plus 功能 + + private static final long serialVersionUID = 1L; // 序列化版本 UID - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; - /** - * 用户ID - */ - @TableField("user_id") - private String userId; - + * ID + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis-Plus 注解,指定主键字段为 "id",主键类型为 "ASSIGN_ID" + private String id; // ID字段 + /** - * 考试ID - */ - @TableField("exam_id") - private String examId; - + * 用户ID + */ + @TableField("user_id") // MyBatis-Plus 注解,指定数据库字段 "user_id" 对应实体类的 "userId" 字段 + private String userId; // 用户ID字段 + /** - * 考试次数 - */ - @TableField("try_count") - private Integer tryCount; - + * 考试ID + */ + @TableField("exam_id") // MyBatis-Plus 注解,指定数据库字段 "exam_id" 对应实体类的 "examId" 字段 + private String examId; // 考试ID字段 + /** - * 最高分数 - */ - @TableField("max_score") - private Integer maxScore; - + * 考试次数 + */ + @TableField("try_count") // MyBatis-Plus 注解,指定数据库字段 "try_count" 对应实体类的 "tryCount" 字段 + private Integer tryCount; // 考试次数字段 + /** - * 是否通过 - */ - private Boolean passed; - + * 最高分数 + */ + @TableField("max_score") // MyBatis-Plus 注解,指定数据库字段 "max_score" 对应实体类的 "maxScore" 字段 + private Integer maxScore; // 最高分数字段 + + /** + * 是否通过 + */ + private Boolean passed; // 是否通过字段 + /** - * 创建时间 - */ - @TableField("create_time") - private Date createTime; - + * 创建时间 + */ + @TableField("create_time") // MyBatis-Plus 注解,指定数据库字段 "create_time" 对应实体类的 "createTime" 字段 + private Date createTime; // 创建时间字段 + /** - * 更新时间 - */ - @TableField("update_time") - private Date updateTime; - + * 更新时间 + */ + @TableField("update_time") // MyBatis-Plus 注解,指定数据库字段 "update_time" 对应实体类的 "updateTime" 字段 + private Date updateTime; // 更新时间字段 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/mapper/UserExamMapper.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/mapper/UserExamMapper.java index c28ce6f..c5cd0b5 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/mapper/UserExamMapper.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/mapper/UserExamMapper.java @@ -1,29 +1,29 @@ -package com.yf.exam.modules.user.exam.mapper; +package com.yf.exam.modules.user.exam.mapper; // 包名:表示该类属于 user.exam.mapper 包 -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; -import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; -import com.yf.exam.modules.user.exam.entity.UserExam; -import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 MyBatis-Plus 的 BaseMapper 接口,提供基本的数据库操作 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 的 Page 类,用于分页查询 +import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; // 导入用户考试请求 DTO 类,用于封装分页查询请求 +import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; // 导入用户考试响应 DTO 类,用于封装分页查询结果 +import com.yf.exam.modules.user.exam.entity.UserExam; // 导入用户考试实体类,用于映射数据库表 +import org.apache.ibatis.annotations.Param; // 导入 MyBatis 的 Param 注解,用于标注方法参数 /** -*

-* 考试记录Mapper -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -public interface UserExamMapper extends BaseMapper { + *

+ * 考试记录Mapper + *

+ * 用于处理考试记录的数据访问层操作 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +public interface UserExamMapper extends BaseMapper { // 继承 BaseMapper 提供基础的增删改查功能 /** - * 我的考试分页 - * @param page - * @param query - * @return + * 我的考试分页查询 + * @param page 分页对象,用于控制查询的页数和每页的数据量 + * @param query 查询参数,封装了分页和查询条件 + * @return 返回分页查询的结果 */ - IPage paging(Page page, @Param("query") UserExamReqDTO query); - + IPage paging(Page page, @Param("query") UserExamReqDTO query); // 自定义分页查询方法,返回分页结果 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/service/UserExamService.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/service/UserExamService.java index d1fbf72..4e3eb92 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/service/UserExamService.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/service/UserExamService.java @@ -1,43 +1,43 @@ -package com.yf.exam.modules.user.exam.service; +package com.yf.exam.modules.user.exam.service; // 包名:表示该类属于 user.exam.service 包 -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; -import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; -import com.yf.exam.modules.user.exam.entity.UserExam; +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 的 IService 接口,提供基础服务接口 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO 类,用于封装分页查询请求 +import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; // 导入用户考试请求 DTO 类 +import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; // 导入用户考试响应 DTO 类 +import com.yf.exam.modules.user.exam.entity.UserExam; // 导入用户考试实体类,用于映射数据库表 /** -*

-* 考试记录业务类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -public interface UserExamService extends IService { - - /** - * 分页查询数据 - * @param reqDTO - * @return - */ - IPage paging(PagingReqDTO reqDTO); + *

+ * 考试记录业务类 + *

+ * 提供用户考试记录相关的业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +public interface UserExamService extends IService { // 继承 IService 接口,提供对 UserExam 实体的增删改查功能 /** * 分页查询数据 - * @param reqDTO - * @return + * @param reqDTO 分页请求 DTO,封装了分页查询参数 + * @return 返回分页查询的结果 */ - IPage myPaging(PagingReqDTO reqDTO); + IPage paging(PagingReqDTO reqDTO); // 用于分页查询考试记录 + /** + * 分页查询数据,针对当前用户 + * @param reqDTO 分页请求 DTO,封装了分页查询参数 + * @return 返回分页查询的结果 + */ + IPage myPaging(PagingReqDTO reqDTO); // 用于分页查询当前用户的考试记录 /** * 考试完成后加入成绩 - * @param userId - * @param examId - * @param score - * @param passed + * @param userId 用户ID + * @param examId 考试ID + * @param score 用户得分 + * @param passed 用户是否通过考试 */ - void joinResult(String userId, String examId, Integer score, boolean passed); + void joinResult(String userId, String examId, Integer score, boolean passed); // 记录用户考试结果 } diff --git a/src-源文件/main/java/com/yf/exam/modules/user/exam/service/impl/UserExamServiceImpl.java b/src-源文件/main/java/com/yf/exam/modules/user/exam/service/impl/UserExamServiceImpl.java index 226eb84..c08fc2a 100644 --- a/src-源文件/main/java/com/yf/exam/modules/user/exam/service/impl/UserExamServiceImpl.java +++ b/src-源文件/main/java/com/yf/exam/modules/user/exam/service/impl/UserExamServiceImpl.java @@ -1,88 +1,87 @@ -package com.yf.exam.modules.user.exam.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yf.exam.core.api.dto.PagingReqDTO; -import com.yf.exam.modules.user.UserUtils; -import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; -import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; -import com.yf.exam.modules.user.exam.entity.UserExam; -import com.yf.exam.modules.user.exam.mapper.UserExamMapper; -import com.yf.exam.modules.user.exam.service.UserExamService; -import org.springframework.stereotype.Service; - -import java.util.Date; +package com.yf.exam.modules.user.exam.service.impl; // 包名:表示该类属于 user.exam.service.impl 包 + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的 QueryWrapper,用于构建查询条件 +import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的 IPage 接口,用于分页查询 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 MyBatis-Plus 提供的 ServiceImpl 类,提供基础的服务层实现 +import com.yf.exam.core.api.dto.PagingReqDTO; // 导入分页请求 DTO 类,用于封装分页查询请求 +import com.yf.exam.modules.user.UserUtils; // 导入 UserUtils 工具类,用于获取当前用户的 ID +import com.yf.exam.modules.user.exam.dto.request.UserExamReqDTO; // 导入用户考试请求 DTO 类 +import com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO; // 导入用户考试响应 DTO 类 +import com.yf.exam.modules.user.exam.entity.UserExam; // 导入用户考试实体类,用于映射数据库表 +import com.yf.exam.modules.user.exam.mapper.UserExamMapper; // 导入用户考试 Mapper 类,提供数据库操作 +import com.yf.exam.modules.user.exam.service.UserExamService; // 导入用户考试服务接口 +import org.springframework.stereotype.Service; // 导入 Service 注解,标识该类为服务层组件 + +import java.util.Date; // 导入 Date 类,用于处理时间 /** -*

-* 考试记录业务实现类 -*

-* -* @author 聪明笨狗 -* @since 2020-09-21 15:13 -*/ -@Service -public class UserExamServiceImpl extends ServiceImpl implements UserExamService { + *

+ * 考试记录业务实现类 + *

+ * 实现了 UserExamService 接口,提供考试记录相关业务逻辑 + * + * @作者 聪明笨狗 + * @版本 2020-09-21 15:13 + */ +@Service // 标识该类为 Spring 服务层组件 +public class UserExamServiceImpl extends ServiceImpl implements UserExamService { // 继承 ServiceImpl 类,提供基础的增删改查功能,并实现 UserExamService 接口 @Override - public IPage paging(PagingReqDTO reqDTO) { + public IPage paging(PagingReqDTO reqDTO) { // 分页查询方法 - //转换结果 + // 使用 MyBatis-Plus 提供的 paging 方法进行分页查询,并转换为响应 DTO 类型 IPage pageData = baseMapper.paging(reqDTO.toPage(), reqDTO.getParams()); - return pageData; + return pageData; // 返回分页查询结果 } @Override - public IPage myPaging(PagingReqDTO reqDTO) { + public IPage myPaging(PagingReqDTO reqDTO) { // 我的考试分页查询方法 - UserExamReqDTO params = reqDTO.getParams(); + UserExamReqDTO params = reqDTO.getParams(); // 获取请求参数 - - if(params==null){ + // 如果没有传入参数,则初始化为空的 UserExamReqDTO 对象 + if(params == null) { params = new UserExamReqDTO(); } - params.setUserId(UserUtils.getUserId()); - + params.setUserId(UserUtils.getUserId()); // 设置当前用户的 ID - //转换结果 + // 使用 MyBatis-Plus 提供的 paging 方法进行分页查询,并转换为响应 DTO 类型 IPage pageData = baseMapper.paging(reqDTO.toPage(), params); - return pageData; + return pageData; // 返回分页查询结果 } @Override - public void joinResult(String userId, String examId, Integer score, boolean passed) { + public void joinResult(String userId, String examId, Integer score, boolean passed) { // 记录考试结果的方法 - //查询条件 + // 构建查询条件,查找用户的考试记录 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(UserExam::getUserId, userId) - .eq(UserExam::getExamId, examId); + wrapper.lambda().eq(UserExam::getUserId, userId) // 查询条件:用户 ID + .eq(UserExam::getExamId, examId); // 查询条件:考试 ID - UserExam record = this.getOne(wrapper, false); - if(record == null){ + UserExam record = this.getOne(wrapper, false); // 查找匹配的记录 + if(record == null) { // 如果记录不存在,则创建新记录 record = new UserExam(); - record.setCreateTime(new Date()); - record.setUpdateTime(new Date()); - record.setUserId(userId); - record.setExamId(examId); - record.setMaxScore(score); - record.setPassed(passed); - this.save(record); + record.setCreateTime(new Date()); // 设置创建时间 + record.setUpdateTime(new Date()); // 设置更新时间 + record.setUserId(userId); // 设置用户 ID + record.setExamId(examId); // 设置考试 ID + record.setMaxScore(score); // 设置最大分数 + record.setPassed(passed); // 设置是否通过 + this.save(record); // 保存新记录 return; } - // 修复低分数不加入统计问题 - record.setTryCount(record.getTryCount()+1); - record.setUpdateTime(new Date()); + // 如果记录存在,则更新该记录 + record.setTryCount(record.getTryCount() + 1); // 增加考试次数 + record.setUpdateTime(new Date()); // 更新更新时间 - if(record.getMaxScore() < score){ - record.setMaxScore(score); - record.setPassed(passed); + // 如果当前分数高于记录中的最大分数,则更新最大分数 + if(record.getMaxScore() < score) { + record.setMaxScore(score); // 更新最大分数 + record.setPassed(passed); // 更新是否通过 } - this.updateById(record); - - + this.updateById(record); // 更新记录 } }