综述: 新增积分订单功能模块
- 在福利专区页面新增积分订单tab页面,支持查看积分换购和积分优惠购订单详情 - 新增积分订单样式设计,包含订单状态标签、费用明细、商品详情等展示组件 - 实现订单详情展开收起功能,支持查看订单下店铺及商品的详细信息 - 添加模拟订单数据,包含已完成、待备货、待取货等不同状态的订单示例 - 优化积分专区tab切换逻辑,支持积分订单页面的渲染和交互
This commit is contained in:
		
							parent
							
								
									1390fd21a0
								
							
						
					
					
						commit
						acaea8fd8d
					
				
							
								
								
									
										408
									
								
								用户端APP/福利专区.html
								
								
								
								
							
							
						
						
									
										408
									
								
								用户端APP/福利专区.html
								
								
								
								
							|  | @ -179,6 +179,217 @@ | |||
|             opacity: 0.7; | ||||
|         } | ||||
| 
 | ||||
|         /* 积分订单样式 */ | ||||
|         .points-orders-container { | ||||
|             background: white; | ||||
|             border-radius: 15px; | ||||
|             padding: 20px; | ||||
|             margin-bottom: 15px; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-item { | ||||
|             background: #f8f9fa; | ||||
|             border-radius: 12px; | ||||
|             padding: 15px; | ||||
|             margin-bottom: 15px; | ||||
|             border: 1px solid #e9ecef; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-header { | ||||
|             display: flex; | ||||
|             justify-content: space-between; | ||||
|             align-items: center; | ||||
|             margin-bottom: 15px; | ||||
|             padding-bottom: 10px; | ||||
|             border-bottom: 1px solid #e9ecef; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-no { | ||||
|             font-size: 14px; | ||||
|             font-weight: bold; | ||||
|             color: #333; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-status { | ||||
|             font-size: 12px; | ||||
|             padding: 4px 8px; | ||||
|             border-radius: 12px; | ||||
|             font-weight: 500; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-status.completed { | ||||
|             background: #f6ffed; | ||||
|             color: #52c41a; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-status.pending { | ||||
|             background: #fff7e6; | ||||
|             color: #fa8c16; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-status.processing { | ||||
|             background: #e6f7ff; | ||||
|             color: #1890ff; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-info { | ||||
|             display: flex; | ||||
|             justify-content: space-between; | ||||
|             align-items: center; | ||||
|             margin-bottom: 10px; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-detail { | ||||
|             flex: 1; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-time { | ||||
|             font-size: 12px; | ||||
|             color: #666; | ||||
|             margin-bottom: 5px; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-fees { | ||||
|             font-size: 12px; | ||||
|             color: #666; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-total { | ||||
|             text-align: right; | ||||
|             color: #ff6b35; | ||||
|             font-size: 16px; | ||||
|             font-weight: bold; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-expand { | ||||
|             text-align: center; | ||||
|             margin-top: 10px; | ||||
|         } | ||||
| 
 | ||||
|         .expand-toggle { | ||||
|             background: none; | ||||
|             border: 1px solid #ff6b35; | ||||
|             color: #ff6b35; | ||||
|             padding: 5px 15px; | ||||
|             border-radius: 15px; | ||||
|             font-size: 12px; | ||||
|             cursor: pointer; | ||||
|             transition: all 0.3s; | ||||
|         } | ||||
| 
 | ||||
|         .expand-toggle:hover { | ||||
|             background: #ff6b35; | ||||
|             color: white; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-stores { | ||||
|             display: none; | ||||
|             margin-top: 15px; | ||||
|             padding-top: 15px; | ||||
|             border-top: 1px solid #e9ecef; | ||||
|         } | ||||
| 
 | ||||
|         .points-order-stores.expanded { | ||||
|             display: block; | ||||
|         } | ||||
| 
 | ||||
|         .points-store-item { | ||||
|             background: white; | ||||
|             border-radius: 8px; | ||||
|             padding: 12px; | ||||
|             margin-bottom: 10px; | ||||
|             border: 1px solid #e9ecef; | ||||
|         } | ||||
| 
 | ||||
|         .points-store-header { | ||||
|             display: flex; | ||||
|             justify-content: space-between; | ||||
|             align-items: center; | ||||
|             margin-bottom: 10px; | ||||
|             font-size: 13px; | ||||
|             font-weight: 500; | ||||
|         } | ||||
| 
 | ||||
|         .points-store-name { | ||||
|             color: #333; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-list { | ||||
|             display: none; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-list.expanded { | ||||
|             display: block; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-item { | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             padding: 8px 0; | ||||
|             border-bottom: 1px solid #f0f0f0; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-item:last-child { | ||||
|             border-bottom: none; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-image { | ||||
|             width: 40px; | ||||
|             height: 40px; | ||||
|             border-radius: 6px; | ||||
|             background: linear-gradient(135deg, #ff6b35, #f7931e); | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             justify-content: center; | ||||
|             font-size: 18px; | ||||
|             margin-right: 10px; | ||||
|             flex-shrink: 0; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-info { | ||||
|             flex: 1; | ||||
|             min-width: 0; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-name { | ||||
|             font-size: 12px; | ||||
|             color: #333; | ||||
|             margin-bottom: 2px; | ||||
|             white-space: nowrap; | ||||
|             overflow: hidden; | ||||
|             text-overflow: ellipsis; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-specs { | ||||
|             font-size: 11px; | ||||
|             color: #666; | ||||
|             display: flex; | ||||
|             gap: 10px; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-price { | ||||
|             text-align: right; | ||||
|             font-size: 12px; | ||||
|             color: #ff6b35; | ||||
|             font-weight: 500; | ||||
|         } | ||||
| 
 | ||||
|         .points-product-points { | ||||
|             font-size: 11px; | ||||
|             color: #666; | ||||
|             margin-top: 2px; | ||||
|         } | ||||
| 
 | ||||
|         .store-expand-btn { | ||||
|             background: none; | ||||
|             border: 1px solid #ddd; | ||||
|             color: #666; | ||||
|             padding: 2px 8px; | ||||
|             border-radius: 10px; | ||||
|             font-size: 11px; | ||||
|             cursor: pointer; | ||||
|         } | ||||
| 
 | ||||
|         /* 积分专区样式 */ | ||||
|         .points-section { | ||||
|             background: white; | ||||
|  | @ -795,6 +1006,7 @@ | |||
|             <div class="points-tabs"> | ||||
|                 <div class="points-tab active" onclick="switchPointsTab('exchange')">积分换购</div> | ||||
|                 <div class="points-tab" onclick="switchPointsTab('discount')">积分优惠购</div> | ||||
|                 <div class="points-tab" onclick="switchPointsTab('orders')">积分订单</div> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- 积分换购内容 --> | ||||
|  | @ -874,6 +1086,17 @@ | |||
|                 </div> | ||||
|                 <div class="load-more-tip">下滑展示更多</div> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- 积分订单内容 --> | ||||
|             <div id="orders" class="points-content"> | ||||
|                 <div class="points-orders-container"> | ||||
|                     <!-- 积分订单列表 --> | ||||
|                     <div class="points-orders-list" id="pointsOrdersList"> | ||||
|                         <!-- 订单数据将通过JavaScript动态生成 --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <div class="load-more-tip">下滑展示更多</div> | ||||
|             </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <!-- 秒杀专区 --> | ||||
|  | @ -1337,6 +1560,97 @@ | |||
|         // 积分购物车功能 | ||||
|         let pointsCartCount = 0; | ||||
| 
 | ||||
|         // 模拟积分订单数据 | ||||
|         const pointsOrdersData = [ | ||||
|             { | ||||
|                 settlementOrderNo: 'SU2024010001', | ||||
|                 status: '已完成', | ||||
|                 statusClass: 'completed', | ||||
|                 deliveryFee: 8.00, | ||||
|                 packageFee: 2.00, | ||||
|                 dispatchFee: 3.00, | ||||
|                 totalFee: 13.00, | ||||
|                 paymentTime: '2024-01-15 14:30:22', | ||||
|                 storeOrders: [ | ||||
|                     { | ||||
|                         storeOrderNo: 'SO2024010001', | ||||
|                         storeName: '华清超市', | ||||
|                         items: [ | ||||
|                             { | ||||
|                                 productOrderNo: 'PO2024010001', | ||||
|                                 productName: '有机纯牛奶 250ml', | ||||
|                                 productEmoji: '🥛', | ||||
|                                 originalPrice: 8.00, | ||||
|                                 productQuantity: 1, | ||||
|                                 pointsUsed: 500, | ||||
|                                 customerPayment: 0.00, | ||||
|                                 pointsType: '积分换购', | ||||
|                                 status: '已完成' | ||||
|                             } | ||||
|                         ] | ||||
|                     } | ||||
|                 ] | ||||
|             }, | ||||
|             { | ||||
|                 settlementOrderNo: 'SU2024010002', | ||||
|                 status: '待备货', | ||||
|                 statusClass: 'pending', | ||||
|                 deliveryFee: 6.00, | ||||
|                 packageFee: 1.50, | ||||
|                 dispatchFee: 2.00, | ||||
|                 totalFee: 9.50, | ||||
|                 paymentTime: '2024-01-15 15:45:10', | ||||
|                 storeOrders: [ | ||||
|                     { | ||||
|                         storeOrderNo: 'SO2024010002', | ||||
|                         storeName: '新鲜果园', | ||||
|                         items: [ | ||||
|                             { | ||||
|                                 productOrderNo: 'PO2024010002', | ||||
|                                 productName: '红富士苹果 约500g', | ||||
|                                 productEmoji: '🍎', | ||||
|                                 originalPrice: 12.00, | ||||
|                                 productQuantity: 1, | ||||
|                                 pointsUsed: 800, | ||||
|                                 customerPayment: 0.00, | ||||
|                                 pointsType: '积分换购', | ||||
|                                 status: '待备货' | ||||
|                             } | ||||
|                         ] | ||||
|                     } | ||||
|                 ] | ||||
|             }, | ||||
|             { | ||||
|                 settlementOrderNo: 'SU2024010003', | ||||
|                 status: '待取货', | ||||
|                 statusClass: 'processing', | ||||
|                 deliveryFee: 10.00, | ||||
|                 packageFee: 3.00, | ||||
|                 dispatchFee: 4.00, | ||||
|                 totalFee: 17.00, | ||||
|                 paymentTime: '2024-01-15 16:20:35', | ||||
|                 storeOrders: [ | ||||
|                     { | ||||
|                         storeOrderNo: 'SO2024010003', | ||||
|                         storeName: '农家特产', | ||||
|                         items: [ | ||||
|                             { | ||||
|                                 productOrderNo: 'PO2024010003', | ||||
|                                 productName: '纯天然蜂蜜 500g', | ||||
|                                 productEmoji: '🍯', | ||||
|                                 originalPrice: 48.00, | ||||
|                                 productQuantity: 1, | ||||
|                                 pointsUsed: 200, | ||||
|                                 customerPayment: 35.00, | ||||
|                                 pointsType: '积分优惠购', | ||||
|                                 status: '待取货' | ||||
|                             } | ||||
|                         ] | ||||
|                     } | ||||
|                 ] | ||||
|             } | ||||
|         ]; | ||||
| 
 | ||||
|         // 页面切换功能 | ||||
|         function switchTab(tabName) { | ||||
|             // 隐藏所有内容 | ||||
|  | @ -1385,6 +1699,100 @@ | |||
|              | ||||
|             // 激活选中的积分标签 | ||||
|             event.target.classList.add('active'); | ||||
|              | ||||
|             // 如果切换到积分订单tab,渲染订单数据 | ||||
|             if (tabName === 'orders') { | ||||
|                 renderPointsOrders(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // 渲染积分订单数据 | ||||
|         function renderPointsOrders() { | ||||
|             const ordersList = document.getElementById('pointsOrdersList'); | ||||
|              | ||||
|             if (pointsOrdersData.length === 0) { | ||||
|                 ordersList.innerHTML = '<div style="text-align: center; padding: 40px; color: #999;">暂无积分订单</div>'; | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             ordersList.innerHTML = pointsOrdersData.map(order => ` | ||||
|                 <div class="points-order-item"> | ||||
|                     <div class="points-order-header"> | ||||
|                         <div class="points-order-no">订单号:${order.settlementOrderNo}</div> | ||||
|                         <div class="points-order-status ${order.statusClass}">${order.status}</div> | ||||
|                     </div> | ||||
|                     <div class="points-order-info"> | ||||
|                         <div class="points-order-detail"> | ||||
|                             <div class="points-order-time">${order.paymentTime}</div> | ||||
|                             <div class="points-order-fees">配送费 ¥${order.deliveryFee.toFixed(2)} | 打包费 ¥${order.packageFee.toFixed(2)} | 调度费 ¥${order.dispatchFee.toFixed(2)}</div> | ||||
|                         </div> | ||||
|                         <div class="points-order-total">¥${order.totalFee.toFixed(2)}</div> | ||||
|                     </div> | ||||
|                     <div class="points-order-expand"> | ||||
|                         <button class="expand-toggle" onclick="toggleOrderDetails('${order.settlementOrderNo}')"> | ||||
|                             查看详情 | ||||
|                         </button> | ||||
|                     </div> | ||||
|                     <div class="points-order-stores" id="stores-${order.settlementOrderNo}"> | ||||
|                         ${order.storeOrders.map(store => ` | ||||
|                             <div class="points-store-item"> | ||||
|                                 <div class="points-store-header"> | ||||
|                                     <div class="points-store-name">${store.storeName}</div> | ||||
|                                     <button class="store-expand-btn" onclick="toggleStoreProducts('${order.settlementOrderNo}', '${store.storeOrderNo}')"> | ||||
|                                         商品详情 | ||||
|                                     </button> | ||||
|                                 </div> | ||||
|                                 <div class="points-product-list" id="products-${order.settlementOrderNo}-${store.storeOrderNo}"> | ||||
|                                     ${store.items.map(item => ` | ||||
|                                         <div class="points-product-item"> | ||||
|                                             <div class="points-product-image">${item.productEmoji}</div> | ||||
|                                             <div class="points-product-info"> | ||||
|                                                 <div class="points-product-name">${item.productName}</div> | ||||
|                                                 <div class="points-product-specs"> | ||||
|                                                     <span>数量: ${item.productQuantity}</span> | ||||
|                                                     <span>${item.pointsType}</span> | ||||
|                                                 </div> | ||||
|                                             </div> | ||||
|                                             <div class="points-product-price"> | ||||
|                                                 ${item.customerPayment > 0 ? '¥' + item.customerPayment.toFixed(2) : ''} | ||||
|                                                 <div class="points-product-points">${item.pointsUsed}积分</div> | ||||
|                                             </div> | ||||
|                                         </div> | ||||
|                                     `).join('')} | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         `).join('')} | ||||
|                     </div> | ||||
|                 </div> | ||||
|             `).join(''); | ||||
|         } | ||||
| 
 | ||||
|         // 切换订单详情显示 | ||||
|         function toggleOrderDetails(orderNo) { | ||||
|             const storesContainer = document.getElementById(`stores-${orderNo}`); | ||||
|             const button = event.target; | ||||
|              | ||||
|             if (storesContainer.classList.contains('expanded')) { | ||||
|                 storesContainer.classList.remove('expanded'); | ||||
|                 button.textContent = '查看详情'; | ||||
|             } else { | ||||
|                 storesContainer.classList.add('expanded'); | ||||
|                 button.textContent = '收起详情'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // 切换店铺商品详情显示 | ||||
|         function toggleStoreProducts(orderNo, storeOrderNo) { | ||||
|             const productsList = document.getElementById(`products-${orderNo}-${storeOrderNo}`); | ||||
|             const button = event.target; | ||||
|              | ||||
|             if (productsList.classList.contains('expanded')) { | ||||
|                 productsList.classList.remove('expanded'); | ||||
|                 button.textContent = '商品详情'; | ||||
|             } else { | ||||
|                 productsList.classList.add('expanded'); | ||||
|                 button.textContent = '收起详情'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // 秒杀时间段tab切换功能 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue