项目持续创作中:
仿抖音短视频APP专栏
目录
实现用户点赞视频
用户取消点赞
用户是否点赞视频的判断
用户在点赞我们的视频后,我们需要去实现一些相关的业务,
这里需要对应到数据库的一张表,就是my_liked_vlog,这个就是我所点赞过的视频列表。
点赞过后,这个视频的点赞数会累加一,会用到我们的redis技术。
首先在我们的service中:
实现:
@Transactional
@Override
public void userLikeVlog(String userId, String vlogId) {
String rid = sid.nextShort();
MyLikedVlog likedVlog = new MyLikedVlog();
likedVlog.setId(rid);
likedVlog.setVlogId(vlogId);
likedVlog.setUserId(userId);
myLikedVlogMapper.insert(likedVlog);
}
注意在我们的前面加一个注入MyLikeVlogMapper
在编写controller之前先查看一下前端:
我们在后端:
@PostMapping("like")
public GraceJSONResult myPrivateList(@RequestParam String userId,
@RequestParam String vlogerId,
@RequestParam String vlogId) {
//我点赞的视频,关联保存到数据库
vlogService.userLikeVlog(userId,vlogId);
//点赞后,视频和视频发布者的或者都会+1;
redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS+":"+vlogerId,1);
redis.increment(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId,1);
//我点赞的视频,需要在redis中保存关联关系
redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId,"1");
return GraceJSONResult.ok();
}
这里的redis操作可以放到我们的service里面执行会更好。
也最好下来在这里做一个校验判断两个id是否存在,在我们的上一篇文章中有写到。
启动,测试:
点击之后,这里红色的心亮起了
我们打开数据库来看一下:
这里是成功的插入了
打开redis查看:
这里是一模一样的,说明是成功的
用户点赞操作就是实现了。
咱们的前端这里发起的请求叫unlike
我们后端去写一下,携带的参数和上面是相同的,操作和喜欢是相反的。
@PostMapping("unlike")
public GraceJSONResult unlike(@RequestParam String userId,
@RequestParam String vlogerId,
@RequestParam String vlogId) {
//我取消点赞的视频,关联关系删除
vlogService.userUnLikeVlog(userId,vlogId);
//点赞后,视频和视频发布者的或者都会+1;
redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS+":"+vlogerId,1);
redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId,1);
redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId);
return GraceJSONResult.ok();
}
这里还是建议大家redis写在service中处理。
接着service:
实现:
这里会根据vlogeId和userId去匹配符合的数据进行删除。
@Transactional
@Override
public void userUnLikeVlog(String userId, String vlogId) {
MyLikedVlog likedVlog = new MyLikedVlog();
likedVlog.setVlogId(vlogId);
likedVlog.setUserId(userId);
myLikedVlogMapper.delete(likedVlog);
}
重启,测试:
这里我们取消点赞。
打开数据库:
这里是还没有刷新的原来的数据
再到redis中查看:
刷新一下:
累减变为0
在页面中我们看下效果,先对视频进行一个点赞
获赞数变为1
取消点赞,获赞数变为0:
我们在这里会发现一些小问题,在之前的开发中:
这里其实是有点问题的
用户的获赞总数应该是视频博主(点赞/喜欢)总和
第一条记录是永远不存在的
这样就能修复这样一段代码。
我们这里其实是存在一点问题的,因为当我们下拉刷新式,虽然我们的数据被存入了数据库中吗,但是在前端其实并没有做处理,它刷新之后这个心还是没有亮
对于的我们的后端,其实在进入这个界面时,应该判断曾经有没有点赞过这条视频,如果点赞了,再次看到这个视频时,应该是亮着的。
我们要在这里对方法进行一个扩展:
当我们拿到list之后,要进行一个循环判断,判断用户是否点赞过视频。
首先:
我们要在这里添加一个参数userId,其实在我们的前端也是可以看见的。
这里我们要在接口方法处都要去添加一个传入的参数。
在service实现中我们要将返回的list进行循环遍历,
for(IndexVlogVO v : list)调用方法在reids中查询我是否点赞过这条视频。
@Override
public PagedGridResult getIndexVlogList(String userId,
String search,
Integer page,
Integer pageSize){
PageHelper.startPage(page,pageSize);
Map map = new HashMap<>();
if(StringUtils.isNotBlank(search)){
map.put("search",search);
}
List list= vlogMapperCustom.getIndexVlogList(map);
// return list;
for(IndexVlogVO v : list){
String vlogerId = v.getVlogerId();
String vlogId = v.getVlogId();
if(StringUtils.isNotBlank(userId)){
v.setDoILikeThisVlog(doILikeVlog(userId,vlogId));
}
}
return setterPagedGrid(list,page);
}
private boolean doILikeVlog(String myId,String vlogId){
String doILike = redis.get(REDIS_USER_LIKE_VLOG+":"+myId+":"+vlogId);
boolean isLike = false;
if(StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")){
isLike = true;
}
return isLike;
}
重启,测试:
我们进行一个下拉刷新
这里就完成了我们的一个判断用户是否点赞过该视频。