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


    项目持续更新中:

    防抖音短视频APP项目专栏

    目录

    判断用户是否关注博主

    我的关注列表

     我的粉丝列表

    实现互粉标记显示


    判断用户是否关注博主

    在这里我们对这个人进行关注之后,重新退出界面再次进入,并没有变为已关注,所以我们在这里要做一个查询

     我们在service层写接口:

     接口实现:

    1. @Override
    2. public boolean queryDoIFollowVloger(String myId, String vlogerId) {
    3. Fans vloger = queryFansRelationship(myId,vlogerId);
    4. return vloger !=null;
    5. }

    这里我们先查看一下前端的路由:

     接着我们在controller层:

    1. @GetMapping("queryDoIFollowVloger")
    2. public GraceJSONResult queryDoIFollowVloger(@RequestParam String myId,
    3. @RequestParam String vlogerId){
    4. return GraceJSONResult.ok(fansService.queryDoIFollowVloger(myId,vlogerId));
    5. }

    接着我们重新启动一下,在刷新回到我们的主页,这时候就变成了已关注的状态。

    注:我们在service这一层是通过查询数据库的方式来做的,但是我们之前已经通过redis进行处理。所以我们在这里也可以从redis中查询,返回判断一个true或者false。

    我的关注列表

    我们在其他博主的页面时,关注和粉丝是不能点击查看的。在自己的主页,是可以查看自己的关注和粉丝。

     

     这里我们都是要做一些相应的查询。

    我们需要有一个VO:

    这个是我们需要展现到前端的,在这里我们对数据进行一个封装。

    我们在custom.xml文件中完成编写,

    1. <select id="queryMyFollows" resultType="com.imooc.vo.VlogerVO" parameterType="map">
    2. SELECT
    3. u.id as vlogerId,
    4. u.nickname as nickname,
    5. u.face as face
    6. FROM
    7. fans f
    8. LEFT JOIN
    9. users u
    10. ON
    11. f.vloger_id = u.id
    12. WHERE
    13. f.fan_id = #{paramMap.myId}
    14. ORDER BY
    15. u.nickname
    16. ASC
    17. </select>

    随后就是完成一个映射

    这里mapper层完成之后,就要到我们的业务service层:

    这里需要用到我们的分页 

    接着就要完成我们的实现,首先我们需要把我们需要调用的Map给new出来:

    1. @Override
    2. public PagedGridResult queryMyFollow(String myId, Integer page, Integer pageSize) {
    3. Map map=new HashMap<>();
    4. map.put("myId",myId);
    5. List list = fansMapperCustom.queryMyFollows(map);
    6. return setterPagedGrid(list,page);
    7. }

    在完成controller层之前,我们先看下前端:

    在后端:

     接着重启,做一个测试:

    我们这里进行一个取关操作,是成功的。

    再次进入,就是没有关注的状态了。

     我的粉丝列表

    我的粉丝列表和关注列表本周上是差不多的。

    首先准备一个FansVO:

    isFriend是表示我们之间是否是朋友关系,我们这里可以用来做一个互粉的标记。

     

    在custom.xml中编写我们的相关代码:

    随后到我们的接口中:

    接着写我们的service:

     然后实现这方法:

    1. @Override
    2. public PagedGridResult queryMyFans(String myId, Integer page, Integer pageSize) {
    3. Map map=new HashMap<>();
    4. map.put("myId",myId);
    5. List list = fansMapperCustom.queryMyFans(map);
    6. return setterPagedGrid(list,page);
    7. }

    最后就是在controller中快速实现:

    先在前端查看:

     这里和我的关注列表几乎是一样的。

    1. @GetMapping("queryMyFans")
    2. public GraceJSONResult queryMyFans(@RequestParam String myId,
    3. @RequestParam Integer page,
    4. @RequestParam Integer pageSize){
    5. return GraceJSONResult.ok(fansService.queryMyFans(myId,page,pageSize));
    6. }

    重新启动,测试一下:

    这里我的粉丝数为0,但实际点击进去,是有粉丝的 

    我们点击进去,还是有粉丝的。

    其实数据已经保存到数据库中了,只是这里还没有做到我们的redis中,所以没有显示。

     这里的回粉是另一个标记状态,我们会在后面实现。

    实现互粉标记显示

    在我们的vo中,默认isFriend是false,不管是不是朋友,所以的显示标记都是回粉

    所以我们要做一个查询,查这个isFriend是true还是false。

    我们在service中修改之前的代码,在里面进行对reids进行循环查询。

    注:
            /**
             * 判断粉丝是否是我的朋友(互粉,互关)
             *普通做法:
             * 多表关联+嵌套关联查询,这样会违反多表关联的规范,不可取,高并发会出现性能问题
             *
             * 常规做法:
             * 1.避免过多的表关联查询,先查询我的粉丝列表,获得fansList
             * 2.避免粉丝关注我,并且我也关注粉丝,--》循环fansList,获得每一个粉丝,再去数据库查询我是否关注他
             * 3.如果我也关注他(粉丝),说明我俩互为朋友,则标记flag为true
             *
             * 高端做法:
             * 1.关注/取关的时候,关联关系保存在redis中,不要依赖数据库
             * 2.数据库查询后,直接循环查询redis,避免第二次循环查询数据库的尴尬局面
             */

    1. @Override
    2. public PagedGridResult queryMyFans(String myId, Integer page, Integer pageSize) {
    3. /**
    4. * 判断粉丝是否是我的朋友(互粉,互关)
    5. *普通做法:
    6. * 多表关联+嵌套关联查询,这样会违反多表关联的规范,不可取,高并发会出现性能问题
    7. *
    8. * 常规做法:
    9. * 1.避免过多的表关联查询,先查询我的粉丝列表,获得fansList
    10. * 2.避免粉丝关注我,并且我也关注粉丝,--》循环fansList,获得每一个粉丝,再去数据库查询我是否关注他
    11. * 3.如果我也关注他(粉丝),说明我俩互为朋友,则标记flag为true
    12. *
    13. * 高端做法:
    14. * 1.关注/取关的时候,关联关系保存在redis中,不要依赖数据库
    15. * 2.数据库查询后,直接循环查询redis,避免第二次循环查询数据库的尴尬局面
    16. */
    17. Map map=new HashMap<>();
    18. map.put("myId",myId);
    19. List list = fansMapperCustom.queryMyFans(map);
    20. for(FansVO f: list){
    21. String relationship = redis.get(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+f.getFanId());
    22. if(StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")){
    23. f.setFriend(true);
    24. }
    25. }
    26. return setterPagedGrid(list,page);
    27. }

     重新启动一下,这里如果是好友就会显示互关。

     那么以上就完成了互粉标记的显示。

  • 相关阅读:
    数据结构-线性表
    致与青春同行的代码
    java.lang.Enum类下clone()方法起什么作用呢?
    2019中原银行java实习面试
    详解K8S入口Ingerss
    BI财务分析 – 反映盈利水平利润占比的指标如何分析(上)
    第九届信号与图像处理国际学术研讨会(CSIP 2022)
    【路径规划】如何给路径增加运动对象
    Linux环境变量详解
    Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?
  • 原文地址:https://blog.csdn.net/m0_64005381/article/details/127580707