百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

基于Django+mysql点餐系统设计-第十二篇(移动端会员下单处理)

toyiye 2024-06-06 22:11 12 浏览 0 评论


博客目录:

......

十、基于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})



    运行工程,点击提交订单,如下图

  会员下单处理写完了,总体来说也是增删改查,下一篇讲订单的展示


#头条创作挑战赛#

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码