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

目录

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层实现

    @GetMapping
    public 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提供者:

    @Override
    public ResultList friendmovements(PublicPageVo publicPageVo, Long userId) {
        //创建封装类
        ResultList movementVoResultList = new ResultList<>();
        //通过userId
        Query 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);
        //处理数据,获得动态id
        List<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提供者服务:

    @Override
    public 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;
        //找到推荐评论的推荐pid
        String pids = stringRedisTemplate.opsForValue().get(key);
        //切割处理数据
        String[] pidList = pids.split(",");
        //查找对应的评论和userid
        ResultList recommendmovements = movementApi.recommendmovements(pidList,publicPageVo);
        List<Movement> items = recommendmovements.getItems();
        //传入用户APi
        Map<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提供者模块(提供相关接口的实现)

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

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

    @Override
    public 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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/13363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…

数据库实验 | 第1关:建立和调用存储过程(不带输出参数的存储过程)

任务描述 本关任务&#xff1a; 该实验是针对数据表jdxx&#xff0c;该数据表有四个字段&#xff0c;分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。 例如&#xff0c;查询天心区(qxmc)的所有字段的值结果如图所示 任务要求 建立存储过程 dqxx(in city varchar(10),i…

QT QPainter坐标系统和坐标变换

一、坐标变换函数 QPainter 在窗口上绘图的默认坐标系统如图下图所示&#xff0c;这是绘图设备的物理坐标。为了绘图的方便&#xff0c;QPainter 提供了一些坐标变换的功能&#xff0c;通过平移、旋转等坐标变换&#xff0c;得到一个逻辑坐标系统&#xff0c;使用逻辑坐标系统…

BEV+Transformer对无人驾驶硬件体系的巨大改变

摘要&#xff1a; BEVTransformer彻底终结了2D直视图CNN时代&#xff0c;BEVTransformer对智能驾驶硬件系统有着什么样的影响&#xff1f;背后的受益者又是谁&#xff1f; 图片来源&#xff1a;特斯拉 BEVTransformer是目前智能驾驶领域最火热的话题&#xff0c;没有之一&…

【区块链】走进web3的世界-DApp如何快速接入wall

在web3中&#xff0c;wall是您进入区块链的一个标识&#xff0c;每个用户使用的wall都不近相同&#xff0c;因此接入更多的wall是很有必要的&#xff0c;从用户角度来说&#xff0c;非必要情况下&#xff0c;我是不愿意去额外下载wall的。因此今天我们来聊一下&#xff0c;DApp…

开发常用的 Linux 命令2(文件的查看、搜索和权限)

开发常用的 Linux 命令2&#xff08;文件的查看、搜索和权限&#xff09; 作为开发者&#xff0c;Linux是我们必须掌握的操作系统之一。因此&#xff0c;在编写代码和部署应用程序时&#xff0c;熟练使用Linux命令非常重要。这些常用命令不得不会&#xff0c;掌握这些命令&…

【hello Linux】进程程序替换

目录 1. 程序替换的原因 2. 程序替换原理 3. 替换函数 4. 函数解释 5. 命名理解 6.简陋版shell的制作 补充&#xff1a; Linux&#x1f337; 1. 程序替换的原因 进程自创建后只能执行该进程对应的程序代码&#xff0c;那么我们若想让该进程执行另一个“全新的程序”这 便要用…

“分割一切”大模型SAM、超轻量PP-MobileSeg、工业质检工具、全景分割方案,PaddleSeg全新版本等你来体验!

图像分割是计算机视觉的一项基础技术&#xff0c;其目标是将图像中的像素按内容分成不同的类别。它在许多领域有重要应用&#xff0c;比如自动驾驶、工业质检、医疗图像分析、遥感图像解译等。 导读 PaddleSeg 是飞桨高性能图像分割开发套件&#xff0c;在图像分割领域做了大…

IC-14W网络IC卡读写器_银河麒麟桌面操作系统V10适配测试报告

银河麒麟操作系统产品NeoCertify 认证测试报告 系统版本&#xff1a;银河麒麟桌面操作系统V10 厂商名称&#xff1a; 广州荣士电子有限公司 认证产品&#xff1a;IC-14W网络IC卡读写器 测试日期&#xff1a; 2022-11-04 …

基于html+css的图片展示11

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【unity实战】随机地下城生成1——随机生成地下城初稿(含源码)

先看看实现的最终效果 #用到的素材 https://download.csdn.net/download/qq_36303853/87712757 导入素材 导入房间图片素材,配置图片信息信息 点击sprite Editor,开始切割图片 随机创建基本房间 已一个白底图片模拟房间预设体 思路:建立一个空的 GameObject 用来做…

平凡的Python为什么能一跃成为世界排名第一的语言

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;大周|慕课网讲师 一、前言 本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么…

牛客竞赛字符串专题 NC237664 Typewriter(SAM + 树上倍增 + 二分 + 线段树优化dp)

本题主要考察了如何用 SAM 求原串每个前缀对应的能与非后缀匹配的最长后缀&#xff0c;以及如何求 SAM 每个节点 right 集合的 min / max。很有价值的一道串串题。 题意&#xff1a; 你有一台打字机&#xff0c;你需要用它打出一段只由小写字母构成的文本S。 设某个时刻&#…

Linux基础—DHCP原理与配置

Linux基础—DHCP原理与配置 一、DHCP工作原理1.了解DHCP服务使用DHCP的优势DHCP的分配方式 2.DHCP的IP地白动获取工作原理: 二、配置DHCP服务器三、DHCP场景应用实验 一、DHCP工作原理 1.了解DHCP服务 DHCP(Dynamic HostConfiguration Protocol&#xff0c;动态主机配置协议) …

第四章 面向对象(OOP)

目录 一、编程思想 1.1. 面向对象 1.2. 面向过程 1.3.举例说明&#xff08;把大象装进冰箱&#xff09; 1.4.二者的联系与区别 1.5.面向对象的三个阶段 1.6.什么是类&#xff0c;什么是实例&#xff0c;二者的联系 二、面向对象三大特征 2.1 封装 2.2 继承 2.3 多态…

【C++11】智能指针

目录 一、异常层层嵌套执行流乱跳容易导致内存泄漏 二、使用智能指针解决上述问题 1、RAII 2、像指针一样 3、智能指针RAII运算符重载 三、C98的auto_ptr 四、C11的unique_ptr和shared_ptr 1、unique_ptr唯一指针 2、shared_ptr共享指针 2.1shared_ptr是否线程安全 …

不得不说的创建型模式-工厂方法模式

工厂方法模式是创建型模式之一&#xff0c;它定义了一个用于创建对象的接口&#xff0c;但将具体创建的过程延迟到子类中进行。换句话说&#xff0c;它提供了一种通过调用工厂方法来实例化对象的方法&#xff0c;而不是通过直接使用 new 关键字来实例化对象。 下面是一个使用 C…

浅理解JavaScript数组去重的方法(划重点),当面试官问如何实现数组去重时,你可以这样做...

文章目录 &#x1f4cb;前言&#x1f3af;什么是数组去重&#xff0c;运用场景是什么&#xff1f;&#x1f3af;常用的数组去重方法&#x1f9e9;使用 Set 对象&#x1f9e9;使用 Object&#xff08;对象、基于Hash哈希表&#xff09; 或 Map&#x1f9e9;使用 filter 方法与 i…

Smartbi电子表格软件架构与差异化特色

Smartbi电子表格软件选择与Excel结合&#xff0c;原因在于Excel一直被模仿&#xff0c;从未被超越。虽然市场上的报表软件很多&#xff0c;但存在太多的不完美。国外的产品功能复杂、难于学习&#xff08;控件方式&#xff09;&#xff0c;做不了中国式复杂格式的报表&#xff…

Python双向循环链表的操作

目录 一、双向循环链表 双向循环链表图 二、双向循环链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&a…