فهرست منبع

feat(recommend): 添加用户喜欢功能和相关API

- 在前端API工具类中添加获取用户喜欢列表的方法
- 在推荐控制器中添加保存用户喜欢记录到数据库的逻辑
- 实现获取用户喜欢列表的API端点
- 在推荐映射器中添加插入和查询用户喜欢记录的数据访问方法
- 在推荐服务中实现保存用户喜欢记录和获取喜欢列表的业务逻辑
- 创建用户喜欢记录的数据表映射配置
李思佳 2 هفته پیش
والد
کامیت
4572dc16d0

+ 4 - 0
LiangZhiYUMao/utils/api.js

@@ -533,6 +533,10 @@ export default {
     // 获取今日推荐
     getTodayRecommend: () => request({ 
       url: '/recommend/today' 
+    }),
+    // 获取用户喜欢的列表
+    getLikedUsers: (userId, limit) => request({
+      url: `/recommend/liked-users?userId=${userId}${limit ? `&limit=${limit}` : ''}`
     })
   },
 

+ 17 - 0
service/Recommend/src/main/java/com/zhentao/controller/RecommendController.java

@@ -98,6 +98,8 @@ public class RecommendController {
                 // 记录喜欢,并从不喜欢集合移除(幂等)
                 stringRedisTemplate.opsForSet().add(likeKey, String.valueOf(targetUserId));
                 stringRedisTemplate.opsForSet().remove(dislikeKey, String.valueOf(targetUserId));
+                // 保存到数据库
+                recommendService.saveUserLike(userId, targetUserId);
             } else if ("dislike".equalsIgnoreCase(type)) {
                 stringRedisTemplate.opsForSet().add(dislikeKey, String.valueOf(targetUserId));
                 stringRedisTemplate.opsForSet().remove(likeKey, String.valueOf(targetUserId));
@@ -254,6 +256,21 @@ public class RecommendController {
         java.util.Map<String,Object> m = new java.util.HashMap<>();
         m.put(k1, v1); m.put(k2, v2); return m;
     }
+    
+    // 获取用户喜欢的列表
+    @GetMapping("/liked-users")
+    public Result<List<RecommendUserVO>> getLikedUsers(
+            @RequestParam("userId") Integer userId,
+            @RequestParam(value = "limit", required = false, defaultValue = "20") Integer limit
+    ) {
+        try {
+            List<RecommendUserVO> list = recommendService.getLikedUsers(userId, limit);
+            return Result.success(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("获取喜欢的用户列表失败: " + e.getMessage());
+        }
+    }
 
 }
 

+ 6 - 0
service/Recommend/src/main/java/com/zhentao/mapper/RecommendMapper.java

@@ -36,6 +36,12 @@ public interface RecommendMapper {
 
     // areas by cityId
     List<com.zhentao.pojo.Area> selectAreasByCity(@Param("cityId") Integer cityId);
+    
+    // 插入用户喜欢记录
+    int insertUserLike(@Param("userId") Integer userId, @Param("likeUserId") Integer likeUserId);
+    
+    // 查询用户喜欢的列表
+    List<RecommendUserVO> selectLikedUsers(@Param("userId") Integer userId, @Param("limit") Integer limit);
 }
 
 

+ 6 - 0
service/Recommend/src/main/java/com/zhentao/service/RecommendService.java

@@ -13,6 +13,12 @@ public interface RecommendService {
     List<com.zhentao.pojo.City> getAllCities();
     List<com.zhentao.pojo.City> getCitiesByProvince(Integer provinceId);
     List<com.zhentao.pojo.Area> getAreasByCity(Integer cityId);
+    
+    // 保存用户喜欢记录
+    boolean saveUserLike(Integer userId, Integer likeUserId);
+    
+    // 获取用户喜欢列表
+    List<RecommendUserVO> getLikedUsers(Integer userId, Integer limit);
 }
 
 

+ 30 - 0
service/Recommend/src/main/java/com/zhentao/service/impl/RecommendServiceImpl.java

@@ -441,6 +441,36 @@ public class RecommendServiceImpl implements RecommendService {
         if (n == null) return 0.0;
         try { return n.doubleValue(); } catch (Exception ignore) { return 0.0; }
     }
+
+    @Override
+    public boolean saveUserLike(Integer userId, Integer likeUserId) {
+        if (userId == null || likeUserId == null) {
+            throw new IllegalArgumentException("userId and likeUserId cannot be null");
+        }
+        try {
+            int result = recommendMapper.insertUserLike(userId, likeUserId);
+            return result > 0;
+        } catch (Exception ex) {
+            log.error("saveUserLike failed", ex);
+            return false;
+        }
+    }
+
+    @Override
+    public List<RecommendUserVO> getLikedUsers(Integer userId, Integer limit) {
+        if (userId == null) {
+            throw new IllegalArgumentException("userId cannot be null");
+        }
+        if (limit == null || limit <= 0) {
+            limit = 20;
+        }
+        try {
+            return recommendMapper.selectLikedUsers(userId, limit);
+        } catch (Exception ex) {
+            log.error("getLikedUsers failed", ex);
+            return java.util.Collections.emptyList();
+        }
+    }
 }
 
 

+ 41 - 0
service/Recommend/src/main/resources/mapper/RecommendMapper.xml

@@ -546,6 +546,47 @@
     <select id="selectAreasByCity" resultMap="AreaResultMap">
         SELECT id, name, city_id FROM area WHERE city_id = #{cityId} ORDER BY id
     </select>
+    
+    <!-- 插入用户喜欢记录 -->
+    <insert id="insertUserLike">
+        <![CDATA[
+        INSERT INTO user_likes_user (user_id, like_user_id, create_time)
+        VALUES (#{userId}, #{likeUserId}, NOW())
+        ON DUPLICATE KEY UPDATE create_time = NOW()
+        ]]>
+    </insert>
+    
+    <!-- 查询用户喜欢的列表 -->
+    <select id="selectLikedUsers" resultMap="RecommendUserMap">
+        <![CDATA[
+        SELECT
+          u.user_id,
+          u.nickname,
+          u.gender,
+          p.province_id,
+          p.city_id,
+          p.area_id,
+          p.height,
+          p.weight,
+          p.education_level,
+          p.salary_range,
+          p.hobby,
+          p.star,
+          p.animal,
+          p.school_name,
+          p.job_title,
+          u.avatar_url,
+          u.last_active_at,
+          80.0 AS compatibility_score
+        FROM user_likes_user ulu
+        JOIN users u ON u.user_id = ulu.like_user_id
+        LEFT JOIN user_profile p ON p.user_id = u.user_id
+        WHERE ulu.user_id = #{userId}
+          AND u.status = 1
+        ORDER BY ulu.create_time DESC
+        LIMIT #{limit}
+        ]]>
+    </select>
 </mapper>