阿语python美多商城-订单-提交订单之第8.2.2节保存订单基本信息和订单商品信息...

news/2024/5/18 15:27:44 标签: web, cookie, django, nginx, 数据库

1. 提交订单接口设计和定义

1.请求方式

选项方案
请求方法POST
请求地址/orders/commit/

2.请求参数:JSON

参数名类型是否必传说明
address_idint用户地址编号
pay_methodint用户支付方式

3.响应结果:JSON

字段说明
code状态码
errmsg错误信息
order_id订单编号

4.后端接口定义

class OrderCommitView(LoginRequiredJSONMixin, View):
    """订单提交"""

    def post(self, request):
        """保存订单信息和订单商品信息"""
        pass

提示:

  • 订单数据分为订单基本信息和订单商品信息,二者为一对多的关系。

  • 保存到订单的数据是从Redis购物车中的已勾选的商品信息。

2. 保存订单基本信息

class OrderCommitView(LoginRequiredJSONMixin, View):
    """提交订单"""

    def post(self, request):
        """保存订单信息和订单商品信息"""
        # 获取当前要保存的订单数据
        json_dict = json.loads(request.body.decode())
        address_id = json_dict.get('address_id')
        pay_method = json_dict.get('pay_method')
        # 校验参数
        if not all([address_id, pay_method]):
            return http.HttpResponseForbidden('缺少必传参数')
        # 判断address_id是否合法
        try:
            address = Address.objects.get(id=address_id)
        except Exception:
            return http.HttpResponseForbidden('参数address_id错误')
        # 判断pay_method是否合法
        if pay_method not in [OrderInfo.PAY_METHODS_ENUM['CASH'], OrderInfo.PAY_METHODS_ENUM['ALIPAY']]:
            return http.HttpResponseForbidden('参数pay_method错误')

        # 获取登录用户
        user = request.user
        # 生成订单编号:年月日时分秒+用户编号
        order_id = timezone.localtime().strftime('%Y%m%d%H%M%S') + ('%09d' % user.id)
        # 保存订单基本信息 OrderInfo(一)
        order = OrderInfo.objects.create(
            order_id=order_id,
            user=user,
            address=address,
            total_count=0,
            total_amount=Decimal('0'),
            freight=Decimal('10.00'),
            pay_method=pay_method,
            status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'] if pay_method == OrderInfo.PAY_METHODS_ENUM['ALIPAY'] else
            OrderInfo.ORDER_STATUS_ENUM['UNSEND']
        )
        pass

3. 保存订单商品信息

class OrderCommitView(LoginRequiredJSONMixin, View):
    """提交订单"""

    def post(self, request):
        """保存订单信息和订单商品信息"""
        # 获取当前保存订单时需要的信息
        ......

        # 保存订单基本信息 OrderInfo(一)
        ......

        # 从redis读取购物车中被勾选的商品信息
        redis_conn = get_redis_connection('carts')
        redis_cart = redis_conn.hgetall('carts_%s' % user.id)
        selected = redis_conn.smembers('selected_%s' % user.id)
        carts = {}
        for sku_id in selected:
            carts[int(sku_id)] = int(redis_cart[sku_id])
        sku_ids = carts.keys()

        # 遍历购物车中被勾选的商品信息
        for sku_id in sku_ids:
            # 查询SKU信息
            sku = SKU.objects.get(id=sku_id)
            # 判断SKU库存
            sku_count = carts[sku.id]
            if sku_count > sku.stock:
                return http.JsonResponse({'code': RETCODE.STOCKERR, 'errmsg': '库存不足'})

            # SKU减少库存,增加销量
            sku.stock -= sku_count
            sku.sales += sku_count
            sku.save()

            # 修改SPU销量
            sku.goods.sales += sku_count
            sku.goods.save()

            # 保存订单商品信息 OrderGoods(多)
            OrderGoods.objects.create(
                order=order,
                sku=sku,
                count=sku_count,
                price=sku.price,
            )

            # 保存商品订单中总价和总数量
            order.total_count += sku_count
            order.total_amount += (sku_count * sku.price)

        # 添加邮费和保存订单信息
        order.total_amount += order.freight
        order.save()

        # 清除购物车中已结算的商品
        pl = redis_conn.pipeline()
        pl.hdel('carts_%s' % user.id, *selected)
        pl.srem('selected_%s' % user.id, *selected)
        pl.execute()

        # 响应提交订单结果
        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '下单成功', 'order_id': order.order_id})

http://www.niftyadmin.cn/n/739715.html

相关文章

阿语python美多商城-支付-对接支付宝系统之第9.2.2节保存订单支付结果

1. 支付结果数据说明用户订单支付成功后,支付宝会将用户重定向到 http://www.meiduo.site:8000/payment/status/,并携带支付结果数据。参考统一收单下单并支付页面接口:https://docs.open.alipay.com/270/alipay.trade.page.pay提示&#xff…

阿语python美多商城-支付-对接支付宝系统之第9.2.1节订单支付功能

今天更新完成就已经把所有的多美商场的文档更新完成,要是想看视频的可以去b站关注:阿语学 订单支付功能提示:订单支付触发页面:《order_success.html》 和 《user_center_order.html》我们实现订单支付功能时,只需要向…

阿语python美多商城-性能优化-页面静态化之第10.2.2节Django实现MySQL读写分离

Django实现MySQL读写分离1. 增加slave数据库的配置DATABASES {default: { # 写(主机)ENGINE: django.db.backends.mysql, # 数据库引擎HOST: 192.168.103.158, # 数据库主机PORT: 3306, # 数据库端口USER: itcast, # 数据库用户名PASSWORD: 123456, # 数…

阿语python美多商城-性能优化-页面静态化之第10.1.1节首页广告页面静态化

首页广告页面静态化思考:美多商城的首页访问频繁,而且查询数据量大,其中还有大量的循环处理。问题:用户访问首页会耗费服务器大量的资源,并且响应数据的效率会大大降低。解决:页面静态化1. 页面静态化介绍1…

阿语python美多商城-支付-评价订单商品之第9.3.1节评价订单商品

评价订单商品1. 展示商品评价页面1.请求方式选项方案请求方法GET请求地址/orders/comment/2.请求参数:查询参数参数名类型是否必传说明order_idint是订单编号3.响应结果:HTMLgoods_judge.html4.后端接口定义和实现class OrderCommentView(LoginRequiredM…

阿语python美多商城-性能优化-MySQL读写分离之第10.2.1节MySQL主从同步

MySQL主从同步1. 主从同步机制1.主从同步介绍和优点在多台数据服务器中,分为主服务器和从服务器。一台主服务器对应多台从服务器。主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据。主服务器写入数据后&#…

阿语python美多商城-支付-评价订单商品之第9.3.2节详情页展示评价信息

详情页展示评价信息1.请求方式选项方案请求方法POST请求地址/comments/(?P<sku_id>\d)/2.请求参数&#xff1a;查询参数参数名类型是否必传说明sku_idint是商品SKU编号3.响应结果&#xff1a;JSON字段说明code状态码errmsg错误信息comment_list[ ]评价列表username发表评…

阿语python美多商城-性能优化-页面静态化之第10.1.2节首页广告页面静态化

商品详情页面静态化提示&#xff1a;商品详情页查询数据量大&#xff0c;而且是用户频繁访问的页面。类似首页广告&#xff0c;为了减少数据库查询次数&#xff0c;提升页面响应效率&#xff0c;我们也要对详情页进行静态化处理。静态化说明&#xff1a;首页广告的数据变化非常…