前言:本文是學習網易微專業的《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 訂單創建流程