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

项目持续更新中:

仿抖音短视频APP专栏

目录

视频页点赞总数 

用户页点赞视频列表展示

我的关注视频列表展示

互粉朋友视频瀑布列表展示


视频页点赞总数 

在我们的点赞下面会有一个数字,代表点赞总数。我们需要从redis获取数据进行展示

在service的实现类中添加一个在redis中获取点赞数的方法:

    private Integer getVlogBeLikedCounts(String vlogId){
        String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId);
        if(StringUtils.isNotBlank(countsStr) ){
            countsStr = "0";
        }
        return Integer.valueOf(countsStr);
    }

 其实我们还需要完成点赞过后数值的一个刷新,重新把数量进行一个。

我们重启,测试,下拉刷新。

此时的获赞数变为1:

 但是我们打开一个有过记录,点赞过的视频,这里的数值仍为0,因为我们这里没有做一个视频的查询

我们打开前端, 这是一个新的controller:

 在后端:

    @PostMapping("totalLikedCounts")
    public GraceJSONResult totalLikedCounts(@RequestParam String vlogId) {
        vlogService.getVlogBeLikedCounts(vlogId);
        return GraceJSONResult.ok();
    }

service接口:

service 方法实现:

    @Override
    public Integer getVlogBeLikedCounts(String vlogId){
        String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId);
        if(StringUtils.isNotBlank(countsStr) ){
            countsStr = "0";
        }
        return Integer.valueOf(countsStr);
    }

接着重启,测试:

 此时不管是点赞还是取消关注,点赞数都会随着改变。

这里就已经落实到了数据库和redis。

用户页点赞视频列表展示

前面我们完成了作品和私密的展示

 还有一个赞过的视频列表,那么这些都是要和数据库关联查询的,这里涉及到一张表

 我们这里需要借助于以下三个表进行查询

首先我们先在Mapper中写一个接口定义:

 

 

接着来写我们的自定义sql查询:

    <select id="getMyLikedVlogList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
            SELECT
                    v.id as vlogId,
                    v.vloger_id as vlogerId,
--                     u.face as vlogerFace,
--                     u.nickname as vlogerName,
                    v.title as content,
                    v.url as url,
                    v.cover as cover,
                    v.width as width,
                    v.height as height,
                    v.like_counts as likeCounts,
                    v.comments_counts as commentsCounts,
                    v.is_private as isPrivate
            FROM
                    vlog v
            LEFT JOIN
                    my_liked_vlog mlv
                ON
                    v.id = mlv.vlog_id
            LEFT JOIN
                    users u
                on
                    mlv.user_id = u.id
            WHERE
                    u.id = #{paramMap.userId}
                AND
                    v.is_private = 0
            ORDER BY
                    v.created_time
                ASC

    </select>

再service里面也要添加一个:

 service中实现:
 

    @Override
    public PagedGridResult getMyVlogList(String usedId, Integer page, Integer pageSize) {
        PageHelper.startPage(page,pageSize);
        Map<String,Object> map = new HashMap<>();
        map.put("userId",usedId);
        List<IndexVlogVO> list = vlogMapperCustom.getMyLikedVlogList(map);
        return setterPagedGrid(list,page);
    }

打开前端查看:

 我们后端和前端保持一致,放在同一个代码区域:

    @GetMapping("myLikedList")
    public GraceJSONResult myLikedList(@RequestParam String userId,
                                         @RequestParam Integer page,
                                         @RequestParam Integer pageSize) {
        if (page == null) {
            page = COMMON_START_PAGE;
        }
        if (pageSize == null) {
            pageSize = COMMON_PAGE_SIZE;
        }
        PagedGridResult gridResult = vlogService.getMyVlogList(userId, page, pageSize);

        return GraceJSONResult.ok(gridResult);
    }

 我们重启,测试:

 这里就实现了我们赞过的视频的一个展示。

我的关注视频列表展示

在之前我们完成的都是视频推荐,

 我们这里可以右滑:

 在关注里面,只要是我关注的博主,它们的发布的视频都会在关注的页面进行展示。

这里也是需要通过我们的sql进行多表关联:

 通过这三张表进行的一个查询

 我们在xml文件中编写sql语句:

  <select id="getMyFollowList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
        SELECT
            v.id as vlogId,
            v.vloger_id as vlogerId,
            u.face as vlogerFace,
            u.nickname as vlogerName,
            v.title as content,
            v.url as url,
            v.cover as cover,
            v.width as width,
            v.height as height,
            v.like_counts as likeCounts,
            v.comments_counts as commentsCounts,
            v.is_private as isPrivate
        FROM
            vlog v
        LEFT JOIN
            fans f
        ON
            v.vloge_Id = u.id
        LEFT JOIN
            users u
        on
            f.vloger_id = u.id
        WHERE
            v.is_private = 0
        AND
            f.fan_id=#{paramMap.myId}
        ORDER BY
            v.created_time
        DESC

    </select>

mapper接口: 

 接着在service中:

 实现:

    @Override
    public PagedGridResult getMyFollowVlogList(String myId, Integer page, Integer pageSize) {
        PageHelper.startPage(page,pageSize);
        Map<String,Object> map = new HashMap<>();
        map.put("myId",myId);
        List<IndexVlogVO> list = vlogMapperCustom.getMyFollowVlogList(map);
        for(IndexVlogVO v : list){
            String vlogerId = v.getVlogerId();
            String vlogId = v.getVlogId();

            if(StringUtils.isNotBlank(myId)){
                //用户必定关注过该博主
                v.setDoILikeThisVlog(true);
                //判断当前用户是否点赞
                v.setDoILikeThisVlog(doILikeVlog(myId,vlogId));
            }
            //获得当前视频的点过赞的总数
            v.setLikeCounts(getVlogBeLikedCounts(vlogId));
        }


        return setterPagedGrid(list,page);
    }

在这里我们需要对之前的查询操作进行一个补充:

这里需要判断用户是否关注过博主

   //用户是否关注该博主
                    boolean doIFollowVloger = fansService.queryDoIFollowVloger(userId,vlogerId);
                    v.setDoIFollowVloger(doIFollowVloger);

 

在写controller之前,我们先打开前端:

 在后端我们来编写:

 @GetMapping("followList")
    public GraceJSONResult followList(@RequestParam String myId,
                                       @RequestParam Integer page,
                                       @RequestParam Integer pageSize) {
        if (page == null) {
            page = COMMON_START_PAGE;
        }
        if (pageSize == null) {
            pageSize = COMMON_PAGE_SIZE;
        }
        PagedGridResult gridResult = vlogService.getMyFollowVlogList(myId, page, pageSize);

        return GraceJSONResult.ok(gridResult);
    }

随后重启,测试:

这里就是我关注的博主的视频列表了

 这里下来大家可以取关博主,关注博主来进行一些测试。

互粉朋友视频瀑布列表展示

我们在主页底部切换的时候,这里有一个互粉互关的用户发布的视频列表,

 这里sql语句的编写其实和我们上面差不多,只是添加了一个额外的判断条件

这里如果是1,说明互相关注

 随后在我们的Mapper接口去实现:

 

 <select id="getMyFriendVlogList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
        SELECT
            v.id as vlogId,
            v.vloger_id as vlogerId,
            u.face as vlogerFace,
            u.nickname as vlogerName,
            v.title as content,
            v.url as url,
            v.cover as cover,
            v.width as width,
            v.height as height,
            v.like_counts as likeCounts,
            v.comments_counts as commentsCounts,
            v.is_private as isPrivate
        FROM
            vlog v
        LEFT JOIN
            fans f
        ON
            v.vloge_Id = f.fan_id
        LEFT JOIN
            users u
        on
            f.fan_id = u.id
        WHERE
            v.is_private = 0
          AND
            f.vloger_id=#{paramMap.myId}
            AND
            f.is_fan_friend_of_mine = 1
        ORDER BY
            v.created_time
                DESC

    </select>

接着构建我们的service:

 

 @Override
    public PagedGridResult getMyFriendVlogList(String myId, Integer page, Integer pageSize) {
        PageHelper.startPage(page,pageSize);
        Map<String,Object> map = new HashMap<>();
        map.put("myId",myId);
        List<IndexVlogVO> list = vlogMapperCustom.getMyFriendVlogList(map);
        for(IndexVlogVO v : list){
            String vlogerId = v.getVlogerId();
            String vlogId = v.getVlogId();

            if(StringUtils.isNotBlank(myId)){
                //用户必定关注过该博主
                v.setDoILikeThisVlog(true);
                //判断当前用户是否点赞
                v.setDoILikeThisVlog(doILikeVlog(myId,vlogId));
            }
            //获得当前视频的点过赞的总数
            v.setLikeCounts(getVlogBeLikedCounts(vlogId));
        }
        return setterPagedGrid(list,page);
    }

这里可以合并getMyFollowVlogList,getMyFriendVlogList两种方法,会更加优雅和美观。

我们查看前端:

 

 编写我们的后端controller:

  @GetMapping("friendList")
    public GraceJSONResult friendList(@RequestParam String myId,
                                      @RequestParam Integer page,
                                      @RequestParam Integer pageSize) {
        if (page == null) {
            page = COMMON_START_PAGE;
        }
        if (pageSize == null) {
            pageSize = COMMON_PAGE_SIZE;
        }
        PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, page, pageSize);

        return GraceJSONResult.ok(gridResult);
    }

最后重启,测试:

这里是一个瀑布流,列表内容多一些才会有下滑分页。

如果我们在主页进行关注和点赞,我们会发现它抛异常,这是因为我们在做详情查询时,没有做相应的设置。

联合主键重复

 

 这是detail出现的问题,我们做一个修复

 

 

因为这里很多重复这样的操作,我们把它单独拿出来

 

    private IndexVlogVO setterVO(IndexVlogVO v, String userId){
            String vlogerId = v.getVlogerId();
            String vlogId = v.getVlogId();
            if(StringUtils.isNotBlank(userId)){
                //用户必定关注过该博主
                v.setDoILikeThisVlog(true);
                //判断当前用户是否点赞
                v.setDoILikeThisVlog(doILikeVlog(userId,vlogId));
            }
            //获得当前视频的点过赞的总数
            v.setLikeCounts(getVlogBeLikedCounts(vlogId));
       return v;
        }

在servce中写方法实现:

   @Override
    public IndexVlogVO getVlogDetailById(String userId,String vlogId) {
        Map<String,Object> map = new HashMap<>();
            map.put("vlogId",vlogId);
        List<IndexVlogVO> list= vlogMapperCustom.getIndexVlogList(map);
        if(list!= null && list.size()>0 && !list.isEmpty()){
            IndexVlogVO vlogVO=list.get(0);
            setterVO(vlogVO,userId);
            return setterVO(vlogVO,userId);
        }
        return null;
    }

在controller中:

    @GetMapping("friendList")
    public GraceJSONResult friendList(@RequestParam String myId,
                                      @RequestParam Integer page,
                                      @RequestParam Integer pageSize) {
        if (page == null) {
            page = COMMON_START_PAGE;
        }
        if (pageSize == null) {
            pageSize = COMMON_PAGE_SIZE;
        }
        PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, page, pageSize);

        return GraceJSONResult.ok(gridResult);
    }

我们重启,测试:

这里关注和点赞都实现了。

 以上就完成了我们所有粉丝业务模块的开发。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么时候养猫猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值