1 line
11 KiB
Plaintext
1 line
11 KiB
Plaintext
{"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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"} |