天天看点

抖音实战~关注博主

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

文章目录

  • ​​一、关注我需求分析​​
  • ​​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

("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

抖音实战~关注博主

账号:尾号~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存储数据结构

继续阅读