电商高复用购物车业务分析和代码实现

来源:互联网 发布:js控制标签显示隐藏 编辑:程序博客网 时间:2024/06/02 01:10

购物车在一般的业务中是作为一张表在数据库中存储的,如图:


对应java中的实体类,如下:

package com.mmall.pojo;import org.apache.ibatis.type.TypeHandler;import java.util.Date;public class Cart{    private Integer id;    private Integer userId;    private Integer productId;    private Integer quantity;    private Integer checked;    private Date createTime;    private Date updateTime;    public Cart(Integer id, Integer userId, Integer productId, Integer quantity, Integer checked, Date createTime, Date updateTime) {        this.id = id;        this.userId = userId;        this.productId = productId;        this.quantity = quantity;        this.checked = checked;        this.createTime = createTime;        this.updateTime = updateTime;    }    public Cart() {        super();    }    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 Integer getChecked() {        return checked;    }    public void setChecked(Integer checked) {        this.checked = checked;    }    public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public Date getUpdateTime() {        return updateTime;    }    public void setUpdateTime(Date updateTime) {        this.updateTime = updateTime;    }}
对应购物车中的VO对象productCartVo

package com.mmall.vo;import java.math.BigDecimal;/** * Created by Administrator on 2017/10/19. */public class CartProductVo {    //结合了产品和购物车的抽像字段    private Integer id;    private Integer userId;    private Integer productId;    private Integer quantity;//购物车中此商品的数量    private String productName;//名称    private String productSubtitle;//副标题    private String productMainImage;//购物车内产品的主图    private BigDecimal productPrice;//价格    private Integer status;//    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 getStatus() {        return status;    }    public void setStatus(Integer status) {        this.status = status;    }    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;    }}
那么整个购物车应该是由一条条productCartVo对象组成的集合,并解决求总价,单个商品数量,超过库存情况的处理:

private CartVo getCartVoLimit(Integer userId){        CartVo cartVo = new CartVo();        List<Cart> cartList = cartMapper.selectCartByUserId(userId);        //将数据库购物车表里的信息转化成前台Vo信息        List<CartProductVo> cartProductVoList = Lists.newArrayList();        BigDecimal cartTotalPrice = new BigDecimal("0");        if (CollectionUtils.isNotEmpty(cartList)){            for (Cart cartItem:cartList){                CartProductVo cartProductVo = new CartProductVo();                cartProductVo.setId(cartItem.getId());                cartProductVo.setProductId(cartItem.getProductId());                cartProductVo.setUserId(userId);                Product product = productMapper.selectByPrimaryKey(cartItem.getProductId());                if (product!=null){                    cartProductVo.setProductMainImage(product.getMainImage());                    cartProductVo.setProductSubtitle(product.getSubtitle());                    cartProductVo.setProductName(product.getName());                    cartProductVo.setStatus(product.getStatus());                    cartProductVo.setProductPrice(product.getPrice());                    cartProductVo.setProductStock(product.getStock());//库存                    //判断库存                    int byLimitCount = 0;                    //当产品的库存大于购物车的数量时                    if (product.getStock()>=cartItem.getQuantity()){                        //库存充足的时候                        byLimitCount=cartItem.getQuantity();                        cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS);                    }else {                        //超出库存                        byLimitCount = product.getStock();                        cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL);                        //购物车中更新有效库存                        Cart cartForQuantity = new Cart();                        cartForQuantity.setId(cartItem.getId());                        cartForQuantity.setUserId(userId);                        cartForQuantity.setQuantity(byLimitCount);                        cartMapper.updateByPrimaryKeySelective(cartForQuantity);                    }                    //不仅要把VO设置成最大库存,也要把PO设置成最大库存                    cartProductVo.setQuantity(byLimitCount);                    //计算购物车单行总价                    cartProductVo.setProductTotalPrice(BigDecimalUntil.mul(product.getPrice().doubleValue(),cartProductVo.getQuantity()));                    //获取数据库中购物车选中状态                    cartProductVo.setProductChecked(cartItem.getChecked());                }                if (cartItem.getChecked() == Const.Cart.CHECKED){                    //如果已经勾选,增加到整个购物车的总价中                    cartTotalPrice = BigDecimalUntil.add(cartTotalPrice.doubleValue(),cartProductVo.getProductTotalPrice().doubleValue());                }                cartProductVoList.add(cartProductVo);            }        }        cartVo.setCartTotalPrice(cartTotalPrice);        cartVo.setCartProductVos(cartProductVoList);        //是否全选,前端有全选反选这样一个字段,设置一个私有方法        cartVo.setAllChecked(this.getAllCheckedStatus(userId));        cartVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix"));        return cartVo;    }    private boolean getAllCheckedStatus(Integer userId){        if (userId==null){            return false;        }        //查购物车产品未被选中的个数,若==0,说明全选        return cartMapper.selectCartProductCheckedStatusByUserId(userId)==0;    }
在增删改查中的调用:

PS:验证全选反选的java实现:

查询未被选中的个数==0?全选:反选

<select id="selectCartProductCheckedStatusByUserId" resultType="int" parameterType="int">    select count(1) from mmall_cart    where user_id = #{userId}    and checked = 0  </select>




原创粉丝点击