当前位置:网站首页>抖音实战~关注博主
抖音实战~关注博主
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存储数据结构

边栏推荐
- Arrangement of basic electrical knowledge (I)
- 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
- 电学基础知识整理(一)
- Web APIs DOM event foundation dark horse programmer
- 【Linux】【Mysql】ERROR 1698 (28000): Access denied for user ‘root‘@‘localhost‘
- 05 MongoDB对列的各种操作总结
- Reading notes of top performance version 2 (II) -- Performance observation tool
- Two methods of shell script parameter passing based on arm5718
- 门级建模—学习笔记
- 2021年终总结及2022年展望
猜你喜欢

电学基础知识整理(一)

几个重要的物理概念

Visualization of loss using tensorboard

使用tensorboard进行loss可视化

基于正点原子stm32的mini板的TFTLCD显示实验

GenICam GenTL 标准 ver1.5(2)

Principle and Simulation of switching power supply buck circuit

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

Lingge leangoo agile Kanban tool adds the functions of exporting card documents and pasting shared brain map nodes

How to apply for ASTM E108 flame retardant test for photovoltaic panels?
随机推荐
基于arm5718的Shell脚本参数传递的2种方法
Several important physical concepts
MSC 307(88) (2010 FTPC Code)第2部分烟气和毒性测试
GenICam GenTL 标准 ver1.5(2)
Arrangement of basic electrical knowledge (I)
The operating mechanism of spectrogram in audio Science
Notes to friendship chain
PostgreSQL 实现批量更新、删除、插入
等保2.0密码要求是什么?法律依据有哪些?
Pychart shares third-party modules among different projects
Introversion, lying flat and midlife crisis
How to write anti shake throttling for small programs?
歐洲家具EN 597-1 跟EN 597-2兩個阻燃標准一樣嗎?
English语法_形容词/副词3级 - 比较级
指针链表
美创数据安全管理平台获信通院“数据安全产品能力验证计划”评测证书
Leetcode: monotonic stack structure (Advanced)
ambari SSLError: Failed to connect. Please check openssl library versions.
利用ELK 搭建日志分析系统(二)—— 部署安装
品达通用权限系统(Day 5~Day 6)