文章目录
- 订单结算页面
- 重点:提交订单
- 创建订单数据表
- 注意事项:
- 订单表介绍
- 提交订单数据:
- 保存订单中的数据处理操作(业务逻辑复杂,代码不难,前面都写过)
- 首先是数据验证和加载
- 接着是具体得 业务处理
- 构建订单对象时,我们通过 当前时间,创建一个 订单号。
- 下面是业务处理代码,我们需要使用到mysql事务
- 首先说下django自动提交
- 调用原始的方法,手动管理事务
订单结算页面
- 位置:在购物车中选择好商品之后,就 可以点击 去结算按钮,进入到这个结算页面
- 这里最关键的一点是:
- 涉及到金钱的交易,要保证数据的准确性!
- 我们不能相信前端 传递过来的 商品价格信息,而是应该自己根据redis当中勾选的商品id,进行计算价格。
- 其他的并没有什么好说的,前端需要的数据从后端传递过去即可
- (1)用户地址信息
- (2)支付方式选择
- 支付方式,我们 直接选择是0,1就可以代表那种支付方式了,方法很多
- (3)商品信息
- (4)运费:这是一个复杂的地方(但是我们没有运费系统,所以不管买啥都是,运费都是默认十元)
重点:提交订单
创建订单数据表
注意事项:
- (1)订单号不再采用数据库自增主键,而是由后端生成。
- (2)一个订单中可以有多个商品信息,订单基本信息和订单商品信息是一对多的关系
订单表介绍
- 一般都是订单完成之后才有的商品评论,这里很符合实际
提交订单数据:
- 只需要(1)订单地址
- (2)支付方式
- 其余的均可以自己通过后端获取。 比如总价格,购买哪些商品,都可以从数据表,或者是redis当中得到。
- 点击提交订单时面就是这个地址,看到我们只传递了两个数据。
保存订单中的数据处理操作(业务逻辑复杂,代码不难,前面都写过)
- (1) 创建订单基本信息对象
- (2) 查询选中的购物车数据
- (3) 查询sku商品对象
- 3.1 判断商品库存,不足则提示
- 3.2 库存足够继续执行
- 3.3 修改商品的库存,销量
- 3.4 创建订单商品表对象
- (4) 删除购物车种选中的商品数据
首先是数据验证和加载
# 接收
dict1 = json.loads(request.body.decode())
address_id = dict1.get('address_id')
pay_method = dict1.get('pay_method')
pay_method = int(pay_method)
# 验证
if not all([address_id, pay_method]):
return http.JsonResponse({'code': RETCODE.PARAMERR, 'errmsg': '参数不完整'})
# 收货地址
try:
address = Address.objects.get(pk=address_id, is_delete=False, user_id=request.user.id)
except:
return http.JsonResponse({'code': RETCODE.PARAMERR, 'errmsg': '收货地址无效'})
# 支付方式
if pay_method not in [1, 2]:
return http.JsonResponse({'code': RETCODE.PARAMERR, 'errmsg': '支付方式无效'})
# 处理(业务最多)
user = request.user
now = datetime.now()
# 1.查询购物车选中的商品
redis_cli = get_redis_connection('cart')
# 下面是从redis中拿出商品数据
# 从hash中读取商品编号、数量
cart_dict_bytes = redis_cli.hgetall('cart%d' % request.user.id)
cart_dict_int = {int(sku_id): int(count) for sku_id, count in cart_dict_bytes.items()}
# 从set中读取选中的商品编号
cart_selected_bytes = redis_cli.smembers('selected%d' % request.user.id)
cart_selected_int = [int(sku_id) for sku_id in cart_selected_bytes]
接着是具体得 业务处理
构建订单对象时,我们通过 当前时间,创建一个 订单号。
下面是业务处理代码,我们需要使用到mysql事务
- 因为商品库存等的判断,以及订单对象的创建,必须是同时成功,同时失败的。我们需要使用事务。
- 明确: django本身不提供事务功能! 必须是使用的数据库具有事务功能。 本身上django提供的事务管理函数,还是调用数据库底层的接口方法。
- django中关于mysql事务的文档
首先说下django自动提交
这就是我们不需要自己手动commit提交数据,django会帮我们管理。
调用原始的方法,手动管理事务
- 开启事务,我们需要使用:
后面这里的逻辑还要涉及 悲观锁乐观锁, 事务隔离级别。先到这里,后续接着讲。