点赞功能介绍:
点赞功能在我们日常的软件使用中用的非常多,我们每个人只能为某个评论点赞一次,再点击时就会取消点赞,点赞数也就会随之减一。
设计思路:
-
一: 判断该登录用户是否点过赞
- 我们需要在判断的对象中加入相应的属性(isLiked) Boolean类型 如果为true就表示已经点赞,如果为false就表示没有点赞
- 在Redis中进行Key-Value的查询,查到了就把isLiked置为true,没有查到就置为false。让前端更方便的去展示给用户。
//先获取用户的id
UserDTO user = UserHolder.getUser();
Long userId = user.getId();
//获取Blog的id
Long id = blog.getId();
//判断用户是否点过赞
String key = "Blog:liked:"+id;
Boolean Liked = stringRedisTemplate.opsForSet().isMember(key, userId);
//此时表示已经点过赞
blog.setIsLiked(BooleanUtil.isTrue(Liked));
-
二:根据点赞的情况判断点赞是+1 or -1
-
(1)没点过赞就能够让该用户点赞,并且点赞数加一,并且将点赞的用户信息存储到Redis中,用来对后续是否点赞的判断。
Redis的数据类型选择的是set 它的特点就是元素不可重复,如果要考虑点赞的先后顺序的话我们可以选择用zset
注释:
存储Redis的Key为"Blog:liked:" + 所对应评论的id
value为点赞用户的userId
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result liked(Long id) {
//先获取用户的id
UserDTO user = UserHolder.getUser();
Long userId = user.getId();
//判断用户是否点过赞
String key = "Blog:liked:"+id;
Boolean isLiked = stringRedisTemplate.opsForSet().isMember(key, userId);
if(BooleanUtil.isFalse(isLiked)){
//如果未点赞可以点赞
boolean isSuccess = update().setSql("liked = liked +1").eq("id", id).update();
if(isSuccess){
//成功,将用户加入redis
stringRedisTemplate.opsForSet().add(key,userId.toString());
}
: (2)点过赞如果还要点赞,就让点赞数减一,并且将Redis中对应的用户信息进行清除。
else{
//已点赞就取消之前的点赞
boolean isSuccess = update().setSql("liked = liked -1").eq("id", id).update();
if (isSuccess) {
stringRedisTemplate.opsForSet().remove(key,userId.toString());
}
}
return Result.ok();
}