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


    项目持续更新中:

    仿抖音短视频APP专栏

    目录

    视频页点赞总数 

    用户页点赞视频列表展示

    我的关注视频列表展示

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


    视频页点赞总数 

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

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

    1. private Integer getVlogBeLikedCounts(String vlogId){
    2. String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId);
    3. if(StringUtils.isNotBlank(countsStr) ){
    4. countsStr = "0";
    5. }
    6. return Integer.valueOf(countsStr);
    7. }

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

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

    此时的获赞数变为1:

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

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

     在后端:

    1. @PostMapping("totalLikedCounts")
    2. public GraceJSONResult totalLikedCounts(@RequestParam String vlogId) {
    3. vlogService.getVlogBeLikedCounts(vlogId);
    4. return GraceJSONResult.ok();
    5. }

    service接口:

    service 方法实现:

    1. @Override
    2. public Integer getVlogBeLikedCounts(String vlogId){
    3. String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId);
    4. if(StringUtils.isNotBlank(countsStr) ){
    5. countsStr = "0";
    6. }
    7. return Integer.valueOf(countsStr);
    8. }

    接着重启,测试:

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

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

    用户页点赞视频列表展示

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

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

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

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

     

     

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

    1. <select id="getMyLikedVlogList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
    2. SELECT
    3. v.id as vlogId,
    4. v.vloger_id as vlogerId,
    5. -- u.face as vlogerFace,
    6. -- u.nickname as vlogerName,
    7. v.title as content,
    8. v.url as url,
    9. v.cover as cover,
    10. v.width as width,
    11. v.height as height,
    12. v.like_counts as likeCounts,
    13. v.comments_counts as commentsCounts,
    14. v.is_private as isPrivate
    15. FROM
    16. vlog v
    17. LEFT JOIN
    18. my_liked_vlog mlv
    19. ON
    20. v.id = mlv.vlog_id
    21. LEFT JOIN
    22. users u
    23. on
    24. mlv.user_id = u.id
    25. WHERE
    26. u.id = #{paramMap.userId}
    27. AND
    28. v.is_private = 0
    29. ORDER BY
    30. v.created_time
    31. ASC
    32. </select>

    再service里面也要添加一个:

     service中实现:
     

    1. @Override
    2. public PagedGridResult getMyVlogList(String usedId, Integer page, Integer pageSize) {
    3. PageHelper.startPage(page,pageSize);
    4. Map map = new HashMap<>();
    5. map.put("userId",usedId);
    6. List list = vlogMapperCustom.getMyLikedVlogList(map);
    7. return setterPagedGrid(list,page);
    8. }

    打开前端查看:

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

    1. @GetMapping("myLikedList")
    2. public GraceJSONResult myLikedList(@RequestParam String userId,
    3. @RequestParam Integer page,
    4. @RequestParam Integer pageSize) {
    5. if (page == null) {
    6. page = COMMON_START_PAGE;
    7. }
    8. if (pageSize == null) {
    9. pageSize = COMMON_PAGE_SIZE;
    10. }
    11. PagedGridResult gridResult = vlogService.getMyVlogList(userId, page, pageSize);
    12. return GraceJSONResult.ok(gridResult);
    13. }

     我们重启,测试:

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

    我的关注视频列表展示

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

     我们这里可以右滑:

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

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

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

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

    1. <select id="getMyFollowList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
    2. SELECT
    3. v.id as vlogId,
    4. v.vloger_id as vlogerId,
    5. u.face as vlogerFace,
    6. u.nickname as vlogerName,
    7. v.title as content,
    8. v.url as url,
    9. v.cover as cover,
    10. v.width as width,
    11. v.height as height,
    12. v.like_counts as likeCounts,
    13. v.comments_counts as commentsCounts,
    14. v.is_private as isPrivate
    15. FROM
    16. vlog v
    17. LEFT JOIN
    18. fans f
    19. ON
    20. v.vloge_Id = u.id
    21. LEFT JOIN
    22. users u
    23. on
    24. f.vloger_id = u.id
    25. WHERE
    26. v.is_private = 0
    27. AND
    28. f.fan_id=#{paramMap.myId}
    29. ORDER BY
    30. v.created_time
    31. DESC
    32. </select>

    mapper接口: 

     接着在service中:

     实现:

    1. @Override
    2. public PagedGridResult getMyFollowVlogList(String myId, Integer page, Integer pageSize) {
    3. PageHelper.startPage(page,pageSize);
    4. Map map = new HashMap<>();
    5. map.put("myId",myId);
    6. List list = vlogMapperCustom.getMyFollowVlogList(map);
    7. for(IndexVlogVO v : list){
    8. String vlogerId = v.getVlogerId();
    9. String vlogId = v.getVlogId();
    10. if(StringUtils.isNotBlank(myId)){
    11. //用户必定关注过该博主
    12. v.setDoILikeThisVlog(true);
    13. //判断当前用户是否点赞
    14. v.setDoILikeThisVlog(doILikeVlog(myId,vlogId));
    15. }
    16. //获得当前视频的点过赞的总数
    17. v.setLikeCounts(getVlogBeLikedCounts(vlogId));
    18. }
    19. return setterPagedGrid(list,page);
    20. }

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

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

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

     

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

     在后端我们来编写:

    1. @GetMapping("followList")
    2. public GraceJSONResult followList(@RequestParam String myId,
    3. @RequestParam Integer page,
    4. @RequestParam Integer pageSize) {
    5. if (page == null) {
    6. page = COMMON_START_PAGE;
    7. }
    8. if (pageSize == null) {
    9. pageSize = COMMON_PAGE_SIZE;
    10. }
    11. PagedGridResult gridResult = vlogService.getMyFollowVlogList(myId, page, pageSize);
    12. return GraceJSONResult.ok(gridResult);
    13. }

    随后重启,测试:

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

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

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

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

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

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

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

     

    1. <select id="getMyFriendVlogList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
    2. SELECT
    3. v.id as vlogId,
    4. v.vloger_id as vlogerId,
    5. u.face as vlogerFace,
    6. u.nickname as vlogerName,
    7. v.title as content,
    8. v.url as url,
    9. v.cover as cover,
    10. v.width as width,
    11. v.height as height,
    12. v.like_counts as likeCounts,
    13. v.comments_counts as commentsCounts,
    14. v.is_private as isPrivate
    15. FROM
    16. vlog v
    17. LEFT JOIN
    18. fans f
    19. ON
    20. v.vloge_Id = f.fan_id
    21. LEFT JOIN
    22. users u
    23. on
    24. f.fan_id = u.id
    25. WHERE
    26. v.is_private = 0
    27. AND
    28. f.vloger_id=#{paramMap.myId}
    29. AND
    30. f.is_fan_friend_of_mine = 1
    31. ORDER BY
    32. v.created_time
    33. DESC
    34. </select>

    接着构建我们的service:

     

    1. @Override
    2. public PagedGridResult getMyFriendVlogList(String myId, Integer page, Integer pageSize) {
    3. PageHelper.startPage(page,pageSize);
    4. Map map = new HashMap<>();
    5. map.put("myId",myId);
    6. List list = vlogMapperCustom.getMyFriendVlogList(map);
    7. for(IndexVlogVO v : list){
    8. String vlogerId = v.getVlogerId();
    9. String vlogId = v.getVlogId();
    10. if(StringUtils.isNotBlank(myId)){
    11. //用户必定关注过该博主
    12. v.setDoILikeThisVlog(true);
    13. //判断当前用户是否点赞
    14. v.setDoILikeThisVlog(doILikeVlog(myId,vlogId));
    15. }
    16. //获得当前视频的点过赞的总数
    17. v.setLikeCounts(getVlogBeLikedCounts(vlogId));
    18. }
    19. return setterPagedGrid(list,page);
    20. }

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

    我们查看前端:

     

     编写我们的后端controller:

    1. @GetMapping("friendList")
    2. public GraceJSONResult friendList(@RequestParam String myId,
    3. @RequestParam Integer page,
    4. @RequestParam Integer pageSize) {
    5. if (page == null) {
    6. page = COMMON_START_PAGE;
    7. }
    8. if (pageSize == null) {
    9. pageSize = COMMON_PAGE_SIZE;
    10. }
    11. PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, page, pageSize);
    12. return GraceJSONResult.ok(gridResult);
    13. }

    最后重启,测试:

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

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

    联合主键重复

     

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

     

     

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

     

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

    在servce中写方法实现:

    1. @Override
    2. public IndexVlogVO getVlogDetailById(String userId,String vlogId) {
    3. Map map = new HashMap<>();
    4. map.put("vlogId",vlogId);
    5. List list= vlogMapperCustom.getIndexVlogList(map);
    6. if(list!= null && list.size()>0 && !list.isEmpty()){
    7. IndexVlogVO vlogVO=list.get(0);
    8. setterVO(vlogVO,userId);
    9. return setterVO(vlogVO,userId);
    10. }
    11. return null;
    12. }

    在controller中:

    1. @GetMapping("friendList")
    2. public GraceJSONResult friendList(@RequestParam String myId,
    3. @RequestParam Integer page,
    4. @RequestParam Integer pageSize) {
    5. if (page == null) {
    6. page = COMMON_START_PAGE;
    7. }
    8. if (pageSize == null) {
    9. pageSize = COMMON_PAGE_SIZE;
    10. }
    11. PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, page, pageSize);
    12. return GraceJSONResult.ok(gridResult);
    13. }

    我们重启,测试:

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

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

  • 相关阅读:
    iOS自动化测试框架Kiwi快速上手
    【LeetCode每日一题】——103.二叉树的锯齿形层序遍历
    c++编译的四个阶段
    PM2管理器无法使用解决方法
    基本的Python内置函数
    轻量日志管理方案-[EFK]
    Java-比较器Comparable与Comparator(详解)
    算法分析与设计:CH7快排详解(文末附快排完整算法)
    iOS开发Swift-12-列表UI,TableViewController,动态响应Button勾选-待办事项App(1)
    微信小程序仿苹果负一屏由弱到强的高斯模糊
  • 原文地址:https://blog.csdn.net/m0_64005381/article/details/127610384