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