文章目录
- 一、关注我需求分析
- 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