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

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

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*