微信小程序实战案例 - 餐馆点餐系统 阶段 4 - 订单列表 & 状态

✅ 阶段 4 -- 订单列表 & 状态

目标

  1. 展示用户「我的订单」列表
  2. 支持状态筛选(全部 / 待处理 / 已完成)
  3. 支持分页加载和实时刷新
  4. 使用原生组件编写

✅ 1. 页面结构:文件结构

复制代码
pages/orders/
  ├─ index.json
  ├─ index.wxml
  ├─ index.js
  └─ index.wxss

✅ 2. 页面配置 index.json

json 复制代码
{
  "navigationBarTitleText": "我的订单"
}

✅ 3. 页面模板 index.wxml

xml 复制代码
<view class="tabs">
  <text class="tab {{activeTab==0 ? 'active' : ''}}" data-index="0" bindtap="onTabChange">全部</text>
  <text class="tab {{activeTab==1 ? 'active' : ''}}" data-index="1" bindtap="onTabChange">待处理</text>
  <text class="tab {{activeTab==2 ? 'active' : ''}}" data-index="2" bindtap="onTabChange">已完成</text>
</view>

<view wx:if="{{orders.length}}">
  <block wx:for="{{orders}}" wx:key="orderNo">
    <view class="order-card">
      <view class="order-header">
        <text>订单号:{{item.orderNo}}</text>
        <text class="status {{item.status}}">{{item.status == 'PENDING' ? '待处理' : '已完成'}}</text>
      </view>
      <view class="order-body">
        <text>共 {{item.totalCount}} 件商品</text>
        <text>合计:¥{{item.totalPrice}}</text>
      </view>
      <view class="order-time">{{item.timeStr}}</view>
    </view>
  </block>
</view>

<view wx:else class="empty">
  <text>暂无订单</text>
</view>

✅ 4. 样式 index.wxss

css 复制代码
.tabs {
  display: flex;
  border-bottom: 1px solid #eee;
  background: #f8f8f8;
}
.tab {
  flex: 1;
  text-align: center;
  padding: 20rpx 0;
  font-size: 30rpx;
  color: #888;
}
.tab.active {
  color: #333;
  border-bottom: 4rpx solid #07c160;
  font-weight: bold;
}

.order-card {
  background: #fff;
  margin: 20rpx;
  padding: 20rpx;
  border-radius: 12rpx;
  box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.04);
}
.order-header {
  display: flex;
  justify-content: space-between;
  font-weight: bold;
}
.status {
  font-size: 28rpx;
}
.status.PENDING {
  color: #ff9900;
}
.status.DONE {
  color: #07c160;
}
.order-body {
  margin-top: 10rpx;
  font-size: 28rpx;
  display: flex;
  justify-content: space-between;
}
.order-time {
  font-size: 24rpx;
  color: #999;
  margin-top: 10rpx;
  text-align: right;
}
.empty {
  text-align: center;
  color: #999;
  font-size: 28rpx;
  padding: 100rpx 0;
}

✅ 5. 页面逻辑 index.js

js 复制代码
const db = wx.cloud.database()
const PAGE_SIZE = 10

Page({
  data: {
    activeTab: 0,
    orders: [],
    page: 0,
    finished: false
  },

  onShow() {
    this.resetAndLoad()
    this.timer = setInterval(() => this.refresh(), 5000)
  },

  onHide() {
    clearInterval(this.timer)
  },
  onUnload() {
    clearInterval(this.timer)
  },

  onTabChange(e) {
    this.setData({ activeTab: Number(e.currentTarget.dataset.index) })
    this.resetAndLoad()
  },

  resetAndLoad() {
    this.setData({ orders: [], page: 0, finished: false })
    this.loadPage()
  },

  async loadPage(isRefresh = false) {
    if (this.data.finished) return

    const statusMap = ['', 'PENDING', 'DONE']
    const filter = statusMap[this.data.activeTab]

    let query = db.collection('orders')
    if (filter) {
      query = query.where({ status: filter })
    }

    const res = await query
      .orderBy('createdAt', 'desc')
      .skip(this.data.page * PAGE_SIZE)
      .limit(PAGE_SIZE)
      .get()

    const list = res.data.map(o => ({
      ...o,
      totalCount: o.items.reduce((sum, i) => sum + i.count, 0),
      timeStr: this.formatTime(o.createdAt)
    }))

    this.setData({
      orders: isRefresh ? list : this.data.orders.concat(list),
      page: this.data.page + 1,
      finished: list.length < PAGE_SIZE
    })
  },

  refresh() {
    this.setData({ page: 0, finished: false })
    this.loadPage(true)
  },

  formatTime(ts) {
    const date = new Date(ts)
    return `${date.getMonth()+1}-${date.getDate()} ${date.getHours()}:${date.getMinutes().toString().padStart(2, '0')}`
  }
})

✅ 6. 自测 Checklist

  • 能切换订单状态:全部 / 待处理 / 已完成
  • 正确显示订单号、商品数量、金额
  • 页面卡片样式清晰
  • 页面首次进入加载数据
  • 每 5 秒自动刷新状态(模拟店员更新)
  • 无订单时显示「暂无订单」

相关推荐
全职计算机毕业设计16 小时前
基于微信小程序的城市特色旅游推荐应用的设计与实现
微信小程序·小程序
gaojianqiao123420 小时前
uniapp引入七鱼客服微信小程序SDK
微信小程序·uni-app
说私域21 小时前
线下消费经济“举步维艰”,开源AI智能名片链动2+1+S2B2C小程序线上“狂飙突进”!
人工智能·小程序·开源·零售
天上掉下来个程小白1 天前
添加购物车-02.代码开发
java·服务器·前端·后端·spring·微信小程序·苍穹外卖
JAVA叶知秋1 天前
uniapp自定义底部导航栏h5有效果小程序无效的解决方案
小程序·uni-app
沙尘暴炒饭2 天前
用uniapp在微信小程序实现画板(电子签名)功能,使用canvas实现功能
微信小程序·小程序·uni-app
PyAIGCMaster2 天前
Taro 编译不平不同平台小程序
小程序
fakaifa3 天前
【开源版】likeshop上门家政系统PHP版全开源+uniapp前端
小程序·uni-app·php·家政小程序源码·家政服务小程序·源码下载·上门家政
说私域3 天前
基于定制开发开源AI智能名片S2B2C商城小程序的公私域流量融合运营策略研究
人工智能·小程序·开源·零售
阿諪諪3 天前
uniapp小程序中实现无缝衔接滚动效果
小程序·uni-app