Browse Source
1. 添加了订单状态筛选功能(全部、待付款、已完成) 2. 实现了分页加载和预加载功能 3. 优化了时间选择器的样式,使其更精致更小 4. 添加了订单详情页面 5. 修复了从测试页面跳转到订单页面的问题 6. 更新了服务器端API,支持分页和筛选功能 7. 创建了专门的测试页面,使用13399867166电话测试订单功能pull/19/head
10 changed files with 1405 additions and 80 deletions
@ -0,0 +1,79 @@ |
|||||
|
// pages/order/detail/index.js
|
||||
|
Page({ |
||||
|
// 分享给朋友/群聊
|
||||
|
onShareAppMessage() { |
||||
|
return { |
||||
|
title: '鸡蛋贸易平台 - 订单详情', |
||||
|
path: '/pages/order/detail/index', |
||||
|
imageUrl: '/images/你有好蛋.png' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 分享到朋友圈
|
||||
|
onShareTimeline() { |
||||
|
return { |
||||
|
title: '鸡蛋贸易平台 - 订单详情', |
||||
|
query: '', |
||||
|
imageUrl: '/images/你有好蛋.png' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
data: { |
||||
|
orderId: '', |
||||
|
orderDetail: null, |
||||
|
loading: false, |
||||
|
error: '' |
||||
|
}, |
||||
|
|
||||
|
onLoad(options) { |
||||
|
if (options.orderId) { |
||||
|
this.setData({ orderId: options.orderId }); |
||||
|
this.loadOrderDetail(); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 加载订单详情
|
||||
|
loadOrderDetail() { |
||||
|
const orderId = this.data.orderId; |
||||
|
if (!orderId) { |
||||
|
this.setData({ error: '订单ID不能为空' }); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
this.setData({ loading: true, error: '' }); |
||||
|
|
||||
|
wx.request({ |
||||
|
url: `http://localhost:3003/api/orders/detail/${orderId}`, |
||||
|
method: 'GET', |
||||
|
header: { |
||||
|
'Content-Type': 'application/json' |
||||
|
}, |
||||
|
success: (res) => { |
||||
|
console.log('获取订单详情成功:', res.data); |
||||
|
if (res.data.success) { |
||||
|
this.setData({ |
||||
|
orderDetail: res.data.data, |
||||
|
loading: false |
||||
|
}); |
||||
|
} else { |
||||
|
this.setData({ |
||||
|
error: res.data.message || '获取订单详情失败', |
||||
|
loading: false |
||||
|
}); |
||||
|
} |
||||
|
}, |
||||
|
fail: (err) => { |
||||
|
console.error('获取订单详情失败:', err); |
||||
|
this.setData({ |
||||
|
error: '网络请求失败,请稍后重试', |
||||
|
loading: false |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 返回上一页
|
||||
|
goBack() { |
||||
|
wx.navigateBack(); |
||||
|
} |
||||
|
}) |
||||
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText": "订单详情", |
||||
|
"usingComponents": {} |
||||
|
} |
||||
@ -0,0 +1,106 @@ |
|||||
|
<view class="order-detail-page"> |
||||
|
<!-- 加载中 --> |
||||
|
<view wx:if="{{loading}}" class="loading"> |
||||
|
<text>加载中...</text> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 错误提示 --> |
||||
|
<view wx:elif="{{error}}" class="error"> |
||||
|
<text>{{error}}</text> |
||||
|
<button bindtap="loadOrderDetail">重新加载</button> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 订单详情 --> |
||||
|
<view wx:elif="{{orderDetail}}" class="order-content"> |
||||
|
<!-- 订单头部 --> |
||||
|
<view class="order-header"> |
||||
|
<view class="order-no">订单号: {{orderDetail.sales_no}}</view> |
||||
|
<view class="order-date">{{orderDetail.order_date}}</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 客户信息 --> |
||||
|
<view class="section"> |
||||
|
<view class="section-title">客户信息</view> |
||||
|
<view class="customer-info"> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">公司名称:</view> |
||||
|
<view class="value">{{orderDetail.customer_company}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">联系人:</view> |
||||
|
<view class="value">{{orderDetail.contact_person}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">联系电话:</view> |
||||
|
<view class="value">{{orderDetail.phone}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">联系地址:</view> |
||||
|
<view class="value">{{orderDetail.address}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 订单摘要 --> |
||||
|
<view class="section"> |
||||
|
<view class="section-title">订单摘要</view> |
||||
|
<view class="order-summary"> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">总金额:</view> |
||||
|
<view class="value total-amount">¥{{orderDetail.total_amount}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">总件数:</view> |
||||
|
<view class="value">{{orderDetail.total_pieces}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">总斤数:</view> |
||||
|
<view class="value">{{orderDetail.total_weight}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">支付状态:</view> |
||||
|
<view class="value payment-status">{{orderDetail.payment_status}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">订单状态:</view> |
||||
|
<view class="value order-status">{{orderDetail.order_status}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 产品详情 --> |
||||
|
<view class="section"> |
||||
|
<view class="section-title">产品详情</view> |
||||
|
<view class="products-list"> |
||||
|
<view wx:for="{{orderDetail.subItems}}" wx:key="sub_id" class="product-item"> |
||||
|
<view class="product-header"> |
||||
|
<view class="product-name">{{item.product_name}}</view> |
||||
|
</view> |
||||
|
<view class="product-details"> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">销售件数:</view> |
||||
|
<view class="value">{{item.sales_pieces}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">销售斤数:</view> |
||||
|
<view class="value">{{item.sales_weight}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">单价:</view> |
||||
|
<view class="value">¥{{item.unit_price}}</view> |
||||
|
</view> |
||||
|
<view class="info-item"> |
||||
|
<view class="label">小计:</view> |
||||
|
<view class="value">¥{{item.sales_amount}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 无数据提示 --> |
||||
|
<view wx:else class="no-data"> |
||||
|
<text>暂无订单详情</text> |
||||
|
</view> |
||||
|
</view> |
||||
@ -0,0 +1,206 @@ |
|||||
|
/* pages/order/detail/index.wxss */ |
||||
|
.order-detail-page { |
||||
|
min-height: 100vh; |
||||
|
background-color: #f5f5f5; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 加载中 */ |
||||
|
.loading { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
padding: 120rpx 0; |
||||
|
background-color: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
||||
|
font-size: 32rpx; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
/* 错误提示 */ |
||||
|
.error { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
padding: 120rpx 40rpx; |
||||
|
background-color: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
||||
|
font-size: 32rpx; |
||||
|
color: #ff4d4f; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.error button { |
||||
|
margin-top: 40rpx; |
||||
|
background-color: #1677ff; |
||||
|
color: #fff; |
||||
|
border: none; |
||||
|
padding: 20rpx 80rpx; |
||||
|
border-radius: 60rpx; |
||||
|
font-size: 28rpx; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
/* 订单内容 */ |
||||
|
.order-content { |
||||
|
background-color: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
padding: 30rpx; |
||||
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
||||
|
} |
||||
|
|
||||
|
/* 订单头部 */ |
||||
|
.order-header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 30rpx; |
||||
|
padding-bottom: 30rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.order-no { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.order-date { |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
/* 区块样式 */ |
||||
|
.section { |
||||
|
margin-bottom: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.section-title { |
||||
|
font-size: 30rpx; |
||||
|
color: #333; |
||||
|
font-weight: bold; |
||||
|
margin-bottom: 20rpx; |
||||
|
padding-left: 20rpx; |
||||
|
border-left: 6rpx solid #1677ff; |
||||
|
} |
||||
|
|
||||
|
/* 客户信息 */ |
||||
|
.customer-info { |
||||
|
background-color: #f9f9f9; |
||||
|
border-radius: 8rpx; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 订单摘要 */ |
||||
|
.order-summary { |
||||
|
background-color: #f9f9f9; |
||||
|
border-radius: 8rpx; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 信息项 */ |
||||
|
.info-item { |
||||
|
display: flex; |
||||
|
margin-bottom: 16rpx; |
||||
|
align-items: flex-start; |
||||
|
} |
||||
|
|
||||
|
.info-item:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
.label { |
||||
|
width: 140rpx; |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
font-weight: bold; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.value { |
||||
|
flex: 1; |
||||
|
font-size: 26rpx; |
||||
|
color: #333; |
||||
|
word-break: break-all; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
/* 总金额样式 */ |
||||
|
.total-amount { |
||||
|
font-size: 28rpx; |
||||
|
color: #ff4d4f; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
/* 状态样式 */ |
||||
|
.payment-status { |
||||
|
color: #52c41a; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.order-status { |
||||
|
color: #1677ff; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
/* 产品列表 */ |
||||
|
.products-list { |
||||
|
background-color: #f9f9f9; |
||||
|
border-radius: 8rpx; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 产品项 */ |
||||
|
.product-item { |
||||
|
background-color: #fff; |
||||
|
border-radius: 8rpx; |
||||
|
padding: 20rpx; |
||||
|
margin-bottom: 16rpx; |
||||
|
box-shadow: 0 1rpx 4rpx rgba(0, 0, 0, 0.05); |
||||
|
} |
||||
|
|
||||
|
.product-item:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
/* 产品头部 */ |
||||
|
.product-header { |
||||
|
margin-bottom: 16rpx; |
||||
|
padding-bottom: 16rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.product-name { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
/* 产品详情 */ |
||||
|
.product-details { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(2, 1fr); |
||||
|
gap: 16rpx; |
||||
|
} |
||||
|
|
||||
|
@media (max-width: 375px) { |
||||
|
.product-details { |
||||
|
grid-template-columns: 1fr; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 无数据提示 */ |
||||
|
.no-data { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
padding: 120rpx 0; |
||||
|
background-color: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
||||
|
font-size: 32rpx; |
||||
|
color: #999; |
||||
|
} |
||||
@ -1,21 +1,98 @@ |
|||||
<view class="order-page"> |
<view class="order-page"> |
||||
<!-- 订单状态标签栏 --> |
<!-- 订单状态标签栏 --> |
||||
<view class="order-tabs"> |
<view class="order-tabs"> |
||||
<view class="tab-item active">全部</view> |
<view class="tab-item {{activeTab === 'all' ? 'active' : ''}}" bindtap="switchTab" data-tab="all">全部</view> |
||||
<view class="tab-item">待付款</view> |
<view class="tab-item {{activeTab === 'unpaid' ? 'active' : ''}}" bindtap="switchTab" data-tab="unpaid">待付款</view> |
||||
<view class="tab-item">待发货</view> |
<view class="tab-item {{activeTab === 'completed' ? 'active' : ''}}" bindtap="switchTab" data-tab="completed">已完成</view> |
||||
<view class="tab-item">待收货</view> |
</view> |
||||
<view class="tab-item">已完成</view> |
|
||||
|
<!-- 时间筛选组件 --> |
||||
|
<view class="date-filter"> |
||||
|
<view class="date-filter-row"> |
||||
|
<view class="date-picker"> |
||||
|
<view class="date-label">开始日期:</view> |
||||
|
<picker mode="date" value="{{dateRange.start}}" bindchange="bindStartDateChange"> |
||||
|
<view class="picker"> |
||||
|
{{dateRange.start || '请选择'}} |
||||
|
</view> |
||||
|
</picker> |
||||
|
</view> |
||||
|
<view class="date-picker"> |
||||
|
<view class="date-label">结束日期:</view> |
||||
|
<picker mode="date" value="{{dateRange.end}}" bindchange="bindEndDateChange"> |
||||
|
<view class="picker"> |
||||
|
{{dateRange.end || '请选择'}} |
||||
|
</view> |
||||
|
</picker> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="filter-actions"> |
||||
|
<button class="reset-btn" bindtap="resetDateFilter">重置</button> |
||||
|
<button class="apply-btn" bindtap="applyDateFilter">应用筛选</button> |
||||
|
</view> |
||||
</view> |
</view> |
||||
|
|
||||
<!-- 订单列表 --> |
<!-- 订单列表 --> |
||||
<view class="order-list"> |
<view class="order-list"> |
||||
<!-- 暂无订单提示 --> |
<!-- 加载中 --> |
||||
<view class="no-orders"> |
<view wx:if="{{loading}}" class="loading"> |
||||
|
<text>加载中...</text> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 错误提示 --> |
||||
|
<view wx:elif="{{error}}" class="error"> |
||||
|
<text>{{error}}</text> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 无订单提示 --> |
||||
|
<view wx:elif="{{orders.length === 0}}" class="no-orders"> |
||||
<view class="no-orders-icon">📦</view> |
<view class="no-orders-icon">📦</view> |
||||
<view class="no-orders-title">空空如也~</view> |
<view class="no-orders-title">空空如也~</view> |
||||
<view class="no-orders-subtitle">您还没有任何订单,快去选购吧</view> |
<view class="no-orders-subtitle">您还没有任何订单,快去选购吧</view> |
||||
<button class="go-shopping-btn" bindtap="goToHome">去首页购物</button> |
<button class="go-shopping-btn" bindtap="goToHome">去首页购物</button> |
||||
</view> |
</view> |
||||
|
|
||||
|
<!-- 订单列表 --> |
||||
|
<view wx:else class="orders"> |
||||
|
<view wx:for="{{orders}}" wx:key="dataid" class="order-card" bindtap="viewOrderDetail" data-order-id="{{item.dataid}}"> |
||||
|
<!-- 订单头部 --> |
||||
|
<view class="order-header"> |
||||
|
<view class="order-no">订单号: {{item.sales_no}}</view> |
||||
|
<view class="order-date">{{item.order_date}}</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 订单主体 --> |
||||
|
<view class="order-body"> |
||||
|
<view class="customer-info"> |
||||
|
<view class="customer-company">{{item.customer_company}}</view> |
||||
|
<view class="contact-person">{{item.contact_person}} {{item.phone}}</view> |
||||
|
</view> |
||||
|
<view class="order-summary"> |
||||
|
<view class="total-amount">总金额: ¥{{item.total_amount}}</view> |
||||
|
<view class="total-pieces">总件数: {{item.total_pieces}}</view> |
||||
|
<view class="total-weight">总斤数: {{item.total_weight}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 订单底部 --> |
||||
|
<view class="order-footer"> |
||||
|
<view class="status-container"> |
||||
|
<view class="payment-status">{{item.payment_status}}</view> |
||||
|
<view class="order-status">{{item.order_status}}</view> |
||||
|
</view> |
||||
|
<view class="arrow-icon">→</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 分页加载状态 --> |
||||
|
<view class="load-more"> |
||||
|
<view wx:if="{{loadingMore}}" class="loading-more"> |
||||
|
<text>加载中...</text> |
||||
|
</view> |
||||
|
<view wx:elif="{{!hasMore && orders.length > 0}}" class="no-more"> |
||||
|
<text>没有更多数据了</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
</view> |
</view> |
||||
</view> |
</view> |
||||
|
|||||
Loading…
Reference in new issue