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

【黑马点评学习笔记 | 实战篇 】| 8-好友关注

Bug如山勤为径代码似海苦作舟。友友们好这里是苦瓜大王。今天学习的是黑马点评项目实战篇——好友关注部分的学习今天也是相对轻松的章节今天我们将完成好友关注功能。笔记如下后续会一直更新黑马点评学习过程中的笔记、问题等请多多支持哦文章目录一、关注和取关二、共同关注1.先把查看用户主页功能做了才能查看共同关注2.改造关注功能三、关注推送1.Feed流的模式(1)~~拉模式~~(2)推模式(3)推拉结合模式2.基于推模式实现关注推送功能(1)改造保存博文,推送到粉丝收件箱(2)实现滚动分页查询1~定义一个滚动分页的DTO2~查询用户所关注的人的最新博文一、关注和取关这个功能需要实现两个接口基本代码如下后续会改造FollowController代码-------------------------------------FollowController------------------------------------ResourceprivateIFollowServicefollowService;/** * 关注或取关 * param followUserId * param isFollow * return */PutMapping(/{id}/{isFollow})publicResultfollow(PathVariable(id)LongfollowUserId,PathVariable(isFollow)BooleanisFollow){returnfollowService.follow(followUserId,isFollow);}/** * 查询是否关注 * param followUserId * return */GetMapping(/or/not/{id})publicResultisFollow(PathVariable(id)LongfollowUserId){returnfollowService.isFollow(followUserId);}FollowServiceImpl代码/** * 关注或取关 * param followUserId * param isFollow * return */publicResultfollow(LongfollowUserId,BooleanisFollow){//1.获取当前登录用户idLonguserIdUserHolder.getUser().getId();//2.判断关注还是取关if(isFollow){//3.关注FollowfollownewFollow().setUserId(userId).setFollowUserId(followUserId);save(follow);}else{//4.取关remove(newQueryWrapperFollow().eq(user_id,userId).eq(follow_user_id,followUserId));}returnResult.ok();}/** * 查询是否关注 * param followUserId * return */publicResultisFollow(LongfollowUserId){//1.获取当前登录用户idLonguserIdUserHolder.getUser().getId();//2.查询是否关注Integercountquery().eq(user_id,userId).eq(follow_user_id,followUserId).count();//3.大于0代表关注returnResult.ok(count0);}二、共同关注1.先把查看用户主页功能做了才能查看共同关注都是增删改查不细讲2.改造关注功能FollowServiceImpl代码-----------------------------------FollowServiceImpl-------------------------------------ResourceprivateStringRedisTemplatestringRedisTemplate;/** * 关注或取关 * param followUserId * param isFollow * return */publicResultfollow(LongfollowUserId,BooleanisFollow){//1.获取当前登录用户idLonguserIdUserHolder.getUser().getId();//2.判断关注还是取关if(isFollow){//3.关注FollowfollownewFollow().setUserId(userId).setFollowUserId(followUserId);booleanisSuccesssave(follow);if(isSuccess){StringkeyFOLLOW_KEYuserId;stringRedisTemplate.opsForSet().add(key,followUserId.toString());}}else{//4.取关booleanisSuccessremove(newQueryWrapperFollow().eq(user_id,userId).eq(follow_user_id,followUserId));if(isSuccess){stringRedisTemplate.opsForSet().remove(FOLLOW_KEYuserId,followUserId.toString());}}returnResult.ok();}代码/** * 查询共同关注 * param id * return */GetMapping(/common/{id})publicResultfollowCommons(PathVariable(id)Longid){returnfollowService.followCommons(id);}/** * 查询共同关注 * param id * return */publicResultfollowCommons(Longid){//1.获取当前用户idLonguserIdUserHolder.getUser().getId();Stringkey1FOLLOW_KEYuserId;Stringkey2FOLLOW_KEYid;//2.求交集SetStringcommonstringRedisTemplate.opsForSet().intersect(key1,key2);//3.转成long型解析出idif(commonnull||common.isEmpty())returnResult.ok(Collections.emptyList());ListLongcommonIdscommon.stream().map(Long::valueOf).collect(Collectors.toList());//查询用户ListUserDTOusersuserService.listByIds(commonIds).stream().map(user-BeanUtil.copyProperties(user,UserDTO.class)).collect(Collectors.toList());returnResult.ok(users);}三、关注推送1.Feed流的模式(1)拉模式有延迟(2)推模式内存占用比较高(3)推拉结合模式用户量在千万以下都可以用推模式本节我们使用推模式2.基于推模式实现关注推送功能Feed流不能采用传统分页使用不依赖角标的滚动查询而List不支持滚动分页使用sortedSet做滚动分页(1)改造保存博文,推送到粉丝收件箱在保存完探店笔记后获得到当前博主的粉丝然后把数据推送到粉丝的redis中去注意这里是粉丝列表而之前存在redis里的是关注列表ResourceprivateIFollowServicefollowService;/** * 保存博文并推送 * param blog * return */publicResultsaveBlog(Blogblog){//1.获取登录用户UserDTOuserUserHolder.getUser();blog.setUserId(user.getId());//2.保存探店笔记booleanisSuccesssave(blog);if(!isSuccess)returnResult.fail(新增笔记失败);//3.查询笔记作者的所有粉丝ListFollowfollowsfollowService.query().eq(follow_user_id,user.getId()).list();//4.推送笔记id给所有粉丝for(Followfollow:follows){//4.1获取粉丝idLonguserIdfollow.getUserId();//4.2推送给每个粉丝StringkeyFEED_KEYuserId;stringRedisTemplate.opsForZSet().add(key,blog.getId().toString(),System.currentTimeMillis());}returnResult.ok(blog.getId());}(2)实现滚动分页查询需求在个人主页的“关注”卡片中查询并展示推送的Blog信息具体操作如下1、每次查询完成后我们要分析出查询出数据的最小时间戳这个值会作为下一次查询的条件2、我们需要找到与上一次查询相同的查询个数作为偏移量下次查询时跳过这些查询过的数据拿到我们需要的数据综上我们的请求参数中就需要携带 lastId上一次查询的最小时间戳 和偏移量这两个参数。这两个参数第一次会由前端来指定以后的查询就根据后台结果作为条件再次传递到后台。滚动查询每一次查询都记住上一次查询的是谁滚动分页查询参数与上次查询结果中最小值一样的元素都要跳过命令实例1~定义一个滚动分页的DTODatapublicclassScrollResult{privateList?list;privateLongminTime;privateIntegeroffset;}2~查询用户所关注的人的最新博文上一次查询的最小时间是本次查询的最大时间BlogController代码RequestParam 表示接受url地址栏传参的注解当方法上参数的名称和url地址栏不相同时可以通过RequestParam 来进行指定--------------------------------------BlogController-------------------------------------GetMapping(/of/follow)publicResultqueryBlogOfFollow(RequestParam(lastId)Longmax,RequestParam(valueoffset,defaultValue0)Integeroffset){returnblogService.queryBlogOfFollow(max,offset);}BlogServiceImpl代码/** * 查询指定用户所关注的人的最新博文 * param max * param offset * return */publicResultqueryBlogOfFollow(Longmax,Integeroffset){// 1.获取当前用户LonguserIdUserHolder.getUser().getId();// 2.查询收件箱 ZREVRANGEBYSCORE key Max Min LIMIT offset count String key FEED_KEY userId;SetZSetOperations.TypedTupleStringtypedTuplesstringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key,0,max,offset,2);// 3.非空判断if(typedTuplesnull||typedTuples.isEmpty()){returnResult.ok();}// 4.解析数据blogId、minTime时间戳、offsetListLongidsnewArrayList(typedTuples.size());longminTime0;// 2intos1;// 2for(ZSetOperations.TypedTupleStringtuple:typedTuples){// 5 4 4 2 2// 4.1.获取idids.add(Long.valueOf(tuple.getValue()));// 4.2.获取分数(时间戳longtimetuple.getScore().longValue();if(timeminTime){os;}else{minTimetime;os1;}}osminTimemax?os:osoffset;// 5.根据id查询blogStringidStrStrUtil.join(,,ids);ListBlogblogsquery().in(id,ids).last(ORDER BY FIELD(id,idStr)).list();for(Blogblog:blogs){// 5.1.查询blog有关的用户queryBlogUser(blog);// 5.2.查询blog是否被点赞isLikedBlog(blog);}// 6.封装并返回ScrollResultrnewScrollResult();r.setList(blogs);r.setOffset(os);r.setMinTime(minTime);returnResult.ok(r);}listByIds底层是MySQL的IN语句所以无法保证顺序要自己写查询逻辑并且不要忘记封装是否点赞过字段以上就是黑马点评实战篇——好友关注部分的学习笔记仅供参考多多支持

相关文章:

【黑马点评学习笔记 | 实战篇 】| 8-好友关注

Bug如山勤为径,代码似海苦作舟。友友们好,这里是苦瓜大王。今天学习的是黑马点评项目实战篇——好友关注部分的学习,今天也是相对轻松的章节!今天我们将完成好友关注功能。笔记如下,后续会一直更新黑马点评学习过程中的…...

户籍制度捆绑资源下留守儿童问题对人口结构的长效影响

一、劳务输出省份留守儿童问题现状分析 1.1 户籍壁垒下公共资源配置失衡现状 户籍制度与城市公共服务的捆绑,构成了流动人口子女随迁的刚性约束机制,是留守儿童问题产生的结构性根源。尽管2010-2020年间我国流动人口增加了1.54亿人,城镇化进…...

【高精度气象】2026别再只问“天气准不准”:真正拉开收益差距的,是把预报接进交易、调度和运维

很多新能源企业到了 2026 年,仍然习惯把问题问成一句话:明天的天气到底准不准?这个问题当然重要,但已经不够了。因为今天的行业竞争,早就不是“谁把风速、辐照度报得更像天气软件”,而是谁能把气象预报真正…...

1%的预测精度提升,在现货市场值多少钱?基于100MW电站的年度收益敏感性分析

当电力现货市场进入“分钟级博弈”,功率预测已不是技术问题,而是算账问题。2026年,对于新能源电站而言,一个根本性的变化正在发生。过去,功率预测是“合规成本”——做得好不被罚,做不好被罚钱。今天&#…...

2026功率预测生死局:MKAN多尺度网络如何将光伏预测误差斩落马下?

当考核规则趋严,传统AI模型集体失灵,一种名为MKAN的新型网络正在改写游戏规则。2026年的春天,对于新能源电站的运营者而言,注定不太平。今年以来,多个省份陆续更新了新能源并网运行管理细则,日内预测偏差考…...

零碳园区管理系统投资效益分析与评估模型的未来发展趋势

在“双碳”目标深度推进的背景下,零碳园区已从政策试点升级为产业绿色转型的核心载体,零碳园区管理系统作为园区碳排管控、能源优化的核心技术支撑,其投资价值与评估体系的完善程度,直接决定园区零碳转型的效率与质量。当前&#…...

养老设计行业黑马崛起:揭秘深圳医博传人如何用3个月霸榜搜索引擎的“危险操作“

当传统养老院还在用"夕阳红"做卖点时 这家公司已经让90后开始抢订床位 您是否好奇:为什么同样的养老设计方案,有的公司门可罗雀,而深圳医博传人设计院的咨询电话却被"打爆"?这背后藏着一个大多数同行都不敢尝…...

中国1:100万地貌类型空间分布数据|14类精细划分|全国覆盖|SHP矢量|含海拔+起伏度属性

🔍 数据简介 本数据集源自 《中华人民共和国地貌图集(1:100万)》(科学出版社,2009年),由中国科学院地理科学与资源研究所牵头全国科研与制图单位共同编制,是全球首套海陆一体化百万分…...

人脸识别OOD模型快速入门:10分钟部署指南

人脸识别OOD模型快速入门:10分钟部署指南 1. 引言 人脸识别技术在日常生活中的应用越来越广泛,从手机解锁到门禁系统,再到身份验证,几乎无处不在。但你是否遇到过这样的情况:系统在面对模糊照片、遮挡人脸或者极端光…...

长芯微LD9680完全P2P替代AD9680,是 14 位 1000MSPSA/D 转换器采用 QFN64 封装

产品描述LD9680 是14 位 1000MSPSA/D 转换器采用 QFN64 封装,功能框图如图 1 所示。该器 件内置片内缓冲器和采样保持电路,专门针对低功耗、小尺寸和易用性而设计。该器件设计 用于高达 2GHz 的宽带模拟信号采样。该器件针对宽输入带宽、高采样速率、出色…...

计算机毕业设计springboot高校智慧图书管理系统 基于SpringBoot的高校智能图书服务平台设计与实现 SpringBoot框架下高校数字化图书馆管理系统开发

计算机毕业设计springboot高校智慧图书管理系统6y8026n8 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的快速发展和高校数字化转型的深入推进,传统图书…...

小游戏上线后,收益到底如何?

大家好,我是晋十七。我开发的竖版塔防小游戏《奥术守卫者》已经上线一段时间了,并且也开通了流量主。很多小伙伴都很好奇个人做小游戏到底能不能赚钱?今天我就跟大家聊聊这个事情。收益展示先上截图吧,我的这款游戏大概是2月中旬上…...

2026毕业论文提速,文鉴智检工具深度分析

毕业季倒计时!2026届毕业生最头疼的问题,莫过于毕业论文的“格式内耗”和“内容打磨”——明明内容达标,却被页眉页脚、参考文献格式反复打回;逐字逐句校对错别字、语法错误,耗时又易漏;好不容易改完格式&a…...

DS2协议库:面向汽车ECU诊断的K-Line通信实现

1. DS2协议库技术解析:面向汽车ECU诊断的K-Line通信实现1.1 协议背景与工程定位DS2(Diagnostic Services 2)并非ISO标准协议,而是宝马(BMW)MS系列发动机控制单元(ECU)在K-Line物理层…...

计算机毕业设计springboot项目管理系统 基于SpringBoot的企业级协同任务管控平台 SpringBoot驱动的智能工作流与资源调度系统

计算机毕业设计springboot项目管理系统wxsy6muz (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在数字化转型浪潮席卷全球的当下,企业对于高效协同与精细化管控的需求…...

2026年不踩雷!论文写作全流程降重首选 —— 千笔·专业降AIGC智能体

在AI技术迅猛发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提升效率与质量。然而,随着学术审查标准的不断升级,AI生成内容的痕迹愈发明显,查重系统对AIGC的识别也日益精准。许多学生因此陷入“AI率…...

24.两两交换链表中的节点(LeetCode)

题目分析: 为链表建立一个虚拟头节点,然后对接下来的两个节点进行位置交换。设置一个指针变量 cur让其指向虚拟头节点 循环遍历的终止条件为cur->next!NULL 并且cur->next->next!NULL 每次循环时,先定义一个指针变量 temp保存 cu…...

真心不骗你!全学科适配降AI率网站,千笔·降AI率助手 VS 万方智搜AI

在AI技术迅速发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提高效率、优化内容。然而,随着学术审核标准的不断提升,AI生成内容的痕迹越来越容易被检测出来,论文中的“AI率超标”问题也日益突出。面…...

对比一圈后!巅峰之作的降AI率软件 —— 千笔·专业降AIGC智能体

在AI技术快速发展的今天,越来越多的学生和研究者开始依赖AI工具辅助论文写作,以提升效率和质量。然而,随着学术审查标准的不断提高,AI生成内容的痕迹越来越容易被检测出来,导致论文AI率超标、重复率过高等问题频发。面…...

如何连接一个隐藏的wifi?

前言某些情况下,我们并不希望自己的wifi被其他人扫描到,选择将wifi网络隐藏起来,本文将从应用开发角度说明,APP应该如何连接这些被隐藏起来的wifi开发实例话不多说,直接上代码private void init() {mWifiManager (Wif…...

世嘉MD完全档案中文版PDF

核心内容分区MD 本体(1988–1996):硬件迭代(MD1/MD2/MD3)、手柄、卡带;全游戏封面 截图 基础信息Mega-CD(1991–1996)、Super 32X(1994–1995)扩展外设与专…...

ESP32学习笔记之UART

第一部分:UART 核心概念 1. 什么是 UART? UART 中文常叫“通用异步收发器”,“异步”意思是通信双方不共享时钟,所以要提前约定好通信参数。 UART 本质上就是按约定好的速度,把 0 和 1 一位一位串行发出去 关键特点&…...

垃圾网站穷疯了,什么都要钱

垃圾。。。。。...

攻防世界 crypto题GFSJ0527-【easy_RSA】

1.工具:thonny2.解题:打开附件,看到如下在一次RSA密钥对生成中,假设p473398607161,q4511491,e17 求解出d*RSA加密算法:①算法原理:RSA是一种非对称加密算法;②CTF中的常见…...

sslyze使用教程

SSLyze 是 Kali Linux 中一款专业的 TLS/SSL 安全扫描工具,主要用于检测目标服务器的 TLS/SSL 配置安全性,包括协议版本支持、加密套件强度、证书有效性、常见漏洞(如 Heartbleed、ROBOT)等,广泛应用于渗透测试、服务器…...

java微信小程序的中小型企业员工电子档案借阅管理系统的设计与实现

目录需求分析与规划技术架构设计核心功能模块开发微信小程序集成测试与部署运维与迭代项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与规划 明确系统核心功能:员工档案录入、借阅…...

Pixel Dimension Fissioner部署教程:Docker镜像开箱即用+Stable v1.0.0适配

Pixel Dimension Fissioner部署教程:Docker镜像开箱即用Stable v1.0.0适配 1. 工具概览 Pixel Dimension Fissioner(像素语言维度裂变器)是一款基于MT5-Zero-Shot-Augment核心引擎构建的文本改写与增强工具。它将传统AI文本处理功能重新包装…...

告别手动排班:智能排班系统助力HR实现高效管理

人力资源部门在企业运营中承担着员工排班的重要职责。 传统的手动排班方式需要HR人员投入大量的时间和精力,工作强度大且效率低下。 尤其在员工人数较多的企业,排班工作往往成为HR部门的日常难题。 每次排班都需要反复核对员工信息、班次需求和特殊情况&…...

Qwen3-ASR语音识别应用:会议记录、字幕生成实战案例

Qwen3-ASR语音识别应用:会议记录、字幕生成实战案例 1. 语音识别技术的新选择 在数字化办公和内容创作领域,语音识别技术正变得越来越重要。Qwen3-ASR作为新一代语音识别解决方案,凭借其强大的多语言支持和方言识别能力,正在改变…...

智能排班系统:企业人力资源管理的数字化革新

传统企业排班工作长期依赖Excel等电子表格工具手动完成。 这种模式不仅需要投入大量的时间成本,还极易出现人为错误。 尤其在员工数量众多、班次结构复杂的组织中,排班工作往往成为人力资源部门的沉重负担。 排班管理人员常常需要花费数小时甚至数天的时…...