实现思路
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;
}
}
网友评论