抖音实战~关注博主

在这里插入图片描述
在这里插入图片描述

文章目录

          • 一、关注我需求分析
            • 1. 关注我流程图
            • 2. 关注我流程简述
            • 3. 表结构设计
          • 二、关注我源码分析
            • 2.1. 前端
            • 2.2. 后端
          • 三、账号1关注实战
            • 3.1. 关注前数据记录
            • 3.2. 账号1关注账号2
            • 3.3. 账号1关注后数据变化
          • 四、. 账号2关注实战
            • 4.1. 账号2关注账号1
            • 4.2. 关注后数据变化
            • 4.3. redis存储数据结构

一、关注我需求分析
1. 关注我流程图

在这里插入图片描述

2. 关注我流程简述
  • 1.短视频页面点击关注
  • 2.前端携带用户ID和短视频发布者ID请求后端
  • 3.参数校验用户ID和短视频发布者ID是否为空
    • 3.1. 为空,直接返回前端提示语
    • 3.2.不为空,流程继续
  • 4.携带用户ID查询数据库
  • 5.携带短视频发布者ID查询数据库
  • 6.双ID判断
    • 6.1. 为空,直接返回前端提示语
    • 6.2.不为空,流程继续
  • 7.判断对方是否关注我
  • 7.1. 未关注我,互为朋友关系状态位0
  • 7.2. 已关注我,互为朋友关系状态位1
    • 7.2.1.更新博主与我的粉丝关系状态为1
    • 7.2.2.保存落库
  • 8.保存我和博主的粉丝关系
  • 9.我的关注总数+1
  • 10.博主的粉丝总数
  • 11.我和博主的关联关系=1
  • 12.返回响应
3. 表结构设计
CREATE TABLE `fans` (`id` varchar(24) NOT NULL,`vloger_id` varchar(24) NOT NULL COMMENT '作家用户id',`fan_id` varchar(24) NOT NULL COMMENT '粉丝用户id',`is_fan_friend_of_mine` int(1) NOT NULL COMMENT '粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `writer_id` (`vloger_id`,`fan_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='粉丝表\n\n';
二、关注我源码分析

短视频页面关注后,个人中心关注状态同步修改

2.1. 前端
	// 关注我followMe() {var me = this;var myUserInfo = getApp().getUserInfoSession();if (myUserInfo == null) {uni.showToast({duration: 3000,title: "请登录~",icon: "none"});uni.navigateTo({url: "../loginRegist/loginRegist",animationType: "slide-in-bottom",success() {me.loginWords = "请登录"}});return;}var vlogerId = me.userPageId;var userId = getApp().getUserInfoSession().id;var serverUrl = app.globalData.serverUrl;uni.request({method: "POST",header: {headerUserId: userId,headerUserToken: app.getUserSessionToken()},url: serverUrl + "/fans/follow?myId=" + userId + "&vlogerId=" + vlogerId,success(result) {if (result.data.status == 200) {me.isFollow = true;uni.setStorageSync("justFollowVlogerId", vlogerId);// 刷新当前页的粉丝数var pendingInfo = me.pageUserInfo;me.pageUserInfo.myFansCounts = pendingInfo.myFansCounts + 1;} else {uni.showToast({title: result.data.msg,icon: "none",duration: 3000});}}});},
2.2. 后端

controller

  /*** 关注** @param myId     我的用户ID* @param vlogerId 视频发布者ID* @return*/@PostMapping("follow")public GraceJSONResult follow(@RequestParam String myId,@RequestParam String vlogerId) {// 判断两个id不能为空if (StringUtils.isBlank(myId) || StringUtils.isBlank(vlogerId)) {return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);}// 判断当前用户,自己不能关注自己if (myId.equalsIgnoreCase(vlogerId)) {return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_RESPONSE_NO_INFO);}// 判断两个id对应的用户是否存在Users vloger = userService.getUser(vlogerId);Users myInfo = userService.getUser(myId);// fixme: 两个用户id的数据库查询后的判断,是分开好?还是合并判断好?if (myInfo == null || vloger == null) {return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_RESPONSE_NO_INFO);}// 保存粉丝关系到数据库fansService.doFollow(myId, vlogerId);// 博主的粉丝+1,我的关注+1//我的关注总数redis.increment(REDIS_MY_FOLLOWS_COUNTS + ":" + myId, 1);// 博主的粉丝总数redis.increment(REDIS_MY_FANS_COUNTS + ":" + vlogerId, 1);// 我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈redis.set(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + myId + ":" + vlogerId, "1");return GraceJSONResult.ok();}
 /*** 关注** @param myId     我的ID* @param vlogerId 视频博主ID*/@Transactional@Overridepublic void doFollow(String myId, String vlogerId) {String fid = sid.nextShort();Fans fans = new Fans();fans.setId(fid);fans.setFanId(myId);fans.setVlogerId(vlogerId);// 判断对方是否关注我,如果关注我,那么双方都要互为朋友关系//TODO 这里的参数注意 判断对方是否关注我,如果关注我,那么双方都要互为朋友关系Fans vloger = queryFansRelationship(vlogerId, myId);if (vloger != null) {fans.setIsFanFriendOfMine(YesOrNo.YES.type);// 粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0vloger.setIsFanFriendOfMine(YesOrNo.YES.type);fansMapper.updateByPrimaryKeySelective(vloger);} else {//粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0fans.setIsFanFriendOfMine(YesOrNo.NO.type);}fansMapper.insert(fans);// 系统消息:关注msgService.createMsg(myId, vlogerId, MessageEnum.FOLLOW_YOU.type, null);}
 /*** 判断对方是否关注我,如果关注我,那么双方都要互为朋友关系** @param fanId    粉丝ID* @param vlogerId 短视频发布ID* @return*/public Fans queryFansRelationship(String fanId, String vlogerId) {Example example = new Example(Fans.class);Example.Criteria criteria = example.createCriteria();criteria.andEqualTo("vlogerId", vlogerId);criteria.andEqualTo("fanId", fanId);List list = fansMapper.selectByExample(example);Fans fan = null;if (list != null && list.size() > 0 && !list.isEmpty()) {fan = (Fans) list.get(0);}return fan;}
三、账号1关注实战
3.1. 关注前数据记录

找二个没有关注的账号进行测试

账号:尾号~5217
昵称:昕泽之源
关注总量:2
粉丝数:1

在这里插入图片描述
账号:尾号~0009
昵称:小美女
关注总量:0
粉丝数:1

在这里插入图片描述
2个账号关系~二人暂无关注

3.2. 账号1关注账号2
  • 使用“尾号为5217”账号登录
    在这里插入图片描述

查看首页由尾号为0009的小美女账号发布短视频
在这里插入图片描述
点击关注
在这里插入图片描述

3.3. 账号1关注后数据变化

尾号~5217关注 尾号~0009的账户后,数据变化

尾号~5217数据变化
关注总量:由2变成了3
粉丝数:1

尾号~0009数据变化
关注总量:没变 还是 0
粉丝数:由1变成了2

表数据变化:
用户表
尾号~0009 userid=21100598TZ9XG6RP
尾号~5217 userid=220620BZ2DH0KP94
在这里插入图片描述
粉丝表
新增一条数据,视频博主(21100598TZ9XG6RP)粉丝中有我(220620BZ2DH0KP94)

2206279H48HX0T54	21100598TZ9XG6RP	220620BZ2DH0KP94	0

在这里插入图片描述

四、. 账号2关注实战
4.1. 账号2关注账号1

使用尾号~0009账户登录
在这里插入图片描述

去首页~视频列表中,查看是否关注的状态为-未关注
在这里插入图片描述
点击关注
关注状态为-已关注
在这里插入图片描述
在这里插入图片描述

4.2. 关注后数据变化

尾号~0009关注 尾号~5217的账户后,数据变化

尾号~5217数据变化
关注总量:3
粉丝数:由1变成了2

尾号~0009数据变化
关注总量:由 变成了1
粉丝数:还是2

表数据变化:
用户表
尾号~0009 userid=21100598TZ9XG6RP
尾号~5217 userid=220620BZ2DH0KP94
粉丝表
新增一条数据,
我(220620BZ2DH0KP94)的粉丝中有尾号0009(21100598TZ9XG6RP)
视频博主(21100598TZ9XG6RP)粉丝中有我(220620BZ2DH0KP94)
并且我们的关系更新为朋友关系,状态都为0

2206279P5FYBZYNC	220620BZ2DH0KP94	21100598TZ9XG6RP	1
2206279H48HX0T54	21100598TZ9XG6RP	220620BZ2DH0KP94	1

在这里插入图片描述

4.3. redis存储数据结构

在这里插入图片描述

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

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

相关文章

ClickHouse 源码阅读 —— SQL的前世今生

注:以下分析基于开源 v19.15.2.2-stable 版本进行,社区最新版本代码改动较大,但是总体思路是不变的。 用户提交一条查询SQL背后发生了什么? 在传统关系型数据库中,SQL处理器的组件主要包括以下几种: • …

史上最全的支付宝二维码扫码优化技术方案

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。 设备扫描二维条码,通…

抖音实战~取关博主

文章目录一、需求分析1. 取关流程图2. 取关流程简述二、源码实战2.1. 取关~前端2.2. 取关~后端三、5217取关实战3.1. 取关前资料分析3.2. 账号5217取关四、账号0009取关实战4.1. 账号0009取关4.2. 数据变化一、需求分析 1. 取关流程图 2. 取关流程简述 1.前端携带用户ID和短视…

终于有人把Python讲清楚了!

Python入门从哪开始,90%以上的书上都是这样讲的:先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构,然后再介绍字符串处理和正则表达式,介绍文件等IO操作.... 就这样一点一点往下说。然而这种按部就班的学习方法&#…

MaxCompute 实现增量数据推送(全量比对增量逻辑)

ODPS 2.0 支持了很多新的集合命令(专有云升级到3版本后陆续支持),简化了日常工作中求集合操作的繁琐程度。增加的SQL语法包括:UNOIN ALL、UNION DISTINCT并集,INTERSECT ALL、INTERSECT DISTINCT交集,EXCEPT ALL、EXCEPT DISTINCT…

uniapp 引入iconfont的方法

文章目录1. 加入购物车2. 下载代码3. 创建静态目录4. 样式字体复制5. 字体转码6. 转码内容替换7. 样式引入7. 使用8. 个性化使用阿里图标库:https://www.iconfont.cn/ 1. 加入购物车 选中自己需要的图标依次加入购物车 2. 下载代码 打开购物车-下载代码到本地 …

独家下载 |《领军行业大数据及AI实战》解锁九大行业领军企业云上大数据及AI实战

飞天大数据平台不仅是阿里经济体大数据生产的基石,更为各行业客户提供大数据整体解决方案和强劲算力。上一册介绍阿里巴巴内部大数据实战的电子书《阿里巴巴大数据及AI实战》推出后,受到了广大开发者的认可。本次带来不同行业下企业的大数据&AI案例和…

从日志入手,保障 Kubernetes 稳定性

作者 | 悟鹏、沉醉来源 | 阿里巴巴云原生头图 | 下载于视觉中国不论对于软件的用户还是开发者,日志都是很重要的信息源。日志可以用来表征软件的运行状态,在软件运行不符合预期时提供丰富的信息,也可以用在开发阶段调试软件,方便定…

抖音实战~我关注的博主列表、关注、取关

文章目录一、关注模块1. 关注流程图2. 关注流程简述二、前端关注相关2.1. 查询我关注博主列表2.2. 取消关注2.2. 关注我2.4. 上滑分页粉丝列表2.5. 状态刷新三、后端关注相关3.1. 查询我关注的博主列表3.2. 取关3.3. 关注一、关注模块 1. 关注流程图 暂未上,敬请期…

灵魂拷问,上 Kubernetes 有什么业务价值?

上 Kubernetes 有什么业务价值? 今天要演讲的主题是跟应用管理或者说是云原生应用交付是相关的。首先我们想要先回答这么一个问题:为什么我们要基于 Kubernetes 去构建一个应用管理平台? 上图是一个本质的问题,我们在落地 K8s 经…

近7万新冠域名一半是钓鱼网站?以色列老牌安全厂商Check Point推出全端保护新战略

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 付费下载于视觉中国 疫情肆虐的2020注定会被长久铭记。在这一年中,人们的工作、生活方式发生了巨变。在以色列老牌安全厂商Check Point全球进行的调查中显示,87%的工作人口采用了居家办公模式,74%的企…

掌门教育微服务体系Solar第3弹:Nacos企业级落地下篇

前言 在高速发展的时候,公司规模越来越大,老师人数越来越多,这时候公司不能铺太多人去做运营与服务,必须提高每个人效,这就需要技术驱动。因此掌门教育转变成一家技术驱动型的公司,如果被迫成为一家靠资金驱…

jdk 1.8 安装

步骤 B:配置 JAVA_HOME 系统变量区域,点击【新建】,在弹出的窗口中,分别输入变量名和值 变量名:JAVA_HOME 变量值:你的安装路径 JAVA_HOMEpath %JAVA_HOME%\bin步骤 C:配置 Path Path环境变量…

【漫画】最近,老王又双叒get了CDN的新技能—可编程化敏捷开发

原文链接 本文为阿里云原创内容,未经允许不得转载。

抖音实战~点赞数量弹框

组件 在components下面新建ge-popup.vue <template><view><view class"mask"></view><!--绑定微信--><view class"wxbox"><view class"weixin"><image src"../static/dz.jpg"></…

阿里张磊:如何构建以应用为中心的“Kubernetes”?(内含 QA 整理)

如何构建“以应用为中心”的 Kubernetes&#xff1f; 构建这么一个以用户为中心的 Kubernetes&#xff0c;需要做几个层级的事情。 应用层驱动 首先来看最核心的部分&#xff0c;上图中蓝色部分&#xff0c;也就是 Kubernetes。可以在 Kubernetes 之上定义一组 CRD 和 Contro…

Trie 树是什么样的数据结构?有哪些应用场景?

作者 | 神奕来源 | 前端应届生头图 | 下载于视觉中国出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是字符串…

iOS Abort问题系统性解决方案

一、背景 崩溃(Crash)&#xff0c;即闪退&#xff0c;多指移动设备&#xff08;如iOS、Android设备&#xff09;在打开/使用应用程序的过程中&#xff0c;突然出现意外退出/中断的情况。如果App线上版本频繁发生崩溃&#xff0c;会极大地影响用户体验&#xff0c;甚至导致用户…

uniapp 处理过去时间对比现在时间的时间差 如刚刚、几分钟前,几小时前,几个月前

文章目录1. 返回的报文2. 时间格式化方法3. 使用1. 返回的报文 格式化时间&#xff1a;createTime [{"id": "62c11d3435b7c4007a8e650e","fromUserId": "21100598TZ9XG6RP","fromNickname": "小美女","fro…

云原生全景图之五:应用程序定义和开发层

作者 | Catherine Paganini、Jason Morgan来源 | K8sMeetup头图 | 下载于视觉中国前文介绍了如何将所有应用程序组件作为整体来编排和管理&#xff08;编排和管理层&#xff09;。本文将介绍云原生全景图的最上层&#xff1a;应用程序定义和开发层。现在我们来到了云原生全景图…