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

项目持续创作中:

仿抖音短视频APP专栏

目录

实现用户点赞视频

用户取消点赞

用户是否点赞视频的判断


实现用户点赞视频

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

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

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

首先在我们的service中:

 实现:

  @Transactional
    @Override
    public void userLikeVlog(String userId, String vlogId) {
        String rid = sid.nextShort();
        MyLikedVlog likedVlog = new MyLikedVlog();
        likedVlog.setId(rid);
        likedVlog.setVlogId(vlogId);
        likedVlog.setUserId(userId);
        myLikedVlogMapper.insert(likedVlog);
    }

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

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

我们在后端:

 @PostMapping("like")
    public GraceJSONResult myPrivateList(@RequestParam String userId,
                                         @RequestParam String vlogerId,
                                         @RequestParam String vlogId) {

        //我点赞的视频,关联保存到数据库
        vlogService.userLikeVlog(userId,vlogId);

        //点赞后,视频和视频发布者的或者都会+1;
        redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS+":"+vlogerId,1);
        redis.increment(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId,1);
        //我点赞的视频,需要在redis中保存关联关系
        redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId,"1");

        return GraceJSONResult.ok();
    }

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

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

启动,测试:

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

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

这里是成功的插入了

 打开redis查看:

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

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

用户取消点赞

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

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

   @PostMapping("unlike")
    public GraceJSONResult unlike(@RequestParam String userId,
                                         @RequestParam String vlogerId,
                                         @RequestParam String vlogId) {

        //我取消点赞的视频,关联关系删除
        vlogService.userUnLikeVlog(userId,vlogId);

        //点赞后,视频和视频发布者的或者都会+1;
        redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS+":"+vlogerId,1);
        redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId,1);

        redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId);

        return GraceJSONResult.ok();
    }

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

接着service:

实现: 

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

  @Transactional
    @Override
    public void userUnLikeVlog(String userId, String vlogId) {
        MyLikedVlog likedVlog = new MyLikedVlog();
        likedVlog.setVlogId(vlogId);
        likedVlog.setUserId(userId);
        myLikedVlogMapper.delete(likedVlog);
    }

重启,测试:

 这里我们取消点赞。

打开数据库:

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

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

 再到redis中查看:

 刷新一下:

累减变为0

 这里也被删除了。

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

 获赞数变为1

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

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

这里其实是有点问题的

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

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

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

用户是否点赞视频的判断

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

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

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

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

首先:

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

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

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

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

  @Override
    public PagedGridResult getIndexVlogList(String userId,
                                            String search,
                                            Integer page,
                                            Integer pageSize){
        PageHelper.startPage(page,pageSize);

        Map<String,Object> map = new HashMap<>();
        if(StringUtils.isNotBlank(search)){
            map.put("search",search);
        }
       List<IndexVlogVO> list= vlogMapperCustom.getIndexVlogList(map);
//        return list;
        for(IndexVlogVO v : list){
            String vlogerId = v.getVlogerId();
            String vlogId = v.getVlogId();
            if(StringUtils.isNotBlank(userId)){
                v.setDoILikeThisVlog(doILikeVlog(userId,vlogId));
            }

        }
        return setterPagedGrid(list,page);
    }
    private boolean doILikeVlog(String myId,String vlogId){
        String doILike = redis.get(REDIS_USER_LIKE_VLOG+":"+myId+":"+vlogId);
        boolean isLike = false;
        if(StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")){
            isLike  = true;
        }
        return isLike;
    }

重启,测试:

我们进行一个下拉刷新

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

猜你喜欢

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