课程说明
- 实现探花功能
- MongoDB geo
- 搜附近
- 上报地理位置
- 搜附近
1、探花
探花功能是将推荐的好友随机的通过卡片的形式展现出来,用户可以选择左滑、右滑操作,左滑:“不喜欢”,右滑:“喜欢”。
喜欢:如果双方喜欢,那么就会成为好友。
如果已经喜欢或不喜欢的用户在列表中不再显示。
1.1、查询推荐列表dubbo服务
1.1.1、实体对象
1. package com.tanhua.dubbo.server.pojo; 2. 3. import lombok.AllArgsConstructor; 4. import lombok.Data; 5. import lombok.NoArgsConstructor; 6. import org.bson.types.ObjectId; 7. import org.springframework.data.mongodb.core.index.Indexed; 8. import org.springframework.data.mongodb.core.mapping.Document; 9. 10. @Data 11. @NoArgsConstructor 12. @AllArgsConstructor 13. @Document(collection = "user_like") 14. public class UserLike implements java.io.Serializable { 15. 16. private static final long serialVersionUID = 6739966698394686523L; 17. 18. private ObjectId id; 19. @Indexed 20. private Long userId; //用户id,自己 21. @Indexed 22. private Long likeUserId; //喜欢的用户id,对方 23. private Boolean isLike; // 是否喜欢 24. private Long created; //创建时间 25. private Long updated; // 更新时间 26. 27. }
1.1.2、定义接口
RecommendUserApi
1. /** 2. * 查询探花列表,查询时需要排除喜欢和不喜欢的用户 3. */ 4. List<RecommendUser> queryCardsList(Long userId, int count);
1.1.3、编写实现
RecommendUserApiImpl
1. /** 2. * 查询探花列表,查询时需要排除喜欢和不喜欢的用户 3. * 1、排除喜欢,不喜欢的用户 4. * 2、随机展示 5. * 3、指定数量 6. */ 7. public List<RecommendUser> queryCardsList(Long userId, int counts) { 8. //1、查询喜欢不喜欢的用户ID 9. List<UserLike> likeList = mongoTemplate.find(Query.query(Criteria.where("userId").is(userId)), UserLike.class); 10. List<Long> likeUserIdS = CollUtil.getFieldValues(likeList, "likeUserId", Long.class); 11. //2、构造查询推荐用户的条件 12. Criteria criteria = Criteria.where("toUserId").is(userId).and("userId").nin(likeUserIdS); 13. //3、使用统计函数,随机获取推荐的用户列表 14. TypedAggregation<RecommendUser> newAggregation = TypedAggregation.newAggregation(RecommendUser.class, 15. Aggregation.match(criteria),//指定查询条件 16. Aggregation.sample(counts) 17. ); 18. AggregationResults<RecommendUser> results = mongoTemplate.aggregate(newAggregation, RecommendUser.class); 19. //4、构造返回 20. return results.getMappedResults(); 21. }
1.1.4、单元测试
1. //com.tanhua.dubbo.server.api.TestRecommendUserApi 2. 3. @Test 4. public void testQueryCardList(){ 5. this.recommendUserApi.queryCardsList(106l, 10) 6. .forEach(recommendUser -> System.out.println(recommendUser)); 7. }
1.2、查询推荐列表APP接口实现
接口文档:https://mock-java.itheima.net/project/35/interface/api/593
1.2.1、TanHuaController
1. /** 2. * 探花-推荐用户列表 3. */ 4. @GetMapping("/cards") 5. public ResponseEntity queryCardsList() { 6. List<TodayBest> list = this.tanhuaService.queryCardsList(); 7. return ResponseEntity.ok(list); 8. }
1.2.2、TanHuaService
1. #默认推荐列表 2. tanhua: 3. default: 4. recommend: 5. users: 2,3,8,10,18,20,24,29,27,32,36,37,56,64,75,88
1. @Value("${tanhua.default.recommend.users}") 2. private String recommendUser; 3. 4. //探花-推荐用户列表 5. public List<TodayBest> queryCardsList() { 6. //1、调用推荐API查询数据列表(排除喜欢/不喜欢的用户,数量限制) 7. List<RecommendUser> users = recommendUserApi.queryCardsList(UserHolder.getUserId(),10); 8. //2、判断数据是否存在,如果不存在,构造默认数据 1,2,3 9. if(CollUtil.isEmpty(users)) { 10. users = new ArrayList<>(); 11. String[] userIdS = recommendUser.split(","); 12. for (String userId : userIdS) { 13. RecommendUser recommendUser = new RecommendUser(); 14. recommendUser.setUserId(Convert.toLong(userId)); 15. recommendUser.setToUserId(UserHolder.getUserId()); 16. recommendUser.setScore(RandomUtil.randomDouble(60, 90)); 17. users.add(recommendUser); 18. } 19. } 20. //3、构造VO 21. List<Long> ids = CollUtil.getFieldValues(users, "userId", Long.class); 22. Map<Long, UserInfo> infoMap = userInfoApi.findByIds(ids, null); 23. 24. List<TodayBest> vos = new ArrayList<>(); 25. for (RecommendUser user : users) { 26. UserInfo userInfo = infoMap.get(user.getUserId()); 27. if(userInfo != null) { 28. TodayBest vo = TodayBest.init(userInfo, user); 29. vos.add(vo); 30. } 31. } 32. return vos; 33. }
1.2.3、测试
效果: