Python服务器运维笔记:第三章电商实战 - 3.1.4.订单功能

前言:本文是学习网易微专业的《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_priceDecimal类型,用其他类型会有精度问题

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 订单创建流程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章