功能实现,
1.用户只能点赞一次,第二次是取消
2.两个接口,一个点赞接口,一个点赞回显的接口
1.点赞接口
前端实现
<el-button icon="el-icon-star-on" @click="like()" :style={color:color}
><div>{{ article.liked }}</div></el-button
>
第一个color是css的color 第二个color是在date里定义的变量,article.liked是点赞数,vuerouter传过来的
color是颜色,islike是判断该用户是否点赞,后端传过来的,this.artcle.liked是点赞数
async like(){
switch (this.color){
case "red":
this.color=""
this.article.liked--
break;
case "":
this.color="red"
this.article.liked++
break;
}
await like(this.id,this.token,this.article.liked);
}
like函数,swich判断点赞颜色来修改点赞数和颜色(用户是否点赞),await是一个点赞请求
export function like(id, token, liked) {
return axios.post("http://localhost:8088/" + id + "/like",
querystring.stringify({
id: id,
liked: liked
}),
{ headers: { 'authorization': token } },
).then((res) => {
// console.log(res.data.data)
return res.data.data
})
}
liked接口后端代码
@PostMapping("/{id}/like")
public Result likeblog(@PathVariable(value = "id") int id, HttpServletRequest request, int liked){
String token = request.getHeader("Authorization");
Map<String, Object> map = jwtutil.parsetoken(token);
String username = map.get("username").toString();
System.out.println("dsa"+username);
//1.获取用户
// dfdsf dfdsf=usermapper.select(username);
//2.判断用户是否点赞
Boolean member = stringRedisTemplate.opsForSet().isMember(String.valueOf(id),username);
System.out.println(member);
if(member==false){
usermapper.updatabylike(liked,id);
stringRedisTemplate.opsForSet().add(String.valueOf(id),username);
}
else{
usermapper.updatabylike(liked,id);
stringRedisTemplate.opsForSet().remove(String.valueOf(id),username);
}
//如果未点赞 点赞+1
//数据库+1
//如果点赞 点赞-1
//数据库-1
return Result.success();
这里说一下,前端传过来的liked是已经点过赞的liked数据了,存入数据库就直接usermapper.updatabylike(liked,id)就行了
说一下,id是这篇文章的id,唯一标识,如果没点赞(member==false)就将这个用户存入redis的set集合中,点赞了取消就移除这个set集合
2.回显接口
后端代码(这里先看后端更好理解一点)
@GetMapping("/{id}/back")
public Result back(@PathVariable(value = "id") int id,HttpServletRequest request){
String token = request.getHeader("Authorization");
Map<String, Object> map = jwtutil.parsetoken(token);
String username = map.get("username").toString();
Boolean member =stringRedisTemplate.opsForSet().isMember(String.valueOf(id),username);
if(member==true){
return Result.success(true);
}
else{
return Result.success(false);
}
}
大概意思就是拿到这个文章的id,到redis去查这set集合的这个用户是否存在,存在返回true,不存在返回false这样
前端:这个是created的代码
this.islike=await back(this.id, this.token);
switch (this.islike) {
case true:
this.color="red"
break;
case false:
this.color=""
break;
}
this.islike就是后端返回的true or false,如果是true, this.color就是red,如果没有就是无色
redis,就是这样,4就是文章的id,value就是点赞这个文章的用户。
至于拿到点赞数就是另一个接口获取文章值了,这里有article.liked,这里就不赘述了