点赞功能

咳咳,点赞功能哈,这是一个非常高频的操作,所以我们这里选择 redis 来存取数据哈

开发点赞业务

  • 因为我们之前用 Spring 整合 Redis 的时候,已经做了 命名的规定。
  • 我们利用 RedisTemplate 这个Bean 操作数据库。

点赞

    // 点赞
    public void like(int userId,int entityType,int entityId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType,entityId);
        Boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey, userId);
        if(isMember){
            redisTemplate.opsForSet().remove(entityLikeKey,userId);
        }else {
            redisTemplate.opsForSet().add(entityLikeKey,userId);
        }
    }
  • 我们通过 实体类类别 和 他的id 来记录他的具体位置,用 set 集合来封装他,再将userId存入进去,表示这个评论或者帖子被这个用户给点赞了。
  • 实体类类别 : 1 表示帖子 2 表示 评论

查询点赞的数量

    // 查询实体点赞的数量
    public long findEntityLikeCount(int entityType,int entityId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType,entityId);
        return redisTemplate.opsForSet().size(entityLikeKey);
    }
  • 这个简单哈,只要我们有他的类别和id,直接在数据库里面查这个集合的key的大小即可

查询该帖子的点赞状态

    // 查询某人对某实体的点赞状态
    public int findEntityLikeStatus(int userId,int entityType,int entityId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType,entityId);
        // 点过赞我们返回 1 没有点赞我们返回 0
        return redisTemplate.opsForSet().isMember(entityLikeKey,userId) ? 1 : 0;
    }
  • 通过 type 和id 我们可以得到 集合中的 key, 然后我们就可以查询这个集合里面是否存在这个userId,如果存在,就表示这个人对这个帖子或者评论进行了点赞,否则就是没有。

视图层开发

  • 做完业务层之后,我们就可以开发视图层了,
  • 首先哈,我们点击点赞,就是反馈给页面,而不是全部刷新,所以我们采用异步请求的方式。
  • 通过 hostHolder 进行获取当前的用户,再通过异步传入 实体类类别 和实体类Id ,就可以通过业务层进行实现 点赞的操作
    @RequestMapping(value = "/like",method = RequestMethod.POST)
    @ResponseBody
    public String like(int entityType,int entityId){
        User user = hostHolder.getUser();
        // 实现点赞
        likeService.like(user.getId(),entityType,entityId);
        // 获取点赞的数量
        long likeCount = likeService.findEntityLikeCount(entityType,entityId);
        // 获取点赞的状态
        int likeStatus = likeService.findEntityLikeStatus(user.getId(),entityType,entityId);
        // 返回的结果
        Map<String ,Object> map = new HashMap<>();
        map.put("likeCount",likeCount);
        map.put("likeStatus",likeStatus);
        return CommunityUtil.getJSONString(0,null,map);
    }
  • 然后依次按照原来的请求将 点赞状态 和 点赞数量添加model即可。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐