83分布式电商项目 - Cookie存储购物车

简介: 83分布式电商项目 - Cookie存储购物车

使用 cookie 存储购物车数据。服务层负责逻辑,控制层负责读写 cookie 。

服务接口层

public interface CartService {
  /**
   * 需求:添加购物车数据
   * @param cartList
   * @param itemId
   * @param num
   * @return PygResult
   */
  List<Cart> addGoodsToCartList(List<Cart> cartList, Long itemId, Integer num);
}

服务实现层

实现思路:

1.根据商品 SKU ID 查询 SKU 商品信息
2.获取商家 ID
3.根据商家 ID 判断购物车列表中是否存在该商家的购物车
4.如果购物车列表中不存在该商家的购物车
-- 4.1 新建购物车对象
-- 4.2 将新建的购物车对象添加到购物车列表
5.如果购物车列表中存在该商家的购物车,查询购物车明细列表中是否存在该商品
-- 5.1. 如果没有,新增购物车明细
-- 5.2. 如果有,在原购物车明细上添加数量,更改金额

CartServiceImpl实现代码:

@Service
public class CartServiceImpl implements CartService {
@Autowired
private TbItemMapper itemMapper;
@Override
public List<Cart> addGoodsToCartList(List<Cart> cartList, Long itemId, Integer num) {
  //1.根据商品 SKU ID 查询 SKU 商品信息
  TbItem item = itemMapper.selectByPrimaryKey(itemId);
  if(item==null){
    throw new RuntimeException("商品不存在")
  };
  if(!item.getStatus().equals("1")){
    throw new RuntimeException("商品状态无效");
  }
  //2.获取商家 ID
  String sellerId = item.getSellerId();
  //3.根据商家 ID 判断购物车列表中是否存在该商家的购物车
  Cart cart = searchCartBySellerId(cartList,sellerId);
  //4.如果购物车列表中不存在该商家的购物车
  if(cart==null){
    //4.1 新建购物车对象 ,
    cart=new Cart();
    cart.setSellerId(sellerId);
    cart.setSellerName(item.getSeller());
    TbOrderItem orderItem = createOrderItem(item,num);
    List orderItemList=new ArrayList();
    orderItemList.add(orderItem);
    cart.setOrderItemList(orderItemList);
    //4.2 将购物车对象添加到购物车列表
    cartList.add(cart);
  }else{
    //5.如果购物车列表中存在该商家的购物车
    // 判断购物车明细列表中是否存在该商品
    TbOrderItem orderItem = searchOrderItemByItemId(cart.getOrderItemList(),itemId);
  if(orderItem==null){
      //5.1. 如果没有,新增购物车明细
    orderItem=createOrderItem(item,num);
    cart.getOrderItemList().add(orderItem);
  }else{
    //5.2. 如果有,在原购物车明细上添加数量,更改金额  
    orderItem.setNum(orderItem.getNum()+num);orderItem.setTot
  alFee(newBigDecimal(orderItem.getNum()*orderItem.getPrice().doubleValue()) );
    //如果数量操作后小于等于 0,则移除
    if(orderItem.getNum()<=0){
      cart.getOrderItemList().remove(orderItem);
    //移除购物车明细
   }
  //如果移除后 cart 的明细数量为 0,则将 cart 移除
  if(cart.getOrderItemList().size()==0){
    cartList.remove(cart);} } }return cartList; 
  }
  /**
  * 根据商家 ID 查询购物车对象
  * @param cartList
  * @param sellerId
  * @return
  */
  private Cart searchCartBySellerId(List<Cart> cartList, String sellerId){
    for(Cart cart:cartList){
      if(cart.getSellerId().equals(sellerId)){
        return cart; 
        }
     }
  return null;
 }
/*
** 根据商品明细 ID 查询
* @param orderItemList
* 
* @param itemId
* @return
* /
private TbOrderItem searchOrderItemByItemId(List<TbOrderItem> orderItemList ,Long itemId ){
    for(TbOrderItem orderItem :orderItemList{
    if(orderItem.getItemId().longValue()==itemId.longValue(){
    return orderItem; 
    } 
  }
  return null;
 }
/**
   * 需求:把商品添加到购物车清单
   * 
   * @param item
   * @return
   */
  private List<TbOrderItem> createOrderItem(TbItem item, Integer num) {
    // 创建集合对象List<TbOrderItem>,封装购物车数据
    List<TbOrderItem> orderItemList = new ArrayList<TbOrderItem>();
    // 创建对象
    TbOrderItem orderItem = new TbOrderItem();
    orderItem.setItemId(item.getId());
    orderItem.setSellerId(item.getSellerId());
    orderItem.setNum(num);
    orderItem.setPicPath(item.getImage());
    orderItem.setPrice(item.getPrice());
    orderItem.setTitle(item.getTitle());
    orderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue()
        * num));
    // 把购物清单对象放入集合
    orderItemList.add(orderItem);
    return orderItemList;
  }

后端控制层

实现思路:

1)从 cookie 中取出购物车

2)向购物车添加商品

3)将购物车存入 cookie

@RestController
@RequestMapping("/cart")
public class CartController {
  // 注入购物车服务对象
  @Reference(timeout=10000000)
  private CartService cartService;
  @RequestMapping("addGoodsToCartList")
  public ResultaddGoodsToCartList(String itemId, Integer num,HttpServletRequest request, HttpServletResponse response) {
    try {
      List<Cart> cartList =findCartList();
      //获取购物车列表
      cartList = cartService.addGoodsToCartList(cartList, itemId, num);
      util.CookieUtil.setCookie(request, response, "cartList", JSON.toJSONString(cartList),3600*24,"UTF-8");
      return new Result(true, "添加成功");
    } catch (Exception e) {
      e.printStackTrace();
      return new Result(false, "添加失败");
    }
   }
  /**
   * 需求:查询购物车列表
   * 
   * @return
   */
  @RequestMapping("/findCartList")
  public List<Cart> findCartList(HttpServletRequest request) {
   String cartListString = util.CookieUtil.getCookieValue(request, "cartList","UTF-8");
   if(cartListString==null || cartListString.equals("")){
     cartListString="[]";
   }
   List<Cart> cartList_cookie = JSON.parseArray(cartListString, Cart.class);
     return cartList_cookie;
}



目录
相关文章
|
7月前
|
存储 分布式计算 Hadoop
Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
246 3
|
3月前
|
NoSQL Java Redis
面试官:项目中如何实现分布式锁?
面试官:项目中如何实现分布式锁?
98 6
面试官:项目中如何实现分布式锁?
|
7月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
325 2
|
4月前
|
资源调度 Java 调度
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
|
4月前
|
存储 SQL 运维
“震撼发布!PolarDB-X:云原生分布式数据库巨擘,超高并发、海量存储、复杂查询,一网打尽!错过等哭!”
【8月更文挑战第7天】PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
115 1
|
4月前
|
存储 缓存 开发框架
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
|
5月前
|
SQL NoSQL Java
如何在Java项目中实现分布式锁
如何在Java项目中实现分布式锁
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题
【7月更文挑战第3天】PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题。此架构让存储层专注数据可靠性,计算层专注处理SQL,提升性能并降低运维复杂度。通过RDMA加速通信,多副本确保高可用性。资源可独立扩展,便于成本控制。动态添加计算节点以应对流量高峰,展示了其灵活性。PolarDB的开源促进了数据库技术的持续创新和发展。
309 2
|
5月前
|
存储 JavaScript 前端开发
操作document.cookie存储和读取Cookies
操作document.cookie存储和读取Cookies
|
5月前
|
消息中间件 Java 中间件
如何在Java项目中实现分布式事务管理
如何在Java项目中实现分布式事务管理

热门文章

最新文章