赞
踩
随着微信小程序的迅速发展与普及,外卖、点餐小程序越来越多地被使用,它不像APP那样全面,有非常复杂的功能,而是提供了快速购物的通道,无需下载使用,不用安装APP,简化了APP的很多功能,之加入核心功能呢。
点餐系统小程序主要完成底部标签导航的设计、幻灯片轮播效果设计、菜单列表的效果显示、购物车功能实现、订单详情页面设计、订单列表设计、消费记录页面的设计。
订餐系统任务需求:
路径 | 作用 |
---|---|
images | 存放图片 |
pages/index | 首页 |
pages/list | 菜单列表页面 |
pages/order/list | 订单列表页面 |
pages/order/detail | 订单详情页面 |
pages/order/balance | 订单确认页面 |
pages/record | 消费记录页面 |
utils/fetch.js | 网络请求封装页面 |
utils/common.wxss | 页面公有样式库 |
app.js | 定义全局变量 |
app.json | 配置pages、window、tabBar |
app.wxss | 公共样式页面 |
为什么要封装网络请求?
module.exports = function(path, data, method) { return new Promise((resolve, reject) => { wx.request({ url: '', // 接口地址 method: method, data: data, header: {'Content-Type': 'json' }, success: resolve, fail: function() {// 请求失败执行fail操作 reject() wx.showModal({ showCancel: false, title: '失败' }) } }) }) } // 引入fetch.js文件 const fetch = require('../../utils/fetch.js') // 接口请求 fetch(path).then((res) => { // 请求成功的操作 },() => { // 请求失败操作 });
首页内容任务分析:
在首页顶部区域,设置了焦点图切换的效果,图片资源通过请求接口获取数据。焦点图区域的布局:
index.wxml
<block wx:for="{{listData}}">
<swiper>
<swiper-item>
<image></image>
</swiper-item>
</swiper>
</block>
焦点图切换:
index.js
//onLoad()函数 onLoad: function(options) { //请求首页接口 wx.showLoading({ title: '努力加载中' }) fetch(‘food/index’).then(res => { // 请求成功,关闭提示框 //请求成功 wx.hideLoading(); // 把接口返回数据给listData this.setData({ listData: res.data }) }, () => { // 请求失败,关闭提示框,执行fetch.js文件中的fail方法 wx.hideLoading() }) } onLoad: function(options) { wx.showLoading({ title: '努力加载中' }) fetch(‘food/index’).then(res => { // 请求成功,关闭提示框 wx.hideLoading(); // 把接口返回数据给listData this.setData({ listData: res.data }) }, () => { // 请求失败,关闭提示框,执行fetch.js文件中的fail方法 wx.hideLoading() }) }
首页中间部分展示了手机点餐的推广banner图,单击“开启订餐之旅”跳转到菜单列表,引导顾客进行点餐,中间区域的布局:
index.wxml
<block wx:for="{{listData}}">
<!-- listData 为后台返回的数据 -->
<view bindtap="gostart">
<image></image>
</block>
index.js
gostart: function(){
//wx.navigateTo()实现跳转
wx.navigateTo({ url: '../list/list' })
}
底部区域的布局:
index.wxml
<block wx:for="{{listData}}">
<view wx:for="{{item.image_bottom}}"
wx:for-item="bottomItem" >
<image></image>
</view>
</block>
菜单列表任务分析:
展示商家的折扣活动信息或店铺优惠信息,折扣信息区页面结构布局:
list.wxml
<!-- 折扣信息区 -->
<view class="discount">
<text class="discount-txt">减</text>满50元减10元(在线支付专享)
</view>
pages/list/list.wxml文件,左侧菜单列表页面结构布局:
list.wxml
<scroll-view class="left-menu" scroll-y="true">
<view wx:for="{{listData}}" wx:key="{{index}}" data-index="{{index}}" bindtap="selectMenu">
<view class="list-menu-name">{{item.name}}</view>
</view>
pages/list/list.wxml文件,右侧菜单列表页面结构布局:
list.wxml
<scroll-view scroll-y="true" style="height:1200rpx;">
<view class="content" id="a{{index}}" wx:for="{{listData}}" wx:key="lists">
<view class="list-tab">view>
<view class="content-list" wx:for="{{item.foods}}" wx:for-item="items"> </view>
</view>
</scroll-view>
list.js
const fetch = require('../../utils/fetch.js')
Page({
data:{ loading:false } // false,不显示底部操作菜单
onLoad: function(options) {
wx.showLoading({ title: '努力加载中' })
fetch('food/list').then(res => {
wx.hideLoading();
this.setData({ listData: res.data ,loading:true })
}, () => { wx.hideLoading() })
}
})
list.js
Page({
data: {
activeIndex: 0,
toView: 'a0',
loading: false
},
// 左侧菜单项选择
selectMenu: function(e) {}
})
购物车任务分析:
菜单列表页面数据请求成功后,loading值设为true,显示底部购物车区域。当购物车里商品数量为0时,购物车图标为灰色,处于不可单击状态
list.wxml
<!-- 接口请求成功后,loading为 true -->
<view class="bottom-operate-menu" wx:if="{{loading}}">
<view class="shopping-cart"> </view>
<view class="submit-btn {{sumMonney!=0?'activity-color-bg':'' }}" bindtap="goBalance"> </view>
</view>
单击图标“+”,把商品添加到购物车。
list.js
Page({
data: {
activeIndex: 0,
currentType: 0,
currentIndex: 0,
loading: false
},
// 加入购物车
addToCart: function(e) {}
})
list.wxml
<!-- 遮罩层 -->
<view class="drawer-screen" bindtap="showCartList" data-statu="close" wx:if="{{showCart}}"></view>
<!-- 商品列表 -->
<view
class="cartlist-content" wx:if="{{showCart}}">
<scroll-view scroll-y="true" class="{{cartList.length>5?'cart-scroll-list':''}}"></scroll-view>
</view>
list.js
showCartList: function() {
if (this.data.cartList.length != 0) {
this.setData({ showCart: !this.data.showCart }); }
}
list.js
Page({
// 购物车添加商品数量
addNumber: function(e) { }
})
list.js
Page({
// 购物车减少商品数量
decNumber: function(e) { }
})
list.js
Page({
clearCartList: function() {
this.setData({
cartList: [], // 商品列表为空
showCart: false, // 不展开购物车
sumMonney: 0,
cupNumber: 0
})
}
})
list.wxml
<view class="cut-bar" wx:if="{{sumMonney==0&&loading}}"></view>
<view class="cut-bar" wx:if="{{sumMonney<25&&sumMonney!=0&&loading}}"></view>
list.js
const fetch = require('../../utils/fetch.js')
pages({
// 单击"选好了",判断页面是否跳转
goBalance: function(e) {}
})
订单确认页面任务分析:
balance.wxml
<view class="top-bar"></view>
<!-- 订单详情 -->
<view class="order-info">
<view class="cart-list-box" wx:for="{{order.foods}}" wx:for-item="item" wx:key="list"></view>
<view class="order-cut" wx:if="{{order.promotion.length > 0}}"></view>
<view class="order-sum"></view>
</view>
balance.js
const fetch = require('../../../utils/fetch.js')
Page({
onLoad: function(options) {
// 请求订单接口
fetch('food/order', {: options.order_id}).then(res => {})
} order_id
balance.wxml
<!-- 备注 -->
<view class="note">
<textarea maxlength="{{max}}" placeholder="如有其他要求,请输入备注" bindinput="listenerTextarea" class="note-text">{{note}}</textarea>
</view>
balance.js
listenerTextarea: function(e) {
var note = e.detail.value
// 存储note值
wx.setStorageSync('note', note)
}
detail.js
onLoad: function (options) {
// 获取note值
var note = wx.getStorageSync('note')
}
balance.wxml
<view bindtap="gotopay">
<view>去支付</view>
</view>
balance.js
gotopay: function(e) {
fetch('food/pay', {order_id:order_id},method).then((res)=>{} )
}
app.js
App({
// 定义全局变量:是否刷新页面。为false不执行刷新
isReloadOrderList: false
})
order/detail/detail.js
onUnload:function(){
var app = getApp();
// 支付成功之后调到订单页面,通知订单页刷新
app.isReloadOrderList = true
wx.switchTab({ url: '/pages/order/list/list‘ })
}
订单详情页面任务分析:
order/detail/detail.wxml
<view class="go-center go-top-10">
<view class="card-box">
<view class="card-fetch">取餐号</view>
<view class="go-top-10" > … </view>
</view>
order/detail/detail.wxml
<view class="order-info">
<view class="order-info-title">订单详情</view>
<view class="cart-list-box">…</view>
<view class="cart-list-box">…</view>
<view class=“order-sum">…</view>
</view>
order/detail/detail.wxml
<view class="order-info">
<view class="order-info-title">…</view>
<view class="order-info-title">…</view>
<view class="order-info-title">…</view>
</view>
<view class="go-center">...</view>
订单列表页面任务分析:
在订单列表页面,展示订单信息,显示订单的下单时间和订单的总价、取餐状态、单击“查看详情”,根据订单内标的order_id 跳转到订单详情页面,效果图如下:
order/list/list.wxml
<scroll-view class="container" scroll-y="true">
<block wx:for="{{orderList}}" wx:for-item="item" wx:for-index="idx" wx:key="{{item.order_id}}">
<view class="orderList" data-postId="{{item.order_id}}">
<view class="order-content">
<view class="content-time">下单时间</view></view>
<view class="content-btm"> … </view></view>
</view>
</view>
</block>
<view class="bottom" wx:if="{{is_last}}">到底啦~</view>
</scroll-view>
因为页面中加载初始化数据、下拉刷新、上拉触底事件都需要调用相同的接口,所以在这里重新定义一个加载数据的方法,根据传递参数的不同获取不同的数据。。
进入pages/order/list/list.js 文件,定义请求接口方法,封装请求的公共部分,传递参数 ,参考代码如下:
const fetch = require('../../../utils/fetch')
Page({
data: {
orderList: [], // 下拉触底时追加数据
is_last: false // 数据是否加载完毕
},
last_id: 0, // 加载文件的标识
// 定义请求方法,封装请求的公共部分(3个参数:数据、成功、失败)
loadData: function(data, success, fail) {
data.row = 10 // 每一页10条数据
fetch('food/orderlist', data).then((res) => {})
})
进入pages/order/list/list.js 文件,在onShow中获取全局变量isReloadOrderList ,是否为true,为true就刷新;请求订单数据,渲染页面;单击“查看详情” 跳转到订单详情页面,根据订单号查询订单数据渲染订单详情页面,参考代码如下:
onLoad: function(options) { wx.showLoading({ title: '加载中...‘ }) // 调用loadData()方法 this.loadData({ last_id: 0 }, (data) => { this.setData({orderList: data.list}, () => { wx.hideLoading() // 请求失败关闭加载框 }) }) } onShow: function() { var app = getApp(); // 获取到并判断全局变量isReloadOrderList,是否为true,为true就刷新 if (app.isReloadOrderList) { this.onLoad() // 刷新完成之后,把isReloadOrderList的值设为false app.isReloadOrderList = false } } // 跳转到订单详情页 orderdetail: function (e) { // 获取订单号 var index = e.currentTarget.dataset.postid wx.navigateTo({ url: '../detail/detail?order_id=' + index }) }
进入pages/order/list/list.js 文件,编写下拉刷新onPullDownRefresh()函数,参考代码如下:
onPullDownRefresh: function() {
wx.showNavigationBarLoading(); // 显示顶部刷新图标
this.loadData({
last_id: 0
}, data => {
this.setData({
orderList: data.list
}, () => {
wx.hideNavigationBarLoading(); // 隐藏导航条栏加载框
})
})
}
进入pages/order/list/list.js 文件,编写下拉刷新onReachBottom()函数,参考代码如下:
onReachBottom: function() {
// 判断数据是否到底,如果is_last为true到底了,则不执行请求
if (this.data.is_last) {return}
wx.showLoading({ title: '玩命加载中' })
this.loadData({last_id: this .last_id}, (data) => {
var orderList = this .data.orderList
for (var i = 0; i < data.list.length; i++) {orderList.push(data.list[i])}
this.setData({ orderList: orderList }, () => {
wx.hideLoading() // 隐藏加载框
})
})
}
消费记录页面任务分析:
消费记录页面展示用户的个人历史订单信息,包括用户的下单时间、商品总价钱。消费记录页面效果如下:
进入pages/record/record/record.wxss文件,设计消费记录页面样式,具体代码:略
进入pages/record/record/record.wxml文件,设计消费记录页面布局,具体代码如下:
<view class="avatar"><image></image></view>
<view class="content">消费记录</view>
<view class="record-content">
<view class="content-infoL">{{items.date}} {{items.time}}</view>
<view class="content-infoR">
<text>¥{{items.summoney}}</text>
</view>
</view>
进入pages/record/record/record.js文件,请求数据渲染页面,具体代码如下:
const fetch=require('../../utils/fetch.js')
Page({
onLoad: function (options) {
wx.showLoading({ title: '努力加载中' })
wx.setNavigationBarTitle({ title: '消费记录' }) // 设置小程序导航栏标题文字内容
// 请求消费记录接口
fetch('food/record').then(res=>{
wx.hideLoading() // 关闭加载信息
this.setData({ listData:res.data })
})
}
})
外卖点餐系统小程序
参考资料
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。