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

news2024/9/22 5:32:20

目录

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;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python教程:如何用PIL将图片转换为ASCII艺术

Python教程&#xff1a;如何用PIL将图片转换为ASCII艺术 ASCII 艺术是一种将图像转换为由字符组成的艺术形式。Python 是一种灵活而强大的编程语言&#xff0c;可以使用它来将图片转换为 ASCII 艺术。本文将介绍如何使用 Python 和 PIL 库来实现这一功能。 文末有完整代码 效…

数学建模第一天:数学建模先导课之MATLAB的入门

目录 一、MATLAB的简介 二、Matlab基础知识 1. 变量 ①命名规则 ②特殊变量名 2、数学符号与函数调用 ①符号 ②数学函数 ③自定义函数 三、数组与矩阵 1、数组 ①创建数组 ②访问数组元素 ③数组运算 2、矩阵 ①定义 ②特殊矩阵 ③矩阵运算 四、控制流 …

若依项目springcloud启动

若依项目springcloud启动 参考&#xff1a;http://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html 1、概述 1.1、学习前提 熟练使用springboot相关技术了解springcloud相关技术电脑配置可以支持 1.2、需要的配置 JDK > 1.8 (推荐1.8版本) Mysql > 5.7.0 (推荐5.7版…

若依数据隔离 ${params.dataScope} 替换 优化为sql 替换

若依数据隔离 ${params.dataScope} 替换 优化为sql 替换 安全问题:有风险的SQL查询&#xff1a;MyBatis解决 若依框架的数据隔离是通过 ${params.dataScope} 实现的 但是在代码安全扫描的时候$ 符会提示有风险的SQL查询&#xff1a;MyBatis 所以我们这里需要进行优化参考: M…

凌恩生物文献分享|IF31.316→一网打尽与婴儿疾病相关的病毒组研究

期刊&#xff1a;Cell Host & Microbe 影响因子&#xff1a;31.316 发表时间&#xff1a;2022年4月 研究团队&#xff1a;清华大学医学院梁冠翔课题组与宾夕法尼亚大学医学院Frederic Bushman课题组 一、研究背景 已知微生物为人类提供营养物质和代谢物&…

AD、PADS、Cadence各有什么优势?

读者中有很大一部分是电子工程师&#xff0c;先想问下大家&#xff1a;你们画PCB常用什么软件&#xff1f; **函第一的AD? 还是最贵Cadence&#xff08;Allegro&#xff09;&#xff1f; 看到有读者在问&#xff1a;AD、PADS、Cadence各有什么优势&#xff1f; 这里就简单分…

一文吃透Java线程池——实现机制篇

前言 本篇博客是《一文吃透Java线程池》系列博客的下半部分。 上半部分链接&#xff1a;一文吃透Java线程池——基础篇 实现机制&#xff08;源码解析&#xff09; 根据前面的学习&#xff0c;我们知道&#xff0c;线程池是如下的运作机制 解析&#xff1a; 一开始&#…

Flutter插件开发-(进阶篇)

一、概述 Flutter也有自己的Dart Packages仓库。插件的开发和复用能够提高开发效率&#xff0c;降低工程的耦合度&#xff0c;像网络请求(http)、用户授权(permission_handler)等客户端开发常用的功能模块&#xff0c;我们只需要引入对应插件就可以为项目快速集成相关能力&…

2023-04-15 学习记录--C/C++-mac vscode配置并运行C/C++

mac vscode配置并运行C/C 一、vscode安装 ⭐️ 去官网下载安装mac版的vscode。 二、vscode配置 ⭐️ &#xff08;一&#xff09;、安装C/C扩展插件及必装好用插件 1、点击左边的 图标(扩展: 商店)&#xff0c;如下图&#xff1a; 2、先安装 C/C、C/CExtension Pack插件&…

大话数据结构-C(2)

二&#xff1a;算法 解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 2.1 算法的特性 算法具有五个基本特性&#xff1a;输入、输出、有穷性、确定性、可行性。 1&#xff09;输入输出&#xff1a; 算法具…

Python --- 文件操作

目录 前言 一、open()函数 1.只读模式 r 2.只写模式 w 3.追加模式 a 二、操作其他文件 1.Python 操作二进制 2.Python 操作 json 文件 三、关闭文件 四、上下文管理器 五、文件指针位置 前言 在实际操作中&#xff0c;通常需要将数据写入到本地文件或者从本地文件中…

南方猛将加盟西方手机完全是臆测,他不会希望落得兔死狗烹的结局

早前南方某科技企业因为命名的问题闹得沸沸扬扬&#xff0c;于是一些业界人士就猜测该猛将会加盟西方手机&#xff0c;对于这种猜测可以嗤之以鼻&#xff0c;从西方手机以往的作风就可以看出来它向来缺乏容纳猛将的气量。一、没有猛将的西方手机迅速沉沦曾几何时&#xff0c;西…

【项目】bxg基于SaaS的餐掌柜项目实战(2023)

基于SaaS的餐掌柜项目实战 餐掌柜是一款基于SaaS思想打造的餐饮系统&#xff0c;采用分布式系统架构进行多服务研发&#xff0c;共包含4个子系统&#xff0c;分别为平台运营端、管家端&#xff08;门店&#xff09;、收银端、小程序端&#xff0c;为餐饮商家打造一站式餐饮服务…

如何用ChatGPT翻译?ChatGPT提升翻译速度,亲测有效

作为翻译新手&#xff0c;你是否为翻译不准确不地道而烦恼&#xff1f; 随着ChatGPT的大火&#xff0c;很多聪明的翻译已经开始使用ChatGPT辅助自己提升翻译能力和速度了。 想用ChatGPT翻译&#xff0c;首先要知道在哪里可以使用ChatGPT&#xff01;在国内选择不用注册不用登录…

python实现批量生成带内容的文件夹

我工作的时候经常遇到这个问题&#xff1a;需要批量生成带内容的文件夹来辅助工作。 我有8种不同名字的文件夹 每个文件夹下面都有以日期命名的文件夹 日期文件夹里面会记录我当天需要记录的东西。 我需要实现的功能是&#xff1a; 1.输入一个天数N&#xff0c;生成N天以前…

机器学习 day05(多元线性回归,向量化)

单个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格仅由房子的大小决定&#xff0c;如图&#xff1a; 多个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格由房子的大小&#xff0c;房子有多少个卧室&#xff0c;房子有几层&#xff0c;房子住了多…

代码随想录|day44|动态规划part06● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包 理论基础 视频&#xff1a;带你学透完全背包问题&#xff01; 和 01背包有什么差别&#xff1f;遍历顺序上有什么讲究&#xff1f;_哔哩哔哩_bilibili 链接&#xff1a;代码随想录 //先遍历背包还是先遍历物品是没有影响的。可以和01背包保持一致&#xff0c;都先遍历…

vue-自定义指令

需求1&#xff1a;定义一个v-big指令&#xff0c;和v-text功能类似&#xff0c;但会把绑定的数值放大10倍。 需求2&#xff1a;定义一个v-fbind指令&#xff0c;和v-bind功能类似&#xff0c;但可以让其所绑定的input元素默认获取焦点。 语法&#xff1a; 局部使用&#xff…

【硬件外设使用】——I2C

【硬件外设使用】——I2CI2C基本概念I2C通信协议I2C使用方法pyb.i2cmachine.i2cI2C可用的传感器I2C基本概念 I2C是"Inter-Integrated Circuit"的缩写&#xff0c;也被称为TWI (Two Wire Interface)。 它是一种串行通信协议&#xff0c;用于连接多个设备或组件。 I2…

记一次idea+Dockerfile+docker部署

软件版本&#xff1a;idea:2021.3,docker:19.03.9,服务器&#xff1a;centos7.8 1.centos7服务器配置 在服务器上编辑docker文件 vi /usr/lib/systemd/system/docker.service修改以ExecStart开头的行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/ru…