购物车添加逻辑
@mg_api.route('/cart/add', methods=['POST'])
def add_to_cart():
try:
goods_id = request.json.get('goodsId')
open_id = get_jwt_identity()
user = WXUser.query.filter(WXUser.open_id == open_id).first()
user_id = user.id # Custom method to get logged-in user ID
product_id = request.json.get('productId')
number = int(request.json.get('number'))
add_type = int(request.json.get('addType'))
current_time = int(datetime.datetime.now().timestamp())
# Check if the product is available for purchase
goods_info = MallGoods.query.filter_by(id=goods_id).first()
if not goods_info or goods_info.is_on_sale == 0:
return jsonify({'success': False, 'message': '商品已下架'}), 400
# Get product specifications and check stock
product_info = MallProduct.query.filter_by(id=product_id).first()
if not product_info or product_info.goods_number < number:
return jsonify({'success': False, 'message': '库存不足'}), 400
# Check if the product is already in the cart
cart_info = MallCart.query.filter_by(
user_id=user_id,
product_id=product_id,
is_delete=0
).first()
retail_price = product_info.retail_price
if add_type == 1:
# Uncheck all other cart items for the user
MallCart.query.filter_by(user_id=user_id, is_delete=0).update({'checked': 0})
# Fetch specification values if available
goods_specification_value = []
if product_info.goods_specification_ids:
goods_specification_value = MallGoodsSpecification.query.filter(
MallGoodsSpecification.goods_id == product_info.goods_id,
MallGoodsSpecification.is_delete == 0,
MallGoodsSpecification.id.in_(product_info.goods_specification_ids.split('_'))
).with_entities(MallGoodsSpecification.value).all()
goods_specification_value = [val[0] for val in goods_specification_value]
# Add new item to the cart
cart_data = MallCart(
goods_id=product_info.goods_id,
product_id=product_id,
goods_sn=product_info.goods_sn,
goods_name=goods_info.name,
goods_aka=product_info.goods_name,
goods_weight=product_info.goods_weight,
freight_template_id=goods_info.freight_template_id,
list_pic_url=goods_info.list_pic_url,
number=number,
user_id=user_id,
retail_price=retail_price,
add_price=retail_price,
goods_specifition_name_value=';'.join(goods_specification_value),
goods_specifition_ids=product_info.goods_specification_ids,
checked=1,
add_time=current_time,
is_fast=1,
is_delete=0
)
db.session.add(cart_data)
db.session.commit()
user,res= get_cart(1)
return jsonify({'success': True, 'data':res })
else:
if not cart_info:
# Add new item to cart if it doesn't exist
goods_specification_value = []
if product_info.goods_specification_ids:
goods_specification_value = MallGoodsSpecification.query.filter(
MallGoodsSpecification.goods_id == product_info.goods_id,
MallGoodsSpecification.is_delete == 0,
MallGoodsSpecification.id.in_(product_info.goods_specification_ids.split('_'))
).with_entities(MallGoodsSpecification.value).all()
goods_specification_value = [val[0] for val in goods_specification_value]
# Add to the cart
cart_data = MallCart(
goods_id=product_info.goods_id,
product_id=product_id,
goods_sn=product_info.goods_sn,
goods_name=goods_info.name,
goods_aka=product_info.goods_name,
goods_weight=product_info.goods_weight,
freight_template_id=goods_info.freight_template_id,
list_pic_url=goods_info.list_pic_url,
number=number,
user_id=user_id,
retail_price=retail_price,
add_price=retail_price,
goods_specifition_name_value=';'.join(goods_specification_value),
goods_specifition_ids=product_info.goods_specification_ids,
checked=1,
add_time=current_time,
is_delete=0
)
db.session.add(cart_data)
else:
# Update existing cart item
if product_info.goods_number < number + cart_info.number:
return jsonify({'success': False, 'message': '库存都不够啦'}), 400
cart_info.retail_price = retail_price
cart_info.number += number
db.session.commit()
user,res= get_cart(0)
return jsonify({'success': True, 'data':res })
except Exception as e:
db.session.rollback() # Rollback in case of any error
return jsonify({'success': False, 'message': str(e)}), 500
addType == 1
的作用是在购物车的“立即购买”场景中使用。
具体解释:
在购物车中,通常有两种商品添加方式:
- 普通加入购物车:即用户在浏览商品时,将商品添加到购物车,但并不立即进行购买。用户可以继续添加其他商品,最后一起结算。
- 立即购买:用户点击“立即购买”时,表示用户只想购买当前商品,不需要保留其他购物车中的商品,直接跳转到结算页面。
addType == 1
的作用就是区分 立即购买 和 普通加入购物车,其处理逻辑如下:
- 当
addType == 1
时:- 表示用户点击了“立即购买”按钮,而非普通添加购物车行为。
- 在代码中,
addType == 1
时,会执行以下操作:- 清空其他已选中的购物车商品:通过
yield _this4.model('cart').where({ is_delete: 0, user_id: userId }).update({ checked: 0 });
语句,将用户购物车中所有商品的checked
状态设置为0
,表示这些商品不会参与结算。 - 将当前商品设为已选中:代码继续将新加入购物车的商品的
checked
状态设置为1
,表示该商品是立即购买的商品,用户可以直接结算这一个商品。
- 清空其他已选中的购物车商品:通过
通过这种方式,可以确保当用户选择“立即购买”时,只会将当前商品加入购物车并标记为已选中,而购物车中的其他商品则不会被选中或参与结算。这与用户普通添加购物车(addType != 1
)的逻辑区分开来。
小结:
addType == 1
用于区分“立即购买”操作。处理逻辑包括取消其他购物车商品的选中状态,并将当前商品标记为选中,以便用户直接购买当前商品。