1 line
15 KiB
Plaintext
1 line
15 KiB
Plaintext
{"version":3,"sources":["pages/mall/consumer/share/index.uvue","pages/user/login.uvue"],"sourcesContent":["<template>\n <scroll-view class=\"share-page\" direction=\"vertical\">\n <view class=\"share-summary\">\n <view class=\"summary-item\">\n <text class=\"summary-value\">{{ totalShares }}</text>\n <text class=\"summary-label\">分享次数</text>\n </view>\n <view class=\"summary-divider\"></view>\n <view class=\"summary-item\">\n <text class=\"summary-value\">{{ completedShares }}</text>\n <text class=\"summary-label\">免单成功</text>\n </view>\n <view class=\"summary-divider\"></view>\n <view class=\"summary-item\">\n <text class=\"summary-value\">{{ totalReward }}</text>\n <text class=\"summary-label\">累计奖励(元)</text>\n </view>\n </view>\n\n <view class=\"rules-section\">\n <view class=\"rules-header\" @click=\"toggleRules\">\n <text class=\"rules-title\">免单规则</text>\n <text class=\"rules-arrow\">{{ showRules ? '▲' : '▼' }}</text>\n </view>\n <view class=\"rules-content\" v-if=\"showRules\">\n <text class=\"rules-text\">1. 购买商品后可生成分享链接</text>\n <text class=\"rules-text\">2. 分享给好友,好友通过链接购买</text>\n <text class=\"rules-text\">3. 累计4人购买后,即可免单</text>\n <text class=\"rules-text\">4. 免单金额存入余额,可联系商家提现</text>\n </view>\n </view>\n\n <view class=\"share-list-section\">\n <view class=\"section-header\">\n <text class=\"section-title\">我的分享</text>\n </view>\n\n <view v-if=\"loading\" class=\"loading-state\">\n <text class=\"loading-text\">加载中...</text>\n </view>\n\n <view v-else-if=\"shares.length === 0\" class=\"empty-state\">\n <text class=\"empty-text\">暂无分享记录</text>\n <text class=\"empty-tip\">购买商品后可以分享免单哦~</text>\n </view>\n\n <view v-else class=\"share-list\">\n <view class=\"share-item\" v-for=\"share in shares\" :key=\"share.id\" @click=\"goToShareDetail(share.id)\">\n <image class=\"product-image\" :src=\"share.product_image != null && share.product_image.length > 0 ? share.product_image : defaultImage\" mode=\"aspectFill\" />\n <view class=\"share-info\">\n <text class=\"product-name\">{{ share.product_name }}</text>\n <view class=\"progress-section\">\n <view class=\"progress-bar\">\n <view class=\"progress-fill\" :style=\"{ width: getProgressPercent(share.current_count, share.required_count) + '%' }\"></view>\n </view>\n <text class=\"progress-text\">{{ share.current_count }}/{{ share.required_count }}</text>\n </view>\n <view class=\"share-bottom\">\n <text class=\"share-code\">分享码: {{ share.share_code }}</text>\n <text class=\"share-status\" :class=\"getStatusClass(share.status)\">{{ getStatusText(share.status) }}</text>\n </view>\n </view>\n <text class=\"share-arrow\">›</text>\n </view>\n </view>\n </view>\n </scroll-view>\n</template>\n\n<script setup lang=\"uts\">\nimport { ref, onMounted, computed } from 'vue'\nimport { supabaseService } from '@/utils/supabaseService.uts'\n\ntype ShareRecord = {\n id: string\n product_id: string\n product_name: string\n product_image: string | null\n product_price: number\n share_code: string\n required_count: number\n current_count: number\n status: number\n reward_amount: number | null\n created_at: string\n}\n\nconst shares = ref<ShareRecord[]>([])\nconst loading = ref<boolean>(true)\nconst showRules = ref<boolean>(false)\nconst defaultImage: string = '/static/images/default-product.png'\n\nconst totalShares = computed((): number => shares.value.length)\n\nconst completedShares = computed((): number => {\n let count = 0\n for (let i = 0; i < shares.value.length; i++) {\n if (shares.value[i].status === 1) count++\n }\n return count\n})\n\nconst totalReward = computed((): number => {\n let total = 0\n for (let i = 0; i < shares.value.length; i++) {\n if (shares.value[i].reward_amount != null) {\n total += shares.value[i].reward_amount!\n }\n }\n return total\n})\n\nconst loadShares = async (): Promise<void> => {\n loading.value = true\n try {\n const result = await supabaseService.getMyShareRecords()\n const parsed: ShareRecord[] = []\n \n for (let i = 0; i < result.length; i++) {\n const item = result[i]\n let itemObj: UTSJSONObject | null = null\n if (item instanceof UTSJSONObject) {\n itemObj = item\n } else {\n itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\n }\n \n parsed.push({\n id: itemObj.getString('id') ?? '',\n product_id: itemObj.getString('product_id') ?? '',\n product_name: itemObj.getString('product_name') ?? '',\n product_image: itemObj.getString('product_image'),\n product_price: itemObj.getNumber('product_price') ?? 0,\n share_code: itemObj.getString('share_code') ?? '',\n required_count: itemObj.getNumber('required_count') ?? 4,\n current_count: itemObj.getNumber('current_count') ?? 0,\n status: itemObj.getNumber('status') ?? 0,\n reward_amount: itemObj.getNumber('reward_amount'),\n created_at: itemObj.getString('created_at') ?? ''\n })\n }\n \n shares.value = parsed\n } catch (e) {\n console.error('加载分享记录失败:', e)\n } finally {\n loading.value = false\n }\n}\n\nconst toggleRules = (): void => {\n showRules.value = !showRules.value\n}\n\nconst getProgressPercent = (current: number, required: number): number => {\n if (required <= 0) return 0\n return Math.min(100, Math.round((current / required) * 100))\n}\n\nconst getStatusText = (status: number): string => {\n if (status === 0) return '进行中'\n if (status === 1) return '已免单'\n if (status === 2) return '已失效'\n if (status === 3) return '已过期'\n return '未知'\n}\n\nconst getStatusClass = (status: number): string => {\n if (status === 0) return 'status-progress'\n if (status === 1) return 'status-completed'\n if (status === 2) return 'status-invalid'\n if (status === 3) return 'status-expired'\n return ''\n}\n\nconst goToShareDetail = (shareId: string): void => {\n uni.navigateTo({\n url: `/pages/mall/consumer/share/detail?id=${shareId}`\n })\n}\n\nonMounted(() => {\n loadShares()\n})\n</script>\n\n<style>\n.share-page {\n flex: 1;\n height: 100%;\n background-color: #f5f5f5;\n}\n\n.share-summary {\n display: flex;\n flex-direction: row;\n background-color: white;\n padding: 20px 0;\n margin-bottom: 8px;\n}\n\n.summary-item {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.summary-value {\n font-size: 24px;\n font-weight: bold;\n color: #ff6b35;\n}\n\n.summary-label {\n font-size: 12px;\n color: #999;\n margin-top: 4px;\n}\n\n.summary-divider {\n width: 1px;\n height: 40px;\n background-color: #f0f0f0;\n}\n\n.rules-section {\n background-color: white;\n margin-bottom: 8px;\n}\n\n.rules-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n}\n\n.rules-title {\n font-size: 15px;\n font-weight: bold;\n color: #333;\n}\n\n.rules-arrow {\n font-size: 12px;\n color: #999;\n}\n\n.rules-content {\n padding: 0 16px 16px;\n display: flex;\n flex-direction: column;\n}\n\n.rules-text {\n font-size: 13px;\n color: #666;\n line-height: 24px;\n}\n\n.share-list-section {\n background-color: white;\n}\n\n.section-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.section-title {\n font-size: 16px;\n font-weight: bold;\n color: #333;\n}\n\n.loading-state {\n padding: 40px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.loading-text {\n font-size: 14px;\n color: #999;\n}\n\n.empty-state {\n padding: 60px 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.empty-text {\n font-size: 14px;\n color: #999;\n}\n\n.empty-tip {\n font-size: 12px;\n color: #ccc;\n margin-top: 8px;\n}\n\n.share-list {\n display: flex;\n flex-direction: column;\n}\n\n.share-item {\n display: flex;\n flex-direction: row;\n padding: 16px;\n border-bottom: 1px solid #f9f9f9;\n}\n\n.product-image {\n width: 80px;\n height: 80px;\n border-radius: 8px;\n}\n\n.share-info {\n flex: 1;\n margin-left: 12px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.product-name {\n font-size: 14px;\n color: #333;\n lines: 2;\n}\n\n.progress-section {\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-top: 8px;\n}\n\n.progress-bar {\n flex: 1;\n height: 6px;\n background-color: #f0f0f0;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background-color: #ff6b35;\n border-radius: 3px;\n}\n\n.progress-text {\n font-size: 12px;\n color: #ff6b35;\n margin-left: 8px;\n}\n\n.share-bottom {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n margin-top: 8px;\n}\n\n.share-code {\n font-size: 12px;\n color: #999;\n}\n\n.share-status {\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 4px;\n}\n\n.status-progress {\n background-color: #fff5f0;\n color: #ff6b35;\n}\n\n.status-completed {\n background-color: #f6ffed;\n color: #52c41a;\n}\n\n.status-invalid {\n background-color: #f5f5f5;\n color: #999;\n}\n\n.status-expired {\n background-color: #fff1f0;\n color: #ff4d4f;\n}\n\n.share-arrow {\n font-size: 20px;\n color: #ccc;\n margin-left: 8px;\n align-self: center;\n}\n</style>\n",null],"names":[],"mappings":"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"} |