交友项目【查询好友动态,查询推荐动态】实现
目录
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:查询推荐动态
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:圈子 1.1:查询好友动态 1.1.1:接口分析 1.1.2:流程分析 1.1.2:代码实现 1.2:查询推荐动态 1.2.1:接口分析 1.2.2:流程分析 1.2.3:代码实现 1:…...
24个强大的HTML属性,建议每位前端工程师都应该掌握!
HTML属性非常多,除了一些基础属性外,还有许多有用的特别强大的属性 本文将介绍24个强大的HTML属性,可以使您的网站更具有动态性和交互性,让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML属性吧! 1、Acc…...

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

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

无线洗地机哪款性价比高?高性价比的洗地机分享
虽说现在市面上清洁工具很多,但是要说清洁效果最好的,肯定非洗地机莫属。它集合了吸,洗,拖三大功能,干湿垃圾一次清理,还能根据地面的脏污程度进行清洁,达到极致的清洁效果,省时省力…...
精通 Python OpenCV4:第三、四部分
原文:Mastering OpenCV 4 with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最好真…...

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

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

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

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

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

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

常见的注册中心Nacos、Eureka
常见的注册中心 1.Eureka(原生,2.0遇到瓶颈,停止维护) 2.Zookeeper(支持,专业的独立产品。例如:dubbo) 3.Consul(原生,GO语言开发) 4.Nacos …...
逆向思维书籍推荐
《逆向思维》作者:德鲁克 《逆向思维法》作者:艾伦哈勃 《逆向思维:如何解决问题》作者:托尼布赖恩特 《逆向思维的力量》作者:李开复 《逆向思维:掌握创新的关键》作者:李嘉诚 《逆向思维》作…...
centos系统简析
服务器所使用的最多的系统之一便是Linux系统,Linux下centos系统也是常用的系统,今天来给大家详细说名下centos系统。 CentOS于2004年5月发布,作为一个完全免费且基于Linux内核的操作系统。CentOS 起源于 RHEL。其目标是提供一个免费提供的企…...
「SQL面试题库」 No_43 只出现一次的最大数字
🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试࿰…...
TEB算法详解 参数详解
teb算法的基本思路之前已经看完了,今天主要看一下teb算法的参数配置文件,分析一下每个配置参数的作用: teb的参数主要可以包含以下几个部分: 1、Trajectory Trajectory的参数顾名思义,就是对路径生效的一些参数&…...

JavaSE学习进阶day05_03 泛型(进阶)
第五章 泛型,之前基础班学习过泛型,但是学的不深入 需要我们掌握的内容:(掌握) 1,如何使用一个带有泛型的类 2,如何使用一个带有泛型的方法 代码示例: ArrayList<String> lis…...

Flutter 布局探索 | 如何分析尺寸和约束
theme: cyanosis 前言 本文来分享一下,通过查看源码和布局信息解决的一个实际中的布局小问题,也希望通过本文的分享,当你遇到布局问题时,可以靠自己的脑子和双手解决问题。 如下所示,将 TextField 作为 AppBar 组件的 …...
01-Java基础知识面试题(2020最新版)
Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并 终得到结果的过程。 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、 和手段通过计算机能够理解的形式告诉计算机,使得…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...