前言:本文是学习网易微专业的《python全栈工程师》 中的《服务器运维开发工程师》专题的课程笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 订单创建流程
- 订单系统模型关系
二、详情解读
2.1.订单创建流程
创建购物车代码:
# -*- coding=utf-8 -*-
import time, math, datetime
from flask import current_app, render_template, redirect, request, jsonify, url_for
from flask_login import current_user, login_required
from xp_mall.extensions import db,csrf
from xp_mall.member import member_module
from xp_mall.member.cart import empty
from xp_mall.forms.member import AddressForm
from xp_mall.models.order import Order, OrderGoods, Cart, Logistics
from xp_mall.utils import get_pay_obj
@member_module.route('/create_order', methods=['get', 'post'])
def create_order():
'''
订单创建
:return:
'''
cart_list = Cart.query.filter_by(user_id=current_user.user_id).all()
total_price = get_total_price(cart_list)
form = AddressForm()
if form.validate_on_submit() and cart_list:
order = Order(
order_no = get_order_no(),
subject = "平哥商城订单",
total_price = total_price,
status = 0,
buyer = current_user.user_id,
payment = form.payment.data,
createTime=datetime.datetime.now()
)
logistics = Logistics(
receiver = form.receiver.data,
mobile = form.mobile.data,
address = form.address.data,
status = ""
)
# 记录订单商品信息
# 商品价格是变动的,需要记录下单时价格,以备核对
[ order.goods.append(OrderGoods(**{
"goods_id":cart.goods.goods_id,
"price":cart.goods.price,
"order_price":cart.goods.price,
"order_active":"",
"amount":cart.amount,
"discount":100
})) for cart in cart_list]
order.logistics.append(logistics)
try:
empty()
db.session.add(order)
db.session.commit()
except Exception as e:
db.session.rollback()
else:
return redirect(url_for(".pay_order", order_no=order.order_no))
return render_template('member/order/buy.html', form=form, cart_list=cart_list, total_price=total_price)
需要注意的问题:
不能以前端页面显示的总价格做为最终的付款依据,要以后台计算的为准。因为前端的数据可以被恶意修改后提交。
对于实体商品订单,由于需要进行物流传送,所以还需要确认收货地址。通常会员可以预先设置多个地址备选择使用。
虚拟商品不用物流,但是需要后续操作,比如充值。
订单支付需要选择支付方式,又如常见的支付宝渠道,微信渠道,以及会员 储值型消费。
2.2.订单模型
2.2.1.订单模型 - 关联关系
2.2.2.订单模型 - orders
表
Column | Data type | 说明 |
---|---|---|
id | INTEGER | |
order_no | VARCHAR(50) | 订单编号,用于支付时,订单识别 |
subject | VARCHAR(100) | 订单说明,本次订单内容 |
total_price | FLOAT/Numeric | 订单金额 |
status | VARCHAR(10) | 订单状态(等待支付,等待发货,等待收货,已收货) |
seller | VARCHAR(50) | 卖家账号(多商户商城) |
buyer | VARCHAR(50) | 买家账号 |
createTime | DATATIME | 订单创建时间 |
payment | VARCHAR(30) | 支付方式 |
paytime | DATETIME | 支付时间 |
说明:
1.order_no
为了不重复,一般用时间戳生成
2.total_price
用Decimal
类型,用其他类型会有精度问题
2.2.3.订单模型 - orders_goods
表
Column | Data type | 说明 |
---|---|---|
id | INTEGER | |
goods_id | INTEGER | 订单关联商品 |
order_id | INTEGER | 与order表关联 |
price | FLOAT/Numeric | 订单创建时商品价格 |
order_price | FLOAT/Numeric | 订单创建实际价格 |
order_active | INTEGER | 订单参与活动关联键 |
amount | INTEGER | 订单商品数量 |
discount | FLAOT/Numeric | 订单折扣计算 |
一份订单可以包含多件商品,每一件商品也可以包含在多个订单内。订单与商品的关系,是多对多关系,需要中间表order_goods
关联。
2.2.4.订单模型 - logistics
表
Column | Data type | 说明 |
---|---|---|
id | INTEGER | |
order_id | INTEGER | 关联订单 |
receiver | VARCHAR(20) | 收件人 |
mobile | VARCHAR(30) | 联系电话 |
address | VARCHAR(100) | 地址 |
status | VARCHAR(100) | 物流状态 |
2.3.开发任务
- 增加一个用户地址管理功能
- 在订单生成页面使用可选地址列表
三、课程小结
- 01 订单模型
- 02 订单创建流程