我们最开始设想的点赞功能如下:
public Result updateBlogLikes(@PathVariable("id") Long id) {
//修改点赞数量
blogService.update().setSql("liked = liked +1 ").eq("id",id).update();
return Result.ok();
}
但是该代码会导致一个用户可以无限地为一篇笔记点赞,显然不符合实际的业务需求。
所以,需求如下:
- 同一个用户只能点赞一次,再次点击则取消点赞
- 如果当前用户已点赞,那么点赞按钮需要高亮显示
实现步骤:
- 给Blog类中添加一个isLike字段,标示是否被当前用户点赞
- 修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1
- 采用set集合可以对点赞用户进行去重,已点赞的用户存在于某笔记对应的set集合中,则不能再次点赞
public Result updatelikeBlog(Long id) {
// 1.获取登录用户
Long userId = UserHolder.getUser().getId();
// 2.判断当前登录用户是否点赞
String key = BLOG_LIKED_KEY + id;
Boolean isMember = template.opsForSet().isMember(key, userId.toString());
if (BooleanUtil.isFalse(isMember)) {
// 3.如果未点赞
// 3.1 数据库点赞数+1
boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
// 3.2 保存用户到Redis的set集合中
if (isSuccess) {
template.opsForSet().add(key, userId.toString());
}
} else {
// 4.如果已点赞
// 4.1 数据库点赞数-1
boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
// 4.2 把用户从Redis的set集合中移除
if (isSuccess) {
template.opsForSet().remove(key, userId.toString());
}
}
return Result.ok();
}