当前位置: 首页 > news >正文

尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)

目录:

(1)功能—展示购物车列表

(2)在web-all添加前端实现

(3)功能--合并购物车

(1)功能—展示购物车列表

购物车列表接口:CartService

/*** 通过用户Id 查询购物车列表* @param userId* @param userTempId* @return*/
List<CartInfo> getCartList(String userId, String userTempId);

 实现类:CartServiceImpl

@Override
public List<CartInfo> getCartList(String userId, String userTempId) {//获取临时用户购物车数据List<CartInfo> cartInfoList = null;if(!StringUtils.isEmpty(userTempId)){BoundHashOperations<String, String, CartInfo> boundHashOps = this.redisTemplate.boundHashOps(this.getCartKey(userTempId));cartInfoList = boundHashOps.values();}//获取用户购物车数据if(!StringUtils.isEmpty(userId)){BoundHashOperations<String, String, CartInfo> boundHashOps = this.redisTemplate.boundHashOps(this.getCartKey(userId));cartInfoList = boundHashOps.values();}if(!CollectionUtils.isEmpty(cartInfoList)){//  展示购物车列表的时候应该有顺序! 京东:按照更新时间! 苏宁:创建时间!cartInfoList.sort((o1,o2)->{//  使用时间进行比较return DateUtil.truncatedCompareTo(o2.getUpdateTime(),o1.getUpdateTime(), Calendar.SECOND);});}return cartInfoList;
}

 

 

控制器:CartApiController

/*** 查询购物车** @param request* @return*/
@GetMapping("cartList")
public Result cartList(HttpServletRequest request) {// 获取用户IdString userId = AuthContextHolder.getUserId(request);// 获取临时用户IdString userTempId = AuthContextHolder.getUserTempId(request);List<CartInfo> cartInfoList = cartService.getCartList(userId, userTempId);return Result.ok(cartInfoList);
}

 在Web-all模块添加一个Controller:

(2)在web-all添加前端实现

添加依赖和配置网关

<dependency>
      <groupId>com.atguigu.gmall</groupId>
      <artifactId>service-cart-client</artifactId>
      <version>1.0</version>
   </dependency>

在nacos的配置网关中添加 

- id: web-cart
 
uri: lb://web-all
 
predicates:
  - Host=cart.gmall.com

- id: service-cart
 
uri: lb://service-cart
 
predicates:
  - Path=/*/cart/**

 controller实现:

添加跳转到购物车详情页面的controller

package com.atguigu.gmall.all.controller;/*** <p>* 购物车页面* </p>**/
@Controller
public class CartController {@Autowiredprivate CartFeignClient cartFeignClient;@Autowiredprivate ProductFeignClient productFeignClient;/*** 查看购物车* @param request* @return*/@RequestMapping("cart.html")public String index(){return "cart/index";}/*** 添加购物车* @param skuId* @param skuNum* @param request* @return*/@RequestMapping("addCart.html")public String addCart(@RequestParam(name = "skuId") Long skuId,@RequestParam(name = "skuNum") Integer skuNum,HttpServletRequest request){SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);request.setAttribute("skuInfo",skuInfo);request.setAttribute("skuNum",skuNum);return "cart/addCart";}
}

 

(3)功能--合并购物车

功能分析:

  1. 当用户登录以后,先判断未登录的时候,用户是否购买了商品。
    1. 如果用户购买了商品,则找到对应的商品Id,对数量进行合并。
    2. 没有找到的商品,则直接添加到数据。
  2. 合并完成之后,删除未登录数据。

 

更改实现类:CartServiceImpl:cartList的实现

@Overridepublic List<CartInfo> cartList(String userId, String userTempId) {/*1.  判断是否登录,根据判断结果查询不同的购物车!2.  查询的结果需要排序!3.  有可能需要合并!在登录的情况下.  未登录 ---> 登录合并!合并完成之后,需要删除未登录购物车数据!case1: 有userId ,没有userTempIdcase2: 没有userId ,有userTempId   return noLoginCartInfoListcase3: 有userId ,有userTempId登录情况下合并购物车:先判断未登录购物车集合有数据!true: 有数据合并false: 没有数据只需要登录购物车数据删除未登录购物车!*///  声明一个集合来存储未登录数据List<CartInfo> noLoginCartInfoList = null;//  完成case2 业务逻辑//  属于未登录if (!StringUtils.isEmpty(userTempId)){String cartKey = this.getCartKey(userTempId);//  获取登录的购物车集合数据!//  noLoginCartInfoList = this.redisTemplate.boundHashOps(cartKey).values();noLoginCartInfoList  = this.redisTemplate.opsForHash().values(cartKey);}//  这个是集合的排序if (StringUtils.isEmpty(userId)){if (!CollectionUtils.isEmpty(noLoginCartInfoList)){noLoginCartInfoList.sort((o1,o2)->{//  按照更新时间:return DateUtil.truncatedCompareTo(o2.getUpdateTime(),o1.getUpdateTime(), Calendar.SECOND);});}//  返回未登录数据!return noLoginCartInfoList;}//  ----------------------case 1 and case3 -----------------/*demo:登录:17  118  1未登录:17  118  119  2合并:17  218  219  2*///  属于登录List<CartInfo> LoginCartInfoList = null;//  先获取到登录购物车的keyString cartKey = this.getCartKey(userId);//  hset key field value;  hget key field;  hvals key ; hmset key field value field value;  hmset key map;//  合并思路二:BoundHashOperations<String, String, CartInfo>  boundHashOperations = this.redisTemplate.boundHashOps(cartKey);//  判断购物车中的field//  boundHashOperations.hasKey(skuId.toString);if (!CollectionUtils.isEmpty(noLoginCartInfoList)){//  循环遍历未登录购物车集合noLoginCartInfoList.stream().forEach(cartInfo -> {//  在未登录购物车中的skuId 与登录的购物车skuId 相对  skuId = 17 18if (boundHashOperations.hasKey(cartInfo.getSkuId().toString())){//  合并业务逻辑 : skuNum + skuNum 更新时间CartInfo loginCartInfo = boundHashOperations.get(cartInfo.getSkuId().toString());//更新数量loginCartInfo.setSkuNum(loginCartInfo.getSkuNum()+cartInfo.getSkuNum());loginCartInfo.setUpdateTime(new Date());//  最新价格loginCartInfo.setSkuPrice(productFeignClient.getSkuPrice(cartInfo.getSkuId()));//  选中状态合并!if (cartInfo.getIsChecked().intValue()==1){
//                        if (loginCartInfo.getIsChecked().intValue()==0){
//                            loginCartInfo.setIsChecked(1);
//                        }loginCartInfo.setIsChecked(1);}//  修改缓存的数据:    hset key field valueboundHashOperations.put(cartInfo.getSkuId().toString(),loginCartInfo);}else {//  直接添加到缓存!    skuId = 19cartInfo.setUserId(userId);cartInfo.setCreateTime(new Date());cartInfo.setUpdateTime(new Date());boundHashOperations.put(cartInfo.getSkuId().toString(),cartInfo);}});//  删除未登录购物车数据!this.redisTemplate.delete(this.getCartKey(userTempId));}//  获取到合并之后的数据:LoginCartInfoList = this.redisTemplate.boundHashOps(cartKey).values();if (CollectionUtils.isEmpty(LoginCartInfoList)){return new ArrayList<>();}//  设置合并之后的排序结果!LoginCartInfoList.sort(((o1, o2) -> {return DateUtil.truncatedCompareTo(o2.getUpdateTime(),o1.getUpdateTime(), Calendar.SECOND);}));return LoginCartInfoList;}

 未登录时:

 

登录的数据:

在购物车页面点击登录:或者结算时会跳转登录

 数据进行了合并,临时id数据页进行了清楚

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#实现数据采集系统-数据反写(3)ModbusTcp写入数据模块开发
  • 2024世界机器人大会盛大开幕,卓翼飞思携无人智能领域产品集中亮相 !
  • Otterctf 2018 内存取证 (复现)
  • Redis持久化RDB/AOF
  • linux和docker部署基本的命令掌握
  • 全国产化服务器:飞腾FT2000+/64核密集计算、显控及存储一体式加固服务器
  • 《Web项目跨域请求后端Api设置Cookie失败问题?》
  • 前端如何快速切换node版本:nvm
  • 1.反爬虫机制
  • 一、Java入门知识与基本使用
  • 常见面试问题(Python)
  • Java核心API——Collection集合的工具类Collections
  • 解决Jasper Studio报表工具中预览正常显示,但部署到服务器上面无法正常显示的问题
  • linux neo4j 切换知识图谱
  • 粘包,Telnet,SSH,Wireshark
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【Linux系统编程】快速查找errno错误码信息
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【技术性】Search知识
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Linux下的乱码问题
  • log4j2输出到kafka
  • mysql中InnoDB引擎中页的概念
  • OSS Web直传 (文件图片)
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 从伪并行的 Python 多线程说起
  • 工程优化暨babel升级小记
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 设计模式 开闭原则
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据仓库的几种建模方法
  • 一道面试题引发的“血案”
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • (7)STL算法之交换赋值
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (七)Java对象在Hibernate持久化层的状态
  • (转)我也是一只IT小小鸟
  • .NET 8.0 发布到 IIS
  • .NET 8.0 中有哪些新的变化?
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net6 webapi log4net完整配置使用流程
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • :如何用SQL脚本保存存储过程返回的结果集