2订单模块
2.1表的关联
一个用户可以有多个订单 1:n
一个订单中可以有多个商品
一个商品可以在多个订单中
订单----商品 m:n
2.2建立模型
做一下数据迁移
然后可以查看一下,数据库中多了两张表
2.3点击结算按键时,生成订单
在views.py文件下写一下视图函数
@check_login
def add_order(request):
data = {
'status':1,
'msg':'add order success'
}
order = Order()
order.order_id = my_md5(str(uuid.uuid4()))
#用uuid随机生成一窜数字,用md5生成订单号
order.user_id = request.user.id
order.save()
#查询当前用户的购物车
carts = Cart.objects.filter(user_id=request.user.id)
# 如果没有这个购物车
if not carts.exists():
data['status'] = error_code.NO_THIS_CART
data['msg'] = 'no this cart'
# 如果有
else:
total_price = 0
#把购车中的商品加入到商品订单表中
for cart in carts:
# 先判断一下商品是否被选中
if cart.is_select:
ordergoods = OrderGoods()
ordergoods.goods_id = cart.goods_id
ordergoods.order_id = order.id
ordergoods.price = cart.goods.price
ordergoods.num = cart.num
ordergoods.save()
#计算总价
total_price += ordergoods.price * ordergoods.num
order.price = total_price
order.save()
return JsonResponse(data)
然后在url.py文件下去添加path
path('add_order/',add_order,name='add_order'),#添加订单
在购物车cart.html页面,给结算按键添加一个id=“calculate_price”
再添加一个点击事件,写一下js样式
这里使用Ajax请求从后端请求数据
去浏览器添加到订单(不小心添加了两次)
查看一些订单表,数据添加成功
查看一下中间表
2.4 把订单发送到支付宝
进入myalipay.py文件下
进入views.py文件下的add_order视图函数,将myalipay.py文件下手机网站支付功能的代码复制过来进行修改,我们需要得到支付跳转的链接
也就是
去写一下js样式
这里用外部浏览器打开的,没有用虚拟机里的浏览器
由于沙箱调试不是那么稳定,有时可能会出现交易错误,还有可能是公钥的保存错误,存在空格,导致签名验证不通过
接下来,把支付成功的订单的状态码改一下,支付成功后跳到mine页面
这里有一些问题,一般情况下,订单支付后购物车中应该没有这些商品了,所以,提交订单的时候,清空购物车
当然最后这里可以整理一下
将添加到订单和生成支付宝订单分成两个视图函数
@check_login
def add_order(request):
data = {
'status':1,
'msg':'add order success'
}
order = Order()
order.order_id = my_md5(str(uuid.uuid4()))
order.user_id = request.user.id
order.save()
#查询当前用户的购物车
carts = Cart.objects.filter(user_id=request.user.id)
if not carts.exists():
data['status'] = error_code.NO_THIS_CART
data['msg'] = 'no this cart'
else:
total_price = 0
#把购车中的商品加入到商品订单表中
for cart in carts:
if cart.is_select:
ordergoods = OrderGoods()
ordergoods.goods_id = cart.goods_id
ordergoods.order_id = order.id
ordergoods.price = cart.goods.price
ordergoods.num = cart.num
ordergoods.save()
#计算总价
total_price += ordergoods.price * ordergoods.num
#删除购物车中的商品
carts.delete()
order.price = total_price
order.save()
#支付连接发给前端
data['re_url'] = make_alipay_bill(order)
return JsonResponse(data)
#生成支付宝订单
def make_alipay_bill(order):
#手机网站支付 alipay.trade.wap.pay
order_string = alipay.api_alipay_trade_wap_pay(
out_trade_no=order.order_id,
total_amount=order.price,
subject='一些水果',
return_url="http://10.3.134.112:8000/axf/pay_result/",
notify_url="https://example.com/notify" # 可选, 不填则使用默认notify url
)
alipay_url = 'https://openapi.alipaydev.com/gateway.do?'
re_url = alipay_url + order_string
return re_url