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