基于Redis实现点赞功能(set集合)

代码如下(简单明了,直接复制粘贴使用):

package com.pipilin.api.controller;

import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pipilin.common.core.controller.BaseController;
import com.pipilin.common.core.domain.AjaxResult;
import com.pipilin.vim.domain.Article;
import com.pipilin.vim.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/system/like")
public class PArticleController extends BaseController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private ArticleService articleService;


    /**
     * @author: 289151517520@qq.com
     * @params: page 分页对象 articleId 文章ID
     * @date: 2022/7/9 21:41
     */
    @GetMapping("/queryArticleList")
    public AjaxResult queryArticleList(Page page, Long articleId){
        Page page1 = articleService.page(page, new LambdaQueryWrapper<Article>().orderByDesc(Article::getLiked));
        List<Article> records = page1.getRecords();
        records.forEach(article -> {
            articleService.queryArticleUser(article);
            isArticleLiked(article);
        });
        return AjaxResult.success(records);
    }



    /**
     * @author: @author: 289151517520@qq.com
     * @params: articleId 文章ID
     * @date: 2022/7/9 21:41
     */
    @GetMapping("/queryArticleById")
    public AjaxResult queryArticleById(Long articleId){

        // 1.查询article
        Article article = articleService.getById(articleId);
        if(ObjectUtil.isNull(article)){
            return AjaxResult.error("文章不存在!");
        }
        // 2. 查询article有关的用户
        List<Article> articles = articleService.queryArticleUser(article);
        // 3. 查询article是否被点赞
        isArticleLiked(article);
        return AjaxResult.success(article);
    }

    /**
     * @author: 289151517520@qq.com
     * @params: articleId 文章ID
     * @date: 2022/7/9 21:42
     */
    private void isArticleLiked(Article article){
        // 1.获取登录用户信息
        Long userId = getUserId();
        // 2.判断当前登录用户是否已经点赞
        String key = "article:liked:" + article.getId();
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        article.setLiked(BooleanUtil.isTrue(isMember));
    }



    /**
     * @title: 点赞、取消点赞
     * @author: 289151517520@qq.com
     * @params: articleId 文章ID
     * @date: 2022/7/9 21:09
     */
    @PostMapping
    public AjaxResult likedArticle(Long articleId)
    {
        // 1.获取登录用户信息
        Long userId = getUserId();
        // 2.判断当前登录用户是否已经点赞
        String key = "article:liked:" + articleId;
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        if(BooleanUtil.isFalse(isMember)){
            // 3.如果未点赞,可以点赞
            // 3.1 数据库点赞数 + 1
            boolean isSuccess = articleService.update().setSql("liked = liked + 1").eq("id", articleId).update();
            // 3.2 保存用户到Redis的set集合
            if(isSuccess){
                stringRedisTemplate.opsForSet().add(key,userId.toString());
            }
        }else {
            // 4. 如果已经点赞,取消点赞
            // 4.1 数据库点赞数 - 1
            boolean isSuccess = articleService.update().setSql("liked = liked - 1").eq("id", articleId).update();
            // 4.2 把用户从Redis的set集合移除
            if(isSuccess){
                stringRedisTemplate.opsForSet().remove(key,userId.toString());
            }

        }

        return AjaxResult.success();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值