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


    项目持续创作中:

    仿抖音短视频APP专栏

    目录

    实现用户点赞视频

    用户取消点赞

    用户是否点赞视频的判断


    实现用户点赞视频

    用户在点赞我们的视频后,我们需要去实现一些相关的业务,

    这里需要对应到数据库的一张表,就是my_liked_vlog,这个就是我所点赞过的视频列表。

    点赞过后,这个视频的点赞数会累加一,会用到我们的redis技术。

    首先在我们的service中:

     实现:

    1. @Transactional
    2. @Override
    3. public void userLikeVlog(String userId, String vlogId) {
    4. String rid = sid.nextShort();
    5. MyLikedVlog likedVlog = new MyLikedVlog();
    6. likedVlog.setId(rid);
    7. likedVlog.setVlogId(vlogId);
    8. likedVlog.setUserId(userId);
    9. myLikedVlogMapper.insert(likedVlog);
    10. }

    注意在我们的前面加一个注入MyLikeVlogMapper

    在编写controller之前先查看一下前端:

    我们在后端:

    1. @PostMapping("like")
    2. public GraceJSONResult myPrivateList(@RequestParam String userId,
    3. @RequestParam String vlogerId,
    4. @RequestParam String vlogId) {
    5. //我点赞的视频,关联保存到数据库
    6. vlogService.userLikeVlog(userId,vlogId);
    7. //点赞后,视频和视频发布者的或者都会+1;
    8. redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS+":"+vlogerId,1);
    9. redis.increment(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId,1);
    10. //我点赞的视频,需要在redis中保存关联关系
    11. redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId,"1");
    12. return GraceJSONResult.ok();
    13. }

     这里的redis操作可以放到我们的service里面执行会更好。

    也最好下来在这里做一个校验判断两个id是否存在,在我们的上一篇文章中有写到。

    启动,测试:

    点击之后,这里红色的心亮起了

     我们打开数据库来看一下:

    这里是成功的插入了

     打开redis查看:

     这里是一模一样的,说明是成功的

     用户点赞操作就是实现了。

    用户取消点赞

    咱们的前端这里发起的请求叫unlike 

    我们后端去写一下,携带的参数和上面是相同的,操作和喜欢是相反的。

    1. @PostMapping("unlike")
    2. public GraceJSONResult unlike(@RequestParam String userId,
    3. @RequestParam String vlogerId,
    4. @RequestParam String vlogId) {
    5. //我取消点赞的视频,关联关系删除
    6. vlogService.userUnLikeVlog(userId,vlogId);
    7. //点赞后,视频和视频发布者的或者都会+1;
    8. redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS+":"+vlogerId,1);
    9. redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId,1);
    10. redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId);
    11. return GraceJSONResult.ok();
    12. }

    这里还是建议大家redis写在service中处理。

    接着service:

    实现: 

    这里会根据vlogeId和userId去匹配符合的数据进行删除。

    1. @Transactional
    2. @Override
    3. public void userUnLikeVlog(String userId, String vlogId) {
    4. MyLikedVlog likedVlog = new MyLikedVlog();
    5. likedVlog.setVlogId(vlogId);
    6. likedVlog.setUserId(userId);
    7. myLikedVlogMapper.delete(likedVlog);
    8. }

    重启,测试:

     这里我们取消点赞。

    打开数据库:

    这里是还没有刷新的原来的数据

     刷新之后这条记录就没有了。

     再到redis中查看:

     刷新一下:

    累减变为0

     这里也被删除了。

     在页面中我们看下效果,先对视频进行一个点赞

     获赞数变为1

     取消点赞,获赞数变为0:

     我们在这里会发现一些小问题,在之前的开发中:

    这里其实是有点问题的

     用户的获赞总数应该是视频博主(点赞/喜欢)总和

    第一条记录是永远不存在的 

     这样就能修复这样一段代码。

    用户是否点赞视频的判断

    我们这里其实是存在一点问题的,因为当我们下拉刷新式,虽然我们的数据被存入了数据库中吗,但是在前端其实并没有做处理,它刷新之后这个心还是没有亮

     对于的我们的后端,其实在进入这个界面时,应该判断曾经有没有点赞过这条视频,如果点赞了,再次看到这个视频时,应该是亮着的。

    我们要在这里对方法进行一个扩展:

    当我们拿到list之后,要进行一个循环判断,判断用户是否点赞过视频。

    首先:

     我们要在这里添加一个参数userId,其实在我们的前端也是可以看见的。

    这里我们要在接口方法处都要去添加一个传入的参数。

    在service实现中我们要将返回的list进行循环遍历,

     for(IndexVlogVO v : list)调用方法在reids中查询我是否点赞过这条视频。

    1. @Override
    2. public PagedGridResult getIndexVlogList(String userId,
    3. String search,
    4. Integer page,
    5. Integer pageSize){
    6. PageHelper.startPage(page,pageSize);
    7. Map map = new HashMap<>();
    8. if(StringUtils.isNotBlank(search)){
    9. map.put("search",search);
    10. }
    11. List list= vlogMapperCustom.getIndexVlogList(map);
    12. // return list;
    13. for(IndexVlogVO v : list){
    14. String vlogerId = v.getVlogerId();
    15. String vlogId = v.getVlogId();
    16. if(StringUtils.isNotBlank(userId)){
    17. v.setDoILikeThisVlog(doILikeVlog(userId,vlogId));
    18. }
    19. }
    20. return setterPagedGrid(list,page);
    21. }
    22. private boolean doILikeVlog(String myId,String vlogId){
    23. String doILike = redis.get(REDIS_USER_LIKE_VLOG+":"+myId+":"+vlogId);
    24. boolean isLike = false;
    25. if(StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")){
    26. isLike = true;
    27. }
    28. return isLike;
    29. }

    重启,测试:

    我们进行一个下拉刷新

     这里就完成了我们的一个判断用户是否点赞过该视频。

  • 相关阅读:
    Win10鼠标宏怎么设置?电脑设置鼠标宏的方法
    【数据结构】C语言实现栈
    Servlet的url-pattern配置
    Linux基础命令
    SpringBoot项目搭建
    硬件驱动为什么要有WHQL数字签名
    MySQL学习系列(10)-每天学习10个知识
    PCIE电路设计
    单元测试中常见错误
    储存卡数据怎么恢复?恢复靠它
  • 原文地址:https://blog.csdn.net/m0_64005381/article/details/127597529