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

2024-08-24 04:52

本文主要是介绍尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录:

(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数据页进行了清楚

这篇关于尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101499

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S