Django设计的订单相关的表如下所示:
由于每一个订单中的商品种类与数量都不定,因此单独将订单商品提出为一个表,为一对多的关系。
订单的提交
从购物车页面提交是通过form形式提交的,在checkbox元素中定义参数value并设为对应的商品id,则传递到后端的为一个由选中商品id组成的列表,在后端中的业务流程为:
①获取参数并校验,表单中的checkbox只有被选中时其value才会被提交,若不选中则不提交,若有多个name相同,则使用POST.getlist获取到一个由多个value(checkbox的value)组成的列表;
②从redis中获取该用户购物车的信息,从mysql中获取商品id对应的信息,计算数量与总价格,并将其动态添加到查询到的sku模型类实例中;
③处理运费与实付款;
④组织参数,渲染订单创建的页面。
订单的提交并不复杂,其中重点在于如何将选中的商品id传入后端,以及传入订单创建页面的参数选择。
订单的创建
订单创建的前端页面
共分为三部分:
①收货地址的选择,此处将默认收货地址默认选中,可以在该用户已有的收货地址中选择,也可以跳转到收货地址的编辑页面;
②支付方式的选择,因为此处只做了支付宝的接口因此其他支付方式暂时无法支付,但是可以提交;
③将要提交的商品按条目显示(在订单提交后端中传入),并显示其数量、单价、小计、单位等信息,显示总价、运费、总数量信息;
注:①在订单创建页面不使用form进行post提交,使用ajax post提交,订单创建成功时跳转到订单页面,创建失败时不跳转,显示后端传递的具体信息;
②由于订单中的信息是从购物车中查询到的,这个信息可能与真实情况不符(如商品下架,库存卖完等),因此在订单创建时必须要进行多次校验之后才可以确定订单是否可以创建成功。
订单创建的参数传递
从购物车提交至订单创建页面再到订单创建后端,其传递选中的商品都是通过传递sku_id然后通过查询redis中的用户购物车信息来进行的(并不直接传递具体的商品信息),但由于订单创建功能不与购物车页面交互,因此将被选中商品的sku_ids重构为一个字符串,直接从购物车传递到订单创建页面,并在订单创建页面中动态添加一个属性为sku_ids(此方法常用于在页面中获取变量)并使用ajax post请求发回后端,在订单创建流程中使用。
订单创建的注意事项
(1)关于订单提交失败:由于可能因为各种原因导致的订单无法完成,但订单