Files
medical-mall/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/points/index.kt.map

1 line
8.4 KiB
Plaintext

{"version":3,"sources":["pages/mall/consumer/points/index.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<template>\r\n <view class=\"points-page\">\r\n <view class=\"points-header\">\r\n <view class=\"points-info\">\r\n <text class=\"points-label\">当前积分</text>\r\n <text class=\"points-value\">{{ totalPoints }}</text>\r\n </view>\r\n <view class=\"points-actions\">\r\n <button class=\"exchange-btn\" @click=\"handleExchange\">积分兑换</button>\r\n </view>\r\n </view>\r\n \r\n <view class=\"records-section\">\r\n <text class=\"section-title\">积分明细</text>\r\n \r\n <view v-if=\"loading\" class=\"loading-state\">\r\n <text>加载中...</text>\r\n </view>\r\n \r\n <view v-else-if=\"records.length === 0\" class=\"empty-state\">\r\n <text class=\"empty-text\">暂无积分记录</text>\r\n </view>\r\n \r\n <view v-else class=\"record-list\">\r\n <view v-for=\"item in records\" :key=\"item.id\" class=\"record-item\">\r\n <view class=\"record-left\">\r\n <text class=\"record-title\">{{ item.description ?? getTypeText(item.type) }}</text>\r\n <text class=\"record-time\">{{ formatTime(item.created_at) }}</text>\r\n </view>\r\n <view class=\"record-right\">\r\n <text class=\"record-amount\" :class=\"{ positive: item.points > 0, negative: item.points < 0 }\">\r\n {{ item.points > 0 ? '+' : '' }}{{ item.points }}\r\n </text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, onMounted } from 'vue'\r\nimport { supabaseService } from '@/utils/supabaseService.uts'\r\n\r\ntype PointRecord = {\r\n id: string\r\n user_id: string\r\n points: number\r\n type: string\r\n description: string\r\n created_at: string\r\n}\r\n\r\nconst totalPoints = ref<number>(0)\r\nconst records = ref<PointRecord[]>([])\r\nconst loading = ref<boolean>(true)\r\n\r\n// 函数必须按调用顺序定义:先定义被调用的函数\r\nconst loadPoints = async (): Promise<void> => {\r\n try {\r\n const points = await supabaseService.getUserPoints()\r\n totalPoints.value = points\r\n } catch (e) {\r\n console.error('获取积分失败', e)\r\n }\r\n}\r\n\r\nconst loadRecords = async (): Promise<void> => {\r\n try {\r\n const list = await supabaseService.getPointRecords()\r\n records.value = list as PointRecord[]\r\n } catch (e) {\r\n console.error('获取积分记录失败', e)\r\n }\r\n}\r\n\r\n// loadData 在 loadPoints 和 loadRecords 之后定义\r\nconst loadData = async (): Promise<void> => {\r\n loading.value = true\r\n await loadPoints()\r\n await loadRecords()\r\n loading.value = false\r\n}\r\n\r\nonMounted(() => {\r\n loadData()\r\n})\r\n\r\nconst handleExchange = () => {\r\n uni.showToast({\r\n title: '积分商城开发中',\r\n icon: 'none'\r\n })\r\n}\r\n\r\nconst getTypeText = (type: string): string => {\r\n // 不支持 Record<string, string>,使用 if-else\r\n if (type == 'signin') {\r\n return '每日签到'\r\n } else if (type == 'shopping') {\r\n return '购物奖励'\r\n } else if (type == 'redeem') {\r\n return '积分兑换'\r\n } else if (type == 'admin') {\r\n return '系统调整'\r\n } else if (type == 'register') {\r\n return '注册赠送'\r\n } else {\r\n return '积分变动'\r\n }\r\n}\r\n\r\nconst formatTime = (timeStr: string): string => {\r\n if (timeStr == '') return ''\r\n const date = new Date(timeStr)\r\n const y = date.getFullYear()\r\n const m = (date.getMonth() + 1).toString().padStart(2, '0')\r\n const d = date.getDate().toString().padStart(2, '0')\r\n const hh = date.getHours().toString().padStart(2, '0')\r\n const mm = date.getMinutes().toString().padStart(2, '0')\r\n return `${y}-${m}-${d} ${hh}:${mm}`\r\n}\r\n</script>\r\n\r\n<style>\r\n.points-page {\r\n flex: 1;\r\n}\r\n\r\n.points-header {\r\n background-color: #ff5000;\r\n padding: 30px 20px;\r\n color: white;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.points-info {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.points-label {\r\n font-size: 14px;\r\n opacity: 0.9;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.points-value {\r\n font-size: 36px;\r\n font-weight: bold;\r\n}\r\n\r\n.exchange-btn {\r\n background-color: rgba(255,255,255,0.2);\r\n color: white;\r\n border: 1px solid rgba(255,255,255,0.4);\r\n font-size: 14px;\r\n border-radius: 20px;\r\n padding: 0 15px;\r\n height: 32px;\r\n line-height: 32px;\r\n}\r\n\r\n.records-section {\r\n background-color: white;\r\n margin-top: 10px;\r\n padding: 0 16px;\r\n min-height: 500px;\r\n}\r\n\r\n.section-title {\r\n font-size: 16px;\r\n font-weight: bold;\r\n padding: 16px 0;\r\n border-bottom: 1px solid #f0f0f0;\r\n display: flex;\r\n}\r\n\r\n.record-item {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 0;\r\n border-bottom: 1px solid #f9f9f9;\r\n}\r\n\r\n.record-left {\r\n display: flex;\r\n flex-direction: column;\r\n margin-bottom: 4px;\r\n font-size: 15px;\r\n color: #333;\r\n}\r\n\r\n.record-time {\r\n font-size: 12px;\r\n color: #999;\r\n}\r\n\r\n.record-amount {\r\n font-size: 16px;\r\n font-weight: bold;\r\n color: #333;\r\n}\r\n\r\n.record-amount.positive {\r\n color: #ff5000;\r\n}\r\n\r\n.record-amount.negative {\r\n color: #333;\r\n}\r\n\r\n.empty-state {\r\n padding: 40px 0;\r\n display: flex;\r\n justify-content: center;\r\n}\r\n\r\n.empty-text {\r\n color: #999;\r\n font-size: 14px;\r\n}\r\n</style>",null],"names":[],"mappings":"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"}