美文网首页
购物车模块

购物车模块

作者: 我的最最爱 | 来源:发表于2018-07-28 09:24 被阅读0次

实现思路

1)在电商中购物车是重要的一环,我考虑了两种方式,第一种是用户登陆才能加入购物车,第二种方式是用户可以再 不登录的情况下加入购物车(因为第二种方式使用户更方便

2)由于不登录加入购物车,所以只能采用cookie(由于session存在服务器端,并且定时销毁),在登陆过后采用redis,把用户名为key商品对象为值进行储存,并把cookie中的数据清除,加入到redis中,当用户提交订单时,清除redis并加入到数据库中

3)由于购物车使用过于频繁,所以采用了redis,减少了高并发下的数据库的访问程度,提高了数据库的性能

代码实现

service实现类

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private TbItemMapper itemMapper;
    /**
     * 添加商品到购物车
     * @param list
     * @param itemId
     * @param num
     * @return
     */
    @Override
    public List<Cart> addGoodsToCartList(List<Cart> cartList, Long itemId, Integer num) {
        
        //1.根据skuID查询商品明细SKU的对象
        TbItem item = itemMapper.selectByPrimaryKey(itemId);
        if(item==null){
            throw new RuntimeException("商品不存在");
        }
        if(!item.getStatus().equals("1")){
            throw new RuntimeException("商品状态不合法");
        }       
        //2.根据SKU对象得到商家ID
        String sellerId = item.getSellerId();//商家ID
        
        //3.根据商家ID在购物车列表中查询购物车对象
        Cart cart = searchCartBySellerId(cartList,sellerId);
        
        if(cart==null){//4.如果购物车列表中不存在该商家的购物车
            
            //4.1 创建一个新的购物车对象
            cart=new Cart();
            cart.setSellerId(sellerId);//商家ID
            cart.setSellerName(item.getSeller());//商家名称         
            List<TbOrderItem> orderItemList=new ArrayList();//创建购物车明细列表
            TbOrderItem orderItem = createOrderItem(item,num);          
            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.setTotalFee( new BigDecimal(orderItem.getPrice().doubleValue()*orderItem.getNum() ) );
                //当明细的数量小于等于0,移除此明细
                if(orderItem.getNum()<=0){
                    cart.getOrderItemList().remove(orderItem);                  
                }
                //当购物车的明细数量为0,在购物车列表中移除此购物车
                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;        
    }
    
    /**
     * 根据skuID在购物车明细列表中查询购物车明细对象
     * @param orderItemList
     * @param itemId
     * @return
     */
    public TbOrderItem searchOrderItemByItemId(List<TbOrderItem> orderItemList,Long itemId){
        for(TbOrderItem orderItem:orderItemList){
            if(orderItem.getItemId().longValue()==itemId.longValue()){
                return orderItem;
            }           
        }
        return null;
    }
    
    /**
     * 创建购物车明细对象
     * @param item
     * @param num
     * @return
     */
    private TbOrderItem createOrderItem(TbItem item,Integer num){
        //创建新的购物车明细对象
        TbOrderItem orderItem=new TbOrderItem();
        orderItem.setGoodsId(item.getGoodsId());
        orderItem.setItemId(item.getId());
        orderItem.setNum(num);
        orderItem.setPicPath(item.getImage());
        orderItem.setPrice(item.getPrice());
        orderItem.setSellerId(item.getSellerId());
        orderItem.setTitle(item.getTitle());
        orderItem.setTotalFee(  new BigDecimal(item.getPrice().doubleValue()*num) );
        return orderItem;
    }
    
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 从redis中提取购物车列表
     * @param username
     * @return
     */
    @Override
    public List<Cart> findCartListFromRedis(String username) {
        System.out.println("从redis中提取购物车"+username);
        List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps("cartList").get(username);
        if(cartList==null){
            cartList=new ArrayList();
        }       
        return cartList;
    }
    /**
     * 将购物车列表存入redis
     * @param username
     * @param cartList
     */
    @Override
    public void saveCartListToRedis(String username, List<Cart> cartList) {
        System.out.println("向redis中存入购物车"+username);
        redisTemplate.boundHashOps("cartList").put(username, cartList);
        
    }
    /**
     * 合并购物车
     * @param cartList1
     * @param cartList2
     * @return
     */

    @Override
    public List<Cart> mergeCartList(List<Cart> cartList1, List<Cart> cartList2) {
        // cartList1.addAll(cartList2);  不能简单合并         
        for(Cart cart:cartList2){
            for( TbOrderItem orderItem :cart.getOrderItemList() ){
                cartList1=addGoodsToCartList(cartList1,orderItem.getItemId(),orderItem.getNum());
            }
        }
        return cartList1;       
    }

}

相关文章

网友评论

      本文标题:购物车模块

      本文链接:https://www.haomeiwen.com/subject/jzarpftx.html