黑馬點評12-實現好友關注/取關功能,查看好友共同關注列表

好友關注

數據模型

數據庫中的tb_follow記錄博主與粉絲的關系

在這里插入圖片描述

tb_follow表對應的實體類

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_follow")
public class Follow implements Serializable {private static final long serialVersionUID = 1L;/*** 主鍵*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 用戶id*/private Long userId;/*** 關聯的用戶id*/private Long followUserId;/*** 創建時間*/private LocalDateTime createTime;
}

是否關注/關注/取關

需求: 在探店圖文的詳情頁面中,可以查看用戶是否關注了筆記博主,用戶也可以手動關注/取消關注發布筆記的作者

在這里插入圖片描述

第一步: 在FollowController層中編寫判斷是否關注關注/取關的兩個方法

@RestController
@RequestMapping("/follow")
public class FollowController {@Resourceprivate IFollowService followService;// 判斷當前用戶是否關注了筆記博主,參數是發布筆記的博主Id@GetMapping("/or/not/{id}")public Result isFollow(@PathVariable("id") Long followUserId) {return followService.isFollow(followUserId);}// 實現取關/關注,參數是發布筆記的博主Id以及是否關注(true表示關注,false表示取關)@PutMapping("/{id}/{isFollow}")public Result follow(@PathVariable("id") Long followUserId, @PathVariable("isFollow") Boolean isFellow) {return followService.follow(followUserId,isFellow);}
}

第二步: 在FellowServiceImp中來編寫具體的業務邏輯

  • 判斷當前用戶是否關注了筆記博主: 將請求參數攜帶的發布筆記的博主Id和當前登陸的用戶Id作為條件去數據庫中查詢是否有對應的記錄
  • 關注和取消關注: 請求參數中的true(關注)/fasle(取關),關注是將用戶和博主的關聯信息保存到數據庫,取關即將他們的關聯信息從數據庫移除,避免堆積數據
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {@Overridepublic Result isFollow(Long followUserId) {// 獲取當前登錄的用戶IdLong userId = UserHolder.getUser().getId();LambdaQueryWrapper<Follow> queryWrapper = new LambdaQueryWrapper<>();// 查詢tb_follow表判斷當前用戶是否關注了該筆記的博主queryWrapper.eq(Follow::getUserId, userId).eq(Follow::getFollowUserId, followUserId);// 沒必要查詢出具體數據,只需要判斷數據存不存在即可//select count(*) from tb_follow where user_id = ? and follow_user_id = ?int count = this.count(queryWrapper);return Result.ok(count > 0);}@Overridepublic Result follow(Long followUserId, Boolean isFellow) {// 獲取當前登錄的用戶IdLong userId = UserHolder.getUser().getId();// 判斷用戶是要關注還是取關,true表示關注,false表示取關if (isFellow) {// 關注則將用戶和筆記博主的關聯信息保存到數據庫Follow follow = new Follow();follow.setUserId(userId);follow.setFollowUserId(followUserId);save(follow);} else {// 取關則將用戶和博主的關聯信息從數據庫中移除,避免數據庫中堆積大量數據//delete from tb_follow where user_id = ? and follow_user_id = ?LambdaQueryWrapper<Follow> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Follow::getUserId, userId).eq(Follow::getFollowUserId, followUserId);remove(queryWrapper);}return Result.ok();}
}

共同關注

需求:當我們點擊博主用戶頭像時進入到詳情頁,可以查看到博主發布的筆記以及用戶和博主的好友共同關注列表

在這里插入圖片描述

第一步: 在UserController中編寫查詢博主信息的方法

@GetMapping("/{id}")
public Result queryUserById(@PathVariable("id") Long userId) {// 查詢詳情User user = userService.getById(userId);if (user == null) {// 查不到返回空return Result.ok();}// 查到則轉為userDTO對象UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);// 返回查詢到的數據return Result.ok(userDTO);
}

第二步: 在BlogController中編寫分頁查詢博主發布的所有筆記的方法

// 根據博主id查詢博主的探店筆記
@GetMapping("/of/user")
public Result queryBlogByUserId(@RequestParam(value = "current", defaultValue = "1") Integer current, @RequestParam("id") Long id) {LambdaQueryWrapper<Blog> queryWrapper = new LambdaQueryWrapper<>();// 根據博主id查詢用戶信息queryWrapper.eq(Blog::getUserId, id);Page<Blog> pageInfo = new Page<>(current, SystemConstants.MAX_PAGE_SIZE);blogService.page(pageInfo, queryWrapper);// 獲取查詢到的所有用戶信息List<Blog> records = pageInfo.getRecords();return Result.ok(records);
}// 根據博主id查詢博主的探店筆記
@GetMapping("/of/user")
public Result queryBlogByUserId(@RequestParam(value = "current", defaultValue = "1") Integer current,@RequestParam("id") Long id) {// 根據博主id查詢用戶信息Page<Blog> page = blogService.query().eq("user_id", id).page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 獲取查詢到的所有用戶信息List<Blog> records = page.getRecords();return Result.ok(records);
}

第三步: 修改關注/取關的邏輯,以follows:userId作為Set集合的Key,存放當前用戶關注的所有博主Id

  • 關注/取關: 將關注的博主Id放到當前登陸用戶關注的Set集合中,取關就是將關注的博主Id從當前登陸用戶的Set集合中移除
  • 共同關注:通過SINTER key1 key2查詢登陸用戶的Set集合和其關注博主的Set集合中元素的交集
@Resource
private StringRedisTemplate stringRedisTemplate;
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {@Overridepublic Result follow(Long followUserId, Boolean isFellow) {// 獲取當前登錄的用戶IdLong userId = UserHolder.getUser().getId();String key = "follows:" + userId;// 判斷用戶是要關注還是取關,true表示關注,false表示取關if (isFellow) {// 關注則將用戶和筆記博主的關聯信息保存到數據庫Follow follow = new Follow();follow.setUserId(userId);follow.setFollowUserId(followUserId);boolean iSsuccess = save(follow);// 如果更新成功則將關聯信息也寫入Redis,key是當前的用戶id,value就是關注的博主idif (iSsuccess) {stringRedisTemplate.opsForSet().add(key, followUserId.toString());}} else {// 取關則將用戶和博主的關聯信息從數據庫中移除,避免數據庫中堆積大量數據//delete from tb_follow where user_id = ? and follow_user_id = ?LambdaQueryWrapper<Follow> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Follow::getUserId, userId).eq(Follow::getFollowUserId, followUserId);boolean iSsuccess = remove(queryWrapper);// 如果取關成功則將關聯的博主Id從當前登陸用戶的set集合中移除if (iSsuccess){stringRedisTemplate.opsForSet().remove(key,followUserId.toString());}}return Result.ok();} 
}

第四步: 編寫控制器方法,查看登陸用戶和其關注博主的好友共同關注列表

@GetMapping("/common/{id}")
public Result followCommons(@PathVariable Long id){return followService.followCommons(id);
}
@Resource
private IUserService userService;
@Override
public Result followCommons(Long id) {// 獲取當前登陸用戶的idLong userId = UserHolder.getUser().getId();// // 獲取當前登陸對應的set集合的keyString key1 = "follows:" + userId;// 獲取當前登陸用戶關注博主所對應的set集合的keyString key2 = "follows:" + id;// 對當前登陸用戶和其關注博主的Set集合取交集Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key1, key2);// 無交集就返回個空的List集合if (intersect == null || intersect.isEmpty()) {return Result.ok(Collections.emptyList());}// 將String類型的用戶id轉化為Long類型的用戶id然后使用List集合收集List<Long> ids = intersect.stream().map(Long::valueOf).collect(Collectors.toList());// 根據ids集合中的用戶id去數據庫中查詢登陸用戶和博主共同關注的用戶信息并封裝成UserDto對象,最后存入List集合中返回List<UserDTO> userDTOS = userService.listByIds(ids).stream().map(user ->BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());return Result.ok(userDTOS);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165071.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165071.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165071.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營第三十二天| 122 買賣股票的最佳時機 || 55 跳躍游戲 45 跳躍游戲 ||

目錄 122 買賣股票的最佳時機 || 55 跳躍游戲 45 跳躍游戲 || 122 買賣股票的最佳時機 || 設置變量now代表此時買入的股票&#xff0c;為賦值為Integer.MAX_VALUE&#xff0c;遍歷prices數組&#xff0c;有如下兩種情況&#xff1a; 如果比now小說明不能售出&#xff0c;可以…

關于unicloud云對象或云函數獲取時間不對的問題

話不多說&#xff0c;直接上代碼&#xff1a; function timeWeekFormat() { //定義一個日期對象; var dateTime getOffsetDate(8); //獲得系統年份; var year dateTime.getFullYear(); //獲得系統月份; var month dateTime.getMonth() 1; //獲…

棧和隊列的OJ題--12.括號匹配

12.括號匹配 20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; 解題思路&#xff1a;該題比較簡單&#xff0c;是對棧特性很好的應用&#xff0c;具體操作如下&#xff1a;循環遍歷String中的字符&#xff0c;逐個取到每個括號&#xff0c;如果該括號是&#xff1a;1. …

Git工作流和Commit規范

Git大家都非常熟悉了&#xff0c;就不做過多介紹&#xff0c;但是如何用好Git、如何進行合理的分支開發、Merge你是否有一個規范流程呢&#xff1f;&#x1f4a4; 不論是一個團隊一起開發一個項目&#xff0c;還是自己獨立開發一個項目&#xff0c;都少不了要和Git打交道&…

【NGINX--5】身份驗證

1、HTTP 基本身份驗證 需要通過 HTTP 基本身份驗證保護應用或內容。 生成以下格式的文件&#xff0c;其中的密碼使用某個受支持的格式進行了加密或哈希處理&#xff1a; # comment name1:password1 name2:password2:comment name3:password3第一個字段是用戶名&#xff0…

紫光展銳V8821榮獲“中國芯”重大創新突破產品獎

近日&#xff0c;“中國芯”優秀產品評選落下帷幕&#xff0c;紫光展銳首顆5G IoT-NTN衛星通信SoC芯片V8821憑借在衛星通信前沿領域的技術創新&#xff0c;從285家芯片企業、398款芯片產品中脫穎而出&#xff0c;榮獲第十八屆“中國芯”年度重大創新突破產品獎。 “中國芯”優…

ReentrantLock源碼解析

ReentrantLock源碼解析 文章目錄 ReentrantLock源碼解析一、ReentrantLock二、ReentrantLock 的 Sync、FairSync、NonfairSync2.1 Sync、FairSync、NonfairSync2.2 NonfairSync 下的 tryAcquire2.3 FairSync下的 tryAcquire2.4 tryRelease 三、lock.lock()3.1 NonfairSync.lock…

優橙內推青海專場——5G網絡優化(中高級)工程師

可加入就業QQ群&#xff1a;801549240 聯系老師內推簡歷投遞郵箱&#xff1a;hrictyc.com 內推公司1&#xff1a;浙江明訊網絡技術有限公司 內推公司2&#xff1a;南京華蘇科技有限公司 內推公司3&#xff1a;杭州華星創業通信技術有限公司 浙江明訊網絡技術有限公司 浙江明…

4.常見面試題--操作系統

特點&#xff1a;并發性、共享性、虛擬性、異步性。 Windows 和 Linux 內核差異 對于內核的架構?般有這三種類型&#xff1a; ● 宏內核&#xff0c;包含多個模塊&#xff0c;整個內核像?個完整的程序&#xff1b; ● 微內核&#xff0c;有?個最?版本的內核&#xff0…

名字大卻不中用的AI大模型,名不副實

這兩天 OpenAI 團隊&#xff08; ChatGPT 公司&#xff09;的戲比較多&#xff0c;兩三天的功夫&#xff0c;劇情發展都超出了 OpenAI 首席科學家的預期&#xff0c;目前來看&#xff0c;微軟還是最大的贏家。這是個引子&#xff0c;這個話題&#xff0c;網絡上早已傳爛了&…

云安全之盾:ZStack 云主機安全防護解決方案全方位保護云環境

隨著云計算的蓬勃發展&#xff0c;網絡威脅愈發復雜&#xff0c;涵蓋了從勒索病毒到APT攻擊的各種威脅類型。在這一風云變幻的網絡安全環境下&#xff0c;云主機安全不再僅僅是一個選項&#xff0c;它是信息系統安全的核心要素。云軸科技ZStack 云主機安全防護解決方案是為了滿…

6.3.WebRTC中的SDP類的結構

在上節課中呢&#xff0c;我向你介紹了sdp協議&#xff0c; 那這節課呢&#xff0c;我們再來看看web rtc中。是如何存儲sdp的&#xff1f;也就是sdp的類結構&#xff0c;那在此之前呢&#xff1f;我們先對sdp的內容啊&#xff0c;做一下分類。因為在上節課中呢&#xff0c;雖然…

Python+jieba+wordcloud實現文本分詞、詞頻統計、條形圖繪制及不同主題的詞云圖繪制

目錄 序言&#xff1a;第三方庫及所需材料函數模塊介紹分詞詞頻統計條形圖繪制詞云繪制主函數 效果預覽全部代碼 序言&#xff1a;第三方庫及所需材料 編程語言&#xff1a;Python3.9。 編程環境&#xff1a;Anaconda3&#xff0c;Spyder5。 使用到的主要第三方庫&#xff1a;…

python之pyqt專欄1-環境搭建

#python pyqt# python&#xff1a;3.11.6 pycharm&#xff1a;PyCharm Community Edition 2023.2.5 pyqt6 python安裝 官網下載&#xff1a;Python Releases for Windows | Python.org pycharm社區版安裝 官網地址&#xff1a;Download PyCharm: Python IDE for Professional…

golang學習筆記——創建項目

創建項目 從Go 1.8開始&#xff0c;將GOPATH設置為環境變量不是必需的。如果我們沒有設置一個&#xff0c;Go使用默認的GOPATH為$HOME/go。可以使用go env查看環境變量信息。 創建項目 # 創建項目目錄 mkdir helloLog cd helloLog # 使用go mod初始化項目,生成go.mod文件 go…

TikTok shop印尼重啟電商征程:與當地平臺合作開啟新篇章!——站斧瀏覽器

經歷了一個半月的間隔&#xff0c;TikTok Shop成功重返印度尼西亞市場。據國際媒體報道&#xff0c;TikTok計劃通過與印尼本地電子商務平臺的合作&#xff0c;重啟其在該國的電商業務。 Temmy Satya Permana&#xff0c;印尼合作社和中小企業部的官員&#xff0c;證實了這一重…

【廣州華銳互動】VR線上課件制作軟件滿足數字化教學需求

隨著科技的不斷發展&#xff0c;虛擬現實&#xff08;VR&#xff09;技術在教學領域的應用逐漸成為趨勢。其中&#xff0c;廣州華銳互動開發的VR線上課件制作軟件更是備受關注。這種工具為教師提供了便捷的制作VR課件的手段&#xff0c;使得VR教學成為可能&#xff0c;極大地豐…

thinkphp6 不支持:redis錯誤

起因&#xff1a; 使用 redis 時候&#xff0c;thinkphp 報錯。 解決方法&#xff1a; 打開 php.ini 文件&#xff0c;增加 extensionphp_redis.dll 即可

Java架構師發展方向和歷程

目錄 1 導論2 架構師的三觀培養3 架構師的遇到的困難4 架構師職責5 架構師之路6 架構師的發展方向7 應用領域架構師8 業務架構師9 系統架構師和企業架構師10 技術路線和演進規劃11 一線大廠的技術生態拓張案例12 如何推進項目落地想學習架構師構建流程請跳轉:Java架構師系統架…

CUDA與GPU編程

文章目錄 CUDA與GPU編程1. 并行處理與GPU體系架構1.1 并行處理簡介1.1.1 串行處理與并行處理的區別1.1.2 并行處理的概念1.1.3 常見的并行處理 1.2 GPU并行處理1.2.1 GPU與CPU并行處理的異同1.2.2 CPU的優化方式1.2.3 GPU的特點 1.3 環境搭建 CUDA與GPU編程 1. 并行處理與GPU體…