購物車管理
功能:
加入商品; 更新商品數; 查詢商品數; 移除商品; 單選/取消; 全選/取消; 購物車列表
接口
門戶:購物車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);
//除不盡的情況:取兩位小數,四舍五入
}
}
