購物車管理
功能:
加入商品; 更新商品數; 查詢商品數; 移除商品; 單選/取消; 全選/取消; 購物車列表
接口
門戶:購物車list列表; 購物車添加商品; 更新購物車某個產品數量; 移除購物車某個產品; 購物車選中某個商品; 取消選中某個產品; 查詢購物車產品數量;購物車全選;購物車取消全選
注
guava截取字符串:
productIds=“zhangshang,lisi”//多個用戶id的字符串 List<String> productList = Splitter.on(",").splitToList(productIds);
計算商品數量的一個隱患:當查詢到的數量為空時,無法將null賦值給int。 解決方法:IFNULL(sum(quantity),0) Mysql內置函數,如果sum(quantity)為空,則賦值為0
//mapper.java int selectCartProductCount(@Param(value = "userId") Integer userId); //mapper.xml <select id="selectCartProductCount" parameterType="int" resultType="int"> select IFNULL(sum(quantity),0) as count from eshop_cart where user_id=#{userId} </select>
學習目標:
1 購物車模塊的設計思想:封裝一個購物車的核心方法;每當對購物車進行操作后,都調用該方法,該方法會對CartVo進行 裝配 和數量的校驗,並返回一個CartVo
2 封裝一個購物車核心方法
/** * 限制購物車,其中會判斷數量是否正確 * @param userId * @return */ private CartVo getCartVoLimit(Integer userId){ CartVo cartVo=new CartVo(); //獲得該用戶的購物車list List<Cart> cartList=cartMapper.selectCartByUserId(userId); //創建一個CarProductVoList List<CartProductVo> cartProductVoList= Lists.newArrayList(); BigDecimal cartTotalPrice=new BigDecimal("0"); //判斷購物車是否為空 if(CollectionUtils.isNotEmpty(cartList)){ //將Cart的項裝配到CarProductVo,再add到CarProductVoList for(Cart cartItem : cartList){ CartProductVo cartProductVo=new CartProductVo(); cartProductVo.setId(cartItem.getId()); cartProductVo.setUserId(userId); cartProductVo.setProductId(cartItem.getProductId()); Product product=productMapper.selectByPrimaryKey(cartItem.getProductId()); if(product!=null){ cartProductVo.setProductMainImage(product.getMainImage()); cartProductVo.setProductName(product.getName()); cartProductVo.setProductSubtitle(product.getSubtitle()); cartProductVo.setProductStatus(product.getStatus()); cartProductVo.setProductPrice(product.getPrice()); cartProductVo.setProductStock(product.getStock()); //判斷庫存 int buyLimitCount =0; if(product.getStock()>=cartItem.getQuantity()){ //庫存充足的時候 buyLimitCount=cartItem.getQuantity(); cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS); }else { buyLimitCount=product.getStock(); cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL); //更新購物車有效庫存 Cart cartForQuantity=new Cart(); cartForQuantity.setId(cartItem.getId()); cartForQuantity.setQuantity(buyLimitCount); cartMapper.updateByPrimaryKeySelective(cartForQuantity); } cartProductVo.setQuantity(buyLimitCount); //計算總價 cartProductVo.setProductTotalPrice(BigDecimalUtil.mul(product.getPrice().doubleValue(),cartProductVo.getQuantity())); cartProductVo.setProductChecked(cartItem.getChecked()); } if(cartItem.getChecked()==Const.Cart.CHECKED){ cartTotalPrice=BigDecimalUtil.add(cartTotalPrice.doubleValue(),cartProductVo.getProductTotalPrice().doubleValue()); } cartProductVoList.add(cartProductVo); } } cartVo.setCartTotalPrice(cartTotalPrice); cartVo.setCartProductVoList(cartProductVoList); cartVo.setAllChecked(this.getAllCheckedStatus(userId)); cartVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix")); return cartVo; } /** * 判斷購物車是否全選 * @param userId * @return */ private boolean getAllCheckedStatus(Integer userId){ if(userId==null){ return false; } return cartMapper.selectCartProductCheckedStatusByUserId(userId)==0; }
cartProductVo:
package com.eshop.vo; import java.math.BigDecimal; /** * 將產品和購物車結合在一起 的一個抽象對象 */ public class CartProductVo { private Integer id;//購物車id private Integer userId; private Integer productId; private Integer quantity;//產品購買數量 private String productName; private String productSubtitle; private String productMainImage; private BigDecimal productPrice; private Integer productStatus; private BigDecimal productTotalPrice;//產品總價 private Integer productStock;//產品庫存數量 private Integer productChecked; private String limitQuantity;//限制商品的數量的返回結果 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public Integer getProductId() { return productId; } public void setProductId(Integer productId) { this.productId = productId; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProductSubtitle() { return productSubtitle; } public void setProductSubtitle(String productSubtitle) { this.productSubtitle = productSubtitle; } public String getProductMainImage() { return productMainImage; } public void setProductMainImage(String productMainImage) { this.productMainImage = productMainImage; } public BigDecimal getProductPrice() { return productPrice; } public void setProductPrice(BigDecimal productPrice) { this.productPrice = productPrice; } public Integer getProductStatus() { return productStatus; } public void setProductStatus(Integer productStatus) { this.productStatus = productStatus; } public BigDecimal getProductTotalPrice() { return productTotalPrice; } public void setProductTotalPrice(BigDecimal productTotalPrice) { this.productTotalPrice = productTotalPrice; } public Integer getProductStock() { return productStock; } public void setProductStock(Integer productStock) { this.productStock = productStock; } public Integer getProductChecked() { return productChecked; } public void setProductChecked(Integer productChecked) { this.productChecked = productChecked; } public String getLimitQuantity() { return limitQuantity; } public void setLimitQuantity(String limitQuantity) { this.limitQuantity = limitQuantity; } }
CartVo:
package com.eshop.vo; import java.math.BigDecimal; import java.util.List; public class CartVo { private List<CartProductVo> cartProductVoList; private BigDecimal cartTotalPrice; private Boolean allChecked; private String imageHost; public List<CartProductVo> getCartProductVoList() { return cartProductVoList; } public void setCartProductVoList(List<CartProductVo> cartProductVoList) { this.cartProductVoList = cartProductVoList; } public BigDecimal getCartTotalPrice() { return cartTotalPrice; } public void setCartTotalPrice(BigDecimal cartTotalPrice) { this.cartTotalPrice = cartTotalPrice; } public Boolean getAllChecked() { return allChecked; } public void setAllChecked(Boolean allChecked) { this.allChecked = allChecked; } public String getImageHost() { return imageHost; } public void setImageHost(String imageHost) { this.imageHost = imageHost; } }
3 解決浮點型商業運算中精度丟失: 使用BigDecimal ,注意一定要使用 BigDecimal(String str )字符串的構造器
public static BigDecimal add(double v1,double v2){ BigDecimal b1=new BigDecimal(Double.toString(v1)); BigDecimal b2=new BigDecimal(Double.toString(v2)); return b1.add(b2); }
該方法:
package com.eshop.util; import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalUtil { private BigDecimalUtil(){ //私有構造器防止被實例化 } public static BigDecimal add(double v1,double v2){ BigDecimal b1=new BigDecimal(Double.toString(v1)); BigDecimal b2=new BigDecimal(Double.toString(v2)); return b1.add(b2); } public static BigDecimal sub(double v1,double v2){ BigDecimal b1=new BigDecimal(Double.toString(v1)); BigDecimal b2=new BigDecimal(Double.toString(v2)); return b1.subtract(b2); } public static BigDecimal mul(double v1,double v2){ BigDecimal b1=new BigDecimal(Double.toString(v1)); BigDecimal b2=new BigDecimal(Double.toString(v2)); return b1.multiply(b2); } public static BigDecimal div(double v1,double v2){ BigDecimal b1=new BigDecimal(Double.toString(v1)); BigDecimal b2=new BigDecimal(Double.toString(v2)); return b1.divide(b2,2, RoundingMode.HALF_UP); //除不盡的情況:取兩位小數,四舍五入 } }