抖音实战~关注博主

抖音实战~关注博主_第1张图片
抖音实战~关注博主_第2张图片

文章目录

          • 一、关注我需求分析
            • 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. 关注我流程图

抖音实战~关注博主_第3张图片

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

抖音实战~关注博主_第4张图片
账号:尾号~0009
昵称:小美女
关注总量:0
粉丝数:1

抖音实战~关注博主_第5张图片
2个账号关系~二人暂无关注

3.2. 账号1关注账号2
  • 使用“尾号为5217”账号登录
    抖音实战~关注博主_第6张图片

查看首页由尾号为0009的小美女账号发布短视频
抖音实战~关注博主_第7张图片
点击关注
抖音实战~关注博主_第8张图片

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

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

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

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

表数据变化:
用户表
尾号~0009 userid=21100598TZ9XG6RP
尾号~5217 userid=220620BZ2DH0KP94
抖音实战~关注博主_第9张图片
粉丝表
新增一条数据,视频博主(21100598TZ9XG6RP)粉丝中有我(220620BZ2DH0KP94)

2206279H48HX0T54	21100598TZ9XG6RP	220620BZ2DH0KP94	0

抖音实战~关注博主_第10张图片

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

使用尾号~0009账户登录
抖音实战~关注博主_第11张图片

去首页~视频列表中,查看是否关注的状态为-未关注
抖音实战~关注博主_第12张图片
点击关注
关注状态为-已关注
抖音实战~关注博主_第13张图片
抖音实战~关注博主_第14张图片

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存储数据结构

抖音实战~关注博主_第16张图片

你可能感兴趣的:(抖音App,关注)