From eb2d3c39e21ed1f607ef4afe76de2df43a1baf55 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 4 May 2026 22:46:21 +0800 Subject: [PATCH] ♻️ refactor(im):用户申请列表,增加流式查询,避免一次性加载过多,或者历史无法被加载到。 --- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/ImFriendRequestController.java | 25 ++++++++++++++++++++++--- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendRequestMapper.java | 10 +++++++--- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestService.java | 15 +++++++++++---- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestServiceImpl.java | 9 +++++++-- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/ImFriendRequestController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/ImFriendRequestController.java index 879577d..5a2bfb3 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/ImFriendRequestController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/ImFriendRequestController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.im.controller.admin.friend; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import org.springframework.validation.annotation.Validated; @@ -75,12 +77,29 @@ public class ImFriendRequestController { } @GetMapping("/list") - @Operation(summary = "查询「我相关」的好友申请列表(含我发起的、别人加我的)") - public CommonResult> getMyFriendRequestList() { - List list = friendRequestService.getMyFriendRequestList(getLoginUserId()); + @Operation(summary = "查询「我相关」的好友申请列表(游标分页:传 lastRequestId 加载更多)") + public CommonResult> getMyFriendRequestList( + @Parameter(description = "当前列表最旧记录的 id;首页不传") + @RequestParam(value = "lastRequestId", required = false) Long lastRequestId, + @Parameter(description = "单次拉取条数", required = true) @RequestParam("limit") @Min(1) Integer limit) { + List list = friendRequestService.getMyFriendRequestList(getLoginUserId(), lastRequestId, limit); return success(buildList(list)); } + @GetMapping("/get") + @Operation(summary = "按 id 单查「我相关」的申请记录(带越权过滤;WebSocket 通知到达后用)") + @Parameter(name = "id", description = "申请记录编号", required = true) + public CommonResult getMyFriendRequest(@RequestParam("id") Long id) { + ImFriendRequestDO request = friendRequestService.getFriendRequest(id); + // 越权过滤:fromUser / toUser 必有一方是当前用户,否则当不存在返回 null + Long currentUserId = getLoginUserId(); + if (request == null || (ObjUtil.notEqual(request.getFromUserId(), currentUserId) + && ObjUtil.notEqual(request.getToUserId(), currentUserId))) { + return success(null); + } + return success(CollUtil.getFirst(buildList(Collections.singletonList(request)))); + } + // ========== 私有方法:VO 组装 ========== private List buildList(List list) { diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendRequestMapper.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendRequestMapper.java index 3a455b3..7fddddb 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendRequestMapper.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendRequestMapper.java @@ -24,10 +24,14 @@ public interface ImFriendRequestMapper extends BaseMapperX { .last("LIMIT 1")); } - default List selectMyList(Long userId, int limit) { - // 先放扩展过滤再放双向 OR;否则 .and() 返回 LambdaQueryWrapper 基类,丢失 eqIfPresent 等扩展方法 + /** + * 拉取「我相关」的好友申请列表;游标分页:lastRequestId 为 null 拉首页,非 null 拉 id 严格小于它的下一页 + */ + default List selectMyList(Long userId, Long lastRequestId, int limit) { + // 先放扩展过滤再放双向 OR;否则 .and() 返回 LambdaQueryWrapper 基类,丢失 ltIfPresent 等扩展方法 LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); - wrapper.and(w -> w.eq(ImFriendRequestDO::getFromUserId, userId) + wrapper.ltIfPresent(ImFriendRequestDO::getId, lastRequestId) + .and(w -> w.eq(ImFriendRequestDO::getFromUserId, userId) .or().eq(ImFriendRequestDO::getToUserId, userId)) .orderByDesc(ImFriendRequestDO::getId) .last("LIMIT " + limit); diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestService.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestService.java index cb08e45..82f053a 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestService.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestService.java @@ -39,11 +39,18 @@ public interface ImFriendRequestService { void refuseFriendRequest(Long userId, Long requestId, String handleContent); /** - * 查询「我相关」的申请列表(含我发起的、别人加我的) + * 查询「我相关」的申请列表(含我发起的、别人加我的);游标分页:传 lastRequestId 拉它之前的下一页 * - * @param userId 用户编号 - * @return 申请记录列表 + * @param userId 用户编号 + * @param lastRequestId 当前列表最旧记录的 id;首页传 null + * @param limit 单次拉取条数(page size,由前端常量控制) + * @return 申请记录列表,按 id 倒序 */ - List getMyFriendRequestList(Long userId); + List getMyFriendRequestList(Long userId, Long lastRequestId, Integer limit); + + /** + * 按 id 单查申请记录;通用读接口,调用方自行做越权过滤 + */ + ImFriendRequestDO getFriendRequest(Long id); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestServiceImpl.java index 446b740..11ee222 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendRequestServiceImpl.java @@ -183,8 +183,13 @@ public class ImFriendRequestServiceImpl implements ImFriendRequestService { } @Override - public List getMyFriendRequestList(Long userId) { - return friendRequestMapper.selectMyList(userId, imProperties.getFriend().getRequestListMaxSize()); + public List getMyFriendRequestList(Long userId, Long lastRequestId, Integer limit) { + return friendRequestMapper.selectMyList(userId, lastRequestId, limit); + } + + @Override + public ImFriendRequestDO getFriendRequest(Long id) { + return friendRequestMapper.selectById(id); } /** -- libgit2 0.21.4