微信小程序商城

购物车添加逻辑

@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 的作用是在购物车的“立即购买”场景中使用。

具体解释:

在购物车中,通常有两种商品添加方式:

  1. 普通加入购物车:即用户在浏览商品时,将商品添加到购物车,但并不立即进行购买。用户可以继续添加其他商品,最后一起结算。
  2. 立即购买:用户点击“立即购买”时,表示用户只想购买当前商品,不需要保留其他购物车中的商品,直接跳转到结算页面。

addType == 1 的作用就是区分 立即购买普通加入购物车,其处理逻辑如下:

  • addType == 1
    • 表示用户点击了“立即购买”按钮,而非普通添加购物车行为。
    • 在代码中,addType == 1 时,会执行以下操作:
      1. 清空其他已选中的购物车商品:通过 yield _this4.model('cart').where({ is_delete: 0, user_id: userId }).update({ checked: 0 }); 语句,将用户购物车中所有商品的 checked 状态设置为 0,表示这些商品不会参与结算。
      2. 将当前商品设为已选中:代码继续将新加入购物车的商品的 checked 状态设置为 1,表示该商品是立即购买的商品,用户可以直接结算这一个商品。

通过这种方式,可以确保当用户选择“立即购买”时,只会将当前商品加入购物车并标记为已选中,而购物车中的其他商品则不会被选中或参与结算。这与用户普通添加购物车(addType != 1)的逻辑区分开来。

小结:

addType == 1 用于区分“立即购买”操作。处理逻辑包括取消其他购物车商品的选中状态,并将当前商品标记为选中,以便用户直接购买当前商品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值