龙空技术网

基于Django+mysql的点餐系统设计-第十二篇(H5:下单操作)重写

通过技术看生活 145

前言:

如今咱们对“ajax提交list集合”大体比较关切,我们都需要剖析一些“ajax提交list集合”的相关资讯。那么小编也在网摘上汇集了一些关于“ajax提交list集合””的相关知识,希望各位老铁们能喜欢,我们一起来了解一下吧!

博客目录:

......

十、基于Django+mysql的点餐系统设计第十篇(H5手机移动端点餐:登录)

十一、基于Django+mysql的点餐系统设计-第十一篇(H5手机移动端点餐:购物车操作)

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

十二、基于Django+mysql的点餐系统设计-第十二篇(H5:下单操作)重写

本章源码下载地址:

  前段时间忙其他事断更了两个多月,现在终于有精力继续写博客了。另外,电脑坏了,换了块主板后,做了系统重置,python、mysql、pychram、github、sourcetree等工具又重新进行了环境配置、设置,好麻烦。遇到了一些问题,还好都解决了。

  言归正传,现在开始讲下单操作。当用户将选好的餐品置于购物车,在购物车点击"去结算",页面跳转到"提交订单"页面。"提交订单"页面显示餐品信息、价格、数量和总价。正常情况下,可以调支付方式的接口,进行支付宝支付或者微信支付。但是,为了方便,这里点击"提交订单",直接进行数据插入数据库的处理,同时,前端页面跳转到"订单处理"页面,订单处理页面提示"下单成功!",并展示订单号、消费金额。点击"继续购物",跳转到餐品选择首页。

  首先说加载移动端订单页,在首页点击"去结算",页面跳到提交订单页。在mobile/urls.py中添加加载移动端订单页的路由:

    # 订单处理    path('orders/add', index.addOrders, name="mobile_addorders"), # 加载移动端订单页

  按照顺序,页面的请求会从路由跳转到具体的实现方法。加载订单的方法路径为mobile/views/index.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 # 放进session    return render(request,"mobile/addOrders.html")

  解释下上面的代码逻辑:页面在点击去结算时触发了orders/add路由,路由将代码逻辑处理抛给了addOrders函数。addOrders函数是怎么处理的呢?

在缓存中获取购物车信息cartlist,如果cartlist不在缓存中,返回空;若缓存中存在cartlist,则for循环遍历cartlist,将每一个餐品的数目和价格相乘,并累加得出的总额放到total_money变量中,然后将total_money放到缓存中。每个餐品的数目和价格以及餐品总额都得到了,那么就将后端的处理逻辑传给前端吧。

  在templates/mobile/addOrders.html中进行后端代码逻辑的接收。在addOrders.html中首选将每个餐品的图片名称、价格、数目显示出来。怎么显示呢?大家思考两分钟。

  显示的逻辑是获取购物车(cartlist)的信息,然后对cartlist进行遍历,将每个餐品的图片名称、价格、数目遍历出来,如下图:

<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>

  接下来,完善总额和提交订单的逻辑。

<footer>

<div class="button"><button onclick="doSubmit()">提交订单</button></div>

<h4>实付款:¥{{ request.session.total_money }}</h4>

</footer>

  通过在缓存中获取total_money来展现付款总额,提交订单的操作通过ajax触发doSubmit()方法。doSubmit逻辑如下:

//执行订单提交操作函数

function doSubmit(){

window.location.href = "{% url 'mobile_doaddorders' %}";

}

  通过doSubmit()方法的执行,页面就可以进行订单的处理了。doSubmit()方法中要跳转的链接"mobile_doaddorders"引出了订单处理的逻辑。

首先,通过"mobile_doaddorders"找到orders/doadd路由,该路由的处理逻辑在哪呢?它在mobile/views/index.py下,具体实现逻辑如下:

    path('orders/doadd', index.doAddOrders, name="mobile_doaddorders"), #执行移动端下单操作

  通过路由跳转到处理订单处理操作的后端方法index.doAddOrders中,由于没有对接支付宝支付和微信支付的接口,在这里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})

  通过看上面doAddOrders函数处理逻辑可知,订单信息、支付信息、订单详情三个数据库中插入的数据,大部分来源于缓存。当将缓存中的数据插入到数据库中后,将缓存中的cartlist、total_money。至此,订单处理的逻辑处理完了。

后端将订单处理完后,前端页面该怎么显示呢?后端逻辑处理完后,将处理结果渲染到mobile/orderinfo.html页面,并且带上订单信息也就是Orders数据库的数据。看下面mobile/orderinfo.html页面的代码逻辑:

{% extends 'mobile/base.html' %}

{% 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 loginContent">

<h3>下单成功!</h3>

<h4>订单号:{{ order.id }} 消费金额:{{ order.money }} </h4>

<div class="button"><button onclick="location.href='{% url 'mobile_index' %}'">继续购物</button></div>

</article>

{% endblock %}

  分析一下mobile/orderinfo.html页面的代码:1、返回到上一步调用了现成的方法 javascript:window.history.back(); 2、将订单号和消费金额显示出来,因为后端已经将订单信息赋予给order传给前端了,所以直接获取订单信息的id号和金额就可以了 <h4>订单号:{{ order.id }} 消费金额:{{ order.money }} </h4> ;

3、如果在页面点击继续购物的话,会跳转到餐品首页。怎么实现的逻辑呢?当用户点击"继续购物"按钮时,触发了跳转链接,‘mobile_index’将页面引导到路由页面,MTV一整套循环后,跳转到了移动端餐品首页 <div class="button"><button onclick="location.href='{% url 'mobile_index' %}'">继续购物</button></div>

到这里,H5手机移动端点餐:下单操作讲完了。在下单操作快讲完的时候,发现移动端下单操作讲过,时隔两个多月再继续讲,忘了之前的进度了,下一篇要将大堂点餐的下单操作了。

#头条创作挑战赛#

标签: #ajax提交list集合