cuizhiyao_branch
STRIV1 9 months ago
parent 1651403136
commit 3067413682

@ -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; import com.baomidou.mybatisplus.core.metadata.IPage;
// 引入统一的API响应封装类
import com.yf.exam.core.api.ApiRest; import com.yf.exam.core.api.ApiRest;
// 引入基础控制器类提供通用的API响应方法
import com.yf.exam.core.api.controller.BaseController; import com.yf.exam.core.api.controller.BaseController;
// 引入各种DTO类用于请求和响应数据传输
import com.yf.exam.core.api.dto.BaseIdReqDTO; import com.yf.exam.core.api.dto.BaseIdReqDTO;
import com.yf.exam.core.api.dto.BaseIdRespDTO; import com.yf.exam.core.api.dto.BaseIdRespDTO;
import com.yf.exam.core.api.dto.BaseIdsReqDTO; import com.yf.exam.core.api.dto.BaseIdsReqDTO;
import com.yf.exam.core.api.dto.PagingReqDTO; import com.yf.exam.core.api.dto.PagingReqDTO;
// 引入工具类,用于对象之间的属性拷贝
import com.yf.exam.core.utils.BeanMapper; import com.yf.exam.core.utils.BeanMapper;
// 引入试卷相关的DTO类
import com.yf.exam.modules.paper.dto.PaperDTO; import com.yf.exam.modules.paper.dto.PaperDTO;
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; 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.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.ExamDetailRespDTO;
import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO; import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO;
import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; import com.yf.exam.modules.paper.dto.response.PaperListRespDTO;
// 引入试卷实体类
import com.yf.exam.modules.paper.entity.Paper; import com.yf.exam.modules.paper.entity.Paper;
// 引入试卷相关的业务处理服务类
import com.yf.exam.modules.paper.service.PaperService; import com.yf.exam.modules.paper.service.PaperService;
// 引入用户工具类,获取当前登录用户信息
import com.yf.exam.modules.user.UserUtils; import com.yf.exam.modules.user.UserUtils;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
// 引入Shiro注解用于角色权限管理
import org.apache.shiro.authz.annotation.RequiresRoles; import org.apache.shiro.authz.annotation.RequiresRoles;
// 引入Spring的Bean工具类用于属性复制
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
// 引入Spring的自动注入注解用于自动注入服务
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
// 引入Spring的Web注解定义HTTP请求的映射方式
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
@ -34,123 +48,126 @@ import org.springframework.web.bind.annotation.RestController;
* <p> * <p>
* *
* </p> * </p>
* *
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
*/ */
@Api(tags={"试卷"}) @Api(tags={"试卷"}) // Swagger API 文档注解,用于描述该接口属于试卷相关操作
@RestController @RestController // 标记为Spring的控制器处理HTTP请求
@RequestMapping("/exam/api/paper/paper") @RequestMapping("/exam/api/paper/paper") // 定义请求路径的基础路径
public class PaperController extends BaseController { public class PaperController extends BaseController { // 继承BaseController类提供基本的API返回
@Autowired @Autowired // 自动注入PaperService负责业务逻辑处理
private PaperService baseService; private PaperService baseService;
/** /**
* *
* @param reqDTO * @param reqDTO
* @return * @return
*/ */
@ApiOperation(value = "分页查找") @ApiOperation(value = "分页查找") // Swagger操作注解用于描述接口
@RequestMapping(value = "/paging", method = { RequestMethod.POST}) @RequestMapping(value = "/paging", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<IPage<PaperListRespDTO>> paging(@RequestBody PagingReqDTO<PaperListReqDTO> reqDTO) { public ApiRest<IPage<PaperListRespDTO>> paging(@RequestBody PagingReqDTO<PaperListReqDTO> reqDTO) {
//分页查询并转换 // 调用业务层进行分页查询
IPage<PaperListRespDTO> page = baseService.paging(reqDTO); IPage<PaperListRespDTO> page = baseService.paging(reqDTO);
// 返回成功响应,并附带查询结果
return super.success(page); return super.success(page);
} }
/** /**
* *
* @param reqDTO * @param reqDTO
* @return * @return ID
*/ */
@ApiOperation(value = "创建试卷") @ApiOperation(value = "创建试卷") // Swagger操作注解用于描述接口
@RequestMapping(value = "/create-paper", method = { RequestMethod.POST}) @RequestMapping(value = "/create-paper", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<BaseIdRespDTO> save(@RequestBody PaperCreateReqDTO reqDTO) { public ApiRest<BaseIdRespDTO> save(@RequestBody PaperCreateReqDTO reqDTO) {
//复制参数 // 调用业务层创建试卷传入当前用户ID和考试ID
String paperId = baseService.createPaper(UserUtils.getUserId(), reqDTO.getExamId()); String paperId = baseService.createPaper(UserUtils.getUserId(), reqDTO.getExamId());
// 返回创建结果包括试卷ID
return super.success(new BaseIdRespDTO(paperId)); return super.success(new BaseIdRespDTO(paperId));
} }
/** /**
* *
* @param reqDTO * @param reqDTO ID
* @return * @return
*/ */
@ApiOperation(value = "试卷详情") @ApiOperation(value = "试卷详情") // Swagger操作注解用于描述接口
@RequestMapping(value = "/paper-detail", method = { RequestMethod.POST}) @RequestMapping(value = "/paper-detail", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<ExamDetailRespDTO> paperDetail(@RequestBody BaseIdReqDTO reqDTO) { public ApiRest<ExamDetailRespDTO> paperDetail(@RequestBody BaseIdReqDTO reqDTO) {
//根据ID删除 // 调用业务层获取试卷详情
ExamDetailRespDTO respDTO = baseService.paperDetail(reqDTO.getId()); ExamDetailRespDTO respDTO = baseService.paperDetail(reqDTO.getId());
// 返回成功响应,并附带试卷详情
return super.success(respDTO); return super.success(respDTO);
} }
/** /**
* *
* @param reqDTO * @param reqDTO IDID
* @return * @return
*/ */
@ApiOperation(value = "试题详情") @ApiOperation(value = "试题详情") // Swagger操作注解用于描述接口
@RequestMapping(value = "/qu-detail", method = { RequestMethod.POST}) @RequestMapping(value = "/qu-detail", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<PaperQuDetailDTO> quDetail(@RequestBody PaperQuQueryDTO reqDTO) { public ApiRest<PaperQuDetailDTO> quDetail(@RequestBody PaperQuQueryDTO reqDTO) {
//根据ID删除 // 调用业务层获取试题详情
PaperQuDetailDTO respDTO = baseService.findQuDetail(reqDTO.getPaperId(), reqDTO.getQuId()); PaperQuDetailDTO respDTO = baseService.findQuDetail(reqDTO.getPaperId(), reqDTO.getQuId());
// 返回成功响应,并附带试题详情
return super.success(respDTO); return super.success(respDTO);
} }
/** /**
* *
* @param reqDTO * @param reqDTO
* @return * @return
*/ */
@ApiOperation(value = "填充答案") @ApiOperation(value = "填充答案") // Swagger操作注解用于描述接口
@RequestMapping(value = "/fill-answer", method = { RequestMethod.POST}) @RequestMapping(value = "/fill-answer", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<PaperQuDetailDTO> fillAnswer(@RequestBody PaperAnswerDTO reqDTO) { public ApiRest<PaperQuDetailDTO> fillAnswer(@RequestBody PaperAnswerDTO reqDTO) {
//根据ID删除 // 调用业务层填充答案操作
baseService.fillAnswer(reqDTO); baseService.fillAnswer(reqDTO);
// 返回成功响应
return super.success(); return super.success();
} }
/** /**
* *
* @param reqDTO * @param reqDTO ID
* @return * @return
*/ */
@ApiOperation(value = "交卷操作") @ApiOperation(value = "交卷操作") // Swagger操作注解用于描述接口
@RequestMapping(value = "/hand-exam", method = { RequestMethod.POST}) @RequestMapping(value = "/hand-exam", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<PaperQuDetailDTO> handleExam(@RequestBody BaseIdReqDTO reqDTO) { public ApiRest<PaperQuDetailDTO> handleExam(@RequestBody BaseIdReqDTO reqDTO) {
//根据ID删除 // 调用业务层进行交卷操作
baseService.handExam(reqDTO.getId()); baseService.handExam(reqDTO.getId());
// 返回成功响应
return super.success(); return super.success();
} }
/** /**
* *
* @param reqDTO * @param reqDTO ID
* @return * @return
*/ */
@ApiOperation(value = "试卷详情") @ApiOperation(value = "试卷结果") // Swagger操作注解用于描述接口
@RequestMapping(value = "/paper-result", method = { RequestMethod.POST}) @RequestMapping(value = "/paper-result", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<ExamResultRespDTO> paperResult(@RequestBody BaseIdReqDTO reqDTO) { public ApiRest<ExamResultRespDTO> paperResult(@RequestBody BaseIdReqDTO reqDTO) {
//根据ID删除 // 调用业务层获取试卷的考试结果
ExamResultRespDTO respDTO = baseService.paperResult(reqDTO.getId()); ExamResultRespDTO respDTO = baseService.paperResult(reqDTO.getId());
// 返回成功响应,并附带试卷结果
return super.success(respDTO); return super.success(respDTO);
} }
/** /**
* *
* @return * @return
*/ */
@ApiOperation(value = "检测进行中的考试") @ApiOperation(value = "检测进行中的考试") // Swagger操作注解用于描述接口
@RequestMapping(value = "/check-process", method = { RequestMethod.POST}) @RequestMapping(value = "/check-process", method = { RequestMethod.POST}) // 定义POST请求路径
public ApiRest<PaperDTO> checkProcess() { public ApiRest<PaperDTO> checkProcess() {
//复制参数 // 调用业务层检测用户是否有未完成的考试
PaperDTO dto = baseService.checkProcess(UserUtils.getUserId()); PaperDTO dto = baseService.checkProcess(UserUtils.getUserId());
// 返回成功响应,并附带考试进程数据
return super.success(dto); return super.success(dto);
} }
} }

@ -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; import com.yf.exam.core.annon.Dict;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入Serializable接口用于对象序列化
import java.io.Serializable; import java.io.Serializable;
// 引入Date类用于表示日期和时间
import java.util.Date; import java.util.Date;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * ID
* @author * 使
* @since 2020-05-25 17:31 *
*/ * @author
@Data * @since 2020-05-25 17:31
@ApiModel(value="试卷", description="试卷") */
public class PaperDTO implements Serializable { @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="试卷", description="试卷") // Swagger注解用于描述该类在API文档中的作用和说明
private static final long serialVersionUID = 1L; public class PaperDTO implements Serializable { // 实现Serializable接口表示该类的对象可以被序列化
private static final long serialVersionUID = 1L; // 序列化版本ID用于序列化和反序列化操作
@ApiModelProperty(value = "试卷ID", required=true) @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String id; private String id; // 试卷ID
@Dict(dictTable = "sys_user", dicText = "real_name", dicCode = "id") @Dict(dictTable = "sys_user", dicText = "real_name", dicCode = "id") // 字典表映射,映射用户表的姓名字段
@ApiModelProperty(value = "用户ID", required=true) @ApiModelProperty(value = "用户ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String userId; private String userId; // 用户ID
@Dict(dictTable = "sys_depart", dicText = "dept_name", dicCode = "id") @Dict(dictTable = "sys_depart", dicText = "dept_name", dicCode = "id") // 字典表映射,映射部门表的部门名称字段
@ApiModelProperty(value = "部门ID", required=true) @ApiModelProperty(value = "部门ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String departId; private String departId; // 部门ID
@ApiModelProperty(value = "规则ID", required=true) @ApiModelProperty(value = "规则ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String examId; private String examId; // 规则ID表示该试卷对应的考试规则
@ApiModelProperty(value = "考试标题", required=true) @ApiModelProperty(value = "考试标题", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String title; private String title; // 考试标题,表示试卷的名称
@ApiModelProperty(value = "考试时长", required=true) @ApiModelProperty(value = "考试时长", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer totalTime; private Integer totalTime; // 考试时长(单位:分钟)
@ApiModelProperty(value = "用户时长", required=true) @ApiModelProperty(value = "用户时长", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer userTime; private Integer userTime; // 用户已使用的时间(单位:分钟)
@ApiModelProperty(value = "试卷总分", required=true) @ApiModelProperty(value = "试卷总分", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer totalScore; private Integer totalScore; // 试卷总分
@ApiModelProperty(value = "及格分", required=true) @ApiModelProperty(value = "及格分", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer qualifyScore; private Integer qualifyScore; // 及格分数
@ApiModelProperty(value = "客观分", required=true) @ApiModelProperty(value = "客观分", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer objScore; private Integer objScore; // 客观题分数
@ApiModelProperty(value = "主观分", required=true) @ApiModelProperty(value = "主观分", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer subjScore; private Integer subjScore; // 主观题分数
@ApiModelProperty(value = "用户得分", required=true) @ApiModelProperty(value = "用户得分", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer userScore; private Integer userScore; // 用户得分
@ApiModelProperty(value = "是否包含简答题", required=true) @ApiModelProperty(value = "是否包含简答题", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Boolean hasSaq; private Boolean hasSaq; // 是否包含简答题,布尔类型,表示该试卷是否有简答题
@ApiModelProperty(value = "试卷状态", required=true) @ApiModelProperty(value = "试卷状态", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer state; private Integer state; // 试卷状态,表示试卷的当前状态,如未开始、进行中、已结束等
@ApiModelProperty(value = "创建时间", required=true) @ApiModelProperty(value = "创建时间", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Date createTime; private Date createTime; // 创建时间,表示试卷的创建时间
@ApiModelProperty(value = "更新时间", required=true) @ApiModelProperty(value = "更新时间", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Date updateTime; private Date updateTime; // 更新时间,表示试卷的最后更新时间
@ApiModelProperty(value = "截止时间") @ApiModelProperty(value = "截止时间") // Swagger注解描述该字段在API文档中的含义
private Date limitTime; private Date limitTime; // 截止时间,表示考试的最后提交时间
} }

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入Serializable接口用于对象序列化
import java.io.Serializable; import java.io.Serializable;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * IDID
* @author *
* @since 2020-05-25 17:31 *
*/ * @author
@Data * @since 2020-05-25 17:31
@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") */
public class PaperQuAnswerDTO implements Serializable { @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") // Swagger注解用于描述该类在API文档中的作用和说明
private static final long serialVersionUID = 1L; public class PaperQuAnswerDTO implements Serializable { // 实现Serializable接口表示该类的对象可以被序列化
private static final long serialVersionUID = 1L; // 序列化版本ID用于序列化和反序列化操作
@ApiModelProperty(value = "自增ID", required=true) @ApiModelProperty(value = "自增ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String id; private String id; // 自增ID表示备选答案的唯一标识符
@ApiModelProperty(value = "试卷ID", required=true) @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String paperId; private String paperId; // 试卷ID表示该备选答案所属的试卷
@ApiModelProperty(value = "回答项ID", required=true) @ApiModelProperty(value = "回答项ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String answerId; private String answerId; // 回答项ID表示该备选答案的唯一标识符
@ApiModelProperty(value = "题目ID", required=true) @ApiModelProperty(value = "题目ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String quId; private String quId; // 题目ID表示该备选答案所属的题目
@ApiModelProperty(value = "是否正确项", required=true) @ApiModelProperty(value = "是否正确项", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Boolean isRight; private Boolean isRight; // 是否正确项,布尔值,表示该备选答案是否是正确答案
@ApiModelProperty(value = "是否选中", required=true) @ApiModelProperty(value = "是否选中", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Boolean checked; private Boolean checked; // 是否选中,布尔值,表示该备选答案是否已被选中
@ApiModelProperty(value = "排序", required=true) @ApiModelProperty(value = "排序", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer sort; private Integer sort; // 排序,表示该备选答案在题目中的排序位置
@ApiModelProperty(value = "选项标签", required=true) @ApiModelProperty(value = "选项标签", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String abc; private String abc; // 选项标签,通常为 A、B、C、D 等,表示该备选答案的标识符
} }

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入Serializable接口用于对象序列化
import java.io.Serializable; import java.io.Serializable;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * IDID
* @author *
* @since 2020-05-25 17:31 * @author
*/ * @since 2020-05-25 17:31
@Data */
@ApiModel(value="试卷考题", description="试卷考题") @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
public class PaperQuDTO implements Serializable { @ApiModel(value="试卷考题", description="试卷考题") // Swagger注解用于描述该类在API文档中的作用和说明
public class PaperQuDTO implements Serializable { // 实现Serializable接口表示该类的对象可以被序列化
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L; // 序列化版本ID用于序列化和反序列化操作
@ApiModelProperty(value = "ID", required=true) @ApiModelProperty(value = "ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String id; private String id; // 题目ID唯一标识符
@ApiModelProperty(value = "试卷ID", required=true) @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String paperId; private String paperId; // 试卷ID表示该题目所属的试卷
@ApiModelProperty(value = "题目ID", required=true) @ApiModelProperty(value = "题目ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String quId; private String quId; // 题目ID唯一标识该题目
@ApiModelProperty(value = "题目类型", required=true) @ApiModelProperty(value = "题目类型", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer quType; private Integer quType; // 题目类型,表示题目的分类,如选择题、判断题、主观题等
@ApiModelProperty(value = "是否已答", required=true) @ApiModelProperty(value = "是否已答", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Boolean answered; private Boolean answered; // 是否已答,布尔值,表示该题目是否已被回答
@ApiModelProperty(value = "主观答案", required=true) @ApiModelProperty(value = "主观答案", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String answer; private String answer; // 主观答案,表示对该题目的回答内容(适用于主观题)
@ApiModelProperty(value = "问题排序", required=true) @ApiModelProperty(value = "问题排序", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer sort; private Integer sort; // 问题排序,表示该题目在试卷中的顺序
@ApiModelProperty(value = "单题分分值", required=true) @ApiModelProperty(value = "单题分分值", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer score; private Integer score; // 单题分值,表示该题目的满分
@ApiModelProperty(value = "实际得分(主观题)", required=true) @ApiModelProperty(value = "实际得分(主观题)", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer actualScore; private Integer actualScore; // 实际得分,表示用户在该题目中实际得到的分数(适用于主观题)
@ApiModelProperty(value = "是否答对", required=true) @ApiModelProperty(value = "是否答对", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Boolean isRight; private Boolean isRight; // 是否答对,布尔值,表示用户是否答对了该题目
} }

@ -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; import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * PaperQuAnswerDTO
* @author * @author
* @since 2020-05-25 17:31 * @since 2020-05-25 17:31
*/ */
@Data @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") @ApiModel(value="试卷考题备选答案", description="试卷考题备选答案") // Swagger注解描述模型信息生成API文档时使用
public class PaperQuAnswerExtDTO extends PaperQuAnswerDTO { public class PaperQuAnswerExtDTO extends PaperQuAnswerDTO { // 继承自PaperQuAnswerDTO类扩展了额外属性
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化时的版本控制
@ApiModelProperty(value = "试题图片", required=true) @ApiModelProperty(value = "试题图片", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String image; private String image; // 试题对应的图片内容
@ApiModelProperty(value = "答案内容", required=true) @ApiModelProperty(value = "答案内容", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String content; private String content; // 备选答案的具体内容
} }

@ -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; import com.yf.exam.modules.paper.dto.PaperQuDTO;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入List集合用于存储多个备选答案
import java.util.List; import java.util.List;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * PaperQuDTO
* @author * @author
* @since 2020-05-25 17:31 * @since 2020-05-25 17:31
*/ */
@Data @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="试卷题目详情类", description="试卷题目详情类") @ApiModel(value="试卷题目详情类", description="试卷题目详情类") // Swagger注解用于描述该类在API文档中的作用和说明
public class PaperQuDetailDTO extends PaperQuDTO { public class PaperQuDetailDTO extends PaperQuDTO { // 继承自PaperQuDTO类扩展了额外属性
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化时的版本控制
@ApiModelProperty(value = "图片", required=true) @ApiModelProperty(value = "图片", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String image; private String image; // 题目的图片内容
@ApiModelProperty(value = "题目内容", required=true) @ApiModelProperty(value = "题目内容", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String content; private String content; // 试题的具体内容
@ApiModelProperty(value = "答案内容", required=true) @ApiModelProperty(value = "答案内容", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
List<PaperQuAnswerExtDTO> answerList; private List<PaperQuAnswerExtDTO> answerList; // 存储该题目的备选答案使用List集合存储多个答案
} }

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入List集合用于存储多个答案
import java.util.List; import java.util.List;
/** /**
* @author bool * @author bool
*
* PaperQuQueryDTO
*/ */
@Data @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") @ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") // Swagger注解用于描述该类在API文档中的作用和说明
public class PaperAnswerDTO extends PaperQuQueryDTO { public class PaperAnswerDTO extends PaperQuQueryDTO { // 继承自PaperQuQueryDTO类扩展了额外属性
@ApiModelProperty(value = "回答列表", required=true)
private List<String> answers;
@ApiModelProperty(value = "主观答案", required=true) @ApiModelProperty(value = "回答列表", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String answer; private List<String> answers; // 存储多个选择题答案的列表
@ApiModelProperty(value = "主观答案", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String answer; // 存储主观题的答案内容
} }

@ -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; import com.yf.exam.core.api.dto.BaseDTO;
// 引入Jackson注解用于处理JSON序列化时忽略某些字段
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
/** /**
* @author bool * @author bool
* IDID
*/ */
@Data @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="试卷创建请求类", description="试卷创建请求类") @ApiModel(value="试卷创建请求类", description="试卷创建请求类") // Swagger注解用于描述该类在API文档中的作用和说明
public class PaperCreateReqDTO extends BaseDTO { public class PaperCreateReqDTO extends BaseDTO { // 继承自BaseDTO类扩展了考试ID和用户ID字段
@JsonIgnore @JsonIgnore // Jackson注解表示在进行JSON序列化/反序列化时忽略该字段
private String userId; private String userId; // 存储用户ID通常用于标识发起请求的用户但在JSON序列化中不会被传递
@ApiModelProperty(value = "考试ID", required=true)
private String examId;
@ApiModelProperty(value = "考试ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String examId; // 存储考试ID用于创建试卷时指定关联的考试
} }

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入Serializable接口用于对象序列化
import java.io.Serializable; import java.io.Serializable;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * IDIDID
*
* @author * @author
* @since 2020-05-25 17:31 * @since 2020-05-25 17:31
*/ */
@Data @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="试卷", description="试卷") @ApiModel(value="试卷", description="试卷") // Swagger注解描述该类在API文档中的作用和说明
public class PaperListReqDTO implements Serializable { public class PaperListReqDTO implements Serializable { // 实现Serializable接口支持对象的序列化
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID", required=true) private static final long serialVersionUID = 1L; // 序列化版本号,用于序列化和反序列化时的版本控制
private String userId;
@ApiModelProperty(value = "部门ID", required=true) @ApiModelProperty(value = "用户ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String departId; private String userId; // 存储请求发起者的用户ID通常用于标识用户
@ApiModelProperty(value = "规则ID", required=true) @ApiModelProperty(value = "部门ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String examId; private String departId; // 存储请求者所在部门的ID用于查询特定部门的试卷
@ApiModelProperty(value = "用户昵称", required=true) @ApiModelProperty(value = "规则ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String realName; private String examId; // 存储与试卷相关的考试规则ID用于标识试卷属于哪种考试
@ApiModelProperty(value = "试卷状态", required=true) @ApiModelProperty(value = "用户昵称", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer state; private String realName; // 存储用户的真实姓名,用于标识请求者
@ApiModelProperty(value = "试卷状态", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private Integer state; // 存储试卷的状态,可能的值如:未开始、进行中、已完成等
} }

@ -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; import com.yf.exam.core.api.dto.BaseDTO;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
/** /**
* @author bool * @author bool
*
* IDID
*/ */
@Data @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") @ApiModel(value="查找试卷题目详情请求类", description="查找试卷题目详情请求类") // Swagger注解用于描述该类在API文档中的作用和说明
public class PaperQuQueryDTO extends BaseDTO { public class PaperQuQueryDTO extends BaseDTO { // 继承自BaseDTO类扩展了试卷ID和题目ID字段
@ApiModelProperty(value = "试卷ID", required=true) @ApiModelProperty(value = "试卷ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String paperId; private String paperId; // 存储试卷ID用于查询特定试卷的题目详情
@ApiModelProperty(value = "题目ID", required=true)
private String quId;
@ApiModelProperty(value = "题目ID", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String quId; // 存储题目ID用于查询指定试卷中的某一道题目
} }

@ -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; import com.yf.exam.modules.paper.dto.PaperDTO;
// 引入PaperQuDTO类用于表示试题的DTO
import com.yf.exam.modules.paper.dto.PaperQuDTO; import com.yf.exam.modules.paper.dto.PaperQuDTO;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入Calendar类用于时间计算
import java.util.Calendar; import java.util.Calendar;
// 引入List集合用于存储试题列表
import java.util.List; import java.util.List;
@Data /**
@ApiModel(value="考试详情", description="考试详情") * <p>
public class ExamDetailRespDTO extends PaperDTO { *
* </p>
* PaperDTO
*
*/
@Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="考试详情", description="考试详情") // Swagger注解用于描述该类在API文档中的作用和说明
public class ExamDetailRespDTO extends PaperDTO { // 继承自PaperDTO表示考试详情响应DTO
@ApiModelProperty(value = "单选题列表", required=true) @ApiModelProperty(value = "单选题列表", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private List<PaperQuDTO> radioList; private List<PaperQuDTO> radioList; // 存储单选题的列表使用PaperQuDTO表示单个试题
@ApiModelProperty(value = "多选题列表", required=true) @ApiModelProperty(value = "多选题列表", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private List<PaperQuDTO> multiList; private List<PaperQuDTO> multiList; // 存储多选题的列表使用PaperQuDTO表示单个试题
@ApiModelProperty(value = "判断题", required=true) @ApiModelProperty(value = "判断题", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private List<PaperQuDTO> judgeList; private List<PaperQuDTO> judgeList; // 存储判断题的列表使用PaperQuDTO表示单个试题
@ApiModelProperty(value = "剩余结束秒数", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
@ApiModelProperty(value = "剩余结束秒数", required=true) public Long getLeftSeconds(){ // 计算剩余时间的方法,返回剩余的秒数
public Long getLeftSeconds(){
// 结束时间 // 结束时间
Calendar cl = Calendar.getInstance(); Calendar cl = Calendar.getInstance(); // 获取当前时间的Calendar实例
cl.setTime(this.getCreateTime()); cl.setTime(this.getCreateTime()); // 设置Calendar的时间为试卷的创建时间
cl.add(Calendar.MINUTE, getTotalTime()); cl.add(Calendar.MINUTE, getTotalTime()); // 在创建时间的基础上加上试卷的总时间(分钟)
return (cl.getTimeInMillis() - System.currentTimeMillis()) / 1000; // 计算剩余时间(单位:秒)
return (cl.getTimeInMillis() - System.currentTimeMillis()) / 1000; // 返回剩余时间(当前时间到结束时间的差值,以秒为单位)
} }
} }

@ -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; import com.yf.exam.modules.paper.dto.PaperDTO;
// 引入PaperQuDetailDTO类用于表示试题详细信息
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入List集合用于存储试题列表
import java.util.List; import java.util.List;
@Data /**
@ApiModel(value="考试结果展示响应类", description="考试结果展示响应类") * <p>
public class ExamResultRespDTO extends PaperDTO { *
* </p>
* PaperDTO
*
*/
@Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
@ApiModel(value="考试结果展示响应类", description="考试结果展示响应类") // Swagger注解用于描述该类在API文档中的作用和说明
public class ExamResultRespDTO extends PaperDTO { // 继承自PaperDTO表示考试结果展示响应DTO
@ApiModelProperty(value = "问题列表", required=true) @ApiModelProperty(value = "问题列表", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private List<PaperQuDetailDTO> quList; private List<PaperQuDetailDTO> quList; // 存储试题详细信息的列表使用PaperQuDetailDTO表示每个试题的详细数据
} }

@ -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; import com.yf.exam.modules.paper.dto.PaperDTO;
// 引入Swagger注解用于API文档生成
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * PaperDTOrealName
* @author *
* @since 2020-05-25 17:31 *
*/ * @author
@Data * @since 2020-05-25 17:31
@ApiModel(value="试卷列表响应类", description="试卷列表响应类") */
public class PaperListRespDTO extends PaperDTO { @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) @ApiModelProperty(value = "人员", required=true) // Swagger注解描述该字段在API文档中的含义并标注该字段为必填项
private String realName; private String realName; // 存储人员姓名,用于表示与该试卷相关的人员信息
} }

@ -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.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.activerecord.Model;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 引入Date类用于时间相关的字段
import java.util.Date; import java.util.Date;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * `el_paper`
* @author *
* @since 2020-05-25 17:31 * @author
*/ * @since 2020-05-25 17:31
@Data */
@TableName("el_paper") @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
public class Paper extends Model<Paper> { @TableName("el_paper") // MyBatis Plus注解指定该实体类对应的数据库表名
public class Paper extends Model<Paper> { // 继承MyBatis Plus的Model类提供了CRUD等基础操作
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L; // 序列化版本ID用于序列化和反序列化操作
/** /**
* ID * ID
*/ */
@TableId(value = "id", type = IdType.ASSIGN_ID) @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解指定主键字段及其生成策略
private String id; private String id; // 试卷ID唯一标识符
/** /**
* ID * ID
*/ */
@TableField("user_id") @TableField("user_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String userId; private String userId; // 用户ID表示创建该试卷的用户
/** /**
* ID * ID
*/ */
@TableField("depart_id") @TableField("depart_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String departId; private String departId; // 部门ID表示该试卷所属的部门
/** /**
* ID * ID
*/ */
@TableField("exam_id") @TableField("exam_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String examId; private String examId; // 规则ID表示该试卷所属的考试规则
/** /**
* *
*/ */
private String title; private String title; // 考试标题,表示试卷的名称或标题
/** /**
* *
*/ */
@TableField("total_time") @TableField("total_time") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer totalTime; private Integer totalTime; // 考试时长,单位为分钟
/** /**
* *
*/ */
@TableField("user_time") @TableField("user_time") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer userTime; private Integer userTime; // 用户实际用时,单位为分钟
/** /**
* *
*/ */
@TableField("total_score") @TableField("total_score") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer totalScore; private Integer totalScore; // 试卷的总分数
/** /**
* *
*/ */
@TableField("qualify_score") @TableField("qualify_score") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer qualifyScore; private Integer qualifyScore; // 及格分数,表示通过该试卷的最低分数
/** /**
* *
*/ */
@TableField("obj_score") @TableField("obj_score") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer objScore; private Integer objScore; // 客观题部分的得分
/** /**
* *
*/ */
@TableField("subj_score") @TableField("subj_score") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer subjScore; private Integer subjScore; // 主观题部分的得分
/** /**
* *
*/ */
@TableField("user_score") @TableField("user_score") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer userScore; private Integer userScore; // 用户在该试卷上的得分
/** /**
* *
*/ */
@TableField("has_saq") @TableField("has_saq") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Boolean hasSaq;
/**
*
*/
private Integer state;
/**
*
*/
@TableField("create_time")
private Date createTime;
/**
*
*/
@TableField("update_time")
private Date updateTime;
/**
*
*/
@TableField("limit_time")
private Date limitTime;
}

@ -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.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.activerecord.Model;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * `el_paper_qu`
* @author *
* @since 2020-05-25 17:31 * @author
*/ * @since 2020-05-25 17:31
@Data */
@TableName("el_paper_qu") @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
public class PaperQu extends Model<PaperQu> { @TableName("el_paper_qu") // MyBatis Plus注解指定该实体类对应的数据库表名
public class PaperQu extends Model<PaperQu> { // 继承MyBatis Plus的Model类提供了基础的CRUD等操作
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L; // 序列化版本ID用于序列化和反序列化操作
/** /**
* ID * ID
*/ */
@TableId(value = "id", type = IdType.ASSIGN_ID) @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解指定主键字段及其生成策略
private String id; private String id; // 题目ID唯一标识符
/** /**
* ID * ID
*/ */
@TableField("paper_id") @TableField("paper_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String paperId; private String paperId; // 试卷ID表示该题目所属的试卷ID
/** /**
* ID * ID
*/ */
@TableField("qu_id") @TableField("qu_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String quId; private String quId; // 题目ID唯一标识符
/** /**
* *
*/ */
@TableField("qu_type") @TableField("qu_type") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer quType; 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") @TableField("actual_score") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Integer actualScore; private Integer actualScore; // 主观题的实际得分,可能与用户给出的答案相关
/** /**
* *
*/ */
@TableField("is_right") @TableField("is_right") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Boolean isRight; private Boolean isRight; // 是否答对,布尔值,表示用户是否答对了该题目
} }

@ -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.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.activerecord.Model;
// 引入Lombok注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
/** /**
* <p> * <p>
* *
* </p> * </p>
* * `el_paper_qu_answer`
* @author *
* @since 2020-05-25 17:31 * @author
*/ * @since 2020-05-25 17:31
@Data */
@TableName("el_paper_qu_answer") @Data // Lombok注解自动生成getter、setter、toString、equals和hashCode方法
public class PaperQuAnswer extends Model<PaperQuAnswer> { @TableName("el_paper_qu_answer") // MyBatis Plus注解指定该实体类对应的数据库表名
public class PaperQuAnswer extends Model<PaperQuAnswer> { // 继承MyBatis Plus的Model类提供了基础的CRUD等操作
private static final long serialVersionUID = 1L; // 序列化版本ID用于序列化和反序列化操作
/** /**
* ID * ID
*/ */
@TableId(value = "id", type = IdType.ASSIGN_ID) @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解指定主键字段及其生成策略
private String id; private String id; // 唯一标识符ID数据库中的主键
/** /**
* ID * ID
*/ */
@TableField("paper_id") @TableField("paper_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String paperId; private String paperId; // 该备选答案对应的试卷ID
/** /**
* ID * ID
*/ */
@TableField("answer_id") @TableField("answer_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String answerId; private String answerId; // 该备选答案的唯一标识符ID
/** /**
* ID * ID
*/ */
@TableField("qu_id") @TableField("qu_id") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private String quId; private String quId; // 该备选答案所属的题目ID
/** /**
* *
*/ */
@TableField("is_right") @TableField("is_right") // MyBatis Plus注解指定字段与数据库表字段的映射关系
private Boolean isRight; 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等用于显示选项
} }

@ -1,33 +1,38 @@
package com.yf.exam.modules.paper.enums; package com.yf.exam.modules.paper.enums; // 定义当前类所在的包路径
/** /**
* * <p>
* @author bool *
* </p>
* 使
*
* @author bool
* @date 2019-10-30 13:11 * @date 2019-10-30 13:11
*/ */
public interface ExamState { public interface ExamState {
/** /**
* *
*
*/ */
Integer ENABLE = 0; Integer ENABLE = 0;
/** /**
* *
*
*/ */
Integer DISABLED = 1; Integer DISABLED = 1;
/** /**
* *
*
*/ */
Integer READY_START = 2; Integer READY_START = 2;
/** /**
* *
*
*/ */
Integer OVERDUE = 3; Integer OVERDUE = 3;
} }

@ -1,33 +1,38 @@
package com.yf.exam.modules.paper.enums; package com.yf.exam.modules.paper.enums; // 定义当前类所在的包路径
/** /**
* * <p>
* @author bool *
* </p>
* 使
*
* @author bool
* @date 2019-10-30 13:11 * @date 2019-10-30 13:11
*/ */
public interface PaperState { public interface PaperState {
/** /**
* *
*
*/ */
Integer ING = 0; Integer ING = 0;
/** /**
* *
*
*/ */
Integer WAIT_OPT = 1; Integer WAIT_OPT = 1;
/** /**
* *
*
*/ */
Integer FINISHED = 2; Integer FINISHED = 2;
/** /**
* *
* 退
*/ */
Integer BREAK = 3; Integer BREAK = 3;
} }

@ -1,45 +1,61 @@
package com.yf.exam.modules.paper.job; package com.yf.exam.modules.paper.job; // 定义类所在的包路径
import com.yf.exam.ability.job.service.JobService; import com.yf.exam.ability.job.service.JobService; // 导入 JobService 类,用于获取任务数据
import com.yf.exam.modules.paper.service.PaperService; import com.yf.exam.modules.paper.service.PaperService; // 导入 PaperService 类,用于处理试卷相关的业务逻辑
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2; // 引入 log4j2 日志工具
import org.quartz.Job; import org.quartz.Job; // 导入 Quartz 作业接口
import org.quartz.JobDetail; import org.quartz.JobDetail; // 导入 Quartz JobDetail 类
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext; // 导入 Quartz JobExecutionContext 类
import org.quartz.JobExecutionException; import org.quartz.JobExecutionException; // 导入 Quartz JobExecutionException 类
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired; // 引入 Spring 注解,用于自动注入依赖
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component; // 引入 Spring 组件注解,标识为 Spring Bean
/** /**
* *
* <p>
* Quartz
* PaperService
* </p>
*
* @author bool * @author bool
*/ */
@Log4j2 @Log4j2 // 启用 log4j2 日志记录
@Component @Component // 标识该类为一个 Spring 组件Spring 会自动将其注册为 Bean
public class BreakExamJob implements Job { public class BreakExamJob implements Job {
// 自动注入 PaperService用于处理与试卷相关的业务逻辑
@Autowired @Autowired
private PaperService paperService; private PaperService paperService;
/**
*
*
* <p>
* Quartz
* PaperService
* </p>
*
* @param jobExecutionContext Quartz
* @throws JobExecutionException
*/
@Override @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail detail = jobExecutionContext.getJobDetail(); // 从 jobExecutionContext 中获取任务的详细信息
String name = detail.getKey().getName(); JobDetail detail = jobExecutionContext.getJobDetail(); // 获取任务详情
String group = detail.getKey().getGroup(); String name = detail.getKey().getName(); // 获取任务名称
String group = detail.getKey().getGroup(); // 获取任务分组
// 获取任务的附加数据,通常是任务触发时的相关参数
String data = String.valueOf(detail.getJobDataMap().get(JobService.TASK_DATA)); String data = String.valueOf(detail.getJobDataMap().get(JobService.TASK_DATA));
// 打印任务执行日志,便于调试和跟踪
log.info("++++++++++定时任务:处理到期的交卷"); log.info("++++++++++定时任务:处理到期的交卷");
log.info("++++++++++jobName:{}", name); log.info("++++++++++jobName:{}", name);
log.info("++++++++++jobGroup:{}", group); log.info("++++++++++jobGroup:{}", group);
log.info("++++++++++taskData:{}", data); log.info("++++++++++taskData:{}", data);
// 调用 PaperService 进行强制交卷操作
// 强制交卷 // data 参数通常是考试 ID 或者某种标识符,用于识别需要交卷的考试
paperService.handExam(data); paperService.handExam(data);
} }
} }

@ -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.mapper.BaseMapper; // 引入 MyBatis-Plus 的 BaseMapper
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage; // 引入分页结果接口 IPage
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 引入分页插件 Page
import com.yf.exam.modules.paper.dto.PaperDTO; import com.yf.exam.modules.paper.dto.PaperDTO; // 引入 DTO 类,表示试卷数据传输对象
import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; // 引入请求 DTO 类,表示查询试卷时的请求参数
import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; import com.yf.exam.modules.paper.dto.response.PaperListRespDTO; // 引入响应 DTO 类,表示查询试卷时的响应结果
import com.yf.exam.modules.paper.entity.Paper; import com.yf.exam.modules.paper.entity.Paper; // 引入实体类,表示试卷数据表中的记录
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param; // 引入 MyBatis 注解,用于指定 SQL 查询中的参数
import java.util.List; import java.util.List;
/** /**
* <p> * <p>
* Mapper * Mapper
* </p> * </p>
* *
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
*/ */
public interface PaperMapper extends BaseMapper<Paper> { public interface PaperMapper extends BaseMapper<Paper> { // 继承 MyBatis-Plus 提供的 BaseMapper自动实现 CRUD 操作
/** /**
* *
* @param page * <p>
* @param query * `Page` `PaperListReqDTO`
* @return * </p>
*
* @param page
* @param query ID ID
* @return `IPage<PaperListRespDTO>`
*/ */
IPage<PaperListRespDTO> paging(Page page, @Param("query") PaperListReqDTO query); IPage<PaperListRespDTO> paging(Page page, @Param("query") PaperListReqDTO query);
/** /**
* *
* @param query * <p>
* @return *
* </p>
*
* @param query ID ID
* @return `List<PaperListRespDTO>` DTO
*/ */
List<PaperListRespDTO> list(@Param("query") PaperDTO query); List<PaperListRespDTO> list(@Param("query") PaperDTO query);
} }

@ -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; // 导入BaseMapper接口提供通用的CRUD操作
import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yf.exam.modules.paper.entity.PaperQuAnswer; // 导入PaperQuAnswerExtDTO类表示试卷考题备选答案的扩展数据传输对象
import org.apache.ibatis.annotations.Param; 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;
/** /**
* <p> * <p>
* Mapper * Mapper
* </p> * </p>
* * MyBatis-PlusBaseMapperCRUD
*
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
*/ */
public interface PaperQuAnswerMapper extends BaseMapper<PaperQuAnswer> { public interface PaperQuAnswerMapper extends BaseMapper<PaperQuAnswer> { // 继承自BaseMapper接口提供了所有的基本CRUD操作
/** /**
* *
* @param paperId * @param paperId ID
* @param quId * @param quId ID
* @return * @return IDID
*/ */
List<PaperQuAnswerExtDTO> list(@Param("paperId") String paperId, @Param("quId") String quId); List<PaperQuAnswerExtDTO> list(@Param("paperId") String paperId, @Param("quId") String quId); // 根据试卷ID和题目ID查询对应的备选答案列表
} }

@ -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; // 导入BaseMapper接口提供MyBatis-Plus的通用CRUD操作
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yf.exam.modules.paper.entity.PaperQu; // 导入PaperQuDetailDTO类表示试卷考题详细数据传输对象
import org.apache.ibatis.annotations.Param; 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;
/** /**
* <p> * <p>
* Mapper * Mapper
* </p> * </p>
* * MyBatis-PlusBaseMapperCRUD
*
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
*/ */
public interface PaperQuMapper extends BaseMapper<PaperQu> { public interface PaperQuMapper extends BaseMapper<PaperQu> { // 继承自BaseMapper接口提供通用的CRUD操作
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return
*/ */
int sumObjective(@Param("paperId") String paperId); int sumObjective(@Param("paperId") String paperId); // 根据试卷ID统计所有客观题的分数总和
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return
*/ */
int sumSubjective(@Param("paperId") String paperId); int sumSubjective(@Param("paperId") String paperId); // 根据试卷ID统计所有主观题的分数总和
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return PaperQuDetailDTO
*/ */
List<PaperQuDetailDTO> listByPaper(@Param("paperId") String paperId); List<PaperQuDetailDTO> listByPaper(@Param("paperId") String paperId); // 根据试卷ID查询所有试题的详细信息
} }

@ -1,18 +1,20 @@
// 导入所需的包
package com.yf.exam.modules.paper.service; package com.yf.exam.modules.paper.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页查询
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService; // 用于继承通用服务接口
import com.yf.exam.core.api.dto.PagingReqDTO; import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO
import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; // 试卷问题答案DTO
import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; // 扩展的试卷问题答案DTO
import com.yf.exam.modules.paper.entity.PaperQuAnswer; import com.yf.exam.modules.paper.entity.PaperQuAnswer; // 试卷问题答案实体类
import java.util.List; import java.util.List; // 导入List类用于处理集合数据
/** /**
* <p> * <p>
* *
* </p> * </p>
*
* *
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
@ -21,24 +23,24 @@ public interface PaperQuAnswerService extends IService<PaperQuAnswer> {
/** /**
* *
* @param reqDTO * @param reqDTO DTO
* @return * @return PaperQuAnswerDTO
*/ */
IPage<PaperQuAnswerDTO> paging(PagingReqDTO<PaperQuAnswerDTO> reqDTO); IPage<PaperQuAnswerDTO> paging(PagingReqDTO<PaperQuAnswerDTO> reqDTO);
/** /**
* *
* @param paperId * @param paperId ID
* @param quId * @param quId ID
* @return * @return PaperQuAnswerExtDTO
*/ */
List<PaperQuAnswerExtDTO> listForExam(String paperId, String quId); List<PaperQuAnswerExtDTO> listForExam(String paperId, String quId);
/** /**
* *
* @param paperId * @param paperId ID
* @param quId * @param quId ID
* @return * @return PaperQuAnswer
*/ */
List<PaperQuAnswer> listForFill(String paperId, String quId); List<PaperQuAnswer> listForFill(String paperId, String quId);
} }

@ -1,18 +1,20 @@
// 导入所需的包
package com.yf.exam.modules.paper.service; package com.yf.exam.modules.paper.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页查询
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService; // 用于继承通用服务接口
import com.yf.exam.core.api.dto.PagingReqDTO; import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO
import com.yf.exam.modules.paper.dto.PaperQuDTO; import com.yf.exam.modules.paper.dto.PaperQuDTO; // 试卷问题DTO
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; // 试卷问题详情DTO
import com.yf.exam.modules.paper.entity.PaperQu; import com.yf.exam.modules.paper.entity.PaperQu; // 试卷问题实体类
import java.util.List; import java.util.List; // 导入List类用于处理集合数据
/** /**
* <p> * <p>
* *
* </p> * </p>
*
* *
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
@ -21,50 +23,50 @@ public interface PaperQuService extends IService<PaperQu> {
/** /**
* *
* @param reqDTO * @param reqDTO DTO
* @return * @return PaperQuDTO
*/ */
IPage<PaperQuDTO> paging(PagingReqDTO<PaperQuDTO> reqDTO); IPage<PaperQuDTO> paging(PagingReqDTO<PaperQuDTO> reqDTO);
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return PaperQuDTO
*/ */
List<PaperQuDTO> listByPaper(String paperId); List<PaperQuDTO> listByPaper(String paperId);
/** /**
* *
* @param paperId * @param paperId ID
* @param quId * @param quId ID
* @return * @return PaperQu
*/ */
PaperQu findByKey(String paperId, String quId); PaperQu findByKey(String paperId, String quId);
/** /**
* *
* @param qu * @param qu
*/ */
void updateByKey(PaperQu qu); void updateByKey(PaperQu qu);
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return
*/ */
int sumObjective(String paperId); int sumObjective(String paperId);
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return
*/ */
int sumSubjective(String paperId); int sumSubjective(String paperId);
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return PaperQuDetailDTO
*/ */
List<PaperQuDetailDTO> listForPaperResult(String paperId); List<PaperQuDetailDTO> listForPaperResult(String paperId);
} }

@ -1,21 +1,23 @@
// 导入所需的包
package com.yf.exam.modules.paper.service; package com.yf.exam.modules.paper.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage; // 用于分页查询
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService; // 用于继承通用服务接口
import com.yf.exam.core.api.dto.PagingReqDTO; import com.yf.exam.core.api.dto.PagingReqDTO; // 分页请求DTO
import com.yf.exam.modules.paper.dto.PaperDTO; import com.yf.exam.modules.paper.dto.PaperDTO; // 试卷DTO
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; // 试卷题目详情DTO
import com.yf.exam.modules.paper.dto.request.PaperAnswerDTO; import com.yf.exam.modules.paper.dto.request.PaperAnswerDTO; // 提交答案请求DTO
import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; import com.yf.exam.modules.paper.dto.request.PaperListReqDTO; // 试卷列表请求DTO
import com.yf.exam.modules.paper.dto.response.ExamDetailRespDTO; import com.yf.exam.modules.paper.dto.response.ExamDetailRespDTO; // 考试详情响应DTO
import com.yf.exam.modules.paper.dto.response.ExamResultRespDTO; 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.dto.response.PaperListRespDTO; // 试卷列表响应DTO
import com.yf.exam.modules.paper.entity.Paper; import com.yf.exam.modules.paper.entity.Paper; // 试卷实体类
/** /**
* <p> * <p>
* *
* </p> * </p>
*
* *
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
@ -24,60 +26,57 @@ public interface PaperService extends IService<Paper> {
/** /**
* *
* @param userId * @param userId ID
* @param examId * @param examId ID
* @return * @return ID
*/ */
String createPaper(String userId, String examId); String createPaper(String userId, String examId);
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return ExamDetailRespDTO
*/ */
ExamDetailRespDTO paperDetail(String paperId); ExamDetailRespDTO paperDetail(String paperId);
/** /**
* *
* @param paperId * @param paperId ID
* @return * @return ExamResultRespDTO
*/ */
ExamResultRespDTO paperResult(String paperId); ExamResultRespDTO paperResult(String paperId);
/** /**
* *
* @param paperId * @param paperId ID
* @param quId * @param quId ID
* @return * @return PaperQuDetailDTO
*/ */
PaperQuDetailDTO findQuDetail(String paperId, String quId); PaperQuDetailDTO findQuDetail(String paperId, String quId);
/** /**
* *
* @param reqDTO * @param reqDTO DTO
*/ */
void fillAnswer(PaperAnswerDTO reqDTO); void fillAnswer(PaperAnswerDTO reqDTO);
/** /**
* *
* @param paperId * @param paperId ID
* @return
*/ */
void handExam(String paperId); void handExam(String paperId);
/** /**
* *
* @param reqDTO * @param reqDTO DTO
* @return * @return IPage<PaperListRespDTO>
*/ */
IPage<PaperListRespDTO> paging(PagingReqDTO<PaperListReqDTO> reqDTO); IPage<PaperListRespDTO> paging(PagingReqDTO<PaperListReqDTO> reqDTO);
/** /**
* *
* @param userId * @param userId ID
* @return * @return PaperDTO
*/ */
PaperDTO checkProcess(String userId); PaperDTO checkProcess(String userId);
} }

@ -1,61 +1,95 @@
package com.yf.exam.modules.paper.service.impl; package com.yf.exam.modules.paper.service.impl; // 指定该类所在的包路径
import com.alibaba.fastjson.JSON; // 导入FastJSON库用于处理JSON格式数据的转换
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.metadata.IPage; // 导入MyBatis-Plus的条件查询构造器
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入分页接口
import com.yf.exam.core.api.dto.PagingReqDTO; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yf.exam.modules.paper.dto.PaperQuAnswerDTO; // 导入分页Page类
import com.yf.exam.modules.paper.dto.ext.PaperQuAnswerExtDTO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yf.exam.modules.paper.entity.PaperQuAnswer; // 导入MyBatis-Plus的服务实现类
import com.yf.exam.modules.paper.mapper.PaperQuAnswerMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yf.exam.modules.paper.service.PaperQuAnswerService; // 导入分页请求DTO用于分页查询
import org.springframework.stereotype.Service; import com.yf.exam.core.api.dto.PagingReqDTO;
// 导入试卷考题备选答案DTO类
import java.util.List; 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接口用于返回多个结果
/** /**
* <p> * <p>
* *
* </p> * </p>
* * PaperQuAnswerService
*
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
*/ */
@Service @Service // 标注为Spring的服务类
public class PaperQuAnswerServiceImpl extends ServiceImpl<PaperQuAnswerMapper, PaperQuAnswer> implements PaperQuAnswerService { public class PaperQuAnswerServiceImpl extends ServiceImpl<PaperQuAnswerMapper, PaperQuAnswer> implements PaperQuAnswerService { // 继承ServiceImpl类提供基本的数据库操作功能
/**
*
* @param reqDTO
* @return
*/
@Override @Override
public IPage<PaperQuAnswerDTO> paging(PagingReqDTO<PaperQuAnswerDTO> reqDTO) { public IPage<PaperQuAnswerDTO> paging(PagingReqDTO<PaperQuAnswerDTO> reqDTO) {
//创建分页对象 // 创建分页对象
IPage<PaperQuAnswer> query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); IPage<PaperQuAnswer> query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize());
//查询条件 // 查询条件,可以根据需要添加更多过滤条件
QueryWrapper<PaperQuAnswer> wrapper = new QueryWrapper<>(); QueryWrapper<PaperQuAnswer> wrapper = new QueryWrapper<>();
//获得数据 // 执行分页查询操作
IPage<PaperQuAnswer> page = this.page(query, wrapper); IPage<PaperQuAnswer> page = this.page(query, wrapper);
//转换结果
// 将查询结果转换为DTO对象返回分页后的结果
IPage<PaperQuAnswerDTO> pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference<Page<PaperQuAnswerDTO>>(){}); IPage<PaperQuAnswerDTO> pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference<Page<PaperQuAnswerDTO>>(){});
return pageData;
} return pageData; // 返回分页结果
}
/**
* IDID
* @param paperId ID
* @param quId ID
* @return DTO
*/
@Override @Override
public List<PaperQuAnswerExtDTO> listForExam(String paperId, String quId) { public List<PaperQuAnswerExtDTO> listForExam(String paperId, String quId) {
// 调用Mapper中的list方法查询并返回试题的备选答案列表
return baseMapper.list(paperId, quId); return baseMapper.list(paperId, quId);
} }
/**
*
* @param paperId ID
* @param quId ID
* @return
*/
@Override @Override
public List<PaperQuAnswer> listForFill(String paperId, String quId) { public List<PaperQuAnswer> listForFill(String paperId, String quId) {
//查询条件 // 创建查询条件
QueryWrapper<PaperQuAnswer> wrapper = new QueryWrapper<>(); QueryWrapper<PaperQuAnswer> wrapper = new QueryWrapper<>();
wrapper.lambda() wrapper.lambda() // 使用Lambda表达式进行条件构造
.eq(PaperQuAnswer::getPaperId, paperId) .eq(PaperQuAnswer::getPaperId, paperId) // 通过试卷ID过滤
.eq(PaperQuAnswer::getQuId, quId); .eq(PaperQuAnswer::getQuId, quId); // 通过题目ID过滤
// 查询并返回符合条件的结果列表
return this.list(wrapper); return this.list(wrapper);
} }
} }

@ -1,94 +1,150 @@
package com.yf.exam.modules.paper.service.impl; package com.yf.exam.modules.paper.service.impl; // 指定该类所在的包路径
import com.alibaba.fastjson.JSON; // 导入FastJSON库用于处理JSON格式数据的转换
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.metadata.IPage; // 导入MyBatis-Plus的条件查询构造器
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入分页接口
import com.yf.exam.core.api.dto.PagingReqDTO; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yf.exam.core.utils.BeanMapper; // 导入分页Page类
import com.yf.exam.modules.paper.dto.PaperQuDTO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yf.exam.modules.paper.dto.ext.PaperQuDetailDTO; // 导入MyBatis-Plus的服务实现类
import com.yf.exam.modules.paper.entity.PaperQu; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yf.exam.modules.paper.mapper.PaperQuMapper; // 导入分页请求DTO用于分页查询
import com.yf.exam.modules.paper.service.PaperQuService; import com.yf.exam.core.api.dto.PagingReqDTO;
import org.springframework.stereotype.Service; // 导入BeanMapper工具类用于对象间的转换
import com.yf.exam.core.utils.BeanMapper;
import java.util.List; // 导入试卷考题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接口用于返回多个结果
/** /**
* <p> * <p>
* *
* </p> * </p>
* * PaperQuService
*
* @author * @author
* @since 2020-05-25 16:33 * @since 2020-05-25 16:33
*/ */
@Service @Service // 标注为Spring的服务类
public class PaperQuServiceImpl extends ServiceImpl<PaperQuMapper, PaperQu> implements PaperQuService { public class PaperQuServiceImpl extends ServiceImpl<PaperQuMapper, PaperQu> implements PaperQuService { // 继承ServiceImpl类提供基本的数据库操作功能
/**
*
* @param reqDTO
* @return
*/
@Override @Override
public IPage<PaperQuDTO> paging(PagingReqDTO<PaperQuDTO> reqDTO) { public IPage<PaperQuDTO> paging(PagingReqDTO<PaperQuDTO> reqDTO) {
//创建分页对象 // 创建分页对象
IPage<PaperQu> query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); IPage<PaperQu> query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize());
//查询条件 // 查询条件
QueryWrapper<PaperQu> wrapper = new QueryWrapper<>(); QueryWrapper<PaperQu> wrapper = new QueryWrapper<>();
//获得数据 // 执行分页查询操作
IPage<PaperQu> page = this.page(query, wrapper); IPage<PaperQu> page = this.page(query, wrapper);
//转换结果
// 将查询结果转换为DTO对象返回分页后的结果
IPage<PaperQuDTO> pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference<Page<PaperQuDTO>>(){}); IPage<PaperQuDTO> pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference<Page<PaperQuDTO>>(){});
return pageData;
} return pageData; // 返回分页结果
}
/**
* ID
* @param paperId ID
* @return DTO
*/
@Override @Override
public List<PaperQuDTO> listByPaper(String paperId) { public List<PaperQuDTO> listByPaper(String paperId) {
//查询条件 // 查询条件
QueryWrapper<PaperQu> wrapper = new QueryWrapper<>(); QueryWrapper<PaperQu> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(PaperQu::getPaperId, paperId) wrapper.lambda().eq(PaperQu::getPaperId, paperId) // 通过试卷ID过滤
.orderByAsc(PaperQu::getSort); .orderByAsc(PaperQu::getSort); // 按照题目排序字段升序排列
// 执行查询,获取试卷考题列表
List<PaperQu> list = this.list(wrapper); List<PaperQu> list = this.list(wrapper);
// 使用BeanMapper工具类将实体对象列表转换为DTO对象列表
return BeanMapper.mapList(list, PaperQuDTO.class); return BeanMapper.mapList(list, PaperQuDTO.class);
} }
/**
* IDID
* @param paperId ID
* @param quId ID
* @return
*/
@Override @Override
public PaperQu findByKey(String paperId, String quId) { public PaperQu findByKey(String paperId, String quId) {
//查询条件 // 查询条件
QueryWrapper<PaperQu> wrapper = new QueryWrapper<>(); QueryWrapper<PaperQu> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(PaperQu::getPaperId, paperId) wrapper.lambda().eq(PaperQu::getPaperId, paperId) // 通过试卷ID过滤
.eq(PaperQu::getQuId, quId); .eq(PaperQu::getQuId, quId); // 通过题目ID过滤
return this.getOne(wrapper, false); // 获取匹配的单个试卷考题对象
return this.getOne(wrapper, false); // 返回查询到的结果false表示未查询到时返回null
} }
/**
* IDID
* @param qu
*/
@Override @Override
public void updateByKey(PaperQu qu) { public void updateByKey(PaperQu qu) {
//查询条件 // 查询条件
QueryWrapper<PaperQu> wrapper = new QueryWrapper<>(); QueryWrapper<PaperQu> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(PaperQu::getPaperId, qu.getPaperId()) wrapper.lambda().eq(PaperQu::getPaperId, qu.getPaperId()) // 通过试卷ID过滤
.eq(PaperQu::getQuId, qu.getQuId()); .eq(PaperQu::getQuId, qu.getQuId()); // 通过题目ID过滤
this.update(qu, wrapper); // 执行更新操作
this.update(qu, wrapper); // 更新满足条件的试卷考题
} }
/**
*
* @param paperId ID
* @return
*/
@Override @Override
public int sumObjective(String paperId) { public int sumObjective(String paperId) {
return baseMapper.sumObjective(paperId); return baseMapper.sumObjective(paperId); // 调用Mapper方法统计客观题总分
} }
/**
*
* @param paperId ID
* @return
*/
@Override @Override
public int sumSubjective(String paperId) { public int sumSubjective(String paperId) {
return baseMapper.sumSubjective(paperId); return baseMapper.sumSubjective(paperId); // 调用Mapper方法统计主观题总分
} }
/**
* ID
* @param paperId ID
* @return
*/
@Override @Override
public List<PaperQuDetailDTO> listForPaperResult(String paperId) { public List<PaperQuDetailDTO> listForPaperResult(String paperId) {
return baseMapper.listByPaper(paperId); return baseMapper.listByPaper(paperId); // 调用Mapper方法获取试卷考题详细信息
} }
} }

Loading…
Cancel
Save