Redis6、发布笔记、点赞、排行榜,Feed流-滚动排序分页

本文介绍了使用Redis6实现发布探店笔记、点赞功能及点赞排行榜,详细阐述了点赞高亮显示的实现过程。同时讨论了Feed流的分页问题,特别是滚动分页的实现,包括在不同数据结构如List和SortedSet中选择的考量,以及如何处理数据变动导致的分页问题。最后,讲解了关注推送功能的推模式,分析了其优缺点,并给出了基于推模式的分页查询方案。
摘要由CSDN通过智能技术生成

1、发布探店笔记

发布代码已写好,图片接口路径 

目前项目是发布到本地的,修改上传文件地址,发布保存的是图片的地址了,上传图片的接口,好多地方再用,下面是发布成功的页面,会跳转到个人主页

返回首页也可以看到,因为没人点赞,所以它是排到最后的

实现查询探店笔记详情

点击图片查看详情,返回的应该包含笔记信息+用户信息,如果对某个用户感兴趣,可以去关注该用户 

那如何在Blog类 返回用户信息呢?要么将用户对象封装,要么手动维护单个字段,

在Blog类里新添加两个字段,添加@TableField注解,表示该字段不属于t_blog表

   /**
     * 用户图标
     */
    @TableField(exist = false)
    private String icon;
    /**
     * 用户姓名
     */
    @TableField(exist = false)
    private String name;

 BlogController类新添加接口,

  • 因为是可变参数,利用@PahtVariable来接收
  • 对象用:@RequestBody
    • 如:
          @PostMapping
          public Result saveBlog(@RequestBody Blog blog) {
              return blogService.saveBlog(blog);
          }
  • 普通参数用:@RequestParam
    • 如:
          @GetMapping("/of/user")
          public Result queryBlogByUserId(
                  @RequestParam(value = "current", defaultValue = "1") Integer current,
                  @RequestParam("id") Long id) {
            

理论上将controller里不应该有业务,都是封装的才好 

    // 查询多条 热点探店
    @GetMapping("/hot")
    public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        return blogService.queryHotBlog(current);
    }

    // 查询一条探店
    @GetMapping("/{id}")
    public Result queryBlogById(@PathVariable("id") Long id) {
        return blogService.queryBlogById(id);
    }

实现类 BlogServiceImpl 创建

点击Ctrl+Alt+M快捷键后,在出现的界面中输入方法的名字,然后点击Refactor按钮。

点击Refactor按钮后,就会将一段代码提取成方法。

mac:option+command+m

// 查多个
    @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();
        // 查询用户, 如下代码的意思就是遍历每一个list,然后维护用户的两个字段的值
        /*records.forEach(blog -> {
            queryBlogUser(blog);
        });*/
        // 上边注释代码就可以改成
        records.forEach(this::queryBlogUser);
        return Result.ok(records);
    }

    // 查一个
    @Override
    public Result queryBlogById(Long id) {
        // 1.查询blog
        Blog blog = getById(id);
        if (blog == null) {
            return Result.fail("笔记不存在!");
        }
        this.queryBlogUser(blog);
        return Result.ok(blog);
    }




ctrl + alt + m 快捷封装一段代码为方法
private void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }

以上代码即可实现点击笔记查看详情功能

 二、点赞功能 

实现一人一赞,此外,在查询界面的时候或者一进来就该实现获取是否点赞,并高亮显示

 修改代码,Blog类新添加字段isLike

    /**
     * 是否点赞过了
     */
    @TableField(exist = false)
    private Boolean isLike;

修改BlogController代码

/**
     * 点赞功能
     * @param id
     * @return
     */
    @PutMapping("/like/{id}")
    public Result likeBlog(@PathVariable("id") Long id) {
        // 修改点赞数量,不能直接操作数据库修改,必须实现一人一赞要有校验功能
        return blogService.likeBlog(id);
    }

修改实现类,点赞或取消点赞后 修改库表并更新redis

@Override
    public Result likeBlog(Long id) {
        // 1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        // 2.判断当前登录用户是否已经点赞
        String key = BLOG_LIKED_KEY + id;
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId);
        if (BooleanUtil.isFalse(isMember)) {
            // 3.如果未点赞,可以点赞
            // 3.1.数据库点赞数 + 1
            boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
            // 3.2.保存用户到Redis的set集合  zadd key value score
            if (isSuccess) {
                stringRedisTemplate.opsForSet().add(key, userId.toString());
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值