博客目录:
......
十、基于Django+mysql的点餐系统设计-第十篇(H5手机移动端点餐:登录)
十一、基于Django+mysql的点餐系统设计-第十一篇(H5手机移动端点餐:购物车操作)
十二、基于Django+mysql点餐系统设计-第十二篇(移动端:会员下单处理)
本章源码下载地址:https://github.com/hopeSuceess/testorder/tree/testorder_20220622_01
上一篇讲了购物车操作,紧接着上一篇继续讲新增购物车后,这些餐品的下单操作。首先在Model层定义数据库表,在myadmin/models.py中编写如下代码:
# 订单模型
class Orders(models.Model):
shop_id = models.IntegerField() # 店铺id号
member_id = models.IntegerField() # 会员id
user_id = models.IntegerField() # 操作员id
money = models.FloatField() # 金额
status = models.IntegerField(default=1) #订单状态:1进行中/2无效/3已完成
payment_status = models.IntegerField(default=1) # 支付状态:1未支付/2已支付/3已退款
create_at = models.DateTimeField(default=datetime.now) # 创建时间
update_at = models.DateTimeField(default=datetime.now) # 修改时间
class Meta:
db_table = "orders" # 更改表名
# 订单详情模型
class OrderDetail(models.Model):
order_id = models.IntegerField() #订单id
# product_id = models.IntegerField() # 菜品id
product = models.ForeignKey('Product', on_delete=models.CASCADE) #多对一
product_name = models.CharField(max_length=50) # 菜品名称
price = models.FloatField() # 单价
quantity = models.IntegerField() # 数量
status = models.IntegerField(default=1) #状态:1正常/9删除
class Meta:
db_table = "order_detail" # 更改表名
# 支付信息模型
class Payment(models.Model):
order_id = models.IntegerField() #订单id号
member_id = models.IntegerField() #会员id
money = models.FloatField() #支付金额
type = models.IntegerField() # 付款方式:1会员付款/2收银收款
bank = models.IntegerField(default=1) #收款银行渠道:1微信/2余额/3现金/4支付宝
status = models.IntegerField(default=1) #支付状态:1未支付2/已支付/3已退款
create_at = models.DateTimeField(default=datetime.now) # 创建时间
update_at = models.DateTimeField(default=datetime.now) # 修改时间
class Meta:
db_table = "payment" # 更改表名
定义完了数据库表,开始编写路由控制器的逻辑,在mobile/urls.py中先定义加载移动端订单页的路由逻辑
# 订单处理
path('orders/add', index.addOrders, name="mobile_addorders"), # 加载移动端订单页
定义完了路由逻辑,现在开始写view层的实现逻辑,在mobile/views/cart.py中编写addOrders函数
def addOrders(request):
"""移动端下单表单页"""
# 尝试从session中获取名字为cartlist的购物车信息,若没有返回{}
cartlist = request.session.get('cartlist', {})
total_money = 0 # 初始化一个总金额
# 遍历购物车中的菜品并累加总金额
for vo in cartlist.values():
total_money += vo['num']*vo['price']
request.session['total_money'] = total_money
return render(request, "mobile/addOrders.html")
view层实现的逻辑要渲染到前端,现在对template层进行逻辑实现,templates/mobile/addOrders.html中的代码如下:
{% extends 'mobile/base.html' %}
{% load static %}
{% block mainbody %}
<!--头部-->
<header>
<div class="header">
<h1>提交订单</h1>
<a href="javascript:window.history.back();" class="return"><i></i></a>
</div>
</header>
<! --内容区-->
<article class="main-container add-product">
<!--产品-->
<div class="list-content cartlist order-Pro">
<ul>
{% for vo in request.session.cartlist.values %}
<li class="line">
<a href="#"><div class="pro-img"><img src="{% static 'uploads/product/' %}{{ vo.cover_pic }}" alt=""></div></a>
<div class="pro-con"><h3>{{ vo.name }}</h3><b>¥{{ vo.price }}</b>×{{ vo.num }}</div>
</li>
{% endfor %}
</ul>
</div>
<!--支付方式-->
<div class="order-Delivery line" id="orderPays">
<p>支付方式</p>
<ol class="FilterContentList">
</ol>
<div class="list">
<ul class="line">
<li class="select" bank="4"><i class="icon-alipay"></i>支付宝支付<em class="icon-correct"></em></li>
<li bank="1"><i class="icon-weixinpay"></i>微信支付<em class="icon-correct"></em></li>
</ul>
</div>
</div>
<br><br>
</article>
<!---底部栏目-->
<footer>
<div class="button"><button onclick="doSubmit()">提交订单</button></div>
<h4>实付款:¥{{ request.session.total_money }}</h4>
</footer>
{% endblock %}
{% block myjavascript %}
<script>
//支付方式上的单选按钮点击效果
$("ul.line li").click(function () {
$("ul.line li").removeClass("select");
$(this).addClass("select");
});
//执行订单提交操作函数
function doSubmit(){
{#bid = $("ul.line li.select").attr("bank"); // 获取支付方式#}
{#window.location.href="{% url 'mobile_doaddorders' %}?bank="+bid;#}
window.location.href = "{% url 'mobile_doaddorders' %}";
}
</script>
{% endblock %}
好了,现在启动工程调试一下,访问http://127.0.0.1:8000/mobile/,选择菜品后,点击"去结算",跳到了"提交订单"页
继续往下写,在提交订单页提交订单,这里涉及了多个数据库表的插入:订单信息表、支付表、订单详情表,这三表里的信息在后续的查询中都会用到。
在mobile/views/index.py中实现doAddOrders函数
def doAddOrders(request):
'''执行移动端下单操作'''
try:
#执行订单信息的添加
od = Orders()
od.shop_id = request.session['shopinfo']['id']
od.member_id = request.session['mobileuser']['id']
od.user_id = 0
od.money = request.session['total_money']
od.status = 1 #订单状态:1进行中/2无效/3已完成
od.payment_status = 2 #支付状态:1未支付/2已支付/3已退款
od.create_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
od.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
od.save()
# 执行支付信息添加
op = Payment()
op.order_id = od.id #订单id号
op.member_id = request.session['mobileuser']['id']
op.type = 2 #1会员付款/2收银收款
op.bank = request.GET.get("bank", 3) # 收款银行渠道:1微信/2余额/3现金/4支付宝
op.money = request.session['total_money']
op.status = 2 # 支付状态:1未支付/2已支付/3已退款
op.create_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
op.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
op.save()
# 执行订单详情的添加
cartlist = request.session.get("cartlist", {}) # 获取购物车中的菜品信息
# 遍历购物车中的菜品并添加到订单详情中
for item in cartlist.values():
ov = OrderDetail()
ov.order_id = od.id # 订单id
ov.product_id = item['id'] # 菜品id
ov.product_name = item['name'] # 菜品名称
ov.price = item['price'] # 单价
ov.quantity = item['num'] #数量
ov.status = 1 # 状态:1正常/9删除
ov.save()
del request.session['cartlist']
del request.session['total_money']
except Exception as err:
print(err)
return render(request,"mobile/orderinfo.html", {"order": od})
下面实现template层的逻辑,在templates/mobile目录下创建orderinfo.html,orderinfo.html中的代码逻辑如下:
#! -*- coding: UTF-8 -*-
#@Time : 2022/2/3 18:17
#@Author : 中国
#@File : index.py
#@Software : PyCharm
from datetime import datetime
from django.http import HttpResponse
from django.shortcuts import redirect, render
from django.urls import reverse
from myadmin.models import Category, Product, Shop, Member, Payment, OrderDetail, Orders
def index(request):
# # 接收到前端的处理逻辑,返回”欢迎来到大堂点餐!“
# return HttpResponse('欢迎来到手机移动端点餐页面!')
'''移动端首页'''
#获取并判断当前店铺信息
shopinfo = request.session.get("shopinfo", None)
if shopinfo is None:
return redirect(reverse("mobile_shop")) # 重定向到店铺选择页
# 获取当前店铺下的菜品类别和菜品信息
clist = Category.objects.filter(shop_id=shopinfo['id'],status=1)
productlist = dict()
for vo in clist:
plist = Product.objects.filter(category_id=vo.id, status=1)
productlist[vo.id] = plist
context = {'categorylist': clist, 'productlist': productlist.items(), 'cid': clist[0]}
return render(request, "mobile/index.html", context)
def shop(request):
'''呈现店铺选择页面'''
context = {'shoplist': Shop.objects.filter(status=1)}
return render(request, 'mobile/shop.html', context)
def selectShop(request):
'''执行店铺选择'''
# 获取店铺id号,通过店铺id号获取店铺信息
sid = request.GET['sid']
ob = Shop.objects.get(id=sid)
# 将店铺信息放入到seession中
request.session['shopinfo'] = ob.toDict()
return redirect(reverse('mobile_index'))
def register(request):
'''加载注册/登录页面'''
return render(request, "mobile/register.html")
def doRegister(request):
'''执行注册/登录'''
# 验证短信码
verifycode = "1234" # request.session['verifycode']
code = request.POST['code']
if verifycode != code:
context = {'info': '验证码错误'}
return render(request, "mobile/register.html", context)
try:
#根据手机号码获取当前会员信息
member = Member.objects.get(mobile=request.POST['mobile'])
except Exception as err:
# 此处可以执行当前会员注册(添加)
ob = Member()
ob.nickname = "顾客" #默认会员名称
ob.avatar = "moren.png" # 默认头像
ob.mobile = request.POST['mobile'] # 手机号码
ob.status = 1
ob.create_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
ob.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
ob.save()
member=ob
# 检查当前会员状态
if member.status == 1:
# 将当前会员信息转换成字典格式并存放到seession中
request.session['mobileuser'] = member.toDict()
# 重定向到首页
return redirect(reverse("mobile_index"))
else:
context = {"info": '此账号信息禁用'}
return render(request, "mobile/register.html", context)
def addOrders(request):
'''移动端下单表单页'''
# 尝试从session中获取名字为cartlist的购物车信息,若没有返回{}
cartlist = request.session.get('cartlist', {})
total_money = 0 # 初始化一个总金额
# 遍历购物车中的菜品并累加总金额
for vo in cartlist.values():
total_money += vo['num']*vo['price']
request.session['total_money'] = total_money # 放进session
return render(request,"mobile/addOrders.html")
def doAddOrders(request):
'''执行移动端下单操作'''
try:
#执行订单信息的添加
od = Orders()
od.shop_id = request.session['shopinfo']['id']
od.member_id = request.session['mobileuser']['id']
od.user_id = 0
od.money = request.session['total_money']
od.status = 1 #订单状态:1进行中/2无效/3已完成
od.payment_status = 2 #支付状态:1未支付/2已支付/3已退款
od.create_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
od.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
od.save()
# 执行支付信息添加
op = Payment()
op.order_id = od.id #订单id号
op.member_id = request.session['mobileuser']['id']
op.type = 2 #1会员付款/2收银收款
op.bank = request.GET.get("bank", 3) # 收款银行渠道:1微信/2余额/3现金/4支付宝
op.money = request.session['total_money']
op.status = 2 # 支付状态:1未支付/2已支付/3已退款
op.create_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
op.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
op.save()
# 执行订单详情的添加
cartlist = request.session.get("cartlist", {}) # 获取购物车中的菜品信息
# 遍历购物车中的菜品并添加到订单详情中
for item in cartlist.values():
ov = OrderDetail()
ov.order_id = od.id # 订单id
ov.product_id = item['id'] # 菜品id
ov.product_name = item['name'] # 菜品名称
ov.price = item['price'] # 单价
ov.quantity = item['num'] #数量
ov.status = 1 # 状态:1正常/9删除
ov.save()
del request.session['cartlist']
del request.session['total_money']
except Exception as err:
print(err)
return render(request,"mobile/orderinfo.html", {"order": od})
运行工程,点击提交订单,如下图
会员下单处理写完了,总体来说也是增删改查,下一篇讲订单的展示