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;
}



目录
相关文章
|
2月前
|
存储 开发框架 NoSQL
ASP.NET WEB——项目中Cookie与Session的用法
ASP.NET WEB——项目中Cookie与Session的用法
36 0
|
4月前
|
Java 调度 Maven
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(下)
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(下)
117 0
|
16天前
|
存储 Web App开发 JSON
存储界的cookie、本地存储、会话存储
存储界的cookie、本地存储、会话存储
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
156 0
|
4月前
|
SQL 负载均衡 监控
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(上)
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目
100 0
|
1月前
|
存储 监控 容灾
TiDB存储层深入:分布式存储架构与数据一致性保障
【2月更文挑战第26天】本文将深入探讨TiDB的存储层,详细解析其分布式存储架构、数据复制机制以及数据一致性保障措施。通过了解存储层的核心组件和工作原理,我们可以更好地理解TiDB如何确保数据的可靠性、高可用性和可扩展性。本文将从存储层的架构、数据分布、容错机制等方面展开介绍,帮助读者全面掌握TiDB存储层的关键技术和优势。
|
2月前
|
存储 缓存 固态存储
云计算基础-存储虚拟化(深信服aSAN分布式存储)
每秒钟的IOPS数,该指标主要用于评价小块IO性能,体现存储系统的IO延时能力和并发能力。业界一般默认IOPS指的是4K块大小的IO性能,该值越大说明性能越好。
56 1
|
2月前
|
存储 NoSQL 文件存储
C++ 哈希表企业级项目运用---淘宝分布式文件系统
C++ 哈希表企业级项目运用---淘宝分布式文件系统
|
3月前
|
网络协议 Devops 大数据
【分布式】大型互联网项目特点
【1月更文挑战第25天】【分布式】大型互联网项目特点
|
3月前
|
存储 缓存 监控
【分布式】大型互联网项目架构目标
【1月更文挑战第25天】【分布式】大型互联网项目架构目标