目录

1:圈子

1.1:查询好友动态

1.1.1:接口分析

1.1.2:流程分析

1.1.2:代码实现

1.2:查询推荐动态

1.2.1:接口分析

1.2.2:流程分析

1.2.3:代码实现


1:圈子

1.1:查询好友动态

1.1.1:接口分析

API接口文档:http://192.168.136.160:3000/project/19/interface/api/148

1.1.2:流程分析

当你的一个好友发了一个动态,他可能不想让你不想看到,那你就没有看到他这条动态的权限,也就是说这条动态在数据库中的标注没有你这个好友的查看,这个功能的实现就是,根据当前用户id到数据库中的控制动态谁可以查看的表中(时间线表)去查找对应的好友想让你看到的数据。时间线表通过判断当前用户的id,查找出来对应的动态id数据。

1.1.2:代码实现

与前端交互的app-server模块

controller层实现

    @GetMappingpublic ResponseEntity friendmovements(PublicPageVo publicPageVo){ResultList friendmovements = movementService.friendmovements(publicPageVo,UserHolder.getUserId());return ResponseEntity.ok(friendmovements);}

service层实现

    public ResultList friendmovements(PublicPageVo publicPageVo, Long userId) {ResultList friendmovements = movementApi.friendmovements(publicPageVo, userId);List<Movement> items = friendmovements.getItems();List<MovementVo> movements = new ArrayList<>();for (Movement movement : items) {UserInfo userInfo = userInfoApi.findUser(movement.getUserId());extracted(userId, movements, movement, userInfo);}friendmovements.setItems(movements);return friendmovements;}

统一封装接口的模块

    ResultList friendmovements(PublicPageVo publicPageVo,Long Userid);
        public UserInfo findUser(Long id);

提供者模块(提供相关接口的实现)

mongo提供者:

    @Overridepublic ResultList friendmovements(PublicPageVo publicPageVo, Long userId) {//创建封装类ResultList movementVoResultList = new ResultList<>();//通过userIdQuery query = new Query();query.addCriteria(Criteria.where("friendId").is(userId));long count = mongoTemplate.count(query,MovementTimeline.class);query.skip((publicPageVo.getPage()-1L)*publicPageVo.getPagesize()).limit(publicPageVo.getPagesize().intValue());List<MovementTimeline> movementTimelineList = mongoTemplate.find(query, MovementTimeline.class);System.out.println(movementTimelineList);//处理数据,获得动态idList<ObjectId> movementId = CollUtil.getFieldValues(movementTimelineList, "movementId", ObjectId.class);//查询对应的动态Query movementQuery = new Query(Criteria.where("id").in(movementId)).with(Sort.by(Sort.Order.desc("created")));List<Movement> movements = mongoTemplate.find(movementQuery, Movement.class);//设置列表movementVoResultList.setItems(movements);//设置当前页码movementVoResultList.setPage(publicPageVo.getPage().intValue());//设置总记录数movementVoResultList.setCounts((int) count);//设置页大小movementVoResultList.setPagesize(publicPageVo.getPagesize().intValue());//设置总页数movementVoResultList.setPages((int) (count%publicPageVo.getPagesize() == 0 ? count/ publicPageVo.getPagesize():(count/ publicPageVo.getPagesize())+1));return movementVoResultList;}

db提供者服务:

    @Overridepublic UserInfo findUser(Long id) {UserInfo userInfo = this.userInfoMapper.selectById(id);return userInfo;}

1.2:查询推荐动态

推荐动态是通过推荐系统计算出的结果,现在我们只需要实现查询即可
推荐系统计算完成后,会将结果数据写入到 Redis 中,数据如下:

1.2.1:接口分析

接口文档:http://192.168.136.160:3000/project/19/interface/api/145

1.2.2:流程分析

推荐用户的值在redis缓存中,将其取出查找数据,封装数据。

1.2.3:代码实现

与前端交互的app-server模块

controller层实现

    /*** 推荐动态* @return*/@GetMapping("/recommend")public ResponseEntity recommendmovements(PublicPageVo publicPageVo){ResultList recommendmovements = movementService.recommendmovements(publicPageVo, UserHolder.getUserId());return ResponseEntity.ok(recommendmovements);}

service层实现

    public ResultList recommendmovements(PublicPageVo publicPageVo, Long userId) {//处理redis中数据String key = "MOVEMENTS_RECOMMEND_"+userId;//找到推荐评论的推荐pidString pids = stringRedisTemplate.opsForValue().get(key);//切割处理数据String[] pidList = pids.split(",");//查找对应的评论和useridResultList recommendmovements = movementApi.recommendmovements(pidList,publicPageVo);List<Movement> items = recommendmovements.getItems();//传入用户APiMap<Long, UserInfo> userInfoMap = userInfoApi.findUserByids(items.stream().map(movement -> movement.getUserId()).collect(Collectors.toList()));List<MovementVo> movementVoList = new ArrayList<>();//处理返回数据for (Movement movement : items) {UserInfo userInfo = userInfoMap.get(movement.getUserId());extracted(userId, movementVoList, movement, userInfo);}recommendmovements.setItems(movementVoList);return recommendmovements;}

统一封装接口的模块

    ResultList recommendmovements(String[] pidList, PublicPageVo publicPageVo);
  Map<Long,UserInfo> findUserByids(List<Long> collect);

db提供者模块(提供相关接口的实现)

    @Overridepublic Map<Long, UserInfo> findUserByids(List<Long> collect) {Map<Long,UserInfo> userInfoMap = new HashMap<>();//传入的是用户idfor (Long userid : collect) {UserInfo userInfo = userInfoMapper.selectById(userid);if (userInfo!=null){userInfoMap.put(userInfo.getId(),userInfo);}}return userInfoMap;}

mongo提供者模块(提供相关接口的实现)

    @Overridepublic ResultList recommendmovements(String[] pidList, PublicPageVo publicPageVo) {ResultList<Movement> objectResultList = new ResultList<>();//拼凑条件Query query = new Query();Integer [] newpidList = new Integer[pidList.length];for (int i = 0; i < pidList.length; i++) {newpidList[i] = Integer.valueOf(pidList[i]);}query.addCriteria(Criteria.where("pid").in(newpidList)).limit(publicPageVo.getPagesize().intValue()).skip((publicPageVo.getPage()-1)* publicPageVo.getPagesize());List<Movement> movements = mongoTemplate.find(query, Movement.class);System.out.println(movements);long count = mongoTemplate.count(query, Movement.class);objectResultList.setItems(movements);objectResultList.setPagesize(publicPageVo.getPagesize().intValue());objectResultList.setPage(publicPageVo.getPage().intValue());objectResultList.setPages((int) (count%publicPageVo.getPagesize() == 0 ? count/ publicPageVo.getPagesize():(count/ publicPageVo.getPagesize())+1));//返回处理的数据return objectResultList;}

交友项目【查询好友动态,查询推荐动态】实现相关推荐

  1. 18.查询好友动态和推荐动态

    查询好友动态和推荐动态 一.查询好友动态 代码步骤 Controller层接受请求参数 Service数据封装 调用API查询好友动态详情数据 调用API查询动态发布人详情 构造VO对象 API层根据 ...

  2. 交友项目【查询黑名单人员,移除黑名单人员】功能实现

    目录 1:交友项目 1.1:查询黑名单人员 1.1.1:接口地址 1.1.2:流程分析 1.1.2:代码实现 1.2:移除黑名单人员 1.2.1:接口地址 1.2.2:流程分析 1.2.3:代码实现 ...

  3. java 探花交友项目day5 推荐好友列表 MongoDB集群 发布动态,查询动态 圈子功能

    推荐好友列表 需求分析 推荐好友:分页形式查询推荐的用户列表,根据评分排序显示 代码实现: tanhuaController: /**  * 查询分页推荐好友列表  */ @GetMapping(&q ...

  4. jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询

    jpa命名 多条件查询命名 JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将 ...

  5. JPA 2 | 动态查询与命名查询

    JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将对定义的Entity类执行C ...

  6. SpringDataJpa (二)-动态查询多表操作

    SpringDataJpa (二)-动态查询&多表操作 一.动态查询 1.Specifications动态查询 1.1 搭建测试环境 1.1.1 导入坐标 1.1.2 创建客户实体类 1.1. ...

  7. 基于JPA实现的动态查询工具类

    1. 背景 接触了一个新项目,项目使用的框架为Spring-data-jpa,起初对这个项目还是挺感兴趣的,啊毕竟之前一直用Mybatis-Plus框架,深陷mp框架毒害啊(注:不喜欢写sql). 然 ...

  8. mybatis常用标签和动态查询

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: [mybatis ...

  9. jpa 动态查询条件 数组_Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一.  诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...

最新文章

  1. MyBatis版本升级引发的线上告警回顾及原理分析
  2. mysql 检查哪些项目_mysql根据内容查询在哪个表.go
  3. api与implementation的区别
  4. 元素隐式具有 “any” 类型,因为类型“Shared”没有索引签名问题解决思路
  5. Tomcat无响应问题
  6. 用pc浏览器打开手机页面
  7. mysql5.7优化案例_MYSQL5.7函数索引优化案例【企业数据库实战优化项目】
  8. Sybase ASE15.7静默安装
  9. 挖金矿问题java课程设计_某15万吨金矿采矿方法课程设计
  10. MVC模式中Controller控制器为什么是Servlet?怎么理解?
  11. Excel格式刷使用技巧
  12. 阿里云云.速成美站和云.企业官网建站介绍
  13. AndroidManifest.xml文件解析(详解)
  14. NoC(Network on Chip)基础 (3):网络拓扑结构 Butterfly、Torus、Mesh
  15. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...
  16. 安全测试之SQL注入攻击
  17. AspectJ简单实现
  18. 应届生做技术支持好吗_应届生第一份工作做销售合适吗?难吗?对吗?谁能给我答案?...
  19. 基于springboot实现大学生租房系统演示【附项目源码】分享
  20. java判断数据库连接是否有效的方法

热门文章

  1. BLUEMOON记录
  2. php验证手机号和身份证号
  3. 服务器响应超时是配置不足吗,服务器响应超时是什么情况
  4. 初览spring boot读后感
  5. iphone和ipad设备分辨率
  6. elasticsearch 条件去重_Elasticsearch7.* + SpringBoot2.*根据中文和拼音分页去重搜索-Go语言中文社区...
  7. ZCMU-1618-骨牌覆盖(矩阵乘法+快速幂)
  8. React Native集成极光推送
  9. 『HTML5梦幻之旅』-滚动播放的幻灯片效果
  10. 【荐读】我观察14年才发现,那些很努力却没成就的人都有一个特点