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>
 |