从零开始搭建仿抖音短视频APP--后端开发粉丝业务模块(1)

项目持续更新中:

仿抖音短视频APP专栏

目录 

关注短视频博主

Redis技术妙用

取消关注博主


关注短视频博主

在我们的主页中,刷视频时是可以在头像下方进行一个关注

点击头像,进入对方的主页也是可以进行关注的。

 

 我们在这里会涉及到一张新的表,叫做粉丝表:

 这里有三个字段,博主id,粉丝id,是否为朋友。

如果点击关注,那么我的表里面就会新增一条数据。

我们先来编写service:

 接着实现:

@Service
public class FansServiceImpl extends BaseInfoProperties implements FansService {

    @Resource
    private FansMapper fansMapper;

    @Autowired
    private Sid sid;

    @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);
        fans.setIsFanFriendOfMine(1);

        //判断对方是否关注我,如果关注我,那么双方都要互为朋友关注
        Fans vloger = queryFansRelationship(vlogerId,myId);
        if (vloger != null){
            fans.setIsFanFriendOfMine(YesOrNo.YES.type);
            vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
            fansMapper.updateByPrimaryKey(fans);
        }else {
            fans.setIsFanFriendOfMine(YesOrNo.NO.type);
        }
        fansMapper.insert(fans);
    }

这里主要交换参数位置,来查询是否互为粉丝

    public Fans queryFansRelationship(String fanId,String vlogerId){
        Example example = new Example(Fans.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("vlogerId",fanId);
        criteria.andEqualTo("fanId",vlogerId);

        List list = fansMapper.selectByExample(example);
        Fans fan = null;
        if( list !=null && list.size() > 0 && !list.isEmpty()) {
            fan = (Fans) list.get(0);
        }
        return fan;
    }

接下来实现controller:
我们先打开前端查看:

这里是需要传入两个参数,一个是我的id,还有一个是博主的id。

我们在代码中:

@Slf4j
@Api(tags = "FansController 粉丝相关业务功能的接口" )
@RequestMapping("fans")
@RestController
public class FansController extends BaseInfoProperties{

    @Autowired
    private FansService fansService;

    @Autowired
    private UserService userService;

    @PostMapping("follow")
    public GraceJSONResult follow(@RequestParam String myId,
                                  @RequestParam String vlogerId){

        if(StringUtils.isNotBlank(myId)&&StringUtils.isNotBlank(vlogerId)){
           return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
        }
        //判断当前用户,自己不能关注自己
        if(myId.equalsIgnoreCase(vlogerId)){
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
        }
        //判断两个id对应的用户是否存在
        Users vloger = userService.getUser(vlogerId);
        Users myInfo = userService.getUser(myId);
        if(myInfo == null || vloger == null){
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
        }
        //保存粉丝关系到数据库
        fansService.doFollow(myId,vlogerId);
        return GraceJSONResult.ok();
    }


}

我们可以思考一下,两个用户id的数据库查询后的判断,是分开好?还是合并判断好?

随后重启当前的服务,

这个是我们的主页,这里已经是做了判断,我们这里是没有关注按钮的

 我们滑到另一个用户的视频,

 点击关注,我们可以返回数据库查看一下:

这个是我们的账户,

随后在粉丝表中搜索,这多了一条记录。这里是粉丝id,博主的id我们也可以拷贝查看一下

 

现在我们登录到这个咩咩羊的账户,也关注演示账号。

然后我们回到数据库

 发现字段还是0,没有发送更改,我们回到controller:

 发现了两个小问题,进行了一下修改。所以说我们平常要仔细一点。

我们重启,测试:

 这里已经成功了。

Redis技术妙用

我们在这个页面还没有实现相应的查询功能,

如果我们这里退出,重新关注,是会报错的。

假设我们查询粉丝关注总数,我们普遍来讲是用counts,在数据库中查询,但是在目前的互联网情

况下,高并发等,如果粉丝数达到千万,那么会有性能的影响。我们不能把所有的请求压力给我们

的数据库。我们在这里选择redis,它有一个技术功能:

我们设定一个key:

 我们会发现它的步长是1,而且是单线程的。随着数值的增长,我们通过get 就能获得数值:

 所以我们在controller中:

 //博主的粉丝+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");

大家思考一下,我们的redis是放在controller处理好,还是service好。

现在我们重启,然后在redis中查看一下结果:

 我们在这已经声明好了,后期如果有查询就可以使用redis。

取消关注博主

 我们这里做的基本都是和关注相反的操作。

在service层:

 在service层实现:

  @Transactional
    @Override
    public void doCancel(String myId, String vlogerId) {
        //判断我们是否为朋友关系,如果是,则需要取消双方的关系
        Fans fan =queryFansRelationship(myId,vlogerId);
            if(fan !=null && fan.getIsFanFriendOfMine() == YesOrNo.YES.type){
                //抹除双方的朋友关系,自己的关系删除即可
                Fans pendingFan =queryFansRelationship(vlogerId,myId);
                pendingFan.setIsFanFriendOfMine(YesOrNo.NO.type);
                fansMapper.updateByPrimaryKey(pendingFan);
            }
            //删除自己的关注关联表记录
        fansMapper.delete(fan);
        }

查看我们的前端:

我们回到controller:

   @PostMapping("cancel")
    public GraceJSONResult cancel(@RequestParam String myId,
                                  @RequestParam String vlogerId){

        //删除业务的执行
        fansService.doCancel(myId,vlogerId);

        //博主的粉丝-1 ,我的关注-1;
        redis.decrement(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
        redis.decrement(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);

        //我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
        redis.del(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId);

        return GraceJSONResult.ok();
    }

这里建议redis的操作放到service层完成。

我们重启,测试:

打开页面,点击取消关注

 

 这里记录少了一条。我们再点击关注:

这里就实现了我们的关注和取关。 

猜你喜欢

转载自blog.csdn.net/m0_64005381/article/details/127547271