From 5eb573fb9df7c02d793b5868083d96216cbfcda5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=85=83=E7=9A=93?= Date: Mon, 2 Sep 2024 17:42:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=8C=9C=E4=BD=A0=E5=96=9C?= =?UTF-8?q?=E6=AC=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/controller/PostController.java | 18 ++++++++ .../java/com/ivmiku/tutorial/entity/Post.java | 2 + .../ivmiku/tutorial/mapper/LikeMapper.java | 3 ++ .../ivmiku/tutorial/mapper/PostMapper.java | 6 +++ .../tutorial/service/InteractionService.java | 2 + .../ivmiku/tutorial/service/PostService.java | 4 ++ .../service/impl/InteractionServiceImpl.java | 6 +++ .../service/impl/PostServiceImpl.java | 42 +++++++++++++++++++ .../src/main/resources/mapper/LikeMapper.xml | 4 ++ .../src/main/resources/mapper/PostMapper.xml | 6 +++ 10 files changed, 93 insertions(+) diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java index 718fb77..ae796d4 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java @@ -321,6 +321,24 @@ public class PostController { return Result.ok(drafts); } + /** + * 猜你喜欢 + */ + @GetMapping("/guessYouLike") + @Operation(summary = "猜你喜欢") + public Result guessYouLike(@RequestParam("latitude") Double latitude, + @RequestParam("longitude") Double longitude) { + + String userId = StpUtil.getLoginIdAsString(); + String key = "search_history:" + userId; + // 获取用户的搜索历史关键词 + List searchHistory = redisTemplate.opsForList().range(key, 0, -1); + + // 获取猜你喜欢的帖子列表 + List recommendedPosts = postService.getRecommendedPosts(latitude, longitude, searchHistory); + + return Result.ok(recommendedPosts); + } } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java index 7208d4d..a433294 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java @@ -44,4 +44,6 @@ public class Post implements Serializable { private Date updatedAt; private static final long serialVersionUID = 1L; + + } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/LikeMapper.java b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/LikeMapper.java index 77b9297..c990419 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/LikeMapper.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/LikeMapper.java @@ -21,6 +21,9 @@ public interface LikeMapper extends BaseMapper { @Select("SELECT SUM(like_count) FROM comments WHERE user_openid = #{userOpenid}") Long getCommentLikeCount(@Param("userOpenid") String userOpenid); + // 查询帖子被点赞的总数 + Long getLikeCountByPostId(@Param("postId") Long postId); + } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java index 4e6708e..452f0d5 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java @@ -23,6 +23,12 @@ public interface PostMapper extends BaseMapper { List searchPosts(String keyword); List getTopFavoritedPosts(int limit); + + List getPostsBasedOnHistoryAndHotness(Long userId, List searchHistory); + + + @Select("SELECT * FROM post WHERE ST_Distance_Sphere(point(location_lng, location_lat), point(#{longitude}, #{latitude})) < 50000") // 50km 范围 + List getPostsNearby(Double latitude, Double longitude); } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java index 02fa73a..9ece63b 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java @@ -31,4 +31,6 @@ public interface InteractionService { void unfavoriteOfficialTutorial(String userOpenid, Long tutorialId); IPage getFavoriteOfficialTutorials(String userOpenid, int pageNum, int pageSize); + // 新增方法:根据帖子 ID 获取点赞总数 + Long getLikeCountByPostId(Long postId); } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java index d010cef..b273afc 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java @@ -31,4 +31,8 @@ public interface PostService extends IService { List getTopFavoritedPosts(int limit); List getDraftsByUserId(String userId); + + List getRecommendedPosts(Double latitude, Double longitude, List searchHistory); + + } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java index 89ded28..8ba6f79 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java @@ -251,4 +251,10 @@ public class InteractionServiceImpl implements InteractionService { } + @Override + public Long getLikeCountByPostId(Long postId) { + log.info("Fetching like count for post {}", postId); + return likeMapper.getLikeCountByPostId(postId); + } + } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java index 889f90e..3423dda 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java @@ -5,17 +5,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ivmiku.tutorial.entity.BrowingHistory; import com.ivmiku.tutorial.entity.Post; +import com.ivmiku.tutorial.mapper.CommentMapper; +import com.ivmiku.tutorial.mapper.FavoriteMapper; +import com.ivmiku.tutorial.mapper.LikeMapper; import com.ivmiku.tutorial.mapper.PostMapper; import com.ivmiku.tutorial.service.BrowingHistoryService; +import com.ivmiku.tutorial.service.InteractionService; import com.ivmiku.tutorial.service.PostService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.sql.Timestamp; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; @Service public class PostServiceImpl extends ServiceImpl implements PostService { @@ -25,6 +32,10 @@ public class PostServiceImpl extends ServiceImpl implements Po @Autowired private PostMapper postMapper; + @Lazy + @Autowired + private InteractionService interactionService; + @Autowired private BrowingHistoryService browingHistoryService; @@ -197,5 +208,36 @@ public class PostServiceImpl extends ServiceImpl implements Po } + @Override + public List getRecommendedPosts(Double latitude, Double longitude, List searchHistory) { + // 1. 根据用户当前位置计算距离(例如使用 Haversine 公式) + List nearbyPosts = postMapper.getPostsNearby(latitude, longitude); + + // 2. 根据帖子热度排序 + List sortedPosts = sortPostsByHeat(nearbyPosts); + + // 3. 根据用户的搜索历史关键词筛选相关帖子 + List matchingPosts = sortedPosts.stream() + .filter(post -> searchHistory.stream().anyMatch(keyword -> + post.getTitle().contains(keyword) || post.getContent().contains(keyword))) + .collect(Collectors.toList()); + + return matchingPosts; + } + + public List sortPostsByHeat(List posts) { + // 根据帖子热度进行排序 + return posts.stream() + .sorted((post1, post2) -> { + int post1Heat = calculatePostHeat(post1); + int post2Heat = calculatePostHeat(post2); + return Integer.compare(post2Heat, post1Heat); // 降序排列 + }) + .collect(Collectors.toList()); + } + public int calculatePostHeat(Post post) { + Long postId = post.getPostId(); + return interactionService.getLikeCountByPostId(postId).intValue(); + } } diff --git a/community-8073/src/main/resources/mapper/LikeMapper.xml b/community-8073/src/main/resources/mapper/LikeMapper.xml index b626775..3609f2d 100644 --- a/community-8073/src/main/resources/mapper/LikeMapper.xml +++ b/community-8073/src/main/resources/mapper/LikeMapper.xml @@ -17,4 +17,8 @@ id,user_openid,post_id,tutorialId, comment_id,is_deleted + diff --git a/community-8073/src/main/resources/mapper/PostMapper.xml b/community-8073/src/main/resources/mapper/PostMapper.xml index 1659df8..ac56366 100644 --- a/community-8073/src/main/resources/mapper/PostMapper.xml +++ b/community-8073/src/main/resources/mapper/PostMapper.xml @@ -108,5 +108,11 @@ ORDER BY COUNT(f.id) DESC LIMIT #{limit} +