项目持续创作中:
目录
用户在点赞我们的视频后,我们需要去实现一些相关的业务,
这里需要对应到数据库的一张表,就是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;
- }
重启,测试:
我们进行一个下拉刷新
这里就完成了我们的一个判断用户是否点赞过该视频。