当前位置:网站首页>抖音实战~关注博主
抖音实战~关注博主
2022-06-28 03:40:00 【gblfy】


文章目录
一、关注我需求分析
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
@Override
public 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,如果有一人取关,则两边都需要设置为0
vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
fansMapper.updateByPrimaryKeySelective(vloger);
} else {
//粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0
fans.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存储数据结构

边栏推荐
- 由两个栈组成的队列
- A solution to the inefficiency of setting debug mode in developing flask framework with pychar
- ambari SSLError: Failed to connect. Please check openssl library versions.
- Pychart shares third-party modules among different projects
- 利用ELK 搭建日志分析系统(一)—— 组件介绍
- 几个重要的物理概念
- 使用tensorboard进行loss可视化
- leetcode:494. All methods of adding and subtracting operators to the array to get the specified value
- Building log analysis system with elk (III) -- Security Authentication
- What is the process of en 1101 flammability test for curtains?
猜你喜欢

领歌leangoo敏捷看板工具新增导出卡片文档和粘贴共享脑图节点功能

leetcode:494. All methods of adding and subtracting operators to the array to get the specified value

开关电源—Buck电路原理及其仿真

从零到一,教你搭建「以文搜图」搜索服务(一)

Open the field of maker education and creation

MSC 307(88) (2010 FTPC Code)第2部分烟气和毒性测试

Several ways of sharing printers in LAN

几个重要的物理概念

applicationContext. Getbeansoftype obtains the execution methods of all implementation classes under an interface or obtains the operation application scenarios such as implementation class objects. L

A summary of my recent situation in June 2022
随机推荐
From zero to one, I will teach you to build a "search by text and map" search service (I)
Talking about cloud primitiveness, we have to talk about containers
Door level modeling - learning notes
回溯—迷宫问题
English notes - cause and effect
gcd最大公约数
Two methods of shell script parameter passing based on arm5718
电学基础知识整理(二)
领歌leangoo敏捷看板工具新增导出卡片文档和粘贴共享脑图节点功能
Building log analysis system with elk (III) -- Security Authentication
In the era of video explosion, who is supporting the high-speed operation of video ecological network?
What is the process of en 1101 flammability test for curtains?
GenICam GenTL 标准 ver1.5(2)
KVM常用命令详解
Notes to friendship chain
揭开SSL的神秘面纱,了解如何用SSL保护数据
MSC 307(88) (2010 FTPC Code) Part 5低播焰测试
仅用递归函数和栈操作逆序一个栈
MSC 307(88) (2010 FTPC Code) Part 9床上用品试验
Adder - Notes