Skip to content

Commit d02f944

Browse files
authored
Merge pull request #94 from Boyuan-IT-Club/Red_Moon
添加更多的分页功能
2 parents 1347cc0 + c435e9e commit d02f944

File tree

5 files changed

+146
-4
lines changed

5 files changed

+146
-4
lines changed

src/main/java/club/boyuan/official/controller/ResumeController.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package club.boyuan.official.controller;
22

3+
import club.boyuan.official.dto.PageResultDTO;
34
import club.boyuan.official.dto.ResponseMessage;
45
import club.boyuan.official.dto.ResumeDTO;
56
import club.boyuan.official.dto.ResumeFieldValueDTO;
@@ -808,11 +809,13 @@ public void exportResumeToPdf(
808809
* 支持按姓名、专业、招募周期、状态等多条件组合查询
809810
*/
810811
@GetMapping("/search")
811-
public ResponseEntity<ResponseMessage<List<ResumeDTO>>> queryResumes(
812+
public ResponseEntity<ResponseMessage<?>> queryResumes(
812813
@RequestParam(required = false) String name,
813814
@RequestParam(required = false) String major,
814815
@RequestParam(required = false) Integer cycleId,
815816
@RequestParam(required = false) Integer status,
817+
@RequestParam(required = false, defaultValue = "0") Integer page,
818+
@RequestParam(required = false, defaultValue = "10") Integer size,
816819
HttpServletRequest request) {
817820
try {
818821
String token = request.getHeader("Authorization");
@@ -826,9 +829,18 @@ public ResponseEntity<ResponseMessage<List<ResumeDTO>>> queryResumes(
826829
logger.warn("用户{}尝试条件查询简历,但权限不足", username);
827830
throw new BusinessException(BusinessExceptionEnum.USER_ROLE_NOT_AUTHORIZED);
828831
}
829-
List<ResumeDTO> result = resumeService.queryResumes(name, major, cycleId, status);
830-
logger.info("管理员{}执行条件查询简历,结果数量: {}", username, result.size());
831-
return ResponseEntity.ok(ResponseMessage.success(result));
832+
833+
// 如果page和size参数都为默认值,则使用原来的查询方法(保持向后兼容)
834+
if (page == 0 && size == 10) {
835+
List<ResumeDTO> result = resumeService.queryResumes(name, major, cycleId, status);
836+
logger.info("管理员{}执行条件查询简历,结果数量: {}", username, result.size());
837+
return ResponseEntity.ok(ResponseMessage.success(result));
838+
} else {
839+
// 使用分页查询
840+
PageResultDTO<ResumeDTO> result = resumeService.queryResumesWithPagination(name, major, cycleId, status, page, size);
841+
logger.info("管理员{}执行分页条件查询简历,结果数量: {},总记录数: {}", username, result.getContent().size(), result.getTotalElements());
842+
return ResponseEntity.ok(ResponseMessage.success(result));
843+
}
832844
} catch (BusinessException e) {
833845
logger.warn("条件查询简历业务异常,错误码: {},错误信息: {}", e.getCode(), e.getMessage());
834846
return ResponseEntity.status(HttpStatus.BAD_REQUEST)

src/main/java/club/boyuan/official/mapper/ResumeMapper.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,26 @@ public interface ResumeMapper {
7575
* @return 简历列表
7676
*/
7777
List<Resume> queryResumes(@Param("name") String name, @Param("major") String major, @Param("cycleId") Integer cycleId, @Param("status") Integer status);
78+
79+
/**
80+
* 多条件查询简历列表(分页)
81+
* @param name 姓名(可选)
82+
* @param major 专业(可选)
83+
* @param cycleId 年份ID(可选)
84+
* @param status 简历状态(可选)
85+
* @param offset 偏移量
86+
* @param limit 限制数量
87+
* @return 简历列表
88+
*/
89+
List<Resume> queryResumesWithPagination(@Param("name") String name, @Param("major") String major, @Param("cycleId") Integer cycleId, @Param("status") Integer status, @Param("offset") int offset, @Param("limit") int limit);
90+
91+
/**
92+
* 统计多条件查询简历数量
93+
* @param name 姓名(可选)
94+
* @param major 专业(可选)
95+
* @param cycleId 年份ID(可选)
96+
* @param status 简历状态(可选)
97+
* @return 简历数量
98+
*/
99+
int countResumes(@Param("name") String name, @Param("major") String major, @Param("cycleId") Integer cycleId, @Param("status") Integer status);
78100
}

src/main/java/club/boyuan/official/service/IResumeService.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package club.boyuan.official.service;
22

3+
import club.boyuan.official.dto.PageResultDTO;
34
import club.boyuan.official.dto.ResumeDTO;
45
import club.boyuan.official.dto.ResumeFieldValueDTO;
56
import club.boyuan.official.dto.SimpleResumeFieldDTO;
@@ -107,6 +108,18 @@ public interface IResumeService {
107108
*/
108109
List<ResumeDTO> queryResumes(String name, String major, Integer cycleId, Integer status);
109110

111+
/**
112+
* 条件查询简历列表(分页)
113+
* @param name 姓名(可选)
114+
* @param major 专业(可选)
115+
* @param cycleId 年份ID(可选)
116+
* @param status 简历状态(可选)
117+
* @param page 页码(从0开始)
118+
* @param size 每页大小
119+
* @return 分页结果DTO
120+
*/
121+
PageResultDTO<ResumeDTO> queryResumesWithPagination(String name, String major, Integer cycleId, Integer status, int page, int size);
122+
110123
/**
111124
* 根据cycleId获取所有简历
112125
* @param cycleId 招募周期ID

src/main/java/club/boyuan/official/service/impl/ResumeServiceImpl.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package club.boyuan.official.service.impl;
22

3+
import club.boyuan.official.dto.PageResultDTO;
34
import club.boyuan.official.dto.ResumeDTO;
45
import club.boyuan.official.dto.ResumeFieldValueDTO;
56
import club.boyuan.official.dto.SimpleResumeFieldDTO;
@@ -288,6 +289,58 @@ public List<ResumeDTO> queryResumes(String name, String major, Integer cycleId,
288289
}
289290
}
290291

292+
@Override
293+
public PageResultDTO<ResumeDTO> queryResumesWithPagination(String name, String major, Integer cycleId, Integer status, int page, int size) {
294+
logger.info("分页条件查询简历:name={}, major={}, cycleId={}, status={}, page={}, size={}", name, major, cycleId, status, page, size);
295+
296+
try {
297+
// 参数校验
298+
if (page < 0) page = 0;
299+
if (size <= 0) size = 10;
300+
if (size > 100) size = 100; // 限制最大分页大小
301+
302+
// 计算偏移量
303+
int offset = page * size;
304+
305+
// 查询总数
306+
int totalElements = resumeMapper.countResumes(name, major, cycleId, status);
307+
308+
// 查询数据
309+
List<Resume> resumes = resumeMapper.queryResumesWithPagination(name, major, cycleId, status, offset, size);
310+
311+
// 转换为DTO
312+
List<ResumeDTO> result = new ArrayList<>();
313+
for (Resume resume : resumes) {
314+
ResumeDTO dto = new ResumeDTO();
315+
dto.setResumeId(resume.getResumeId());
316+
dto.setUserId(resume.getUserId());
317+
dto.setCycleId(resume.getCycleId());
318+
dto.setStatus(resume.getStatus());
319+
dto.setSubmittedAt(resume.getSubmittedAt());
320+
dto.setCreatedAt(resume.getCreatedAt());
321+
dto.setUpdatedAt(resume.getUpdatedAt());
322+
// 可选:添加简化字段信息
323+
List<SimpleResumeFieldDTO> simpleFields = getSimpleFieldValuesByResumeId(resume.getResumeId());
324+
dto.setSimpleFields(simpleFields);
325+
result.add(dto);
326+
}
327+
328+
// 计算分页信息
329+
int totalPages = (int) Math.ceil((double) totalElements / size);
330+
boolean first = page == 0;
331+
boolean last = page >= totalPages - 1;
332+
333+
PageResultDTO<ResumeDTO> pageResult = new PageResultDTO<>(result, totalElements, totalPages, page, size, first, last);
334+
335+
logger.info("分页条件查询简历完成:总记录数={}, 总页数={}, 当前页={}, 当前记录数={}", totalElements, totalPages, page, result.size());
336+
337+
return pageResult;
338+
} catch (Exception e) {
339+
logger.error("分页条件查询简历失败", e);
340+
throw new BusinessException(BusinessExceptionEnum.RESUME_QUERY_FAILED);
341+
}
342+
}
343+
291344
@Override
292345
public ResumeDTO getResumeWithFieldValues(Integer userId, Integer cycleId) {
293346
logger.debug("获取用户{}在{}年的简历及字段值", userId, cycleId);

src/main/resources/mapper/ResumeMapper.xml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,48 @@
5353
ORDER BY r.created_at DESC
5454
</select>
5555

56+
<!-- 多条件查询简历列表(分页) -->
57+
<select id="queryResumesWithPagination" resultMap="ResumeMap">
58+
SELECT r.* FROM resume r
59+
LEFT JOIN user u ON r.user_id = u.user_id
60+
<where>
61+
<if test="name != null and name != ''">
62+
AND u.name LIKE CONCAT('%', #{name}, '%')
63+
</if>
64+
<if test="major != null and major != ''">
65+
AND u.major LIKE CONCAT('%', #{major}, '%')
66+
</if>
67+
<if test="cycleId != null">
68+
AND r.cycle_id = #{cycleId}
69+
</if>
70+
<if test="status != null">
71+
AND r.status = #{status}
72+
</if>
73+
</where>
74+
ORDER BY r.created_at DESC
75+
LIMIT #{offset}, #{limit}
76+
</select>
77+
78+
<!-- 统计多条件查询简历数量 -->
79+
<select id="countResumes" resultType="int">
80+
SELECT COUNT(*) FROM resume r
81+
LEFT JOIN user u ON r.user_id = u.user_id
82+
<where>
83+
<if test="name != null and name != ''">
84+
AND u.name LIKE CONCAT('%', #{name}, '%')
85+
</if>
86+
<if test="major != null and major != ''">
87+
AND u.major LIKE CONCAT('%', #{major}, '%')
88+
</if>
89+
<if test="cycleId != null">
90+
AND r.cycle_id = #{cycleId}
91+
</if>
92+
<if test="status != null">
93+
AND r.status = #{status}
94+
</if>
95+
</where>
96+
</select>
97+
5698
<!-- 插入简历 -->
5799
<insert id="insert" parameterType="club.boyuan.official.entity.Resume" useGeneratedKeys="true" keyProperty="resumeId">
58100
INSERT INTO resume(user_id, cycle_id, status)

0 commit comments

Comments
 (0)