当前位置: 首页 > news >正文

微信小程序-点餐(美食屋)02开发实践

目录

概要

整体架构流程

(一)用户注册与登录

(二)菜品浏览与点餐

(三)订单管理

(四)后台管理

部分代码展示

1.index.wxml

2.list.wxml

3.checkout.wxml

4.detail.wxml

小结优点

概要

        01篇让我们成功搭建开发环境,现在让我们着手开发 “美食屋” 点餐系统了。下面,我会用 PHP 和 MySQL 实现系统核心功能,像用户注册登录、展示和管理菜品,以及处理订单。

        快一起动手,让 “美食屋” 从概念变成现实吧!

整体架构流程

以下是系统从用户操作到数据处理的完整流程:

(一)用户注册与登录

  1. 用户操作

    • 用户在微信小程序中进行wx账号登录。

  2. 前端处理

    • 小程序通过wx.request发送注册或登录请求到后端API接口。

  3. 后端处理

    • 注册接口

      • 检查用户名是否已存在。

      • 将用户信息存入数据库,密码加密存储。

      • 返回注册成功或失败的提示。

    • 登录接口

      • 验证用户名和密码是否正确。

      • 返回登录成功或失败的提示,登录成功时返回用户ID。

  4. 前端响应

    • 根据后端返回的结果,提示用户注册或登录成功/失败。

    • 登录成功后,存储用户ID到本地存储,用于后续操作。

(二)菜品浏览与点餐

  1. 用户操作

    • 用户在小程序中浏览菜品列表,选择菜品加入购物车,提交订单。

  2. 前端处理

    • 调用后端的菜品列表接口获取菜品数据,并展示在小程序页面上。

    • 用户选择菜品后,将菜品信息存储到本地购物车。

    • 用户提交订单时,将购物车中的菜品信息、用户ID等数据通过wx.request发送到后端订单提交接口。

  3. 后端处理

    • 菜品列表接口

      • 查询数据库中的菜品表,返回菜品信息。

    • 订单提交接口

      • 计算订单总价。

      • 将订单信息存入订单表,将订单详情存入订单详情表。

      • 返回订单提交成功或失败的提示。

  4. 前端响应

    • 根据后端返回的结果,提示用户订单提交成功/失败。

    • 订单提交成功后,清空购物车,跳转到订单详情页面。

(三)订单管理

  1. 用户操作

    • 用户在小程序中查看订单列表、订单详情,进行支付、取消订单等操作。

  2. 前端处理

    • 调用后端的订单列表接口获取订单数据,并展示在小程序页面上。

    • 用户操作订单时,通过wx.request调用后端的订单操作接口(如支付、取消订单)。

  3. 后端处理

    • 订单列表接口

      • 查询数据库中的订单表,根据用户ID返回订单列表。

    • 订单操作接口

      • 根据用户操作更新订单状态(如支付成功后将订单状态改为“已支付”)。

  4. 前端响应

    • 根据后端返回的结果,提示用户操作成功/失败。

    • 更新订单列表页面,显示最新的订单状态。

(四)后台管理

  1. 商家操作

    • 商家通过后台管理系统查看订单、处理订单(如确认订单、完成订单)。

  2. 后端处理

    • 提供后台管理接口,供商家管理系统调用。

    • 商家操作订单时,更新数据库中的订单状态。

  3. 前端响应

    • 商家管理系统根据后端返回的结果,提示操作成功/失败。

    • 更新订单列表页面,显示最新的订单状态。

部分代码展示

1.index.wxml

        这段代码主要实现了首页的轮播图展示、开启点餐之旅的按钮、最新消息展示以及底部菜品分类图标展示的功能。

<!--index.wxml-->
<swiper class="swiper" indicator-dots="true" autoplay="true" interval="5000" duration="1000"><block wx:for="{{ swiper }}" wx:key="*this"><swiper-item><image src="{{ item }}" /></swiper-item></block>
</swiper>
<!-- 开启点餐之旅 -->
<view class="menu-bar"><view class="menu-block" bindtap="start"><view class="menu-start">开启点餐之旅→</view></view>
</view>
<!-- 最新消息展示 -->
<view class="ad-box"><image src="{{ ad }}" class="ad-image" />
</view>
<view class="bottom-box"><view class="bottom-pic" wx:for="{{ category }}" wx:key="index"><image src="{{ item }}" class="bottom-image" /></view>
</view>
2.list.wxml

        定义了一个页面,主要用于展示商品列表、购物车功能以及相关的促销信息。页面分为多个部分,包括顶部的折扣信息、商品分类和商品列表区域、购物车界面、满减优惠提示以及底部的操作栏。   

<!--pages/list/list.wxml-->
<view class="discount"><text class="discount-txt">减</text>满{{ promotion.k }}元减{{ promotion.v }}元(在线支付专享)
</view>
<view class="content"><!-- 左侧菜单栏区域 --><scroll-view class="category" scroll-y><view wx:for="{{ foodList }}" wx:key="id" class="category-item category-{{ activeIndex == index ? 'selected' : 'unselect' }}" data-index="{{ index }}" bindtap="tapCategory"><view class="category-name">{{ item.name }}</view></view></scroll-view><!-- 右侧商品列表区域 --><scroll-view class="food" scroll-y scroll-into-view="category_{{ tapIndex }}" scroll-with-animation bindscroll="onFoodScroll"><block wx:for="{{ foodList }}" wx:for-item="category" wx:key="id" wx:for-index="category_index"><view class="food-category" id="category_{{ category_index }}">{{ category.name }}</view><view class="food-item" wx:for="{{ category.food }}" wx:for-item="food" wx:key="id"><view class="food-item-pic"><image mode="widthFix" src="{{ food.image_url }}" /></view><view class="food-item-info"><view>{{ food.name }}</view><view class="food-item-price">{{ priceFormat(food.price) }}</view></view><view class="food-item-opt"><i class="iconfont" data-category_index="{{ category_index }}" data-index="{{ index }}" bindtap="addToCart"></i></view></view></block></scroll-view>
</view>
<!-- 购物车界面 -->
<view class="shopcart" wx:if="{{ showCart }}"><view class="shopcart-mask" bindtap="showCartList" wx:if="{{ showCart }}"></view><view class="shopcart-wrap"><view class="shopcart-head"><view class="shopcart-head-title">已选商品</view><view class="shopcart-head-clean" bindtap="cartClear"><i class="iconfont"></i>清空购物车</view></view><view class="shopcart-list"><view class="shopcart-item" wx:for="{{ cartList }}" wx:key="id"><view class="shopcart-item-name">{{ item.name }}</view><view class="shopcart-item-price"><view>{{ priceFormat(item.price * item.number) }}</view></view><view class="shopcart-item-number"><i class="iconfont shopcart-icon-dec" data-id="{{ index }}" bindtap="cartNumberDec"></i><view>{{ item.number }}</view><i class="iconfont shopcart-icon-add" data-id="{{ index }}" bindtap="cartNumberAdd"></i></view></view></view></view>
</view>
<!-- 满减优惠信息 -->
<view class="promotion"><label wx:if="{{ promotion.k - cartPrice > 0 }}">满{{ promotion.k }}立减{{ promotion.v }}元,还差{{ promotion.k - cartPrice }}元</label><label wx:else>已满{{ promotion.k }}元可减{{ promotion.v }}元</label>
</view>
<!-- 小球动画 -->
<view class="operate"><view class="operate-shopcart-ball" hidden="{{ !cartBall.show }}" style="left: {{ cartBall.x }}px; top: {{ cartBall.y }}px;"></view><view class="operate-shopcart" bindtap="showCartList"><i class="iconfont operate-shopcart-icon {{ cartNumber > 0 ? 'operate-shopcart-icon-activity' : '' }}"><span wx:if="{{ cartNumber > 0 }}">{{ cartNumber }}</span></i><view class="operate-shopcart-empty" wx:if="{{ cartNumber === 0 }}">购物车是空的</view><view class="operate-shopcart-price" wx:else><block wx:if="{{ cartPrice >= promotion.k }}"><view>{{ priceFormat(cartPrice - promotion.v )}}</view><text>{{ priceFormat(cartPrice) }}</text></block><view wx:else>{{ priceFormat(cartPrice) }}</view></view></view><view class="operate-submit {{ cartNumber !== 0 ? 'operate-submit-activity' : '' }}" bindtap="order">选好了</view>
</view>
<wxs module="priceFormat">module.exports = function (price) {return '¥ ' + parseFloat(price)}
</wxs>
3.checkout.wxml

        主要实现了订单确认页面的展示,包含订单信息、备注、支付等功能。

<!--pages/order/checkout/checkout.wxml-->
<view class="content"><!-- 标题 --><view class="content-title">请确认您的订单</view><!-- 订单信息--><view class="order"><view class="order-title">订单详情</view><view class="order-list"><!-- 订单商品列表项 --><view class="order-item" wx:for="{{ order_food }}" wx:key="id"><view class="order-item-left"><image class="order-item-image" mode="widthFix" src="{{ item.image_url }}" /><view><view class="order-item-name">{{ item.name }}</view><view class="order-item-number">x {{ item.number }}</view></view></view><view class="order-item-price">{{ priceFormat(item.price * item.number) }}</view></view><!-- 满减信息 --><view class="order-item" wx:if="{{ checkPromotion(promotion) }}"><view class="order-item-left"><i class="order-promotion-icon">减</i>满减优惠</view><view class="order-promotion-price">- {{ priceFormat(promotion) }}</view></view><!-- 小计 --><view class="order-item"><view class="order-item-left">小计</view><view class="order-total-price">{{ priceFormat(price) }}</view></view></view></view><!-- 备注功能 --><view class="content-comment"><label>备注</label><textarea placeholder="如有其他要求,请输入备注" bindinput="inputComment"></textarea></view>
</view>
<!-- 支付功能 -->
<view class="operate"><view class="operate-info">合计:{{ priceFormat(price) }}</view><view class="operate-submit" bindtap="pay">去支付</view>
</view>
<!-- 处理商品价格格式 -->
<wxs module="priceFormat">module.exports = function (price) {return price ? '¥ ' + parseFloat(price) : ''}
</wxs>
<wxs module="checkPromotion">module.exports = function (promotion) {return parseFloat(promotion) > 0}
</wxs>
4.detail.wxml

        此页面主要分为四个部分:顶部取餐号展示区、订单详情区、订单信息列表区、提示信息区。同时,使用了两个 wxs 模块来处理价格格式化和满减优惠判断。

<!--pages/order/detail/detail.wxml-->
<view class="top"><view class="card" wx:if="{{ !is_taken }}"><view class="card-title">取餐号</view><view class="card-content"><view class="card-info"><text class="card-code">{{ code }}</text><text class="card-info-r">正在精心制作中…</text></view><view class="card-comment" wx:if="{{ comment }}">备注:{{ comment }}</view><view class="card-tips">美食制作中,尽快为您服务☺</view></view></view>
</view>
<view class="order"><view class="order-title">订单详情</view><view class="order-list"><!-- 订单商品列表项 --><view class="order-item" wx:for="{{ order_food }}" wx:key="id"><view class="order-item-left"><image class="order-item-image" mode="widthFix" src="{{ item.image_url }}" /><view><view class="order-item-name">{{ item.name }}</view><view class="order-item-number">x {{ item.number }}</view></view></view><view class="order-item-price">{{ priceFormat(item.price * item.number) }}</view></view><!-- 满减信息 --><view class="order-item" wx:if="{{ checkPromotion(promotion) }}"><view class="order-item-left"><i class="order-promotion-icon">减</i>满减优惠</view><view class="order-promotion-price">- {{ priceFormat(promotion) }}</view></view><!-- 小计 --><view class="order-item"><view class="order-item-left">小计</view><view class="order-total-price">{{priceFormat(price)}}</view></view></view>
</view>
<view class="list"><view><text>订单号码</text><view>{{ sn }}</view></view><view><text>下单时间</text><view>{{ create_time }}</view></view><view><text>付款时间</text><view>{{ pay_time }}</view></view><view wx:if="{{ is_taken }}"><text>取餐时间</text><view>{{ taken_time }}</view></view>
</view>
<view class="tips" wx:if="{{ is_taken }}">取餐号{{ code }} 您已取餐</view>
<view class="tips" wx:else>请凭此页面至取餐柜台领取美食</view>
<wxs module="priceFormat">module.exports = function (price) {return price ? '¥ ' + parseFloat(price) : ''}
</wxs>
<wxs module="checkPromotion">module.exports = function (promotion) {return parseFloat(promotion) > 0}
</wxs>

小结优点

  1. 前后端分离

    • 前端专注于用户体验,后端专注于数据处理,提高开发效率和系统可维护性。

  2. 数据交互标准化

    • 使用JSON格式进行数据交互,便于前后端解析和处理。

  3. 扩展性强

    • 后端接口可独立扩展,支持多端接入(如小程序、Web端等)。

  4. 安全性高

    • 数据通过HTTPS传输,后端对用户密码加密存储,保障用户信息安全。

相关文章:

微信小程序-点餐(美食屋)02开发实践

目录 概要 整体架构流程 &#xff08;一&#xff09;用户注册与登录 &#xff08;二&#xff09;菜品浏览与点餐 &#xff08;三&#xff09;订单管理 &#xff08;四&#xff09;后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…...

转换算术表达式

文章目录 构造二叉树表示的算术表达式&#xff1a;按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示&#xff0c;注意转换)&#xff0c; #字符表示空树&#xff0c;如上图的算术表达式 输入2##*3##4## 输入格式 第一行输入表示要计算的算术表达式的二叉树结点的…...

99.17 金融难点通俗解释:归母净利润

目录 0. 承前1. 简述2. 比喻&#xff1a;小明家的小卖部2.1 第一步&#xff1a;计算收到的所有钱2.2 第二步&#xff1a;减去各种支出2.3 第三步&#xff1a;计算能带回家的钱 3. 生活中的例子3.1 好的经营情况3.2 一般的经营情况3.3 不好的经营情况 4. 小朋友要注意4.1 为什么…...

【Flutter】旋转元素(Transform、RotatedBox )

这里写自定义目录标题 Transform旋转元素可以改变宽高约束的旋转 - RotatedBox Transform旋转元素 说明&#xff1a;Transform旋转操作改变了元素的方向&#xff0c;但并没有改变它的布局约束。因此&#xff0c;虽然视觉上元素看起来是旋转了&#xff0c;但它仍然遵循原始的宽…...

MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少&#xff0c;主要讲解&#xff1a;聚合函数和简要介绍sql语句执行过…...

thinkphp6+swoole使用rabbitMq队列

安装think-swoole安装 composer require php-amqplib/php-amqplib,以支持rabbitMq使用安装rabbitMq延迟队列插件 安装 rabbitmq_delayed_message_exchange 插件&#xff0c;按照以下步骤操作&#xff1a; 下载插件&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-…...

大模型开发 | RAG在实际开发中可能遇到的坑

近年来&#xff0c;大语言模型 (LLM) 的飞速发展令人瞩目&#xff0c;它们在各个领域展现出强大的应用潜力。然而&#xff0c;LLM 也存在一些固有的局限性&#xff0c;例如知识更新滞后、信息编造 (幻觉) 等问题。为了克服这些挑战&#xff0c;检索增强生成 (Retrieval-Augment…...

mybatis是什么?有什么作用?mybatis的简单使用

mybatis是什么&#xff1f; MyBatis 是一个持久层框架。 有什么作用&#xff1f; 简化了对数据库数据的操作。 如何简化数据操作的&#xff1f; MyBatis 通过提供 SQL 映射、动态 SQL、结果映射、事务管理等功能&#xff0c;我们直接去用就可以了。 怎么使用&#xff1f;&…...

求平均年龄(信息学奥赛一本通-1059)

【题目描述】 班上有学生若干名&#xff0c;给出每名学生的年龄&#xff08;整数&#xff09;&#xff0c;求班上所有学生的平均年龄&#xff0c;保留到小数点后两位。 【输入】 第一行有一个整数n&#xff08;1≤n≤100&#xff09;&#xff0c;表示学生的人数。其后n行每行有…...

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…...

10 Hyperledger Fabric 介绍

简介 HypeLedger&#xff08;超级账本&#xff09;是由Linux基金会2015年创建的首个面向企业应用场景的开源分布式账本平台。 HypeLedger Fabric是HypeLedger种的区块链项目之一HypeLedger Fabric引入权限管理在架构设计上支持可插拔、可扩展是首个面向联盟链场景的开源项目 …...

Word 中实现方框内点击自动打 √ ☑

注&#xff1a; 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分&#xff0c;第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等&#xff0c;通常…...

噪声算法 纹理

噪声是一种程序生成的随机或伪随机数据&#xff0c;在图形学中常用来创建各种自然现象和复杂纹理效果。 它的本质是一种由数学算法公式生成的有规则性或可控的随机数据。 通过噪声算法生成的随机数据具有以下特点&#xff1a; 随机性&#xff1a;噪声数据本质上是随机的&#…...

hexo + Butterfly搭建博客

Hexo‌是一个基于Node.js的静态网站生成器&#xff0c;主要用于快速搭建博客和个人网站。它使用Markdown语法编写文章&#xff0c;能够迅速生成静态页面并部署到服务器上。 配置node 使用nvm安装node(v16.13.2)后配置镜像 安装并使用node&#xff1a; nvm install 16.13.2 n…...

05.KNN算法总结

KNN算法总结 1 k近邻算法优缺点汇总 优点&#xff1a; 简单有效重新训练的代价低适合类域交叉样本 KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的&#xff0c;因此对于类域的交叉或重叠较多的待分样本集来说&#xff0c;KNN方法较其他方法更为适…...

CentOS 7 搭建lsyncd实现文件实时同步 —— 筑梦之路

在 CentOS 7 上搭建 lsyncd&#xff08;Live Syncing Daemon&#xff09;以实现文件的实时同步&#xff0c;可以按照以下步骤进行操作。lsyncd 是一个基于 inotify 的轻量级实时同步工具&#xff0c;支持本地和远程同步。以下是详细的安装和配置步骤&#xff1a; 1. 系统准备 …...

java定时任务备份数据库

文章目录 前言一、定时任务备份二、分享两个windows运行项目脚本总结 前言 数据库备份 程序中数据库备份可以有效避免因为意外,导致数据丢失,因此数据备份显得尤为重要。 一、定时任务备份 定时任务类&#xff0c;要在配置类或启动类开启 EnableScheduling Data Sl4j Servic…...

Vue.js 传递路由参数和查询参数

Vue.js 传递路由参数和查询参数 在 Vue.js 开发中&#xff0c;Vue Router 提供了灵活的方式来处理路由参数和查询参数&#xff0c;使得组件能够根据不同的路径或查询条件渲染相应的内容。 路由参数 路由参数&#xff08;也称为路径参数&#xff09;是 URL 路径的一部分&…...

2025数学建模美赛|F题成品论文

国家安全政策与网络安全 摘要 随着互联网技术的迅猛发展&#xff0c;网络犯罪问题已成为全球网络安全中的重要研究课题&#xff0c;且网络犯罪的形式和影响日益复杂和严重。本文针对网络犯罪中的问题&#xff0c;基于多元回归分析和差异中的差异&#xff08;DiD&#xff09;思…...

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件...

企业信息化4:免费开源的财务管理系统

前言&#xff1a; 一个完整的财务管理系统不局限于传统的记账和核算工具&#xff0c;而是一整套包含了公司财务战略规划制订、编制各种财务计划、预算管理、资金管理、资产管理、税务管理的完整解决方案&#xff0c;从而实现对公司整体经营状况进行财务分析并定期汇报&#xff…...

PyCharm配置Python环境

1、打开PyCharm项目 可以从File-->Open-->选择你的项目路径-->OK&#xff0c;或者直接点击Open&#xff0c;找到项目路径-->OK&#xff0c;如图所示(点击Ok后可能有下面的弹窗&#xff0c;选择“Trust Project”即可&#xff0c;然后选择“New Window”打开项目) …...

蓝桥杯3522 互质数的个数 | 数论

题目传送门 首先根据a^b得出需要使用欧拉函数φ&#xff0c;根据欧拉函数的性质&#xff1a; φ ( a b ) a b − 1 ∗ φ ( a ) φ ( n ) n ∗ ( 1 − 1 / p 1 ) ∗ ( 1 − 1 / p 2 ) ∗ . . . ∗ ( 1 − 1 / p k ) &#xff0c;其中 p i 为 n 的质因数 φ(a^b)a^{b-1}*φ(…...

Effective C++ 规则49:了解 new-handler 的行为

1、背景 在 C 中&#xff0c;new 运算符用于动态分配内存。然而&#xff0c;当内存分配失败时&#xff0c;程序默认会抛出一个 std::bad_alloc 异常。为了更灵活地处理这种情况&#xff0c;C 提供了一种机制&#xff0c;允许开发者自定义内存分配失败时的行为。这就是 new-han…...

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…...

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09; 目录 手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09;DDPM 原理图Stable Diffusion 原理Stable Diffusion的原理解释Stable Diffusion 和 Diffus…...

MySQL 基础学习(2): INSERT 操作

在这篇文章中&#xff0c;我们将专注于 MySQL 中的 INSERT 操作&#xff0c;深入了解如何高效地向表中插入数据&#xff0c;并探索插入操作中的一些常见错误与解决方案。 一、基础 INSERT 语法 在 MySQL 中&#xff0c;INSERT 操作用于向表中插入新记录&#xff0c;基本语法如…...

openstack 客户端命令行简介

openstack 客户端命令行简介 基本用法常用命令分类**身份认证&#xff08;Keystone&#xff09;**常用命令 **计算服务&#xff08;Nova&#xff09;**常用命令&#xff1a; **网络服务&#xff08;Neutron&#xff09;**常用命令&#xff1a; **块存储服务&#xff08;Cinder&…...

Oracle查看数据库表空间使用情况

Oracle RAC环境查看表空间使用情况 查询字段释义&#xff1a; NEED_ADDFILE,--是否需增加表空间文件 TABLESPACE_NAME,--表空间名称 TABLESPACE_FILE_COUNT, --表空间当前数据文件数量 NOW_FILEENABLE_BLOCKS,--表空间文件当前数据块数 NOW_FILEENABLE_BYTES_GB,--表空间文件当…...

[护网杯 2018]easy_tornado1

题目 、 依次点击文件查看 /flag.txt flag in /fllllllllllllag /welcome.txt render /hints.txt md5(cookie_secretmd5(filename)) tornado模板注入 报cookie /error?msg{{handler.settings}} cookie_secret: 6647062b-e68d-4406-90d3-06e307fa955c} 使用python脚本…...