329 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			329 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <!--
 | |
|  * @Descripttion: 门票详情页面
 | |
|  * @version: 1.0.0
 | |
|  * @Author: Assistant
 | |
|  * @Date: 2025-01-22
 | |
| -->
 | |
| <template>
 | |
|   <view class="ticket-detail-container">
 | |
|     <!-- 内容区域 -->
 | |
|     <view class="content-area">
 | |
|       <view v-if="ticketDetail" class="ticket-detail-card">
 | |
|         <!-- 订单编号 -->
 | |
|         <view class="order-section">
 | |
|           <text class="order-label">订单编号:</text>
 | |
|           <text class="order-code">{{ ticketDetail.orderCode }}</text>
 | |
|         </view>
 | |
| 
 | |
|         <!-- 活动信息 -->
 | |
|         <view class="activity-section">
 | |
|           <view class="activity-title">{{ ticketDetail.actName }}</view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">门票价格:</text>
 | |
|             <text class="detail-value price">¥{{ ticketDetail.price }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">支付时间:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.creationTime }}</text>
 | |
|           </view>
 | |
|         </view>
 | |
| 
 | |
|         <!-- 支付信息 -->
 | |
|         <view class="pay-section">
 | |
|           <view class="section-title">支付信息</view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">支付编号:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.memberCode }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">支付昵称:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.memberName }}</text>
 | |
|           </view>
 | |
|         </view>
 | |
| 
 | |
|         <!-- 购票人信息 -->
 | |
|         <view class="buyer-section">
 | |
|           <view class="section-title">购票人信息</view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">姓名:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.buyName }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">联系方式:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.phone }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">证件证号:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.idCard }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">性别:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.sexVal }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">服装尺寸:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.clothSize }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item" v-if="ticketDetail.cohabitant">
 | |
|             <text class="detail-label">同住人:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.cohabitant }}</text>
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">紧急联系方式:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.emergencyPhone }}</text>
 | |
|           </view>
 | |
|         </view>
 | |
| 
 | |
|         <!-- 展开更多信息 -->
 | |
|         <view class="expand-section" @click="toggleExpand">
 | |
|           <text class="expand-text">{{ expanded ? '收起' : '查看更多' }}</text>
 | |
|           <u-icon
 | |
|             :name="expanded ? 'arrow-up' : 'arrow-down'"
 | |
|             size="12"
 | |
|             color="#999"
 | |
|           ></u-icon>
 | |
|         </view>
 | |
| 
 | |
|         <!-- 更多信息(展开时显示) -->
 | |
|         <view v-if="expanded" class="more-info">
 | |
|           <view class="section-title">其他信息</view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">订单金额:</text>
 | |
|             <text class="detail-value price"
 | |
|               >¥{{ ticketDetail.orderAmount }}</text
 | |
|             >
 | |
|           </view>
 | |
| 
 | |
|           <view class="detail-item">
 | |
|             <text class="detail-label">购买数量:</text>
 | |
|             <text class="detail-value">{{ ticketDetail.quantity }}</text>
 | |
|           </view>
 | |
|         </view>
 | |
|       </view>
 | |
| 
 | |
|       <!-- 加载状态 -->
 | |
|       <view v-if="loading" class="loading-state">
 | |
|         <u-loading-icon mode="spinner"></u-loading-icon>
 | |
|         <text class="loading-text">加载中...</text>
 | |
|       </view>
 | |
| 
 | |
|       <!-- 错误状态 -->
 | |
|       <view v-if="error && !loading" class="error-state">
 | |
|         <text class="error-text">{{ error }}</text>
 | |
|         <button class="retry-btn" @click="loadTicketDetail">重试</button>
 | |
|       </view>
 | |
| 
 | |
|       <!-- 空状态 -->
 | |
|       <view v-if="!ticketDetail && !loading && !error" class="empty-state">
 | |
|         <text class="empty-text">暂无数据</text>
 | |
|       </view>
 | |
|     </view>
 | |
|   </view>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import { getTicketDetail } from '@/config/ticket.js'
 | |
| 
 | |
| export default {
 | |
|   data() {
 | |
|     return {
 | |
|       ticketId: '',
 | |
|       ticketDetail: null,
 | |
|       loading: false,
 | |
|       error: '',
 | |
|       expanded: false,
 | |
|     }
 | |
|   },
 | |
|   onLoad(options) {
 | |
|     if (options.ticketId) {
 | |
|       this.ticketId = options.ticketId
 | |
|       this.loadTicketDetail()
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     // 返回上一页
 | |
|     goBack() {
 | |
|       uni.navigateBack()
 | |
|     },
 | |
| 
 | |
|     // 切换展开状态
 | |
|     toggleExpand() {
 | |
|       this.expanded = !this.expanded
 | |
|     },
 | |
| 
 | |
|     // 加载门票详情
 | |
|     async loadTicketDetail() {
 | |
|       if (!this.ticketId) {
 | |
|         this.error = '缺少门票ID'
 | |
|         return
 | |
|       }
 | |
| 
 | |
|       this.loading = true
 | |
|       this.error = ''
 | |
| 
 | |
|       try {
 | |
|         const res = await getTicketDetail({ ticketId: this.ticketId })
 | |
| 
 | |
|         if (res.code === 200) {
 | |
|           this.ticketDetail = res.data || res.rows?.[0]
 | |
|         } else {
 | |
|           this.error = res.msg || '加载失败'
 | |
|         }
 | |
|       } catch (error) {
 | |
|         console.error('加载门票详情失败:', error)
 | |
|         this.error = '网络错误,请重试'
 | |
|       } finally {
 | |
|         this.loading = false
 | |
|       }
 | |
|     },
 | |
|   },
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .ticket-detail-container {
 | |
|   min-height: 100vh;
 | |
|   background: #f8f8f8;
 | |
| }
 | |
| 
 | |
| .content-area {
 | |
|   padding: 16px;
 | |
| }
 | |
| 
 | |
| .ticket-detail-card {
 | |
|   background: #fff;
 | |
|   border-radius: 12px;
 | |
|   overflow: hidden;
 | |
|   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
 | |
| 
 | |
|   .order-section {
 | |
|     padding: 16px;
 | |
|     border-bottom: 1px solid #f5f5f5;
 | |
| 
 | |
|     .order-label {
 | |
|       font-size: 14px;
 | |
|       color: #999;
 | |
|     }
 | |
| 
 | |
|     .order-code {
 | |
|       font-size: 14px;
 | |
|       color: #666;
 | |
|       margin-left: 4px;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .activity-section {
 | |
|     padding: 16px;
 | |
|     border-bottom: 1px solid #f5f5f5;
 | |
| 
 | |
|     .activity-title {
 | |
|       font-size: 18px;
 | |
|       font-weight: 600;
 | |
|       color: #333;
 | |
|       margin-bottom: 16px;
 | |
|       line-height: 1.4;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .pay-section,
 | |
|   .buyer-section,
 | |
|   .more-info {
 | |
|     padding: 16px;
 | |
|     border-bottom: 1px solid #f5f5f5;
 | |
| 
 | |
|     .section-title {
 | |
|       font-size: 16px;
 | |
|       font-weight: 600;
 | |
|       color: #333;
 | |
|       margin-bottom: 12px;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .detail-item {
 | |
|     display: flex;
 | |
|     margin-bottom: 12px;
 | |
| 
 | |
|     &:last-child {
 | |
|       margin-bottom: 0;
 | |
|     }
 | |
| 
 | |
|     .detail-label {
 | |
|       font-size: 14px;
 | |
|       color: #999;
 | |
|       min-width: 100px;
 | |
|       flex-shrink: 0;
 | |
|     }
 | |
| 
 | |
|     .detail-value {
 | |
|       font-size: 14px;
 | |
|       color: #666;
 | |
|       flex: 1;
 | |
| 
 | |
|       &.price {
 | |
|         color: #005bac;
 | |
|         font-weight: 600;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .expand-section {
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|     justify-content: center;
 | |
|     padding: 16px;
 | |
|     border-bottom: 1px solid #f5f5f5;
 | |
|     cursor: pointer;
 | |
| 
 | |
|     .expand-text {
 | |
|       font-size: 14px;
 | |
|       color: #999;
 | |
|       margin-right: 4px;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .more-info {
 | |
|     border-bottom: none;
 | |
|   }
 | |
| }
 | |
| 
 | |
| .loading-state,
 | |
| .error-state,
 | |
| .empty-state {
 | |
|   display: flex;
 | |
|   flex-direction: column;
 | |
|   align-items: center;
 | |
|   justify-content: center;
 | |
|   padding: 60px 0;
 | |
| 
 | |
|   .loading-text,
 | |
|   .error-text,
 | |
|   .empty-text {
 | |
|     font-size: 14px;
 | |
|     color: #999;
 | |
|     margin-top: 8px;
 | |
|   }
 | |
| 
 | |
|   .retry-btn {
 | |
|     margin-top: 16px;
 | |
|     background: #005bac;
 | |
|     color: #fff;
 | |
|     border: none;
 | |
|     border-radius: 20px;
 | |
|     padding: 8px 24px;
 | |
|     font-size: 14px;
 | |
|   }
 | |
| }
 | |
| </style>
 |