Merge pull request “更新注释文档”(#4) from feature/qzw into develop

pull/10/head
秦泽旺 6 days ago committed by 王奕辉
parent 639a68ab6a
commit 17358e7026

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
</component> </component>
</project> </project>

@ -1,15 +1,17 @@
// 指定当前类所在的包路径这是Java中组织类的一种方式有助于类的管理和访问控制。
package lsgwr.exam; package lsgwr.exam;
// 导入Spring Boot的启动类和应用配置自动装配的注解类。
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
// @SpringBootApplication是一个方便的注解它包括了@Configuration@EnableAutoConfiguration和@ComponentScan注解。
/** // 它告诉Spring Boot基于当前类所在包及其子包下的组件来启动自动配置和组件扫描。
* Spring BootSpring Boot
*/
@SpringBootApplication @SpringBootApplication
public class ExamApplication { public class ExamApplication {
// main方法是Java应用程序的入口点。当运行这个类时JVM会调用这个方法。
public static void main(String[] args) { public static void main(String[] args)
{
// SpringApplication.run方法启动Spring应用传入ExamApplication.class当前启动类和main方法的参数args。
// 这个方法会执行一系列的操作包括启动Spring容器加载应用上下文自动配置等。
SpringApplication.run(ExamApplication.class, args); SpringApplication.run(ExamApplication.class, args);
} }
} }

@ -138,6 +138,7 @@ ResultVO<QuestionSelectionVo> getSelections() {
} catch (Exception e) { } catch (Exception e) {
// 如果获取失败则打印异常信息并返回ResultVO对象状态码为-1提示信息为"获取问题详情失败"数据为null。 // 如果获取失败则打印异常信息并返回ResultVO对象状态码为-1提示信息为"获取问题详情失败"数据为null。
e.printStackTrace(); e.printStackTrace();
// 创建一个表示获取失败的ResultVO对象状态码设置为 -1表示获取操作失败消息设置为"获取问题详情失败"数据部分设置为null
resultVO = new ResultVO<>(-1, "获取问题详情失败", null); resultVO = new ResultVO<>(-1, "获取问题详情失败", null);
} }
// 返回ResultVO对象。 // 返回ResultVO对象。
@ -199,24 +200,22 @@ ResultVO<QuestionSelectionVo> getSelections() {
@PostMapping("/create") @PostMapping("/create")
@ApiOperation("创建考试") @ApiOperation("创建考试")
ResultVO<Exam> createExam(@RequestBody ExamCreateVo examCreateVo, HttpServletRequest request) { ResultVO<Exam> createExam(@RequestBody ExamCreateVo examCreateVo, HttpServletRequest request) {
// 从前端传参数过来,在这里完成考试的入库。 // 定义一个ResultVO类型的变量用于存放最终要返回给客户端的结果对象其泛型参数指定为Exam表示包含新创建考试相关信息的结果封装
ResultVO<Exam> resultVO; ResultVO<Exam> resultVO;
// 获取当前用户的id。 // 从HttpServletRequest对象中获取用户ID信息通常这个用户ID是在请求处理的前置环节比如拦截器中设置到请求属性中的用于标识创建这个考试的用户是谁
String userId = (String) request.getAttribute("user_id"); String userId = (String) request.getAttribute("user_id");
try { try {
// 调用examService的create方法将examCreateVo和userId作为参数传入创建考试。 // 调用ExamService的create方法将创建考试的视图对象examCreateVo和获取到的用户ID传递进去由服务层实现将考试记录数据保存到数据库等具体的创建逻辑操作返回创建好的Exam对象代表新创建的考试信息
Exam exam = examService.create(examCreateVo, userId); Exam exam = examService.create(examCreateVo, userId);
// 创建一个ResultVO对象将创建成功的考试信息返回。 // 如果创建成功创建一个表示成功的ResultVO对象状态码设置为0表示创建操作成功消息设置为"创建考试成功"并将创建好的考试对象放入ResultVO对象中返回给客户端
resultVO = new ResultVO<>(0, "创建考试成功", exam); resultVO = new ResultVO<>(0, "创建考试成功", exam);
} catch (Exception e) { } catch (Exception e) {
// 捕获异常打印异常信息并创建一个ResultVO对象将创建失败的考试信息返回。
e.printStackTrace(); e.printStackTrace();
// 如果在创建过程中出现异常创建一个表示创建失败的ResultVO对象状态码设置为 -1表示创建操作失败消息设置为"创建考试失败"数据部分设置为null
resultVO = new ResultVO<>(-1, "创建考试失败", null); resultVO = new ResultVO<>(-1, "创建考试失败", null);
} }
// 返回ResultVO对象。
return resultVO; return resultVO;
} }
/** /**
* @Description: 使examService.updateExam(),ResultVO, * @Description: 使examService.updateExam(),ResultVO,
* @param examVo * @param examVo
@ -243,7 +242,6 @@ ResultVO<QuestionSelectionVo> getSelections() {
} }
return resultVO; return resultVO;
} }
/** /**
* @Description: * @Description:
* @return ResultVO<List<ExamCardVo>> * @return ResultVO<List<ExamCardVo>>
@ -256,17 +254,16 @@ ResultVO<QuestionSelectionVo> getSelections() {
try { try {
// 调用examService的getExamCardList方法获取考试列表卡片。 // 调用examService的getExamCardList方法获取考试列表卡片。
List<ExamCardVo> examCardVoList = examService.getExamCardList(); List<ExamCardVo> examCardVoList = examService.getExamCardList();
// 如果获取成功,则返回成功的结果 // 如果获取数据成功创建一个表示成功的ResultVO对象状态码设置为0表示获取考试列表卡片成功消息设置为"获取考试列表卡片成功"并将获取到的考试卡片列表数据放入ResultVO对象中以便返回给客户端进行展示
resultVO = new ResultVO<>(0, "获取考试列表卡片成功", examCardVoList); resultVO = new ResultVO<>(0, "获取考试列表卡片成功", examCardVoList);
} catch (Exception e) { } catch (Exception e) {
// 如果获取失败,则打印异常信息,并返回失败的结果。 // 如果获取失败,则打印异常信息,并返回失败的结果。
e.printStackTrace(); e.printStackTrace();
// 创建一个表示获取失败的ResultVO对象状态码设置为 -1表示获取考试列表卡片失败消息可根据业务实际情况设置为相应的提示语数据部分设置为null因为没有成功获取到有效的考试卡片列表数据。
resultVO = new ResultVO<>(-1, "获取考试列表卡片失败", null); resultVO = new ResultVO<>(-1, "获取考试列表卡片失败", null);
} }
// 返回结果
return resultVO; return resultVO;
} }
/** /**
* @Description: id * @Description: id
* @param id id * @param id id
@ -275,17 +272,19 @@ ResultVO<QuestionSelectionVo> getSelections() {
@GetMapping("/detail/{id}") @GetMapping("/detail/{id}")
@ApiOperation("根据考试的id获取考试详情") @ApiOperation("根据考试的id获取考试详情")
ResultVO<ExamDetailVo> getExamDetail(@PathVariable String id) { ResultVO<ExamDetailVo> getExamDetail(@PathVariable String id) {
// 根据id获取考试详情 // 根据id获取考试详情先定义一个用于存放最终要返回给客户端的ResultVO<ExamDetailVo>类型的结果对象,后续根据查询数据的情况进行赋值操作
ResultVO<ExamDetailVo> resultVO; ResultVO<ExamDetailVo> resultVO;
try { try {
// 调用ExamService的getExamDetail方法将接收到的考卷唯一标识符id传递进去由服务层实现从数据库或者其他数据源根据该ID查询对应考卷详细信息的逻辑返回一个ExamDetailVo对象代表该考卷的所有详细信息。
ExamDetailVo examDetail = examService.getExamDetail(id); ExamDetailVo examDetail = examService.getExamDetail(id);
// 如果获取详细信息成功创建一个表示成功的ResultVO对象状态码设置为0表示获取考试详情成功消息设置为"获取考试详情成功"并将获取到的考卷详细信息对象放入ResultVO对象中以便返回给客户端进行展示。
resultVO = new ResultVO<>(0, "获取考试详情成功", examDetail); resultVO = new ResultVO<>(0, "获取考试详情成功", examDetail);
} catch (Exception e) { } catch (Exception e) {
// 如果在获取考卷详细信息的过程中出现异常创建一个表示获取失败的ResultVO对象状态码设置为 -1表示获取考试详情失败消息可根据业务实际情况设置为相应的提示语数据部分设置为null因为没有成功获取到有效的考卷详细信息。
resultVO = new ResultVO<>(-1, "获取考试详情失败", null); resultVO = new ResultVO<>(-1, "获取考试详情失败", null);
} }
return resultVO; return resultVO;
} }
/** /**
* @Description: 使examService.finishExam,ResultVO, * @Description: 使examService.finishExam,ResultVO,
* @param examId id * @param examId id
@ -295,25 +294,24 @@ ResultVO<QuestionSelectionVo> getSelections() {
*/ */
@PostMapping("/finish/{examId}") @PostMapping("/finish/{examId}")
@ApiOperation("根据用户提交的答案对指定id的考试判分") @ApiOperation("根据用户提交的答案对指定id的考试判分")
// 完成考试
ResultVO<ExamRecord> finishExam(@PathVariable String examId, @RequestBody HashMap<String, List<String>> answersMap, HttpServletRequest request) { ResultVO<ExamRecord> finishExam(@PathVariable String examId, @RequestBody HashMap<String, List<String>> answersMap, HttpServletRequest request) {
// 定义返回结果。 // 定义一个用于存放结果的ResultVO<ExamRecord>类型的数据结构,后续根据评分操作的成功与否以及获取到的相关数据进行赋值,用于最终返回给客户端展示评分结果。
ResultVO<ExamRecord> resultVO; ResultVO<ExamRecord> resultVO;
try { try {
// 拦截器里设置上的用户id // 拦截器里设置上的用户id从HttpServletRequest对象中获取用户ID属性值该用户ID用于标识当前提交答案并进行评分的用户是后续业务逻辑处理如记录答题记录归属、判断是否有权限答题等的重要依据
String userId = (String) request.getAttribute("user_id"); String userId = (String) request.getAttribute("user_id");
// 下面根据用户提交的信息进行判分,返回用户的得分情况 // 下面根据用户提交的信息进行判分返回用户的得分情况调用ExamService的judge方法传入获取到的用户ID、考试唯一标识符examId以及用户提交的答案集合answersMap由服务层实现具体的评分逻辑比如对比答案、计算得分等操作并返回一个ExamRecord对象包含了评分后的成绩记录等详细信息
ExamRecord examRecord = examService.judge(userId, examId, answersMap); ExamRecord examRecord = examService.judge(userId, examId, answersMap);
// 返回结果。 // 封装成绩记录到最终结果中创建一个表示评分成功的ResultVO对象状态码设置为0表示考卷提交评分成功消息设置为"考卷提交成功"并将包含成绩记录的ExamRecord对象放入ResultVO对象中以便返回给客户端展示评分结果。
resultVO = new ResultVO<>(0, "考卷提交成功", examRecord); resultVO = new ResultVO<>(0, "考卷提交成功", examRecord);// 封装成绩记录到最终结果中
} catch (Exception e) { } catch (Exception e) {
// 如果在评分过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,查看是答案解析出错还是其他业务逻辑环节出现的错误导致评分失败。
e.printStackTrace(); e.printStackTrace();
// 返回错误结果 // 创建一个表示评分失败的ResultVO对象状态码设置为 -1表示考卷提交评分失败消息可根据业务实际情况设置为相应的提示语数据部分设置为null因为没有成功获取到有效的评分成绩记录
resultVO = new ResultVO<>(-1, "考卷提交失败", null); resultVO = new ResultVO<>(-1, "考卷提交失败", null);
} }
return resultVO; return resultVO;
} }
/** /**
* @Description: 使examService.getExamRecordList,ResultVO, * @Description: 使examService.getExamRecordList,ResultVO,
* @param request id * @param request id
@ -321,22 +319,24 @@ ResultVO<QuestionSelectionVo> getSelections() {
*/ */
@GetMapping("/record/list") @GetMapping("/record/list")
@ApiOperation("获取当前用户的考试记录") @ApiOperation("获取当前用户的考试记录")
// 获取考试记录列表。
ResultVO<List<ExamRecordVo>> getExamRecordList(HttpServletRequest request) { ResultVO<List<ExamRecordVo>> getExamRecordList(HttpServletRequest request) {
// 定义一个用于存放结果的ResultVO<List<ExamRecordVo>>类型的数据结构,后续根据查询用户考试记录操作的成功与否以及获取到的相关数据进行赋值,用于最终返回给客户端展示查询结果。
ResultVO<List<ExamRecordVo>> resultVO; ResultVO<List<ExamRecordVo>> resultVO;
try { try {
// 拦截器里设置上的用户id // 拦截器里设置上的用户id从HttpServletRequest对象中获取用户ID属性值该用户ID用于明确要查询其考试记录的目标用户是服务层准确获取对应数据的关键依据
String userId = (String) request.getAttribute("user_id"); String userId = (String) request.getAttribute("user_id");
// 下面根据用户账号拿到他(她所有的考试信息)注意要用VO封装下 // 下面根据用户账号拿到他所有的考试信息注意要用VO封装下调用ExamService的getExamRecordList方法传入获取到的用户ID由服务层实现从数据库或者其他数据源获取该用户所有历史考试记录数据的逻辑并将其整理封装成List<ExamRecordVo>类型的列表返回每个ExamRecordVo对象包含了如时间、得分等详细信息
List<ExamRecordVo> examRecordVoList = examService.getExamRecordList(userId); List<ExamRecordVo> examRecordVoList = examService.getExamRecordList(userId);
resultVO = new ResultVO<>(0, "获取考试记录成功", examRecordVoList); // 封装查询得到的信息到最终结果中创建一个表示获取成功的ResultVO对象状态码设置为0表示获取考试记录成功消息设置为"获取考试记录成功"并将获取到的用户考试记录列表数据放入ResultVO对象中以便返回给客户端展示历史考试记录情况。
resultVO = new ResultVO<>(0, "获取考试记录成功", examRecordVoList);//封装查询得到的信息到最终结果中;
} catch (Exception e) { } catch (Exception e) {
// 如果在获取用户考试记录数据的过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,查看是数据源查询出错还是数据封装等环节出现的错误导致获取失败。
e.printStackTrace(); e.printStackTrace();
// 创建一个表示获取失败的ResultVO对象状态码设置为 -1表示获取考试记录失败消息可根据业务实际情况设置为相应的提示语数据部分设置为null因为没有成功获取到有效的用户考试记录数据。
resultVO = new ResultVO<>(-1, "获取考试记录失败", null); resultVO = new ResultVO<>(-1, "获取考试记录失败", null);
} }
return resultVO; return resultVO;//返回封装好的 数据结构
} }
/** /**
* @Description: 使examService.getExamRecordDetail,ResultVO,id * @Description: 使examService.getExamRecordDetail,ResultVO,id
* @param recordId id * @param recordId id
@ -345,20 +345,24 @@ ResultVO<QuestionSelectionVo> getSelections() {
@GetMapping("/record/detail/{recordId}") @GetMapping("/record/detail/{recordId}")
@ApiOperation("根据考试记录id获取考试记录详情") @ApiOperation("根据考试记录id获取考试记录详情")
ResultVO<RecordDetailVo> getExamRecordDetail(@PathVariable String recordId) { ResultVO<RecordDetailVo> getExamRecordDetail(@PathVariable String recordId) {
// 定义返回结果。 // 定义一个用于存放结果的ResultVO<RecordDetailVo>类型的数据结构,后续根据查询测验详细情况操作的成功与否以及获取到的相关数据进行赋值,用于最终返回给客户端展示查询结果。
ResultVO<RecordDetailVo> resultVO; ResultVO<RecordDetailVo> resultVO;
try { try {
// 调用examService获取考试记录详情 // 调用ExamService的getRecordDetail方法将接收到的测验记录唯一标识符recordId传递进去由服务层实现从数据库或者其他数据源根据该ID查询对应测验详细信息的逻辑返回一个RecordDetailVo对象代表该次测验的所有详细信息
RecordDetailVo recordDetailVo = examService.getRecordDetail(recordId); RecordDetailVo recordDetailVo = examService.getRecordDetail(recordId);
// 返回成功结果 // 封装查询得到的信息到最终结果中创建一个表示获取成功的ResultVO对象状态码设置为0表示获取考试记录详情成功消息设置为"获取考试记录详情成功"并将获取到的测验详细信息对象放入ResultVO对象中以便返回给客户端展示该次测验的详细情况
resultVO = new ResultVO<>(0, "获取考试记录详情成功", recordDetailVo); resultVO = new ResultVO<>(0, "获取考试记录详情成功", recordDetailVo);//封装查询得到的信息到最终结果中;
} catch (Exception e) { } catch (Exception e) {
// 打印异常信息。 // 如果在获取测验详细信息的过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,查看是数据源查询出错还是数据解析等环节出现的错误导致获取失败
e.printStackTrace(); e.printStackTrace();
// 返回失败结果。 // 创建一个ResultVO对象表示操作失败
// 状态码设置为-1表示获取考试记录详情失败
// 消息设置为"获取考试记录详情失败"
// 由于查询失败详细信息对象设置为null
resultVO = new ResultVO<>(-1, "获取考试记录详情失败", null); resultVO = new ResultVO<>(-1, "获取考试记录详情失败", null);
} }
// 返回结果。 // 返回封装好的ResultVO对象给客户端
// 客户端可以根据状态码和消息判断操作是否成功,并根据详细信息对象获取测验的详细记录信息
return resultVO; return resultVO;
} }
} }

@ -4,51 +4,60 @@
* @date : 2019/5/14 07:42 * @date : 2019/5/14 07:42
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
// 定义包名,用于组织类文件,避免命名冲突
package lsgwr.exam.entity; package lsgwr.exam.entity;
// 导入Jackson库的JsonFormat注解用于JSON序列化时自定义日期格式
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Lombok库的Data注解用于自动生成getter、setter、equals、hashCode和toString方法
import lombok.Data; import lombok.Data;
// 导入Hibernate的DynamicUpdate注解用于在实体更新时只更新发生变化的字段
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
// 导入JPA的Entity注解用于声明该类是一个JPA实体类
import javax.persistence.Entity; import javax.persistence.Entity;
// 导入JPA的Id注解用于声明该类中的某个字段作为主键
import javax.persistence.Id; import javax.persistence.Id;
// 导入Java的Date类用于表示日期和时间
import java.util.Date; import java.util.Date;
@Entity @Entity
@Data @Data
@DynamicUpdate @DynamicUpdate
public class Exam { public class Exam {
// 使用JPA的@Id注解声明该字段为主键
@Id @Id
private String examId; private String examId;// 考试ID唯一标识一场考试
private String examName; private String examName;// 考试名称
private String examAvatar; private String examAvatar; // 考试头像或图标
private String examDescription; private String examDescription;// 考试描述或简介
private String examQuestionIds; private String examQuestionIds;// 存储所有问题ID的字符串可能是逗号分隔的ID列表
private String examQuestionIdsRadio; private String examQuestionIdsRadio;// 存储所有单选题ID的字符串
private String examQuestionIdsCheck; private String examQuestionIdsCheck;// 存储所有多选题ID的字符串
private String examQuestionIdsJudge; private String examQuestionIdsJudge;// 存储所有判断题ID的字符串
private Integer examScore; private Integer examScore;// 考试总分
private Integer examScoreRadio; private Integer examScoreRadio;// 单选题总分
private Integer examScoreCheck; private Integer examScoreCheck;// 多选题总分
private Integer examScoreJudge; private Integer examScoreJudge;// 判断题总分
private String examCreatorId; private String examCreatorId;// 创建者ID标识谁创建了这场考试
private Integer examTimeLimit; private Integer examTimeLimit;// 考试时间限制,单位可能是分钟
// 考试开始时间使用Jackson的@JsonFormat注解自定义日期格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date examStartDate; private Date examStartDate;
// 考试结束时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date examEndDate; private Date examEndDate;
/** /**
* , Java * Java
* 使Jackson@JsonFormat便
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; private Date createTime;
/** /**
* Java * Java
* @DynamicUpdate * 使Hibernate@DynamicUpdate
* 使Jackson@JsonFormat便
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime; private Date updateTime;

@ -7,42 +7,44 @@
package lsgwr.exam.entity; package lsgwr.exam.entity;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;// 引入Jackson库用于日期格式化的注解
import lombok.Data; import lombok.Data;// 引入Lombok库用于简化Java实体类的编写如自动生成getter和setter方法
import javax.persistence.Entity; import javax.persistence.Entity;// 引入JPA注解用于标识这是一个实体类并映射到数据库中的一张表
// 引入JPA注解用于标识实体类的主键字段
import javax.persistence.Id; import javax.persistence.Id;
import java.util.Date; import java.util.Date;
// 使用@Data注解自动生成getter和setter方法以及toString、equals和hashCode方法
@Data @Data
// 使用@Entity注解标识这是一个JPA实体类
@Entity @Entity
public class ExamRecord { public class ExamRecord {
/** /**
* *
*/ */
@Id @Id
private String examRecordId; private String examRecordId;
/** /**
* id * ID
*/ */
private String examId; private String examId;
/** /**
* (_-), * 线_线-
*/ */
private String answerOptionIds; private String answerOptionIds;
/** /**
* userid * IDID
*/ */
private String examJoinerId; private String examJoinerId;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date examJoinDate; private Date examJoinDate;
/** /**
* () *
*/ */
private Integer examTimeCost; private Integer examTimeCost;
/** /**
@ -50,7 +52,7 @@ public class ExamRecord {
*/ */
private Integer examJoinScore; private Integer examJoinScore;
/** /**
* *
*/ */
private Integer examResultLevel; private Integer examResultLevel;
} }

@ -7,18 +7,22 @@
package lsgwr.exam.entity; package lsgwr.exam.entity;
import lombok.Data; import lombok.Data;// 引入Lombok库中的@Data注解用于自动生成getter、setter、toString、equals和hashCode方法
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Entity;// 引入JPAJava Persistence API中的@Entity注解标识这是一个实体类与数据库中的表相对应
import javax.persistence.GeneratedValue;// 引入JPA中的@GeneratedValue注解用于指定主键的生成策略这里未明确指定策略将使用默认策略
import javax.persistence.Id;// 引入JPA中的@Id注解标识实体类的主键字段
// 使用@Data注解自动生成getter、setter等方法
@Data @Data
// 使用@Entity注解标识这是一个JPA实体类
@Entity @Entity
public class ExamRecordLevel { public class ExamRecordLevel {
// 考试记录等级的ID是主键通过@Id注解标识并通过@GeneratedValue注解指定主键生成策略
@Id @Id
@GeneratedValue @GeneratedValue
private Integer examRecordLevelId; private Integer examRecordLevelId;
// 考试记录等级的名称,用于标识等级,如“优秀”、“良好”等
private String examRecordLevelName; private String examRecordLevelName;
// 考试记录等级的描述,用于对等级进行更详细的说明
private String examRecordLevelDescription; private String examRecordLevelDescription;
} }

@ -11,13 +11,16 @@ import lombok.Getter;
@Getter @Getter
public class ExamException extends RuntimeException { public class ExamException extends RuntimeException {
// 定义异常码
private Integer code; private Integer code;
// 构造函数,传入枚举类型
public ExamException(ResultEnum resultEnum) { public ExamException(ResultEnum resultEnum) {
super(resultEnum.getMessage()); super(resultEnum.getMessage());
this.code = resultEnum.getCode(); this.code = resultEnum.getCode();
} }
// 构造函数,传入异常码和异常信息
public ExamException( Integer code, String message) { public ExamException( Integer code, String message) {
super(message); super(message);
this.code = code; this.code = code;

@ -9,5 +9,6 @@ package lsgwr.exam.repository;
import lsgwr.exam.entity.ExamRecordLevel; import lsgwr.exam.entity.ExamRecordLevel;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
// ExamRecordLevelRepository接口继承JpaRepository接口用于操作ExamRecordLevel实体类
public interface ExamRecordLevelRepository extends JpaRepository<ExamRecordLevel, Integer> { public interface ExamRecordLevelRepository extends JpaRepository<ExamRecordLevel, Integer> {
} }

@ -1,9 +1,3 @@
/***********************************************************
* @Description :
* @author : 广(Laing Shan Guang)
* @date : 2019-05-14 08:23
* @email : liangshanguang2@gmail.com
***********************************************************/
package lsgwr.exam.repository; package lsgwr.exam.repository;
import lsgwr.exam.entity.ExamRecord; import lsgwr.exam.entity.ExamRecord;

@ -12,7 +12,9 @@ import org.springframework.data.jpa.repository.Query;
import java.util.List; import java.util.List;
// ExamRepository接口继承JpaRepository接口用于操作Exam实体类
public interface ExamRepository extends JpaRepository<Exam, String> { public interface ExamRepository extends JpaRepository<Exam, String> {
// 使用JPQL查询语句查询Exam实体类按照updateTime降序排列
@Query("select e from Exam e order by e.updateTime desc") @Query("select e from Exam e order by e.updateTime desc")
List<Exam> findAll(); List<Exam> findAll();
} }

@ -4,15 +4,15 @@
* @date : 2019-05-28 08:05 * @date : 2019-05-28 08:05
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.service; package lsgwr.exam.service;// 定义了接口所属的包名
import lsgwr.exam.entity.Exam; import lsgwr.exam.entity.Exam;// 导入了实体类Exam可能包含考试的基本信息
import lsgwr.exam.entity.ExamRecord; import lsgwr.exam.entity.ExamRecord;// 导入了实体类ExamRecord可能包含考试记录的详细信息
import lsgwr.exam.vo.*; import lsgwr.exam.vo.*;// 导入了VO对象VO是值对象用于在不同层之间传递数据
import java.util.HashMap;
import java.util.List;
import java.util.HashMap;// 导入了HashMap用于存储键值对
import java.util.List;// 导入了List用于存储一系列对象
// 定义了一个名为ExamService的接口
public interface ExamService { public interface ExamService {
/** /**
* *

@ -1,3 +1,9 @@
/***********************************************************
* @Description :
* @author : 广(Laing Shan Guang)
* @date : 2019-06-23 19:30
* @email : liangshanguang2@gmail.com
***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
@ -10,9 +16,6 @@ import lombok.Data;
*/ */
@Data @Data
public class ExamCardVo { public class ExamCardVo {
/**
* ID
*/
@JsonProperty("id") @JsonProperty("id")
private String examId; private String examId;
/** /**
@ -34,10 +37,10 @@ public class ExamCardVo {
* *
*/ */
@JsonProperty("score") @JsonProperty("score")
private Integer examScore; private Integer examScore;// 考试的分数
/** /**
* *
*/ */
@JsonProperty("elapse") @JsonProperty("elapse")
private Integer examTimeLimit; private Integer examTimeLimit;// 考试的时间限制,以分钟为单位
} }

@ -5,60 +5,63 @@
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;
// 引入Jackson库中的注解用于JSON序列化和反序列化时自定义属性名
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
// 引入Lombok库中的@Data注解它会自动为你的类的字段生成getter和setter方法以及toString、equals和hashCode方法
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
// 使用@Data注解来自动生成getter、setter等方法
@Data @Data
public class ExamCreateVo { public class ExamCreateVo {
// 考试名称,通过@JsonProperty注解指定JSON字段名为"name"
@JsonProperty("name") @JsonProperty("name")
private String examName; private String examName;
// 考试头像或图标,通过@JsonProperty注解指定JSON字段名为"avatar"
@JsonProperty("avatar") @JsonProperty("avatar")
private String examAvatar; private String examAvatar;
// 考试描述,通过@JsonProperty注解指定JSON字段名为"desc"
@JsonProperty("desc") @JsonProperty("desc")
private String examDescription; private String examDescription;
/** /**
* * @JsonPropertyJSON"elapse"
*
*/ */
@JsonProperty("elapse") @JsonProperty("elapse")
private Integer examTimeLimit; private Integer examTimeLimit;
/** /**
* * 使List<ExamQuestionSelectVo>
* ExamQuestionSelectVoVO
*/ */
private List<ExamQuestionSelectVo> radios; private List<ExamQuestionSelectVo> radios;
/** /**
* * 使List<ExamQuestionSelectVo>
*/ */
private List<ExamQuestionSelectVo> checks; private List<ExamQuestionSelectVo> checks;
/** /**
* * 使List<ExamQuestionSelectVo>
*/ */
private List<ExamQuestionSelectVo> judges; private List<ExamQuestionSelectVo> judges;
/** /**
* * @JsonPropertyJSON"radioScore"
*/ */
@JsonProperty("radioScore") @JsonProperty("radioScore")
private Integer examScoreRadio; private Integer examScoreRadio;
/** /**
* * @JsonPropertyJSON"checkScore"
*/ */
@JsonProperty("checkScore") @JsonProperty("checkScore")
private Integer examScoreCheck; private Integer examScoreCheck;
/** /**
* * @JsonPropertyJSON"judgeScore"
*/ */
@JsonProperty("judgeScore") @JsonProperty("judgeScore")
private Integer examScoreJudge; private Integer examScoreJudge;

@ -5,29 +5,42 @@
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;
// 引入Exam实体类它可能包含了考试的详细信息如考试ID、名称、描述等
import lsgwr.exam.entity.Exam; import lsgwr.exam.entity.Exam;
// 引入Lombok库的@Data注解用于自动生成getter、setter等方法
import lombok.Data; import lombok.Data;
// 使用@Data注解来自动生成这个类的getter、setter等方法
@Data @Data
public class ExamDetailVo { public class ExamDetailVo {
/** /**
* *
* Exam
* ID
* ExamDetailVoExam
*/ */
private Exam exam; private Exam exam;
/** /**
* id * id
* ID
*
* ID
*/ */
private String[] radioIds; private String[] radioIds;
/** /**
* id * id
* idID
*
*
*/ */
private String[] checkIds; private String[] checkIds;
/** /**
* id * id
* ID
*
* ID
*/ */
private String[] judgeIds; private String[] judgeIds;

@ -4,37 +4,40 @@
* @date : 2019-06-22 17:00 * @date : 2019-06-22 17:00
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;// 定义包名,用于组织类文件,避免命名冲突
// 导入Jackson库的JsonProperty注解用于JSON序列化时自定义字段名
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
// 导入Lombok库的Data注解用于自动生成getter、setter、equals、hashCode和toString方法
import lombok.Data; import lombok.Data;
// 导入Java的List接口用于存储ExamVo对象的集合
import java.util.List; import java.util.List;
// 使用Lombok的@Data注解自动为该类生成getter、setter等方法
@Data @Data
public class ExamPageVo { public class ExamPageVo {
/** /**
* *
*/ */
private Integer pageSize; private Integer pageSize;
/** /**
* 1 * 110
* 1
*/ */
private Integer pageNo; private Integer pageNo;
/** /**
* *
*/ */
private Long totalCount; private Long totalCount;
/** /**
* *
*/ */
private Integer totalPage; private Integer totalPage;
/** /**
* * ExamVoExamVo
* @JsonProperty("data")JSONexamVoListJSON"data"
*/ */
@JsonProperty("data") @JsonProperty("data")
private List<ExamVo> examVoList; private List<ExamVo> examVoList;

@ -4,22 +4,32 @@
* @date : 2019-06-17 23:10 * @date : 2019-06-17 23:10
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;// 定义包名,用于组织类文件,避免命名冲突
// 导入Jackson库的JsonProperty注解用于JSON序列化时自定义字段名
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
// 导入Lombok库的Data注解用于自动生成getter、setter、equals、hashCode和toString方法
import lombok.Data; import lombok.Data;
// 使用Lombok的@Data注解自动为该类生成getter、setter等方法
@Data @Data
public class ExamQuestionSelectVo { public class ExamQuestionSelectVo {
/**
* JSON"id"
*
*/
@JsonProperty("id") @JsonProperty("id")
private String questionId; private String questionId;
/**
* JSON"name"
*
*/
@JsonProperty("name") @JsonProperty("name")
private String questionName; private String questionName;
/** /**
* .falsetrue * false
* * true
*
* JSON"checked"
*/ */
@JsonProperty("checked") @JsonProperty("checked")
private Boolean checked = false; private Boolean checked = false;

@ -4,21 +4,35 @@
* @date : 2019-06-23 11:00 * @date : 2019-06-23 11:00
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;// 定义包名,用于组织类文件,避免命名冲突
// 导入Jackson库的JsonProperty注解用于JSON序列化时自定义字段名
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
// 导入Lombok库的Data注解用于自动生成getter、setter、equals、hashCode和toString方法
import lombok.Data; import lombok.Data;
// 导入Java的List接口用于存储对象的集合
import java.util.List; import java.util.List;
// 使用Lombok的@Data注解自动为该类生成getter、setter等方法
@Data @Data
public class ExamQuestionTypeVo { public class ExamQuestionTypeVo {
/**
* ExamQuestionSelectVo
* JSON"radios"
* "radios"radio buttons
*/
@JsonProperty("radios") @JsonProperty("radios")
private List<ExamQuestionSelectVo> examQuestionSelectVoRadioList; private List<ExamQuestionSelectVo> examQuestionSelectVoRadioList;
/**
* ExamQuestionSelectVo
* JSON"checks"
* "checks"checkboxes
*/
@JsonProperty("checks") @JsonProperty("checks")
private List<ExamQuestionSelectVo> examQuestionSelectVoCheckList; private List<ExamQuestionSelectVo> examQuestionSelectVoCheckList;
/**
* ExamQuestionSelectVo
* JSON"judges"
* "judges"true/falseyes/no
*/
@JsonProperty("judges") @JsonProperty("judges")
private List<ExamQuestionSelectVo> examQuestionSelectVoJudgeList; private List<ExamQuestionSelectVo> examQuestionSelectVoJudgeList;
} }

@ -4,27 +4,34 @@
* @date : 2019/10/25 7:42 * @date : 2019/10/25 7:42
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
package lsgwr.exam.vo; package lsgwr.exam.vo;// 定义包名,用于组织类文件,避免命名冲突
// 导入相关的实体类
import lsgwr.exam.entity.Exam; import lsgwr.exam.entity.Exam;// 考试实体类
import lsgwr.exam.entity.ExamRecord; import lsgwr.exam.entity.ExamRecord; // 考试记录实体类
import lsgwr.exam.entity.User; import lsgwr.exam.entity.User;// 用户实体类
// 导入Lombok库的Data注解用于自动生成getter、setter、equals、hashCode和toString方法
import lombok.Data; import lombok.Data;
// 使用Lombok的@Data注解自动生成getter、setter等方法
@Data @Data
public class ExamRecordVo { public class ExamRecordVo {
/** /**
* *
*
* ExamExam
*/ */
private Exam exam; private Exam exam;
/** /**
* *
*
* ExamRecordExamRecord
*/ */
private ExamRecord examRecord; private ExamRecord examRecord;
/** /**
* *
*
* UserUser
*/ */
private User user; private User user;
} }

@ -4,86 +4,83 @@
* @date : 2019/5/14 07:42 * @date : 2019/5/14 07:42
* @email : liangshanguang2@gmail.com * @email : liangshanguang2@gmail.com
***********************************************************/ ***********************************************************/
// 定义包名,用于组织类文件并避免命名冲突
package lsgwr.exam.vo; package lsgwr.exam.vo;
// 导入所需的库和注解
import com.fasterxml.jackson.annotation.JsonFormat;// 用于日期格式的序列化和反序列化
import com.fasterxml.jackson.annotation.JsonProperty;// 用于自定义JSON字段名
import lombok.Data;// 用于自动生成getter、setter等方法
import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date;// Java日期类
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List;// Java列表接口
import lombok.Data; // 使用Lombok的@Data注解自动生成getter、setter等方法
import java.util.Date;
import java.util.List;
@Data @Data
public class ExamVo { public class ExamVo {
// 使用@JsonProperty注解自定义JSON字段名为"id"
@JsonProperty("id") @JsonProperty("id")
private String examId; private String examId;// 考试的唯一标识符
// 使用@JsonProperty注解自定义JSON字段名为"name"
@JsonProperty("name") @JsonProperty("name")
private String examName; private String examName;// 考试名称
// 使用@JsonProperty注解自定义JSON字段名为"avatar"
@JsonProperty("avatar") @JsonProperty("avatar")
private String examAvatar; private String examAvatar;// 考试图标或头像
// 使用@JsonProperty注解自定义JSON字段名为"desc"
@JsonProperty("desc") @JsonProperty("desc")
private String examDescription; private String examDescription;// 考试描述
// 单选题列表JSON字段名为"radios"
@JsonProperty("radios") @JsonProperty("radios")
private List<ExamQuestionSelectVo> examQuestionSelectVoRadioList; private List<ExamQuestionSelectVo> examQuestionSelectVoRadioList;// 单选题选项列表
// 多选题列表JSON字段名为"checks"
@JsonProperty("checks") @JsonProperty("checks")
private List<ExamQuestionSelectVo> examQuestionSelectVoCheckList; private List<ExamQuestionSelectVo> examQuestionSelectVoCheckList;// 多选题选项列表
// 判断题列表JSON字段名为"judges"
@JsonProperty("judges") @JsonProperty("judges")
private List<ExamQuestionSelectVo> examQuestionSelectVoJudgeList; private List<ExamQuestionSelectVo> examQuestionSelectVoJudgeList;// 判断题选项列表
// 考试总分JSON字段名为"score"
@JsonProperty("score") @JsonProperty("score")
private Integer examScore; private Integer examScore;// 考试的总分数
// 单选题总分JSON字段名为"radioScore"
@JsonProperty("radioScore") @JsonProperty("radioScore")
private Integer examScoreRadio; private Integer examScoreRadio;// 单选题的总分数
// 多选题总分JSON字段名为"checkScore"
@JsonProperty("checkScore") @JsonProperty("checkScore")
private Integer examScoreCheck; private Integer examScoreCheck;// 多选题的总分数
// 判断题总分JSON字段名为"judgeScore"
@JsonProperty("judgeScore") @JsonProperty("judgeScore")
private Integer examScoreJudge; private Integer examScoreJudge;// 判断题的总分数
/** // 考试创建人的名称JSON字段名为"creator"
* id // 注意这里假设只存储了创建人的名称实际可能需要根据ID查询数据库获取
*/
@JsonProperty("creator") @JsonProperty("creator")
private String examCreator; private String examCreator;// 考试的创建者名称
/** // 考试的时间限制分钟JSON字段名为"elapse"
*
*/
@JsonProperty("elapse") @JsonProperty("elapse")
private Integer examTimeLimit; private Integer examTimeLimit;// 考试的时间限制,单位为分钟
/** // 考试开始时间JSON字段名为"startDate"
* // 使用@JsonFormat注解指定日期格式和时区
*/
@JsonProperty("startDate") @JsonProperty("startDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date examStartDate; private Date examStartDate;// 考试的开始时间
/** // 考试结束时间JSON字段名为"endDate"
* // 使用@JsonFormat注解指定日期格式和时区
*/
@JsonProperty("endDate") @JsonProperty("endDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date examEndDate; private Date examEndDate;// 考试的结束时间
/** // 创建时间JSON字段名为"createTime"
* // 使用@JsonFormat注解指定日期格式和时区
*/
@JsonProperty("createTime") @JsonProperty("createTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; private Date createTime;// 记录的创建时间
/** // 更新时间JSON字段名为"updateTime"
* // 使用@JsonFormat注解指定日期格式和时区
*/
@JsonProperty("updateTime") @JsonProperty("updateTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime; private Date updateTime;// 记录的更新时间
} }

Loading…
Cancel
Save