JavaWeb_LeadNews_Day9-Redis实现用户行为

这篇具有很好参考价值的文章主要介绍了JavaWeb_LeadNews_Day9-Redis实现用户行为。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

网关配置

nacos: leadnews-app-gateway

# 用户行为微服务
- id: leadnews-behavior
    uri: lb://leadnews-behavior
    predicates:
    - Path=/behavior/**
    filters:
    - StripPrefix= 1

nacos: leadnews-behavior
在配置文件中去除数据源自动配置

spring:
  # redis配置
  redis:
    host: localhost
    # password: 
    port: 6379
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

点赞

  • 当前登录的用户点击了”赞“,就要保存当前行为数据
  • 可以取消点赞
public ResponseResult likesBehavior(LikesBehaviorDto dto) {
    // 1. 检查参数
    if(dto == null || dto.getArticleId() == null || checkParam(dto)){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    // 2. 是否登录
    ApUser user = AppThreadLocalUtil.getUser();
    if(user == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
    }

    // 3. 点赞, 保存数据
    if(dto.getOperation() == 0){
        // 点赞
        Object obj = cacheService.hGet(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
        if(obj != null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "已点赞");
        }
        // 保存当前key
        log.info("保存当前key:{} ,{}, {}", BehaviorConstants.LIKE_BEHAVIOR+dto.getArticleId(), user.getId(), dto);
        cacheService.hPut(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString(), JSON.toJSONString(dto));
    }else{
        // 取消点赞
        // 删除当前key
        log.info("删除当前key:{}, {}", BehaviorConstants.LIKE_BEHAVIOR+dto.getArticleId(), user.getId());
        cacheService.hDelete(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
    }
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

private boolean checkParam(LikesBehaviorDto dto) {
    if(dto.getType() > 2 || dto.getType() < 0 || dto.getOperation() > 1 || dto.getOperation() < 0){
        return true;
    }
    return false;
}

阅读

  • 当用户查看了某一篇文章,需要记录当前用户查看的次数
public ResponseResult readBehavior(ReadBehaviorDto dto) {
    // 1. 检查次数
    if(dto == null || dto.getArticleId() == null || dto.getCount() == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    // 2. 是否登录
    ApUser user = AppThreadLocalUtil.getUser();
    if(user == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
    }

    // 3. 阅读, 保存数据
    // 3.1 更新阅读次数
    String readBehaviorJson = (String) cacheService.hGet(BehaviorConstants.READ_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
    if(StringUtils.isNotBlank(readBehaviorJson)){
        ReadBehaviorDto readBehaviorDto = JSON.parseObject(readBehaviorJson, ReadBehaviorDto.class);
        dto.setCount(readBehaviorDto.getCount()+dto.getCount());
    }
    // 3.2 保存数据
    // 保存当前key
    log.info("保存当前key:{} {} {}", BehaviorConstants.READ_BEHAVIOR+dto.getArticleId(), user.getId(), dto);
    cacheService.hPut(BehaviorConstants.READ_BEHAVIOR+dto.getArticleId().toString(), user.getId().toString(), JSON.toJSONString(dto));
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

不喜欢

用户点击了不喜欢, 就不再给当前用户推荐这一类型的文章信息

public ResponseResult unLikesBehavior(UnLikesBehaviorDto dto) {
    // 1. 检查次数
    if(dto == null || dto.getArticleId() == null || dto.getType() > 1 || dto.getType() < 0){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    // 2. 是否登录
    ApUser user = AppThreadLocalUtil.getUser();
    if(user == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
    }

    // 3. 不喜欢文章, 保存数据
    if(dto.getType() == 0){
        // 不喜欢
        Object o = cacheService.hGet(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
        if(o != null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "已经不喜欢");
        }
        log.info("保存当前key:{} ,{}, {}", BehaviorConstants.UN_LIKE_BEHAVIOR+dto.getArticleId(), user.getId(), dto);
        cacheService.hPut(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString(), JSON.toJSONString(dto));
    }else{
        // 取消不喜欢
        log.info("删除当前key:{}, {}", BehaviorConstants.UN_LIKE_BEHAVIOR+dto.getArticleId(), user.getId());
        cacheService.hDelete(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
    }
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

关注

  • 当前登录后的用户可以关注作者,也可以取消关注作者
  • 从用户的角度出发:一个用户可以关注其他多个作者 —— 我的关注
  • 从作者的角度出发:一个用户(同是作者)也可以拥有很多个粉丝 —— 我的粉丝
public ResponseResult userFollow(UserRelationDto dto) {
    // 1. 检查参数
    if(dto == null || checkParam(dto)){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    // 2. 是否登录
    ApUser user = AppThreadLocalUtil.getUser();
    if(user == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
    }

    // 3. 关注, 保存数据
    if(dto.getOperation() == 0){
        // 关注
        // 将作者写入我的关注中
        cacheService.zAdd(BehaviorConstants.APUSER_FOLLOW_RELATION+user.getId(), dto.getAuthorId().toString(), System.currentTimeMillis());
        // 将我写入作者的粉丝中
        cacheService.zAdd(BehaviorConstants.APUSER_FANS_RELATION+dto.getAuthorId(), user.getId().toString(), System.currentTimeMillis());
    }else{
        // 取消关注
        cacheService.zRemove(BehaviorConstants.APUSER_FOLLOW_RELATION+user.getId(), dto.getAuthorId().toString());
        cacheService.zRemove(BehaviorConstants.APUSER_FANS_RELATION+dto.getAuthorId(), user.getId().toString());
    }
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

private boolean checkParam(UserRelationDto dto) {
    if(dto.getArticleId() == null || dto.getAuthorId() == null){
        return true;
    }
    if(dto.getOperation() > 1 || dto.getOperation() < 0){
        return true;
    }
    return false;
}

收藏

  • 记录当前登录人收藏的文章
public ResponseResult collectionBehavior(CollectionBehaviorDto dto) {
    // 1. 检查参数
    if(dto == null || checkParam(dto)){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }
    // 2. 是否登录
    ApUser user = AppThreadLocalUtil.getUser();
    if(user == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
    }

    // 3. 文章收藏, 数据保存
    if(dto.getOperation() == 0){
        // 收藏

        // 判断是否已经收藏
        String collectionJson = (String) cacheService.hGet(BehaviorConstants.COLLECTION_BEHAVIOR + dto.getEntryId(), user.getId().toString());
        if(StringUtils.isNotBlank(collectionJson)){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "已收藏");
        }

        log.info("文章收藏,保存key:{},{},{}",BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(),dto.getEntryId().toString(), JSON.toJSONString(dto));
        cacheService.hPut(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(),dto.getEntryId().toString(), JSON.toJSONString(dto));
    }else{
        // 取消收藏
        log.info("文章收藏,删除key:{},{},{}",BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(),dto.getEntryId().toString());
        cacheService.hDelete(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(),dto.getEntryId().toString());
    }
    
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

文章详情-行为数据回显

展示文章的关系,app端用户必须登录,判断当前用户是否已经关注该文章的作者、是否收藏了此文章、是否点赞了文章、是否不喜欢该文章等

public ResponseResult loadArticleBehavior(ArticleInfoDto dto) {
    // 1. 检查数据
    if(dto == null || dto.getArticleId() == null || dto.getAuthorId() == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }
    // 2. 是否登录
    ApUser user = AppThreadLocalUtil.getUser();
    if(user == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
    }
    // 3. 回显数据
    Map<String, Boolean> map = new HashMap<>();
    Boolean islike = false, isunlike = false, iscollection = false, isfollow = false;
    // 3.1 是否点赞
    String likeJson = (String) cacheService.hGet(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId(), user.getId().toString());
    if(likeJson != null){
        islike = true;
    }
    // 3.2 是否不喜欢
    String unLikeJson = (String) cacheService.hGet(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId(), user.getId().toString());
    if(unLikeJson != null){
        isunlike = true;
    }
    // 3.3 是否收藏
    String collectiontJson = (String) cacheService.hGet(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(), dto.getArticleId().toString());
    if(collectiontJson != null){
        iscollection = true;
    }
    // 3.4 是否关注
    Double score = cacheService.zScore(BehaviorConstants.APUSER_FOLLOW_RELATION + user.getId(), dto.getAuthorId().toString());
    if(score != null){
        isfollow = true;
    }
    map.put("islike", islike);
    map.put("isunlike", isunlike);
    map.put("iscollection", iscollection);
    map.put("isfollow", isfollow);
    return ResponseResult.okResult(map);
}

来源

黑马程序员. 黑马头条

Gitee

https://gitee.com/yu-ba-ba-ba/leadnews文章来源地址https://www.toymoban.com/news/detail-687472.html

到了这里,关于JavaWeb_LeadNews_Day9-Redis实现用户行为的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaWeb_LeadNews_Day4-阿里云内容安全, 雪花算法, app文章保存, 自媒体文章审核

    依赖 实现 总结 工具类太复杂, 云盾内容安全也没开通(要企业认证), 看看测试好了 测试图片审核会报错, 可能是没开通 背景 技术选型 方案 优势 劣势 redis (INCR)生成一个全局连续递增的数字类型主键 增加了一个外部组件的依赖, Redis不可以, 则整个数据库将无法再插入 UUID 全局

    2024年02月15日
    浏览(38)
  • python实现模拟用户点击行为测试

    目录 一、需求背景 二、爬虫需求实战测试 1、目标需求: 可实现遍历访问多个html网页地址

    2024年02月05日
    浏览(33)
  • Javaweb项目案例:一个简单的用户管理系统实现

    我们来设计一个简单的用户管理系统,具有查看用户,添加用户,删除用户,更新用户的所有功能,并能支持分页显示,以及通过模糊查询的 本项目采用Druid数据库连接池 注意:JDBC和DAO部分本文不予演示,请自行完成此部分代码的编写🐿️ 模板页面,showuser.html Sho

    2024年02月09日
    浏览(48)
  • 基于Spark的电商用户行为分析系统的设计与实现

    项目架构 Flume–Kafka–Spark Streaming–Mysql–FineReport 10 数据可视化使用第三方软件FineReport支持 1. 数据采集:利用Java线程模拟行为数据写入被监控的文件 模拟电商网站用户行为数据(也可与阿里云天池开源数据集:真实的淘宝或天猫用户行为数据) flume实时监控数据文件,并将

    2024年02月04日
    浏览(37)
  • 基于Javaweb实现ATM机系统开发实战(四)用户修改删除功能实现

    我们点一下修改,发现页面进行了跳转,跳转到了/toUpdate,并传递了用户的卡号。  我们可以先查看一下用户列表展示界面的前端代码:userlist.jsp,可以看到前端代码中做了跳转的动作,我们需要在后端中完成相应的servlet完成这个动作。  首先,创建UserToUpdateServlet,对用户

    2024年02月13日
    浏览(35)
  • 基于Spark+Springboot的电商用户行为分析系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作 ✌ 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P

    2024年01月17日
    浏览(52)
  • JavaWeb项目----实现用户登录、注册、对商品信息进行的添加、删除、修改功能

    在idea中创建有关类   web中写jsp页面,index.jsp是首页布局 运行效果如下:  登录页面 运行效果如下:   注册页面  运行效果如下:   登陆正确时跳转到zhuye.jsp主页页面( 使用Java脚本获取集合中对象的元素,放html标签中) 运行效果如下:   在登陆页面,密码或用户名输入

    2024年02月11日
    浏览(37)
  • JavaWeb小项目之Servlet实现用户登录(详细教程学习笔记)【IDEA工具】

    这个【Servlet实现用户登录】小项目,作为 JavaWeb小项目系列 的开篇,未来我会继续完善各个功能,直到可以真正作为一个Web项目(PS:希望这个坑可以填上,说来遗憾,现在已经大三了,人生也比较迷茫,希望可以通过考研改变自己吧。岁月蹉跎,大一学C++,大二学JavaSE的时

    2023年04月11日
    浏览(52)
  • Javaweb程序设计基础入门eclipse实现用户注册登录和session存储

    通过HTML,CSS,JavaScript和JSP实现页面的注册,登录和信息显示的三个界面的设计。 1.1注册界面 2.登录界面 3.通过Java代码进行登录界面的校验 1.用request.getParameter()获取表单提交的数据来存储账号和密码 2.if语句来进行账号和密码的校验 4.信息显示界面HTML 通过requst.getParameter()获

    2024年02月05日
    浏览(39)
  • 基于redis实现用户登陆

    因为session有数据共享问题,不同tomcat服务器中的session不能共享,之后负载均衡就无法实现。所以我们用redis代替session。redis可以被多个tomcat服务器共享,redis基于内存。 之前的session可以看做登陆凭证,本次登陆凭证由session变为token。 1.用户发送请求携带手机号参数获取验证

    2024年03月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包