查看探店笔记:

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<Blog> page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List<Blog> 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,形成点赞排行榜

不同集合比较:

由于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<String> top5 = stringRedisTemplate.opsForZSet().range(BLOG_LIKED_KEY + id, 0, 4);if (top5==null || top5.isEmpty()){return Result.ok(Collections.emptyList());}//2.解析出其中的用户idList<Long> userIdList = top5.stream().map(Long::valueOf).collect(Collectors.toList());//3.根据用户id查询用户
//        List<UserDTO> userDTOList = userService.listByIds(userIdList)
//        由于where id in (5,1) order by FIELD(id,5,1)String ids = StrUtil.join(",", userIdList);List<UserDTO> 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);}

黑马点评--达人探店相关推荐

  1. 达人探店小程序全套源码

    简介: 达人探店小程序全套源码,UI做的很简陋,分享给初学者学习一下小程序. 前台采用了微信小程序(WXML+WXSS+Javascript) 后台是IDEA开发JAVA用了spring-boot,数 ...

  2. 抖音达人探店有用吗?算不算过时呢

    其实我看到这个问题的时候也曾怀疑探店的方式真的对当下年轻人有作用吗?会不会有人怀疑探店达人和商家是串通好的?毕竟在有利益链的情况下,我们还能否相信仅仅靠一个视频就能知晓事物的孰好孰坏?今天就来为大家分 ...

  3. 探店达人专业版盈利模式达人探店盈利模式优势利润在哪里?

    一.探店项目背景 本地生活带货已经达到瓶颈,大量的机构开始转型做代运营版块,但是这并不能根本性 的解决门店营销问题,达不到预期效果,投入成本高,行业乱象的问题频发. 商业的本质是解决需求创造收益,首先 ...

  4. 首例达人探店不标识广告被罚1万元

    我是卢松松,点点上面的头像,欢迎关注我哦! 做商业活动(包含软文)一定更要加"广告"二字,广告里面一定不能有"最"类的极限词.大家一定要记住了! 这不6月5日, ...

  5. 黑马点评项目-达人探店

    一.发布探店笔记 1.1 需求分析 探店笔记类似点评网站的评价,往往是图文结合.对应的表有两个: tb_blog:探店笔记表,包含笔记中标题.文字.图片等 tb_blog_comments:其他用户对 ...

  6. Redis实战——达人探店

    目录 1.发布笔记 1.1 上传图片 1.2. 发表博文功能: 2. 查看探店笔记 3. 点赞功能的实现 4. 点赞排行榜的实现 1.发布笔记 笔记类似点评网站的评价,往往是图文结合. 对应的表有两个 ...

  7. Redis:达人探店

    一.点赞功能的实现 private void queryIsLike(Blog blog){Long userId = UserHolder.getUser().getId();// keyStrin ...

  8. 黑马点评项目-短信登录功能

    一.导入黑马点评项目 1.代码下载 视频资源链接:P25 实战篇-02.短信登录-导入黑马点评项目 代码可以直接去黑马微信公众号上搜索,或者从下面的网盘链接中下载:链接: https://pan.ba ...

  9. 黑马点评项目笔记(四)社交、附近人、数据统计功能实现

    目录 达人探店 查看博文 点赞博文 点赞排行榜 好友关注 关注和取关 共同关注 关注推送(Feed流) Feed流的两种模式 Timeline 三种实现模式 基于推模式实现消息推送 滚动分页 附近商户 ...

最新文章

  1. 人脸识别落地开花 相关标准不可或缺
  2. mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化
  3. Behave用户自定义数据类型
  4. 关于Session的使用和优化
  5. Python dict 调试技巧 —— 利用YAML存储dict内容
  6. kettle组件-应用
  7. phpthink验证旧密码_忘记MacBook密码解决方法
  8. Ubuntu下的QQ
  9. phpcms v9框架的目录结构分析
  10. php 日志库,这可能是php世界中最好的日志库——monolog
  11. 关于a标签 中特有的tilte属性 和 字符串文字换行
  12. 10个方法教你提升表达能力
  13. linux 使用c语言如何获取网关地址
  14. MyBatis框架学习笔记01:初入MyBatis(一)
  15. 估值20亿美元 快狗打车将成“货运第一股”?
  16. Appium 真机测试
  17. *p++ 和 *++p
  18. 基于qt与mupdf库的pdf阅读器开发
  19. 正则表达式 REGEXP_REPLACE
  20. HTML经过按钮时按钮变大,html – 调整按钮大小

热门文章

  1. 智能手机出货量持续下跌,5G或能挽救这个行业
  2. 如何利用Python处理JSON格式的数据,建议收藏!!!
  3. 基于exynos4412-fs4412的spi的回环测试实验
  4. 操作系统——day5
  5. matlab外罚函数实验报告,(实验三)外罚函数法-实验指导书
  6. github下载慢的一种解决方法(临时用)
  7. 【电脑网络突然断开】电脑wifi显示无网络连接,手机可以正常联网
  8. 计算机怎么操作文档,iPhone如何操作电脑文件 文件共享功能了解一下
  9. Mac访问windows共享文件夹
  10. mysql日期隐式转换_mysql中的隐式转换