代码如下(简单明了,直接复制粘贴使用):
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();
}
}