当前位置: 首页 > news >正文

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

目录

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&#xff1a;圈子 1.1&#xff1a;查询好友动态 1.1.1&#xff1a;接口分析 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;查询推荐动态 1.2.1&#xff1a;接口分析 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&#xff1a…...

24个强大的HTML属性,建议每位前端工程师都应该掌握!

HTML属性非常多&#xff0c;除了一些基础属性外&#xff0c;还有许多有用的特别强大的属性 本文将介绍24个强大的HTML属性&#xff0c;可以使您的网站更具有动态性和交互性&#xff0c;让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML属性吧&#xff01; 1、Acc…...

前端--移动端布局--2移动开发之flex布局

目标&#xff1a; 能够说出flex盒子的布局原理 能够使用flex布局的常用属性 能够独立完成携程移动端首页案例 目录&#xff1a; flex布局体验 flex布局原理 flex布局父项常见属性 flex布局子项常见属性 写出网首页案例制作 1.flex布局体验 1.1传统布局与flex布局 传…...

【移动端网页布局】移动端网页布局基础概念 ① ( 移动端浏览器 | 移动端屏幕分辨率 | 移动端网页调试方法 )

文章目录 一、移动端浏览器二、移动端屏幕分辨率三、移动端网页调试方法 一、移动端浏览器 移动端浏览器 比 PC 端浏览器发展要晚 , 使用的技术比较新 , 对 HTML5 CSS3 支持较好 , 常见的浏览器如下 : UC / QQ / Opera / Chrom / 360 / 百度 / 搜狗 / 猎豹 国内的浏览器 基本…...

无线洗地机哪款性价比高?高性价比的洗地机分享

虽说现在市面上清洁工具很多&#xff0c;但是要说清洁效果最好的&#xff0c;肯定非洗地机莫属。它集合了吸&#xff0c;洗&#xff0c;拖三大功能&#xff0c;干湿垃圾一次清理&#xff0c;还能根据地面的脏污程度进行清洁&#xff0c;达到极致的清洁效果&#xff0c;省时省力…...

精通 Python OpenCV4:第三、四部分

原文&#xff1a;Mastering OpenCV 4 with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最好真…...

在现成的3D打印机上进行实验理论:一种数据孪生的攻击探测框架

在现成的3D打印机上提供了一种DT中攻击探测框架的DT解决方案的实验演示&#xff0c;作为说明性CPMS资源。通过网络安全DT对打印机正常运行、异常运行和攻击三种情况下的实验数据进行收集和分析&#xff0c;得出攻击检测结果。实验装置概述如下图所示。该实验研究是在现实世界设…...

网络通信之传输层协议

文章目录 传输层在网络通信中扮演的角色认识TCP协议TCP协议的多种机制确认应答(ACK)机制超时重传机制连接管理机制&#x1f53a;滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常处理 总结 传输层在网络通信中扮演的角色 上图是网络通信中五个模块&#xff…...

短视频app开发:如何提高视频播放稳定性

简介 如今&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分&#xff0c;而短视频app的开发也日益成为了人们热议的话题。在短视频app开发的过程中&#xff0c;如何提高视频播放稳定性是一个非常重要的问题。本文将从短视频源码角度出发&#xff0c;分享提高短视频ap…...

软件测试,想找一份20k以上的工作需要掌握哪些知识?

都知道IT行业是高薪人员的聚集地&#xff0c;但想要成为高薪程序员却并不容易。月薪20k是测试工程师的一个门槛&#xff0c;想要突破就必须掌握更多的技能。 因为程序员职业发展很快&#xff0c;即使是相同起点的人&#xff0c;经过几年的工作或学习&#xff0c;会迅速拉开极…...

PostgreSQL标准复制方案

集群拓扑 假设我们使用4单元的标准配置&#xff1a;主库&#xff0c;同步从库&#xff0c;延迟备库&#xff0c;远程备库&#xff0c;分别用字母M,S,O,R标识。 M&#xff1a;Master, Main, Primary, Leader, 主库&#xff0c;权威数据源。S: Slave, Secondary, Standby, Sync…...

AOD实践,modis数据下载,modis数据处理

modis数据下载-数据读取-重投影-拼接-均值 一、数据下载 1、Cygwin安装 Cygwin安装教程&#xff1a;https://blog.csdn.net/u010356768/article/details/90756742 1.2 数据采集 现提供遥感数据下载服务&#xff0c;主要是NASA数据&#xff0c;数据下载网站包括&#xff1a…...

常见的注册中心Nacos、Eureka

常见的注册中心 1.Eureka&#xff08;原生&#xff0c;2.0遇到瓶颈&#xff0c;停止维护&#xff09; 2.Zookeeper&#xff08;支持&#xff0c;专业的独立产品。例如&#xff1a;dubbo&#xff09; 3.Consul&#xff08;原生&#xff0c;GO语言开发&#xff09; 4.Nacos …...

逆向思维书籍推荐

《逆向思维》作者&#xff1a;德鲁克 《逆向思维法》作者&#xff1a;艾伦哈勃 《逆向思维&#xff1a;如何解决问题》作者&#xff1a;托尼布赖恩特 《逆向思维的力量》作者&#xff1a;李开复 《逆向思维&#xff1a;掌握创新的关键》作者&#xff1a;李嘉诚 《逆向思维》作…...

centos系统简析

服务器所使用的最多的系统之一便是Linux系统&#xff0c;Linux下centos系统也是常用的系统&#xff0c;今天来给大家详细说名下centos系统。 CentOS于2004年5月发布&#xff0c;作为一个完全免费且基于Linux内核的操作系统。CentOS 起源于 RHEL。其目标是提供一个免费提供的企…...

「SQL面试题库」 No_43 只出现一次的最大数字

&#x1f345; 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起&#xff0c;全员免费参与的SQL学习活动。我每天发布1道SQL面试真题&#xff0c;从简单到困难&#xff0c;涵盖所有SQL知识点&#xff0c;我敢保证只要做完这100道题&#xff0c;不仅能轻松搞定面试&#xff0…...

TEB算法详解 参数详解

teb算法的基本思路之前已经看完了&#xff0c;今天主要看一下teb算法的参数配置文件&#xff0c;分析一下每个配置参数的作用&#xff1a; teb的参数主要可以包含以下几个部分&#xff1a; 1、Trajectory Trajectory的参数顾名思义&#xff0c;就是对路径生效的一些参数&…...

JavaSE学习进阶day05_03 泛型(进阶)

第五章 泛型&#xff0c;之前基础班学习过泛型&#xff0c;但是学的不深入 需要我们掌握的内容&#xff1a;&#xff08;掌握&#xff09; 1&#xff0c;如何使用一个带有泛型的类 2&#xff0c;如何使用一个带有泛型的方法 代码示例&#xff1a; ArrayList<String> lis…...

Flutter 布局探索 | 如何分析尺寸和约束

theme: cyanosis 前言 本文来分享一下&#xff0c;通过查看源码和布局信息解决的一个实际中的布局小问题&#xff0c;也希望通过本文的分享&#xff0c;当你遇到布局问题时&#xff0c;可以靠自己的脑子和双手解决问题。 如下所示&#xff0c;将 TextField 作为 AppBar 组件的 …...

01-Java基础知识面试题(2020最新版)

Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码&#xff0c;并 终得到结果的过程。 为了使计算机能够理解人的意图&#xff0c;人类就必须要将需解决的问题的思路、方法、 和手段通过计算机能够理解的形式告诉计算机&#xff0c;使得…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...