1 line
10 KiB
Plaintext
1 line
10 KiB
Plaintext
{"version":3,"sources":["pages/mall/consumer/red-packets/index.uvue","pages/mall/consumer/index.uvue"],"sourcesContent":["<template>\r\n <view class=\"red-packets-page\">\r\n <view class=\"tab-header\" style=\"position: fixed; top: 0; left: 0; right: 0; z-index: 10;\">\r\n <text \r\n class=\"tab-item\" \r\n :class=\"{ active: currentTab === 0 }\" \r\n @click=\"currentTab = 0\">未使用</text>\r\n <text \r\n class=\"tab-item\" \r\n :class=\"{ active: currentTab === 1 }\" \r\n @click=\"currentTab = 1\">已使用/过期</text>\r\n </view>\r\n\r\n <view v-if=\"loading\" class=\"loading-state\">\r\n <text>加载中...</text>\r\n </view>\r\n\r\n <scroll-view v-else class=\"packet-list\" direction=\"vertical\">\r\n <view v-if=\"filteredPackets.length === 0\" class=\"empty-state\">\r\n <text class=\"empty-text\">暂无相关红包</text>\r\n </view>\r\n <view v-else v-for=\"item in filteredPackets\" :key=\"item.id\" class=\"packet-item\" :class=\"{ disabled: item.status !== 0 }\">\r\n <view class=\"packet-left\">\r\n <text class=\"packet-amount\">¥<text class=\"amount-num\">{{ item.amount }}</text></text>\r\n <text class=\"packet-condition\">无门槛</text>\r\n </view>\r\n <view class=\"packet-right\">\r\n <view class=\"packet-info\">\r\n <text class=\"packet-name\">{{ item.name }}</text>\r\n <text class=\"packet-date\">有效期至 {{ formatTime(item.expire_at) }}</text>\r\n </view>\r\n <view class=\"packet-action\">\r\n <button v-if=\"item.status === 0\" class=\"use-btn\" @click=\"usePacket(item)\">立即使用</button>\r\n <text v-else class=\"status-text\">{{ getStatusText(item.status) }}</text>\r\n </view>\r\n </view>\r\n </view>\r\n </scroll-view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, computed, onMounted } from 'vue'\r\nimport { supabaseService } from '@/utils/supabaseService.uts'\r\n\r\ntype RedPacket = {\r\n id: string\r\n user_id: string\r\n amount: number\r\n name: string\r\n status: number // 0: unused, 1: used, 2: expired\r\n expire_at: string\r\n created_at: string\r\n}\r\n\r\nconst loading = ref(true)\r\nconst currentTab = ref(0)\r\nconst packets = ref<Array<RedPacket>>([])\r\n\r\nconst filteredPackets = computed((): Array<RedPacket> => {\r\n const result: Array<RedPacket> = []\r\n if (currentTab.value === 0) {\r\n for (let i: number = 0; i < packets.value.length; i++) {\r\n if (packets.value[i].status === 0) {\r\n result.push(packets.value[i])\r\n }\r\n }\r\n } else {\r\n for (let i: number = 0; i < packets.value.length; i++) {\r\n if (packets.value[i].status !== 0) {\r\n result.push(packets.value[i])\r\n }\r\n }\r\n }\r\n return result\r\n})\r\n\r\nconst loadData = async () => {\r\n loading.value = true\r\n try {\r\n const rawList = await supabaseService.getUserRedPackets()\r\n const mappedList: Array<RedPacket> = []\r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i] as UTSJSONObject\r\n const packet: RedPacket = {\r\n id: item.getString('id') ?? '',\r\n user_id: '',\r\n amount: item.getNumber('amount') ?? 0,\r\n name: item.getString('name') ?? '',\r\n status: item.getNumber('status') ?? 0,\r\n expire_at: item.getString('expire_at') ?? '',\r\n created_at: item.getString('created_at') ?? ''\r\n } as RedPacket\r\n mappedList.push(packet)\r\n }\r\n packets.value = mappedList\r\n } catch (e) {\r\n console.error(e)\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n loadData()\r\n})\r\n\r\nconst usePacket = (item: RedPacket) => {\r\n uni.switchTab({\r\n url: '/pages/mall/consumer/index'\r\n })\r\n}\r\n\r\nconst getStatusText = (status: number): string => {\r\n if (status === 1) return '已使用'\r\n if (status === 2) return '已过期'\r\n return ''\r\n}\r\n\r\nconst formatTime = (timeStr: string): string => {\r\n if (timeStr == '') return '永久有效'\r\n const date = new Date(timeStr)\r\n return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`\r\n}\r\n</script>\r\n\r\n<style>\r\n.red-packets-page {\r\n background-color: #f5f5f5;\r\n flex: 1;\r\n}\r\n\r\n.tab-header {\r\n display: flex;\r\n background-color: #fff;\r\n padding: 10px 0;\r\n /* position: sticky is removed in flavor of inline fixed style */\r\n}\r\n\r\n.tab-item {\r\n flex: 1;\r\n text-align: center;\r\n font-size: 14px;\r\n color: #666;\r\n padding-bottom: 8px;\r\n border-bottom: 2px solid transparent;\r\n}\r\n\r\n.tab-item.active {\r\n color: #ff5000;\r\n border-bottom-color: #ff5000;\r\n font-weight: bold;\r\n}\r\n\r\n.packet-list {\r\n flex: 1;\r\n padding: 15px;\r\n}\r\n\r\n.packet-item {\r\n display: flex;\r\n background-color: #fff;\r\n border-radius: 8px;\r\n margin-bottom: 12px;\r\n overflow: hidden;\r\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\r\n}\r\n\r\n.packet-item.disabled .packet-left,\r\n.packet-item.disabled .packet-name,\r\n.packet-item.disabled .amount-num {\r\n color: #999;\r\n background-color: #f0f0f0;\r\n}\r\n\r\n.packet-item.disabled .packet-left {\r\n background-color: #e0e0e0;\r\n}\r\n\r\n.packet-left {\r\n width: 100px;\r\n background-color: #fff5f0;\r\n color: #ff5000;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 15px 0;\r\n}\r\n\r\n.packet-amount {\r\n font-size: 14px;\r\n}\r\n\r\n.amount-num {\r\n font-size: 28px;\r\n font-weight: bold;\r\n}\r\n\r\n.packet-condition {\r\n font-size: 12px;\r\n margin-top: 4px;\r\n}\r\n\r\n.packet-right {\r\n flex: 1;\r\n padding: 15px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.packet-info {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.packet-name {\r\n font-size: 16px;\r\n font-weight: bold;\r\n color: #333;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.packet-date {\r\n font-size: 12px;\r\n color: #999;\r\n}\r\n\r\n.use-btn {\r\n font-size: 12px;\r\n background-color: #ff5000;\r\n color: #fff;\r\n border-radius: 15px;\r\n padding: 4px 12px;\r\n line-height: 1.5;\r\n}\r\n\r\n.status-text {\r\n font-size: 14px;\r\n color: #999;\r\n}\r\n\r\n.loading-state, .empty-state {\r\n padding: 40px;\r\n align-items: center;\r\n justify-content: center;\r\n display: flex;\r\n}\r\n</style>",null],"names":[],"mappings":"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"} |