zoukankan      html  css  js  c++  java
  • 美多商城之订单模块

    1. 结算订单

        1.1 核心思想:

            查询和展示订单中要结算的信息(收货地址、支付方式、购物车中被勾选的商品信息)

        1.2 实现方式:

     以查询购物车中被勾选的商品信息为例
        redis_cart = redis_conn.hgetall('carts_%s' % user.id)
        redis_selected = redis_conn.smembers('selected_%s' % user.id)
        new_cart_dict = {}
        for sku_id in redis_selected:
               new_cart_dict[int(sku_id)] = int(redis_cart[sku_id])

    2. 提交订单

        2.1 订单数据表

            订单基本信息表、订单商品信息表
            订单基本信息表和订单商品信息表是一对多的关联关系

        2.2 保存订单信息

        # 接收参数
        # 校验参数
        # 保存订单基本信息 OrderInfo(一)
        # 从redis读取购物车中被勾选的商品信息
        # 遍历购物车中被勾选的商品信息
            # 查询SKU信息
          # 判断SKU库存
          # SKU减少库存,增加销量
          # 修改SPU销量
          # 保存订单商品信息 OrderGoods(多)
          # 保存商品订单中总价和总数量
        # 添加邮费和保存订单信息
        # 清除购物车中已结算的商品
        # 响应提交订单结果

        2.3 使用事务保存订单数据

            2.3.1 为什么要使用事务保存订单数据?
                对于订单相关数据表的操作要么一起成功,要么一起失败
            2.3.2 实现方式:
                with transaction.atomic():
              # 显式的开启一次事务,以下这部分代码会在事务中执行
              # 创建保存点
              # 错误回滚事务
              # 正确提交一次事务

        2.4 使用乐观锁并发下单

            2.4.1 为什么要使用乐观锁下单?
                为了保证在出现高并发时,库存和销量不会出错,保证数据安全
            2.4.2 实现方式:
                result = SKU.objects.filter(id=sku_id, stock=origin_stock).update(stock=new_stock, sales=new_sales)
          # 如果下单失败,但是库存足够时,继续下单,直到下单成功或者库存不足为止
          if result == 0:
              continue

    该花的钱要花,该吃的饭要吃。
  • 相关阅读:
    多值参数
    TK图形界面
    匿名函数
    try -catch-finally一些要点
    C#枚举类型转换
    Linux下查看MySQL的安装路径
    linux安装oracle 报错[INS-20802] Oracle Net Configuration Assistant failed 解决办法
    suse-Linux下安装Oracle11g服务器
    window7 下安卓开发环境搭建
    学习Linux最简单的方法
  • 原文地址:https://www.cnblogs.com/chao666/p/12263712.html
Copyright © 2011-2022 走看看