黑马点评--达人探店
创始人
2024-02-18 06:33:59
0

查看探店笔记:

private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());
}@Override
public Result queryBlogById(Long id) {//1.查询blogBlog blog =getById(id);if (blog == null) {return Result.fail("笔记不存在!");}//2.查询blog有关的用户queryBlogUser(blog);return Result.ok(blog);
}
//设置blog的属性private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}

点赞功能:

需求:

  • 同一个用户只能点赞一次,再次点击则取消点赞
  • 如果当前用户已经点赞,则点赞按钮高亮显示(前端已实现,判断字段Blog类的isLike属性)

实现步骤:

  1. 给Blog类中添加一个isLike字段,标示是否被当前用户点赞

        /*** 是否点赞过了*/@TableField(exist = false)private Boolean isLike;
    
  2. 修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1

      @Overridepublic Result likeBlog(Long id) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + id, userId.toString());//3.如果未点赞,可以点赞if (BooleanUtil.isFalse(isMember)){//3.1.数据库点赞数 + 1update().setSql("liked = liked + 1").eq("id", id).update();//3.2.保存用户到Redis的set集合stringRedisTemplate.opsForSet().add(BLOG_LIKED_KEY + id,userId.toString());return Result.ok();}//4.如果已点赞,取消点赞//4.1数据库点赞数 -1update().setSql("liked = liked - 1").eq("id", id).update();//4.2把用户从Redis的Set集合移除stringRedisTemplate.opsForSet().remove(BLOG_LIKED_KEY + id,userId.toString());return Result.ok();}
    
  3. 修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值isLike字段

        @Overridepublic Result queryBlogById(Long id) {//1.查询blogBlog blog =getById(id);if (blog == null) {return Result.fail("笔记不存在!");}//2.查询blog有关的用户queryBlogUser(blog);//3.查询blog是否被点赞isBlogLiked(blog);return Result.ok(blog);}
    
  4. 修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段

    @Overridepublic Result queryHotBlog(Integer current) {// 根据用户查询Page page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List records = page.getRecords();// 查询用户records.forEach(blog -> {//查询一页中blog所属用户queryBlogUser(blog);//查是否被当前用户点赞isBlogLiked(blog);});return Result.ok(records);}

判断该blog用户是否点赞

    private void isBlogLiked(Blog blog) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + blog.getId(), userId.toString());blog.setIsLike(BooleanUtil.isTrue(isMember));}

点赞排行榜

需求1:把笔记点赞的人显示出来,比如最早点赞的TOP5,形成点赞排行榜

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MWUkCUCx-1669443439238)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221125172226084.png)]

不同集合比较:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4RKjI6R-1669443439240)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221125172453751.png)]

由于set集合不具有排序效果,所以采用SortedSet进行替换:

判断当前用户是否点赞过该笔记

    private void isBlogLiked(Blog blog) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞
//        Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + blog.getId(), userId.toString());Double score = stringRedisTemplate.opsForZSet().score(BLOG_LIKED_KEY + blog.getId(), userId.toString());blog.setIsLike(score != null);}

将该笔记点赞总数信息写入数据库与redis,score值为当前时间戳

判断是否点赞,如果未点赞则可以点赞数据库点赞量+1,并且在redis增加点赞信息。如果已点赞,则取消点赞,并且在redis移除点赞信息。

 @Overridepublic Result likeBlog(Long id) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞
//        Boolean isMember = stringRedisTemplate.opsForSet().isMember(BLOG_LIKED_KEY + id, userId.toString());Double score = stringRedisTemplate.opsForZSet().score(BLOG_LIKED_KEY + id, userId.toString());//3.如果未点赞,可以点赞
//        if (BooleanUtil.isFalse(isMember)){if (score == null) {//3.1.数据库点赞数 + 1update().setSql("liked = liked + 1").eq("id", id).update();//3.2.保存用户到Redis的set集合
//            stringRedisTemplate.opsForSet().add(BLOG_LIKED_KEY + id,userId.toString());stringRedisTemplate.opsForZSet().add(BLOG_LIKED_KEY + id, userId.toString(), System.currentTimeMillis());return Result.ok();}
//        }//4.如果已点赞,取消点赞//4.1数据库点赞数 -1update().setSql("liked = liked - 1").eq("id", id).update();//4.2把用户从Redis的Set集合移除
//        stringRedisTemplate.opsForSet().remove(BLOG_LIKED_KEY + id,userId.toString());stringRedisTemplate.opsForZSet().remove(BLOG_LIKED_KEY + id,userId.toString());return Result.ok();}

显示点赞最早的前5用户:

 @Overridepublic Result queryBlogLikes(Long id) {//1.查询top5的点赞用户zrange key 0  4Set top5 = stringRedisTemplate.opsForZSet().range(BLOG_LIKED_KEY + id, 0, 4);if (top5==null || top5.isEmpty()){return Result.ok(Collections.emptyList());}//2.解析出其中的用户idList userIdList = top5.stream().map(Long::valueOf).collect(Collectors.toList());//3.根据用户id查询用户
//        List userDTOList = userService.listByIds(userIdList)
//        由于where id in (5,1) order by FIELD(id,5,1)String ids = StrUtil.join(",", userIdList);List userDTOList = userService.query().in("id",userIdList).last("order by FIELD(id,"+ids+")").list().stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());//4.返回return Result.ok(userDTOList);}

相关内容

热门资讯

苹果App Store垄断案再... IT之家 10 月 28 日消息,去年,美国地区法官伊冯娜・冈萨雷斯・罗杰斯(Yvonne Gonz...
委内瑞拉:摧毁美中情局资助犯罪... 委内瑞拉外交部长伊万·希尔当地时间10月27日表示,委内瑞拉已摧毁一伙由美国中央情报局(CIA)资助...
已完成农发新型政策性金融工具1... 新华社北京10月27日电(记者 刘羽佳)记者27日从中国农业发展银行获悉,在国家发展改革委、财政部、...
用好无还本续贷政策 当“过桥贷款”的高息压力成为不少企业资金周转的“拦路虎”,无还本续贷政策的优化升级为实体经济送去“及...
宣恩“制度+技术”赋能用工监管... 宣恩“制度+技术”赋能用工监管改革试点 今年7月,宣恩县获批省级“非工程建设领域劳动用工监管规范化...
中国银河证券首席经济学家章俊:... 党的二十届四中全会提出,扩大高水平对外开放。中国银河证券首席经济学家章俊表示,在当前全球格局深刻调整...
将出台9条政策措施 加大力度推... 证券时报记者 贺觉渊 10月27日,中国人民银行副行长、国家外汇管理局局长朱鹤新在2025金融街论坛...
农发行已完成农发新型政策性金融... 本报北京10月27日电 (记者李晓晴)记者从中国农业发展银行获悉:在国家发展改革委、财政部、中国人民...
最高法院:申请执行人能否起诉被... 最高法院:申请执行人能否起诉被执行人履行原生效法律文书? 该请求实质是要求法院恢复执行原生效法律文书...
政经谭 | 证监会主席吴清:将... 证监会主席吴清:将择机推出再融资储架发行制度 10月27日,中国证监会主席吴清在2025金融街论坛年...