diff --git a/miniprogram/src/pages.json b/miniprogram/src/pages.json index c0322a7..5597d63 100644 --- a/miniprogram/src/pages.json +++ b/miniprogram/src/pages.json @@ -180,12 +180,6 @@ "navigationBarTitleText": "登录" } }, - { - "path": "pages/comprehensive/profile/setup", - "style": { - "navigationBarTitleText": "完善信息" - } - }, { "path": "pages/comprehensive/mall/index", "style": { diff --git a/miniprogram/src/pages/comprehensive/courses/index.vue b/miniprogram/src/pages/comprehensive/courses/index.vue index 7d39eeb..f99555b 100644 --- a/miniprogram/src/pages/comprehensive/courses/index.vue +++ b/miniprogram/src/pages/comprehensive/courses/index.vue @@ -29,9 +29,18 @@ {{ ticketQty }} - - 合计金额 - ¥{{ ticketTotal }} + + + + + 我的门票 + + + + 订单号 {{ record.order_no }} + {{ record.status_label }} + + {{ formatDate(record.created_at) }} @@ -98,7 +107,7 @@ import { membershipApi } from '@/modules/comprehensive/api/membership' import { ticketApi } from '@/modules/comprehensive/api/ticket' import { multiplyAmount } from '@/modules/comprehensive/utils/money' import { useComprehensiveSessionStore } from '@/modules/comprehensive/stores/session' -import { formatTimeRange, todayString } from '@/modules/comprehensive/utils/date' +import { formatTimeRange, formatDate, todayString } from '@/modules/comprehensive/utils/date' const session = useComprehensiveSessionStore() const activeTab = ref('membership') @@ -113,6 +122,8 @@ const isLoadingMore = ref(false) const ticketProduct = ref(null) const ticketQty = ref(1) const ticketSubmitting = ref(false) +const ticketRecords = ref([]) +const ticketRemaining = ref(0) const ticketTotal = computed(() => ticketProduct.value ? multiplyAmount(ticketProduct.value.unit_price, ticketQty.value) : '0.00') const weekDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] @@ -135,6 +146,7 @@ const switchTab = (tab) => { activeTab.value = tab if (tab === 'tickets') { loadTicketProduct() + loadTicketRecords() } else { loadSessions(true) } @@ -177,6 +189,19 @@ const loadTicketProduct = async () => { } } +const loadTicketRecords = async () => { + try { + const data = await ticketApi.getTicketAccount({ page: 1, pageSize: 20 }) + ticketRecords.value = (data.records || []).filter((r) => + ['available', 'checked_in', 'refunded'].includes(r.status) + ) + ticketRemaining.value = data.remaining_count || 0 + } catch { + ticketRecords.value = [] + ticketRemaining.value = 0 + } +} + const decreaseTicketQty = () => { ticketQty.value = Math.max(1, ticketQty.value - 1) } @@ -222,7 +247,8 @@ const goDetail = (item) => { const refresh = async () => { if (activeTab.value === 'tickets') { ticketProduct.value = null - await loadTicketProduct() + ticketRecords.value = [] + await Promise.all([loadTicketProduct(), loadTicketRecords()]) } else { page.value = 1 await loadSessions(true) @@ -531,4 +557,74 @@ defineExpose({ refresh, loadMore }) .submit-btn { width: 320rpx; } + +/* 门票记录 */ +.ticket-records-section { + margin-bottom: $spacing-md; +} + +.ticket-remaining { + color: $color-success; + font-size: 24rpx; + font-weight: 700; +} + +.ticket-record-card { + display: flex; + flex-direction: column; + gap: $spacing-xs; +} + +.ticket-record-top { + display: flex; + justify-content: space-between; + align-items: center; +} + +.ticket-record-no { + color: $text-color-muted; + font-size: 24rpx; +} + +.ticket-record-date { + color: $text-color-light; + font-size: 22rpx; +} + +.ticket-status-badge { + padding: 4rpx 16rpx; + border-radius: $border-radius-sm; + font-size: 22rpx; + font-weight: 800; +} + +.ticket-status-badge.available { + background: $color-success-light; + color: $color-success; +} + +.ticket-status-badge.checked_in { + background: $bg-color-hover; + color: $text-color-light; +} + +.ticket-status-badge.cancelled { + background: $color-danger-light; + color: $color-danger; +} + +.ticket-status-badge.pending_pay { + background: $color-warning-light; + color: $color-warning; +} + +.ticket-status-badge.refunded { + background: $color-danger-light; + color: $color-danger; +} + +.ticket-status-badge.closed { + background: $bg-color-hover; + color: $text-color-light; +} diff --git a/miniprogram/src/pages/comprehensive/membership/available-sessions.vue b/miniprogram/src/pages/comprehensive/membership/available-sessions.vue index 672873a..32a2952 100644 --- a/miniprogram/src/pages/comprehensive/membership/available-sessions.vue +++ b/miniprogram/src/pages/comprehensive/membership/available-sessions.vue @@ -1,92 +1,42 @@ diff --git a/miniprogram/src/pages/comprehensive/membership/cards.vue b/miniprogram/src/pages/comprehensive/membership/cards.vue index d95b9a8..6d7dbb7 100644 --- a/miniprogram/src/pages/comprehensive/membership/cards.vue +++ b/miniprogram/src/pages/comprehensive/membership/cards.vue @@ -1,47 +1,37 @@ diff --git a/miniprogram/src/pages/comprehensive/profile/detail.vue b/miniprogram/src/pages/comprehensive/profile/detail.vue index 4d35938..159a5b8 100644 --- a/miniprogram/src/pages/comprehensive/profile/detail.vue +++ b/miniprogram/src/pages/comprehensive/profile/detail.vue @@ -35,17 +35,22 @@ - + + + + 加载中... @@ -115,6 +130,7 @@ const bindPhone = async (event) => { .profile-detail { min-height: 100vh; padding: $spacing-md; + padding-bottom: calc(160rpx + env(safe-area-inset-bottom)); background: $bg-color-soft; } @@ -227,7 +243,18 @@ const bindPhone = async (event) => { justify-content: center; } +.action-area { + display: flex; + flex-direction: column; + gap: $spacing-sm; + padding: 0 $spacing-md; +} + .save-button { - flex: 1; + height: 88rpx; +} + +.home-button { + height: 88rpx; } diff --git a/miniprogram/src/pages/comprehensive/profile/index.vue b/miniprogram/src/pages/comprehensive/profile/index.vue index 93c1f8e..959411d 100644 --- a/miniprogram/src/pages/comprehensive/profile/index.vue +++ b/miniprogram/src/pages/comprehensive/profile/index.vue @@ -73,7 +73,6 @@ - @@ -82,7 +81,6 @@ import { computed, onMounted, ref } from 'vue' import { useComprehensiveSessionStore } from '@/modules/comprehensive/stores/session' import { memberApi } from '@/modules/comprehensive/api/member' import { formatAmount } from '@/modules/comprehensive/utils/money' -import AgreementLinks from '@/components/AgreementLinks.vue' const session = useComprehensiveSessionStore() const avatarInitial = computed(() => (session.member?.nickname || '用户').slice(0, 1)) @@ -90,14 +88,9 @@ const balance = ref('0.00') const balanceText = computed(() => formatAmount(balance.value)) const menuItems = [ - { title: '篮球门票', url: '/pages/comprehensive/tickets/index', theme: 'ticket-theme', icon: 'ticket' }, - { title: '充值', url: '/pages/comprehensive/mall/index', theme: 'order-theme', icon: 'order' }, - { title: '我的次卡', url: '/pages/comprehensive/membership/cards', theme: 'profile-theme', icon: 'profile' }, + { title: '我的会员卡', url: '/pages/comprehensive/membership/cards', theme: 'profile-theme', icon: 'profile' }, { title: '我的订单', url: '/pages/comprehensive/profile/orders', theme: 'order-theme', icon: 'order' }, - { title: '我的预约', url: '/pages/comprehensive/bookings/index', theme: 'order-theme', icon: 'order' }, - { title: '余额流水', url: '/pages/comprehensive/profile/balance', theme: 'order-theme', icon: 'order' }, - { title: '个人信息', url: '/pages/comprehensive/profile/detail', theme: 'profile-theme', icon: 'profile' }, - { title: '切换场馆', url: '/pages/venue-select/index?mode=switch', theme: 'profile-theme', icon: 'profile' } + { title: '余额流水', url: '/pages/comprehensive/profile/balance', theme: 'order-theme', icon: 'order' } ] onMounted(async () => { diff --git a/miniprogram/src/pages/comprehensive/profile/login.vue b/miniprogram/src/pages/comprehensive/profile/login.vue index b865547..ef1abb2 100644 --- a/miniprogram/src/pages/comprehensive/profile/login.vue +++ b/miniprogram/src/pages/comprehensive/profile/login.vue @@ -13,7 +13,7 @@ const session = useComprehensiveSessionStore() const handleLogin = async () => { try { await session.login() - uni.redirectTo({ url: '/pages/comprehensive/profile/setup' }) + uni.redirectTo({ url: '/pages/comprehensive/profile/detail' }) } catch { uni.showToast({ title: '登录失败,请重试', icon: 'none' }) } diff --git a/miniprogram/src/pages/comprehensive/profile/orders.vue b/miniprogram/src/pages/comprehensive/profile/orders.vue index b0004e5..2b88c18 100644 --- a/miniprogram/src/pages/comprehensive/profile/orders.vue +++ b/miniprogram/src/pages/comprehensive/profile/orders.vue @@ -1,27 +1,20 @@