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


    项目持续更新中:

    仿抖音短视频APP专栏

    目录 

    关注短视频博主

    Redis技术妙用

    取消关注博主


    关注短视频博主

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

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

     

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

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

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

    我们先来编写service:

     接着实现:

    1. @Service
    2. public class FansServiceImpl extends BaseInfoProperties implements FansService {
    3. @Resource
    4. private FansMapper fansMapper;
    5. @Autowired
    6. private Sid sid;
    7. @Override
    8. public void doFollow(String myId, String vlogerId) {
    9. String fid = sid.nextShort();
    10. Fans fans = new Fans();
    11. fans.setId(fid);
    12. fans.setFanId(myId);
    13. fans.setVlogerId(vlogerId);
    14. fans.setIsFanFriendOfMine(1);
    15. //判断对方是否关注我,如果关注我,那么双方都要互为朋友关注
    16. Fans vloger = queryFansRelationship(vlogerId,myId);
    17. if (vloger != null){
    18. fans.setIsFanFriendOfMine(YesOrNo.YES.type);
    19. vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
    20. fansMapper.updateByPrimaryKey(fans);
    21. }else {
    22. fans.setIsFanFriendOfMine(YesOrNo.NO.type);
    23. }
    24. fansMapper.insert(fans);
    25. }

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

    1. public Fans queryFansRelationship(String fanId,String vlogerId){
    2. Example example = new Example(Fans.class);
    3. Example.Criteria criteria = example.createCriteria();
    4. criteria.andEqualTo("vlogerId",fanId);
    5. criteria.andEqualTo("fanId",vlogerId);
    6. List list = fansMapper.selectByExample(example);
    7. Fans fan = null;
    8. if( list !=null && list.size() > 0 && !list.isEmpty()) {
    9. fan = (Fans) list.get(0);
    10. }
    11. return fan;
    12. }

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

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

    我们在代码中:

    1. @Slf4j
    2. @Api(tags = "FansController 粉丝相关业务功能的接口" )
    3. @RequestMapping("fans")
    4. @RestController
    5. public class FansController extends BaseInfoProperties{
    6. @Autowired
    7. private FansService fansService;
    8. @Autowired
    9. private UserService userService;
    10. @PostMapping("follow")
    11. public GraceJSONResult follow(@RequestParam String myId,
    12. @RequestParam String vlogerId){
    13. if(StringUtils.isNotBlank(myId)&&StringUtils.isNotBlank(vlogerId)){
    14. return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
    15. }
    16. //判断当前用户,自己不能关注自己
    17. if(myId.equalsIgnoreCase(vlogerId)){
    18. return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
    19. }
    20. //判断两个id对应的用户是否存在
    21. Users vloger = userService.getUser(vlogerId);
    22. Users myInfo = userService.getUser(myId);
    23. if(myInfo == null || vloger == null){
    24. return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
    25. }
    26. //保存粉丝关系到数据库
    27. fansService.doFollow(myId,vlogerId);
    28. return GraceJSONResult.ok();
    29. }
    30. }

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

    随后重启当前的服务,

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

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

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

    这个是我们的账户,

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

     

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

    然后我们回到数据库

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

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

    我们重启,测试:

     这里已经成功了。

    Redis技术妙用

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

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

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

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

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

    我们设定一个key:

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

     所以我们在controller中:

    1. //博主的粉丝+1 ,我的关注+1;
    2. redis.increment(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
    3. redis.increment(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);
    4. //我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
    5. redis.set(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId,"1");

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

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

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

    取消关注博主

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

    service层

     在service层实现:

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

    查看我们的前端:

    我们回到controller:

    1. @PostMapping("cancel")
    2. public GraceJSONResult cancel(@RequestParam String myId,
    3. @RequestParam String vlogerId){
    4. //删除业务的执行
    5. fansService.doCancel(myId,vlogerId);
    6. //博主的粉丝-1 ,我的关注-1;
    7. redis.decrement(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
    8. redis.decrement(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);
    9. //我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
    10. redis.del(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId);
    11. return GraceJSONResult.ok();
    12. }

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

    我们重启,测试:

    打开页面,点击取消关注

     

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

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

  • 相关阅读:
    ml-dms-dataset实验
    ES(elasticSearch学习笔记)
    华为云算法零门槛:零基础教你AI试伊妆
    分布式系统(Distributed Systems)概述
    【详解】Python基础操作之os模块常用命令
    uni-app:多种方法写入图片路径
    【MKS_GEN_L 主板使用说明书】
    营销互动类小游戏策划与开发
    JAVA Stream流
    【随想】每日两题Day.2
  • 原文地址:https://blog.csdn.net/m0_64005381/article/details/127547271