抖音实战~关注博主_关注


抖音实战~关注博主_数据_02

文章目录

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

抖音实战~关注博主_redis_03

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

("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();
}
(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);
}
(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

抖音实战~关注博主_2d_04


账号:尾号~0009

昵称:小美女

关注总量:0

粉丝数:1

抖音实战~关注博主_数据_05


2个账号关系~二人暂无关注

3.2. 账号1关注账号2
  • 使用“尾号为5217”账号登录
  • 抖音实战~关注博主_数据_06

查看首页由尾号为0009的小美女账号发布短视频

抖音实战~关注博主_redis_07


点击关注

抖音实战~关注博主_2d_08

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

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

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

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

表数据变化:

用户表

尾号~0009 userid=21100598TZ9XG6RP

尾号~5217 userid=220620BZ2DH0KP94

抖音实战~关注博主_关注_09


粉丝表

新增一条数据,视频博主(21100598TZ9XG6RP)粉丝中有我(220620BZ2DH0KP94)

2206279H48HX0T54  21100598TZ9XG6RP  220620BZ2DH0KP94  0

抖音实战~关注博主_2d_10

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

使用尾号~0009账户登录

抖音实战~关注博主_redis_11

去首页~视频列表中,查看是否关注的状态为-未关注

抖音实战~关注博主_redis_12


点击关注

关注状态为-已关注

抖音实战~关注博主_数据_13


抖音实战~关注博主_关注

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

抖音实战~关注博主_数据_15

4.3. redis存储数据结构

抖音实战~关注博主_redis_16