【探花交友】day07—搜附近(一)

简介: 【探花交友】day07—搜附近

课程说明

  • 实现探花功能
  • 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、测试

效果:


相关文章
|
域名解析 小程序 Linux
朋友圈超火的盲盒交友小程序,完整搭建教程及源码分享~(多图)
朋友圈超火的盲盒交友小程序,完整搭建教程及源码分享~(多图)
朋友圈超火的盲盒交友小程序,完整搭建教程及源码分享~(多图)
|
11月前
|
Dubbo 应用服务中间件 测试技术
【探花交友】day07—搜附近(三)
【探花交友】day07—搜附近(三)
158 0
|
11月前
|
存储 NoSQL Dubbo
【探花交友】day07—搜附近(二)
【探花交友】day07—搜附近(二)
114 0
|
11月前
|
存储 SQL 缓存
【探花交友】day04—圈子功能实现(一)
【探花交友】day04—圈子功能实现
88 0
|
11月前
|
API
【探花交友】day04—圈子功能实现(三)
【探花交友】day04—圈子功能实现(三)
63 0
|
11月前
|
存储 NoSQL API
【探花交友】day04—圈子功能实现(二)
【探花交友】day04—圈子功能实现(二)
109 0
|
11月前
|
NoSQL API Redis
【探花交友】day05—圈子互动(下)
【探花交友】day05—圈子互动(下)
101 0
|
11月前
|
存储 NoSQL 搜索推荐
【探花交友】day05—圈子互动(上)
【探花交友】day05—圈子互动
91 0
|
11月前
|
消息中间件 NoSQL 前端开发
【探花交友】day06—即时通信(一)
【探花交友】day06—即时通信
142 0
|
11月前
|
NoSQL 程序员 API
【探花交友】day06—即时通信(三)
【探花交友】day06—即时通信(三)
87 0