page = baseService.reviewPaging(reqDTO); // 调用服务层进行分页查询
+ return super.success(page); // 返回成功响应和分页结果
+ }
+}
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java
new file mode 100644
index 0000000..8f9b69e
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamDTO.java
@@ -0,0 +1,93 @@
+package com.yf.exam.modules.exam.dto; // 定义包名,DTO类所在的包路径
+
+import com.fasterxml.jackson.annotation.JsonFormat; // 导入Jackson库的注解,用于格式化日期
+import com.yf.exam.modules.paper.enums.ExamState; // 导入考试状态枚举
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+import org.springframework.format.annotation.DateTimeFormat; // 导入Spring的日期格式化注解
+
+import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化
+import java.util.Date; // 导入Java的日期类
+
+/**
+ *
+ * 考试数据传输类,封装考试的基本信息
+ *
+ * 此类用于封装考试的基本信息,以便在应用程序中传输。
+ *
+ * @author 聪明笨狗
+ * @since 2020-07-25 16:18
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="考试", description="考试") // Swagger注解,描述这个类的用途
+public class ExamDTO implements Serializable { // 声明类,实现Serializable接口以确保可以序列化
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性
+
+ @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String id; // 考试ID
+
+ @ApiModelProperty(value = "考试名称", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String title; // 考试名称
+
+ @ApiModelProperty(value = "考试描述", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String content; // 考试描述
+
+ @ApiModelProperty(value = "1公开2部门3定员", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer openType; // 开放类型,1表示公开,2表示部门,3表示定员
+
+ @ApiModelProperty(value = "考试状态", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer state; // 考试状态
+
+ @ApiModelProperty(value = "是否限时", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Boolean timeLimit; // 是否限时
+
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") // Jackson注解,格式化日期
+ @DateTimeFormat(pattern = "yyyy-MM-dd") // Spring注解,格式化日期
+ @ApiModelProperty(value = "开始时间", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Date startTime; // 考试开始时间
+
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") // Jackson注解,格式化日期
+ @DateTimeFormat(pattern = "yyyy-MM-dd") // Spring注解,格式化日期
+ @ApiModelProperty(value = "结束时间", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Date endTime; // 考试结束时间
+
+ @ApiModelProperty(value = "创建时间", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Date createTime; // 创建时间
+
+ @ApiModelProperty(value = "更新时间", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Date updateTime; // 更新时间
+
+ @ApiModelProperty(value = "总分数", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer totalScore; // 总分数
+
+ @ApiModelProperty(value = "总时长(分钟)", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer totalTime; // 总时长(分钟)
+
+ @ApiModelProperty(value = "及格分数", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer qualifyScore; // 及格分数
+
+ /**
+ * 判断考试状态
+ * 根据当前时间和考试的限时设置,返回考试的实际状态。
+ *
+ * @return 当前考试状态
+ */
+ public Integer getState() {
+ if (this.timeLimit != null && this.timeLimit) {
+ if (System.currentTimeMillis() < startTime.getTime()) {
+ return ExamState.READY_START; // 如果当前时间小于开始时间,状态为准备开始
+ }
+ if (System.currentTimeMillis() > endTime.getTime()) {
+ return ExamState.OVERDUE; // 如果当前时间大于结束时间,状态为已过期
+ }
+ if (System.currentTimeMillis() > startTime.getTime()
+ && System.currentTimeMillis() < endTime.getTime()
+ && !ExamState.DISABLED.equals(this.state)) {
+ return ExamState.ENABLE; // 如果当前时间在开始时间和结束时间之间,并且状态不是禁用,状态为正在进行
+ }
+ }
+ return this.state; // 如果不满足上述条件,返回当前状态
+ }
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java
new file mode 100644
index 0000000..7710955
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamDepartDTO.java
@@ -0,0 +1,32 @@
+package com.yf.exam.modules.exam.dto; // 定义包名,DTO类所在的包路径
+
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化
+
+/**
+ *
+ * 考试部门数据传输类,封装考试部门相关信息
+ *
+ * 此类用于封装与考试部门相关的数据,以便在应用程序中传输。
+ *
+ * @author 聪明笨狗
+ * @since 2020-09-03 17:24
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="考试部门", description="考试部门") // Swagger注解,描述这个类的用途
+public class ExamDepartDTO implements Serializable { // 声明类,实现Serializable接口以确保可以序列化
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性
+
+ @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String id; // 唯一标识符,标识考试部门记录的ID
+
+ @ApiModelProperty(value = "考试ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String examId; // 考试的唯一标识符,关联到具体的考试
+
+ @ApiModelProperty(value = "部门ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String departId; // 部门的唯一标识符,关联到具体的部门
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java
new file mode 100644
index 0000000..5cbc8a4
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ExamRepoDTO.java
@@ -0,0 +1,50 @@
+package com.yf.exam.modules.exam.dto; // 定义包名,DTO类所在的包路径
+
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化
+
+/**
+ *
+ * 考试题库数据传输类,封装考试题库相关信息
+ *
+ * 此类用于封装考试题库的数据,以便在应用程序中传输。
+ *
+ * @author 聪明笨狗
+ * @since 2020-09-05 11:14
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="考试题库", description="考试题库") // Swagger注解,描述这个类的用途
+public class ExamRepoDTO implements Serializable { // 声明类,实现Serializable接口以确保可以序列化
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性
+
+ @ApiModelProperty(value = "ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String id; // 题库ID,唯一标识符
+
+ @ApiModelProperty(value = "考试ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String examId; // 关联的考试ID,标识与哪个考试相关联
+
+ @ApiModelProperty(value = "题库ID", required=true) // Swagger注解,描述字段的用途和是否必填
+ private String repoId; // 题库ID,标识具体的题库
+
+ @ApiModelProperty(value = "单选题数量", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer radioCount; // 单选题数量,表示题库中单选题的总数
+
+ @ApiModelProperty(value = "单选题分数", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer radioScore; // 单选题分数,表示单选题的总分
+
+ @ApiModelProperty(value = "多选题数量", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer multiCount; // 多选题数量,表示题库中多选题的总数
+
+ @ApiModelProperty(value = "多选题分数", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer multiScore; // 多选题分数,表示多选题的总分
+
+ @ApiModelProperty(value = "判断题数量", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer judgeCount; // 判断题数量,表示题库中判断题的总数
+
+ @ApiModelProperty(value = "判断题分数", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer judgeScore; // 判断题分数,表示判断题的总分
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java
new file mode 100644
index 0000000..e1887c3
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/ext/ExamRepoExtDTO.java
@@ -0,0 +1,30 @@
+package com.yf.exam.modules.exam.dto.ext; // 定义包名,DTO扩展类所在的包路径
+
+import com.yf.exam.modules.exam.dto.ExamRepoDTO; // 导入考试题库数据传输类
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+/**
+ *
+ * 考试题库数据传输类的扩展,包含额外的题库信息
+ *
+ *
+ * @author 聪明笨狗
+ * @since 2020-09-05 11:14
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="考试题库扩展响应类", description="考试题库扩展响应类") // Swagger注解,描述这个类的用途
+public class ExamRepoExtDTO extends ExamRepoDTO { // 声明类,继承自ExamRepoDTO
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制
+
+ @ApiModelProperty(value = "单选题总量", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer totalRadio; // 单选题总量
+
+ @ApiModelProperty(value = "多选题总量", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer totalMulti; // 多选题总量
+
+ @ApiModelProperty(value = "判断题总量", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer totalJudge; // 判断题总量
+}
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java
new file mode 100644
index 0000000..aa62266
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/request/ExamSaveReqDTO.java
@@ -0,0 +1,30 @@
+package com.yf.exam.modules.exam.dto.request; // 定义包名,请求DTO类所在的包路径
+
+import com.yf.exam.modules.exam.dto.ExamDTO; // 导入基础考试DTO类
+import com.yf.exam.modules.exam.dto.ext.ExamRepoExtDTO; // 导入考试题库扩展DTO类
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+import java.util.List; // 导入Java的List接口,用于定义列表类型的属性
+
+/**
+ *
+ * 考试保存请求类,封装考试保存请求的相关信息
+ *
+ *
+ * @author 聪明笨狗
+ * @since 2020-07-25 16:18
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="考试保存请求类", description="考试保存请求类") // Swagger注解,描述这个类的用途
+public class ExamSaveReqDTO extends ExamDTO { // 声明类,继承自ExamDTO
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制
+
+ @ApiModelProperty(value = "题库列表", required=true) // Swagger注解,描述字段的用途和是否必填
+ private List repoList; // 题库列表,存储与考试相关的题库信息
+
+ @ApiModelProperty(value = "考试部门列表", required=true) // Swagger注解,描述字段的用途和是否必填
+ private List departIds; // 考试部门ID列表,存储与考试相关的部门ID
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java
new file mode 100644
index 0000000..ec344db
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/response/ExamOnlineRespDTO.java
@@ -0,0 +1,21 @@
+package com.yf.exam.modules.exam.dto.response; // 定义包名,响应DTO类所在的包路径
+
+import com.yf.exam.modules.exam.dto.ExamDTO; // 导入基础考试DTO类
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+/**
+ *
+ * 在线考试分页响应类,封装在线考试的分页响应信息
+ *
+ * 此类用于封装在线考试相关的分页数据,提供给前端展示。
+ *
+ * @author 聪明笨狗
+ * @since 2020-07-25 16:18
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="在线考试分页响应类", description="在线考试分页响应类") // Swagger注解,描述这个类的用途
+public class ExamOnlineRespDTO extends ExamDTO { // 声明类,继承自ExamDTO
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java
new file mode 100644
index 0000000..68d4236
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/dto/response/ExamReviewRespDTO.java
@@ -0,0 +1,28 @@
+package com.yf.exam.modules.exam.dto.response; // 定义包名,响应DTO类所在的包路径
+
+import com.yf.exam.modules.exam.dto.ExamDTO; // 导入基础考试DTO类
+import io.swagger.annotations.ApiModel; // 导入Swagger注解,用于描述模型
+import io.swagger.annotations.ApiModelProperty; // 导入Swagger注解,用于描述模型属性
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+/**
+ *
+ * 阅卷分页响应类,封装阅卷相关的分页响应信息
+ *
+ * 此类用于封装阅卷相关的分页数据,提供给前端展示。
+ *
+ * @author 聪明笨狗
+ * @since 2020-07-25 16:18
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@ApiModel(value="阅卷分页响应类", description="阅卷分页响应类") // Swagger注解,描述这个类的用途
+public class ExamReviewRespDTO extends ExamDTO { // 声明类,继承自ExamDTO
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的版本唯一性
+
+ @ApiModelProperty(value = "考试人数", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer examUser; // 考试人数,表示参与考试的用户总数
+
+ @ApiModelProperty(value = "待阅试卷", required=true) // Swagger注解,描述字段的用途和是否必填
+ private Integer unreadPaper; // 待阅试卷数量,表示尚未被阅卷的试卷数量
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/entity/Exam.java b/exam-api/src/main/java/com/yf/exam/modules/exam/entity/Exam.java
new file mode 100644
index 0000000..cd2d284
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/entity/Exam.java
@@ -0,0 +1,61 @@
+package com.yf.exam.modules.exam.entity; // 定义包名,实体类所在的包路径
+
+import com.baomidou.mybatisplus.annotation.IdType; // 导入MyBatis Plus的ID类型注解
+import com.baomidou.mybatisplus.annotation.TableField; // 导入MyBatis Plus的表字段注解
+import com.baomidou.mybatisplus.annotation.TableId; // 导入MyBatis Plus的表ID注解
+import com.baomidou.mybatisplus.annotation.TableName; // 导入MyBatis Plus的表名注解
+import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入MyBatis Plus的模型类
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+import java.util.Date; // 导入Java的日期类
+
+/**
+ *
+ * 考试实体类,封装考试的基本信息
+ *
+ * 此类用于数据库操作,映射考试表的字段。
+ *
+ * @author 聪明笨狗
+ * @since 2020-07-25 16:18
+ */
+@Data // Lombok注解,标记这个类为数据类,自动生成getter和setter方法
+@TableName("el_exam") // MyBatis Plus注解,指定这个实体类对应的数据库表名
+public class Exam extends Model { // 声明类,继承自MyBatis Plus的Model类,用于数据库操作
+
+ private static final long serialVersionUID = 1L; // 序列化ID,用于版本控制,确保类的唯一性
+
+ @TableId(value = "id", type = IdType.ASSIGN_ID) // MyBatis Plus注解,指定这个字段为表的主键,类型为自增ID
+ private String id; // 考试ID,唯一标识符
+
+ private String title; // 考试名称,描述考试的标题
+
+ private String content; // 考试描述,详细描述考试的内容
+
+ @TableField("open_type") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Integer openType; // 开放类型,表示考试的开放范围(1公开,2部门,3定员)
+
+ private Integer state; // 考试状态,表示考试的当前状态(如:未开始、进行中、已结束)
+
+ @TableField("time_limit") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Boolean timeLimit; // 是否限时,表示考试是否有时间限制
+
+ @TableField("start_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Date startTime; // 开始时间,表示考试的开始时间
+
+ @TableField("end_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Date endTime; // 结束时间,表示考试的结束时间
+
+ @TableField("create_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Date createTime; // 创建时间,表示记录的创建时间
+
+ @TableField("update_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Date updateTime; // 更新时间,表示记录的最后更新时间
+
+ @TableField("total_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Integer totalScore; // 总分数,表示考试的总分
+
+ @TableField("total_time") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Integer totalTime; // 总时长(分钟),表示考试的总时长
+
+ @TableField("qualify_score") // MyBatis Plus注解,指定这个字段在数据库表中的列名
+ private Integer qualifyScore; // 及格分数,表示考试的及格分数线
+}
\ No newline at end of file
diff --git a/exam-api/src/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java b/exam-api/src/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java
new file mode 100644
index 0000000..b39d71c
--- /dev/null
+++ b/exam-api/src/main/java/com/yf/exam/modules/exam/entity/ExamDepart.java
@@ -0,0 +1,47 @@
+package com.yf.exam.modules.exam.entity; // 定义包名,实体类所在的包路径
+
+import com.baomidou.mybatisplus.annotation.IdType; // 导入MyBatis Plus的ID类型注解
+import com.baomidou.mybatisplus.annotation.TableField; // 导入MyBatis Plus的表字段注解
+import com.baomidou.mybatisplus.annotation.TableId; // 导入MyBatis Plus的表ID注解
+import com.baomidou.mybatisplus.annotation.TableName; // 导入MyBatis Plus的表名注解
+import com.baomidou.mybatisplus.extension.activerecord.Model; // 导入MyBatis Plus的模型类
+import lombok.Data; // 导入Lombok注解,用于简化数据类的编写
+
+import java.io.Serializable; // 导入Java的序列化接口,用于确保对象可以被序列化
+
+/**
+ *