Files
medical-mall/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/subscription/my-subscriptions.kt.map

1 line
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"sources":["pages/mall/consumer/subscription/my-subscriptions.uvue","pages/user/login.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<template>\r\n <view class=\"my-subs\">\r\n <view class=\"header\">\r\n <text class=\"title\">我的订阅</text>\r\n <button class=\"ghost\" @click=\"goPlanList\">订阅更多</button>\r\n </view>\r\n\r\n <view v-if=\"loading\" class=\"loading\">加载中...</view>\r\n <view v-else-if=\"items.length === 0\" class=\"empty\">暂无订阅</view>\r\n\r\n <view v-else class=\"list\">\r\n <view class=\"card\" v-for=\"s in items\" :key=\"s['id']\">\r\n <view class=\"row between\">\r\n <text class=\"name\">{{ s['plan']?.['name'] != null ? s['plan']?.['name'] : '订阅' }}</text>\r\n <text class=\"status\" :class=\"'st-' + (s['status'] != null ? s['status'] : 'active')\">{{ statusText(s['status'] as string) }}</text>\r\n </view>\r\n <view class=\"row\">\r\n <text class=\"label\">周期</text>\r\n <text class=\"value\">{{ (s['plan']?.['billing_period'] === 'yearly') ? '年付' : '月付' }}</text>\r\n </view>\r\n <view class=\"row\">\r\n <text class=\"label\">价格</text>\r\n <text class=\"value\">¥{{ s['plan']?.['price'] }}</text>\r\n </view>\r\n <view class=\"row\">\r\n <text class=\"label\">开始</text>\r\n <text class=\"value\">{{ fmt(s['start_date'] as string) }}</text>\r\n </view>\r\n <view class=\"row\">\r\n <text class=\"label\">下次扣费</text>\r\n <text class=\"value\">{{ fmt(s['next_billing_date'] as string) }}</text>\r\n </view>\r\n <view class=\"actions\">\r\n <label class=\"toggle\">\r\n <switch :checked=\"!!s['auto_renew']\" @change=\"e => toggleAutoRenew(s, e.detail.value as boolean)\" />\r\n <text class=\"toggle-text\">自动续费</text>\r\n </label>\r\n <button class=\"danger\" @click=\"cancelAtPeriodEnd(s)\" :disabled=\"(s['status'] as string) !== 'active'\">到期取消</button>\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 supaClient from '@/components/supadb/aksupainstance.uts'\r\nimport { getCurrentUserId } from '@/utils/store.uts'\r\n\r\nconst loading = ref<boolean>(true)\r\nconst items = ref<Array<UTSJSONObject>>([])\r\n\r\nconst fmt = (s: string | null): string => {\r\n if (s == null || s.length === 0) return '-'\r\n const d = new Date(s)\r\n if (isNaN(d.getTime())) return '-'\r\n return `${d.getFullYear()}-${(d.getMonth()+1).toString().padStart(2,'0')}-${d.getDate().toString().padStart(2,'0')}`\r\n}\r\n\r\nconst statusText = (st: string): string => {\r\n const map: UTSJSONObject = { trial: '试用', active: '生效', past_due: '逾期', canceled: '已取消', expired: '已过期' } as UTSJSONObject\r\n const val = map[st] as string | null\r\n return val != null ? val : st\r\n}\r\n\r\nconst loadSubs = async () => {\r\n try {\r\n loading.value = true\r\n const userId = getCurrentUserId()\r\n if (userId == null || userId.length === 0) {\r\n items.value = []\r\n return\r\n }\r\n // join: ml_user_subscriptions + ml_subscription_plans\r\n const res = await supaClient\r\n .from('ml_user_subscriptions')\r\n .select('*, plan:ml_subscription_plans(*)', {})\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n items.value = Array.isArray(res.data) ? (res.data as Array<UTSJSONObject>) : []\r\n } catch (e) {\r\n console.error('加载订阅失败:', e)\r\n uni.showToast({ title: '加载失败', icon: 'none' })\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\nconst toggleAutoRenew = async (s: UTSJSONObject, value: boolean) => {\r\n try {\r\n const id = (s['id'] ?? '') as string\r\n const res = await supaClient\r\n .from('ml_user_subscriptions')\r\n .update({ auto_renew: value })\r\n .eq('id', id)\r\n .execute()\r\n if (res.error != null) throw new Error(res.error?.message ?? '未知错误')\r\n s['auto_renew'] = value\r\n uni.showToast({ title: value ? '已开启自动续费' : '已关闭自动续费', icon: 'success' })\r\n } catch (e) {\r\n console.error('更新自动续费失败:', e)\r\n uni.showToast({ title: '操作失败', icon: 'none' })\r\n }\r\n}\r\n\r\nconst cancelAtPeriodEnd = async (s: UTSJSONObject) => {\r\n try {\r\n const id = (s['id'] ?? '') as string\r\n const res = await supaClient\r\n .from('ml_user_subscriptions')\r\n .update({ cancel_at_period_end: true })\r\n .eq('id', id)\r\n .execute()\r\n if (res.error != null) throw new Error(res.error?.message ?? '未知错误')\r\n s['cancel_at_period_end'] = true\r\n s['status'] = 'active' // 保持到期前仍为active\r\n uni.showToast({ title: '已设置到期取消', icon: 'success' })\r\n } catch (e) {\r\n console.error('设置到期取消失败:', e)\r\n uni.showToast({ title: '操作失败', icon: 'none' })\r\n }\r\n}\r\n\r\nconst goPlanList = () => {\r\n uni.navigateTo({ url: '/pages/mall/consumer/subscription/plan-list' })\r\n}\r\n\r\nonMounted(loadSubs)\r\n// 注意uni-app x 的 <script setup> 中不支持 onShow使用 onMounted 代替\r\n// 如果需要页面显示时刷新,可以在页面选项中定义 onShow\r\n</script>\r\n\r\n<style scoped>\r\n.my-subs { padding: 12px; }\r\n.header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }\r\n.title { font-size: 18px; font-weight: 700; }\r\n.ghost { background: #fff; border: 1px solid #ddd; color: #333; border-radius: 6px; padding: 6px 10px; }\r\n.loading, .empty { padding: 24px; text-align: center; color: #888; }\r\n.list { display: flex; flex-direction: column; }\r\n.card { background: #fff; border-radius: 10px; padding: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.05); margin-bottom: 12px; }\r\n.card:last-child { margin-bottom: 0; }\r\n.row { display: flex; padding: 4px 0; }\r\n.label { margin-right: 8px; }\r\n.between { justify-content: space-between; align-items: center; }\r\n.name { font-size: 16px; font-weight: 700; }\r\n.status { font-size: 12px; padding: 2px 8px; border-radius: 999px; background: #eee; color: #333; }\r\n.st-trial { background: #e6f7ff; color: #1677ff; }\r\n.st-active { background: #f6ffed; color: #52c41a; }\r\n.st-past_due { background: #fff7e6; color: #fa8c16; }\r\n.st-canceled, .st-expired { background: #fff1f0; color: #f5222d; }\r\n.label { color: #666; width: 80px; }\r\n.value { color: #111; flex: 1; }\r\n.actions { display: flex; align-items: center; justify-content: space-between; margin-top: 8px; }\r\n.toggle { display: flex; align-items: center; }\r\n.toggle-text { margin-right: 6px; }\r\n.danger { background: #f5222d; color: #fff; border-radius: 6px; padding: 6px 10px; }\r\n</style>",null,null],"names":[],"mappings":"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"}