• 黑马点评--达人探店


    查看探店笔记:

    private void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }
    
    @Override
    public Result queryBlogById(Long id) {
        //1.查询blog
        Blog blog =getById(id);
        if (blog == null) {
            return Result.fail("笔记不存在!");
        }
        //2.查询blog有关的用户
        queryBlogUser(blog);
        return Result.ok(blog);
    }
    //设置blog的属性
        private void queryBlogUser(Blog blog) {
            Long userId = blog.getUserId();
            User user = userService.getById(userId);
            blog.setName(user.getNickName());
            blog.setIcon(user.getIcon());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    点赞功能:

    需求:

    • 同一个用户只能点赞一次,再次点击则取消点赞
    • 如果当前用户已经点赞,则点赞按钮高亮显示(前端已实现,判断字段Blog类的isLike属性)

    实现步骤:

    1. 给Blog类中添加一个isLike字段,标示是否被当前用户点赞

          /**
           * 是否点赞过了
           */
          @TableField(exist = false)
          private Boolean isLike;
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. 修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1

        @Override
          public Result likeBlog(Long id) {
              //1.获取登录用户
              Long userId = UserHolder.getUser().getId();
              //2.判断当前登录用户是否已经点赞
              Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + id, userId.toString());
              //3.如果未点赞,可以点赞
              if (BooleanUtil.isFalse(isMember)){
                  //3.1.数据库点赞数 + 1
                   update().setSql("liked = liked + 1").eq("id", id).update();
                  //3.2.保存用户到Redis的set集合
                  stringRedisTemplate.opsForSet().add(BLOG_LIKED_KEY + id,userId.toString());
                  return Result.ok();
              }
              //4.如果已点赞,取消点赞
              //4.1数据库点赞数 -1
              update().setSql("liked = liked - 1").eq("id", id).update();
              //4.2把用户从Redis的Set集合移除
              stringRedisTemplate.opsForSet().remove(BLOG_LIKED_KEY + id,userId.toString());
              return Result.ok();
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    3. 修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值isLike字段

          @Override
          public Result queryBlogById(Long id) {
              //1.查询blog
              Blog blog =getById(id);
              if (blog == null) {
                  return Result.fail("笔记不存在!");
              }
              //2.查询blog有关的用户
              queryBlogUser(blog);
              //3.查询blog是否被点赞
              isBlogLiked(blog);
              return Result.ok(blog);
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    4. 修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段

        @Override
        public Result queryHotBlog(Integer current) {
            // 根据用户查询
            Page<Blog> page = query()
                    .orderByDesc("liked")
                    .page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
            // 获取当前页数据
            List<Blog> records = page.getRecords();
            // 查询用户
            records.forEach(blog -> {
                //查询一页中blog所属用户
                queryBlogUser(blog);
                //查是否被当前用户点赞
                isBlogLiked(blog);
            });
            return Result.ok(records);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    判断该blog用户是否点赞

        private void isBlogLiked(Blog blog) {
            //1.获取登录用户
            Long userId = UserHolder.getUser().getId();
            //2.判断当前登录用户是否已经点赞
            Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + blog.getId(), userId.toString());
            blog.setIsLike(BooleanUtil.isTrue(isMember));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    点赞排行榜

    需求1:把笔记点赞的人显示出来,比如最早点赞的TOP5,形成点赞排行榜

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MWUkCUCx-1669443439238)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221125172226084.png)]

    不同集合比较:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4RKjI6R-1669443439240)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221125172453751.png)]

    由于set集合不具有排序效果,所以采用SortedSet进行替换:

    判断当前用户是否点赞过该笔记

        private void isBlogLiked(Blog blog) {
            //1.获取登录用户
            Long userId = UserHolder.getUser().getId();
            //2.判断当前登录用户是否已经点赞
    //        Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + blog.getId(), userId.toString());
            Double score = stringRedisTemplate.opsForZSet().score(BLOG_LIKED_KEY + blog.getId(), userId.toString());
            blog.setIsLike(score != null);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将该笔记点赞总数信息写入数据库与redis,score值为当前时间戳

    判断是否点赞,如果未点赞则可以点赞数据库点赞量+1,并且在redis增加点赞信息。如果已点赞,则取消点赞,并且在redis移除点赞信息。

     @Override
        public Result likeBlog(Long id) {
            //1.获取登录用户
            Long userId = UserHolder.getUser().getId();
            //2.判断当前登录用户是否已经点赞
    //        Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + id, userId.toString());
            Double score = stringRedisTemplate.opsForZSet().score(BLOG_LIKED_KEY + id, userId.toString());
            //3.如果未点赞,可以点赞
    //        if (BooleanUtil.isFalse(isMember)){
            if (score == null) {
                //3.1.数据库点赞数 + 1
                update().setSql("liked = liked + 1").eq("id", id).update();
                //3.2.保存用户到Redis的set集合
    //            stringRedisTemplate.opsForSet().add(BLOG_LIKED_KEY + id,userId.toString());
                stringRedisTemplate.opsForZSet().add(BLOG_LIKED_KEY + id, userId.toString(), System.currentTimeMillis());
                return Result.ok();
            }
    //        }
            //4.如果已点赞,取消点赞
            //4.1数据库点赞数 -1
            update().setSql("liked = liked - 1").eq("id", id).update();
            //4.2把用户从Redis的Set集合移除
    //        stringRedisTemplate.opsForSet().remove(BLOG_LIKED_KEY + id,userId.toString());
            stringRedisTemplate.opsForZSet().remove(BLOG_LIKED_KEY + id,userId.toString());
            return Result.ok();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    显示点赞最早的前5用户:

     @Override
        public Result queryBlogLikes(Long id) {
            //1.查询top5的点赞用户zrange key 0  4
            Set<String> top5 = stringRedisTemplate.opsForZSet().range(BLOG_LIKED_KEY + id, 0, 4);
            if (top5==null || top5.isEmpty()){
                return Result.ok(Collections.emptyList());
            }
            //2.解析出其中的用户id
            List<Long> userIdList = top5.stream().map(Long::valueOf).collect(Collectors.toList());
            //3.根据用户id查询用户
    //        List userDTOList = userService.listByIds(userIdList)
    //        由于where id in (5,1) order by FIELD(id,5,1)
            String ids = StrUtil.join(",", userIdList);
            List<UserDTO> userDTOList = userService.query()
                    .in("id",userIdList).last("order by FIELD(id,"+ids+")").list()
                    .stream()
                    .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                    .collect(Collectors.toList());
            //4.返回
            return Result.ok(userDTOList);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    什么是数据库索引?它的类型有哪些
    LeetCode刷题---简单组(二)
    com.lowagie:itext:jar:2.1.7.js9 was not found
    PMP扫盲篇2 | PMP报名、缴费、考试那些事儿~~
    CANoe(持续更新修改...)
    基于C51的中断系统控制
    Linux下中间件tomcat安装配置(阿帕奇猫)
    从零开始,开发一个 Web Office 套件(15):拖动边框,平移编辑器
    Leetcode594:最长和谐子序列
    【设计模式】【第四章】【订单状态流转】【状态模式 + 享元模式+模板方法模式】
  • 原文地址:https://blog.csdn.net/weixin_53050118/article/details/128051531