1 line
11 KiB
Plaintext
1 line
11 KiB
Plaintext
{"version":3,"sources":["pages/mall/consumer/subscription/subscribe-checkout.uvue","uni_modules/ak-req/ak-req.uts","pages/mall/consumer/index.uvue","pages/user/login.uvue"],"sourcesContent":["<template>\r\n <view class=\"subscribe-checkout\">\r\n <view class=\"header\">\r\n <text class=\"title\">确认订阅</text>\r\n </view>\r\n\r\n <view v-if=\"loading\" class=\"loading\">加载中...</view>\r\n <view v-else-if=\"plan == null\" class=\"empty\">未找到订阅方案</view>\r\n <view v-else class=\"card\">\r\n <view class=\"row\">\r\n <text class=\"label\">方案</text>\r\n <text class=\"value\">{{ plan['name'] }}</text>\r\n </view>\r\n <view class=\"row\">\r\n <text class=\"label\">价格</text>\r\n <text class=\"value\">¥{{ plan['price'] }} / {{ plan['billing_period'] === 'yearly' ? '年' : '月' }}</text>\r\n </view>\r\n <view class=\"row\" v-if=\"trialDays > 0\">\r\n <text class=\"label\">试用期</text>\r\n <text class=\"value\">{{ trialDays }} 天</text>\r\n </view>\r\n\r\n <view class=\"section-title\">支付方式</view>\r\n <view class=\"pay-methods\">\r\n <label class=\"pay-item\" @click=\"selPay(1)\">\r\n <radio :checked=\"payMethod === 1\"></radio>\r\n <text>微信支付</text>\r\n </label>\r\n <label class=\"pay-item\" @click=\"selPay(2)\">\r\n <radio :checked=\"payMethod === 2\"></radio>\r\n <text>支付宝</text>\r\n </label>\r\n <label class=\"pay-item\" @click=\"selPay(4)\">\r\n <radio :checked=\"payMethod === 4\"></radio>\r\n <text>余额</text>\r\n </label>\r\n </view>\r\n\r\n <view class=\"actions\">\r\n <button class=\"primary\" :disabled=\"submitting\" @click=\"confirmSubscribe\">确认并支付</button>\r\n </view>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref } from 'vue'\r\nimport { onLoad } from '@dcloudio/uni-app'\r\nimport supaClient from '@/components/supadb/aksupainstance.uts'\r\nimport { PAYMENT_METHOD } from '@/types/mall-types.uts'\r\n\r\nconst planId = ref<string>('')\r\nconst loading = ref<boolean>(true)\r\nconst plan = ref<UTSJSONObject | null>(null)\r\nconst payMethod = ref<number>(PAYMENT_METHOD.WECHAT)\r\nconst trialDays = ref<number>(0)\r\nconst submitting = ref<boolean>(false)\r\n\r\nonLoad(async (opts: OnLoadOptions) => {\r\n planId.value = (opts['planId'] ?? '') as string\r\n await loadPlan()\r\n})\r\n\r\nconst loadPlan = async () => {\r\n try {\r\n loading.value = true\r\n const res = await supaClient\r\n .from('ml_subscription_plans')\r\n .select('*', {})\r\n .eq('id', planId.value)\r\n .single()\r\n .execute()\r\n if (res != null && res.error == null) {\r\n if (Array.isArray(res.data)) {\r\n plan.value = (res.data as Array<UTSJSONObject>)[0] ?? null\r\n } else {\r\n plan.value = res.data as UTSJSONObject\r\n }\r\n trialDays.value = (plan.value?.['trial_days'] ?? 0) as number\r\n } else {\r\n plan.value = null\r\n }\r\n } catch (e) {\r\n console.error('加载方案失败:', e)\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\nconst selPay = (v: number) => { payMethod.value = v }\r\n\r\n// 获取当前用户ID(按现有store实现替换)\r\nconst getCurrentUserId = (): string => {\r\n try {\r\n const u = uni.getStorageSync('current_user_id')\r\n return (u != null) ? (u as string) : ''\r\n } catch { return '' }\r\n}\r\n\r\nconst confirmSubscribe = async () => {\r\n if (plan.value == null) return\r\n const userId = getCurrentUserId()\r\n if (userId.length === 0) {\r\n uni.showToast({ title: '请先登录', icon: 'none' })\r\n return\r\n }\r\n\r\n submitting.value = true\r\n try {\r\n // 1) 创建订单或支付意图(此处简化为直接创建订阅记录)\r\n const now = new Date()\r\n const start = now.toISOString()\r\n // 简单计算下个扣费日\r\n let nextBilling: string | null = null\r\n if ((plan.value?.['billing_period'] ?? 'monthly') === 'yearly') {\r\n nextBilling = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate()).toISOString()\r\n } else {\r\n nextBilling = new Date(now.getFullYear(), now.getMonth() + 1, now.getDate()).toISOString()\r\n }\r\n const body = {\r\n user_id: userId,\r\n plan_id: plan.value['id'],\r\n status: 'active',\r\n start_date: start,\r\n end_date: null,\r\n next_billing_date: nextBilling,\r\n auto_renew: true,\r\n metadata: { pay_method: payMethod.value }\r\n }\r\n const ins = await supaClient\r\n .from('ml_user_subscriptions')\r\n .insert(body)\r\n .single?.()\r\n .execute()\r\n if (ins != null && ins.error == null) {\r\n uni.showToast({ title: '订阅成功', icon: 'success' })\r\n setTimeout(() => {\r\n uni.redirectTo({ url: '/pages/mall/consumer/profile' })\r\n }, 600)\r\n } else {\r\n uni.showToast({ title: ins?.error?.message ?? '订阅失败', icon: 'none' })\r\n }\r\n } catch (e) {\r\n console.error('订阅失败:', e)\r\n uni.showToast({ title: '订阅失败', icon: 'none' })\r\n } finally {\r\n submitting.value = false\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.subscribe-checkout { padding: 12px; }\r\n.header { margin-bottom: 8px; }\r\n.title { font-size: 18px; font-weight: 700; }\r\n.card { background: #fff; border-radius: 10px; padding: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.05); }\r\n.row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #f0f0f0; }\r\n.row:last-child { border-bottom: none; }\r\n.label { color: #666; }\r\n.value { color: #111; font-weight: 700; }\r\n.section-title { margin-top: 12px; font-weight: 700; }\r\n .pay-methods { display: flex; flex-direction: column; padding: 8px 0; }\r\n .pay-item { display: flex; align-items: center; margin-bottom: 8px; }\r\n .pay-item:last-child { margin-bottom: 0; }\r\n .pay-icon { margin-right: 8px; }\r\n.actions { display: flex; justify-content: flex-end; margin-top: 12px; }\r\n.primary { background: #3cc51f; color: #fff; border-radius: 6px; padding: 8px 12px; }\r\n.loading, .empty { padding: 24px; text-align: center; color: #888; }\r\n</style>",null,null,null],"names":[],"mappings":"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"} |