微信小程序实战案例 - 餐馆点餐系统 阶段 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 秒自动刷新状态(模拟店员更新)
  • 无订单时显示「暂无订单」

相关推荐
zhiboshequ7 小时前
Ai音视频对话在微信小程序端的技术实现方案
人工智能·微信小程序·live-pusher·live-player·音视频对话
小蒜学长8 小时前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价
00后程序员张11 小时前
无需 Mac 的 iOS App 上架工具,开心上架Appuploader 负责哪些环节
android·ios·小程序·https·uni-app·iphone·webview
2501_915909061 天前
Ipa Guard 防护上架,混淆、重签名和回归测试怎么做
android·ios·小程序·https·uni-app·iphone·webview
鸿蒙开发1 天前
# 代码写完才发现不能上线:微信小程序开发前必须准备的 8 件事
微信小程序·产品经理
李纲明1 天前
微信小程序 web-view 打开空白或提示未配置业务域名:校验文件、HTTPS 与跳转域名排查
前端·微信小程序·https·web-view·小程序开发·业务域名
济南壹软网络科技有限公司1 天前
盲盒源码系统小程序V6MAX底层架构解析,PHP+Uniapp高性能商用底座发布
小程序·架构·uni-app
2501_915918411 天前
iOS 上架注意事项有哪些?Appuploader 的四个阶段自查清单
android·ios·小程序·https·uni-app·iphone·webview
Autumn_ing1 天前
AI原型设计工具怎么选?可编辑原型与可运行前端适合什么场景
前端·小程序·产品经理·代码·codex·墨刀ai客户端·ai原型
fengGer的bugs1 天前
微信小程序实战:本地存储的新生儿喂养记录(原生 + 四套主题 + 疫苗日程)
微信小程序·小程序