From 0e863288c8321b3ee79c585eaf37bb221d312e5a Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 28 Jan 2026 15:30:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-companion):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E5=B7=B2=E7=82=B9=E8=B5=9E?= =?UTF-8?q?AI=E8=A7=92=E8=89=B2=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyborad/config/SaTokenConfigure.java | 3 +- .../controller/AiCompanionController.java | 10 ++++ .../KeyboardAiCompanionLikeService.java | 8 +++ .../service/KeyboardAiCompanionService.java | 10 ++++ .../KeyboardAiCompanionLikeServiceImpl.java | 12 +++++ .../impl/KeyboardAiCompanionServiceImpl.java | 52 +++++++++++++++++++ 6 files changed, 94 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java index f4493d3..027e26e 100644 --- a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java +++ b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java @@ -116,7 +116,8 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/chat/history", "/ai-companion/comment/add", "/speech/transcribe", - "/ai-companion/comment/page" + "/ai-companion/comment/page", + "/ai-companion/liked" }; } @Bean diff --git a/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java b/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java index db224ab..e2e2cf2 100644 --- a/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java +++ b/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java @@ -17,6 +17,8 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import java.util.List; + /* * @author: ziin * @date: 2026/1/26 @@ -52,4 +54,12 @@ public class AiCompanionController { boolean result = aiCompanionLikeService.toggleLike(userId, req.getCompanionId()); return ResultUtils.success(result); } + + @GetMapping("/liked") + @Operation(summary = "获取当前用户点赞过的AI角色列表", description = "查询当前用户点赞过的所有AI角色,返回角色详细信息") + public BaseResponse> getLikedCompanions() { + Long userId = StpUtil.getLoginIdAsLong(); + List result = aiCompanionService.getLikedCompanions(userId); + return ResultUtils.success(result); + } } diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionLikeService.java b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionLikeService.java index 9ea1aba..ffa105a 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionLikeService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionLikeService.java @@ -38,4 +38,12 @@ public interface KeyboardAiCompanionLikeService extends IService getLikedCompanionIds(Long userId, List companionIds); + + /** + * 获取用户点赞过的所有AI角色ID列表 + * + * @param userId 用户ID + * @return 已点赞的AI角色ID列表 + */ + List getAllLikedCompanionIds(Long userId); } diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java index 8e3d81b..e7e48ce 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java @@ -5,6 +5,8 @@ import com.yolo.keyborad.model.entity.KeyboardAiCompanion; import com.baomidou.mybatisplus.extension.service.IService; import com.yolo.keyborad.model.vo.AiCompanionVO; +import java.util.List; + /* * @author: ziin * @date: 2026/1/26 13:51 @@ -37,4 +39,12 @@ public interface KeyboardAiCompanionService extends IService getLikedCompanions(Long userId); } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionLikeServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionLikeServiceImpl.java index edf0d47..bec5114 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionLikeServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionLikeServiceImpl.java @@ -100,4 +100,16 @@ public class KeyboardAiCompanionLikeServiceImpl extends ServiceImpl getAllLikedCompanionIds(Long userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KeyboardAiCompanionLike::getUserId, userId) + .eq(KeyboardAiCompanionLike::getStatus, (short) 1) + .select(KeyboardAiCompanionLike::getCompanionId); + List likes = this.list(queryWrapper); + return likes.stream() + .map(KeyboardAiCompanionLike::getCompanionId) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java index 4a94b22..09eca3a 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java @@ -147,4 +147,56 @@ public class KeyboardAiCompanionServiceImpl extends ServiceImpl getLikedCompanions(Long userId) { + // 获取用户点赞过的所有AI角色ID + List likedCompanionIds = companionLikeService.getAllLikedCompanionIds(userId); + if (likedCompanionIds.isEmpty()) { + return List.of(); + } + + // 查询这些AI角色的详细信息(只返回已上线且可见的) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(KeyboardAiCompanion::getId, likedCompanionIds) + .eq(KeyboardAiCompanion::getStatus, 1) + .eq(KeyboardAiCompanion::getVisibility, 1) + .orderByDesc(KeyboardAiCompanion::getSortOrder) + .orderByDesc(KeyboardAiCompanion::getPopularityScore); + List companions = this.list(queryWrapper); + + if (companions.isEmpty()) { + return List.of(); + } + + // 获取实际查询到的角色ID + List companionIds = companions.stream() + .map(KeyboardAiCompanion::getId) + .collect(Collectors.toList()); + + // 批量统计点赞数 + LambdaQueryWrapper likeWrapper = new LambdaQueryWrapper<>(); + likeWrapper.in(KeyboardAiCompanionLike::getCompanionId, companionIds) + .eq(KeyboardAiCompanionLike::getStatus, (short) 1); + List likes = companionLikeService.list(likeWrapper); + Map likeCountMap = likes.stream() + .collect(Collectors.groupingBy(KeyboardAiCompanionLike::getCompanionId, Collectors.counting())); + + // 批量统计评论数 + LambdaQueryWrapper commentWrapper = new LambdaQueryWrapper<>(); + commentWrapper.in(KeyboardAiCompanionComment::getCompanionId, companionIds) + .eq(KeyboardAiCompanionComment::getStatus, (short) 1); + List comments = companionCommentService.list(commentWrapper); + Map commentCountMap = comments.stream() + .collect(Collectors.groupingBy(KeyboardAiCompanionComment::getCompanionId, Collectors.counting())); + + // 转换为VO并填充统计数据 + return companions.stream().map(entity -> { + AiCompanionVO vo = BeanUtil.copyProperties(entity, AiCompanionVO.class); + vo.setLikeCount(likeCountMap.getOrDefault(entity.getId(), 0L).intValue()); + vo.setCommentCount(commentCountMap.getOrDefault(entity.getId(), 0L).intValue()); + vo.setLiked(true); // 用户已点赞 + return vo; + }).collect(Collectors.toList()); + } }