课程总结
1.探花功能
-
业务需求
-
执行过程
2.MongoDB的地理位置查询
-
地理位置查询的应用场景
-
查询案例
3.搜附近
-
上报地理位置
-
使用MongoDB搜索附近
一. 探花左划右滑
探花功能是将推荐的好友随机的通过卡片的形式展现出来,用户可以选择左滑、右滑操作,左滑:“不喜欢”,右滑:“喜欢”。
喜欢:如果双方喜欢,那么就会成为好友。
![1572105631737](https://i-blog.csdnimg.cn/blog_migrate/64c78926c057fb73cc0e80e4a0c041db.png)
如果已经喜欢或不喜欢的用户在列表中不再显示。
1-1 技术支持
1. 数据库表
2. Redis缓存
探花功能使用Redis缓存提高查询效率。
对于喜欢/不喜欢功能,使用Redis中的set进行存储。Redis 的 Set 是无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。使用Set可以方便的实现交集,并集等个性化查询。
数据规则:
喜欢:USER_LIKE_SET_{ID}
不喜欢:USER_NOT_LIKE_SET_{ID}
1-2 查询推荐用户
1. 接口文档
单次查询随机返回10条推荐用户数据
需要排除已喜欢/不喜欢的数据
2. 思路分析
查询探花卡片推荐用户列表
1、查询已喜欢/不喜欢的用户列表
2、查询推荐列表,并排除已喜欢/不喜欢用户
3、如果推荐列表不存在,构造默认数据
3. 实体对象
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "user_like")
public class UserLike implements java.io.Serializable {
private static final long serialVersionUID = 6739966698394686523L;
private ObjectId id;
@Indexed
private Long userId; //用户id,自己
@Indexed
private Long likeUserId; //喜欢的用户id,对方
private Boolean isLike; // 是否喜欢
private Long created; //创建时间
private Long updated; // 更新时间
}
4. controller
TanhuaController
/**
* 探花-推荐用户列表
*/
@GetMapping("/cards")
public ResponseEntity queryCardsList() {
List<TodayBest> list = this.tanhuaService.queryCardsList();
return ResponseEntity.ok(list);
}
5. service
TanhuaService
#默认推荐列表
tanhua:
default:
recommend:
users: 2,3,8,10,18,20,24,29,27,32,36,37,56,64,75,88
@Value("${tanhua.default.recommend.users}")
private String recommendUser;
//探花-推荐用户列表
public List<TodayBest> queryCardsList() {
//1、调用推荐API查询数据列表(排除喜欢/不喜欢的用户,数量限制)
List<RecommendUser> users = recommendUserApi.queryCardsList(UserHolder.getUserId(),10);
//2、判断数据是否存在,如果不存在,构造默认数据 1,2,3
if(CollUtil.isEmpty(users)) {
users = new ArrayList<>();
String[] userIdS = recommendUser.split(",");
for (String userId : userIdS) {
RecommendUser recommendUser = new RecommendUser();
recommendUser.setUserId(Convert.toLong(userId));
recommendUser.setToUserId(UserHolder.getUserId());
recommendUser.setScore(RandomUtil.randomDouble(60, 90));
users.add(recommendUser);
}
}
//3、构造VO
List<Long> ids = CollUtil.getFieldValues(users, "userId", Long.class);
Map<Long, UserInfo> infoMap = userInfoApi.findByIds(ids, null);
List<TodayBest> vos = new ArrayList<>();
for (RecommendUser user : users) {
UserInfo userInfo = infoMap.get(user.getUserId());
if(userInfo != null) {
TodayBest vo = TodayBest.init(userInfo, user);
vos.add(vo);
}
}
return vos;
}
6. API实现
RecommendUserApi
/**
* 查询探花列表,查询时需要排除喜欢和不喜欢的用户
*/
List<RecommendUser> queryCardsList(Long userId, int count);
RecommendUserApiImpl
/**
* 查询探花列表,查询时需要排除喜欢和不喜欢的用户
* 1、排除喜欢,不喜欢的用户
* 2、随机展示
* 3、指定数量
*/
public List<RecommendUser> queryCardsList(Long userId, int counts) {
//1、查询喜欢不喜欢的用户ID
List<UserLike> likeList = mongoTemplate.find(Query.query(Criteria.where("userId").is(userId)), UserLike.class);
List<Long> likeUserIdS = CollUtil.getFieldValues(likeList, "likeUserId", Long