电商高复用购物车业务分析和代码实现
程序员文章站
2022-05-22 23:33:34
...
购物车在一般的业务中是作为一张表在数据库中存储的,如图:
对应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>
上一篇: 大型电商项目购物车的实现
下一篇: 6个经典短信小笑话
推荐阅读