Lufaneng 11 months ago
parent 3d4a802ba5
commit d7c95a7d71

@ -1,5 +1,5 @@
{ {
"name": "lift-wechat", "name": "lift-drawing-wechat",
"version": "1.0.0", "version": "1.0.0",
"description": "电梯图纸生成", "description": "电梯图纸生成",
"main": "main.js", "main": "main.js",
@ -10,7 +10,7 @@
"commit": "git-cz" "commit": "git-cz"
}, },
"keywords": [ "keywords": [
"卡叔电梯" "智能电梯图纸生成"
], ],
"author": "Lufaneng", "author": "Lufaneng",
"license": "MIT", "license": "MIT",

@ -49,7 +49,8 @@
"needLogin": true, "needLogin": true,
"style" : "style" :
{ {
"navigationBarTitleText" : "我的" "navigationBarTitleText" : "我的",
"enablePullDownRefresh":true
} }
}, },
{ {

@ -1,54 +1,23 @@
<template> <template>
<view class="container"> <view class="container">
<!-- 顶部筛选标签 --> <!-- 顶部筛选标签 -->
<view class="filter-tabs"> <uv-sticky bgColor="#fff" offsetTop="0">
<view <div class="tabBox">
class="tab-item" <div class="tabItem" :class="{selected:active==='全部'}" @click="switchTab('全部')"></div>
:class="{ active: activeTab === 'all' }" <div class="tabItem" :class="{selected:active==='生成'}" @click="switchTab('生成')"></div>
@click="switchTab('all')" <div class="tabItem" :class="{selected:active==='会员'}" @click="switchTab('会员')"></div>
> </div>
全部 </uv-sticky>
</view>
<view
class="tab-item"
:class="{ active: activeTab === 'generate' }"
@click="switchTab('generate')"
>
生成
</view>
<view
class="tab-item"
:class="{ active: activeTab === 'member' }"
@click="switchTab('member')"
>
会员
</view>
<view
class="tab-item"
:class="{ active: activeTab === 'other' }"
@click="switchTab('other')"
>
其他
</view>
</view>
<!-- 消费记录列表 --> <!-- 消费记录列表 -->
<view class="consumption-list"> <view class="consumption-list">
<view <view class="consumption-item" v-for="item in list" :key="item.id">
class="consumption-item"
v-for="item in filteredConsumptions"
:key="item.id"
>
<!-- 消费项目和金额 --> <!-- 消费项目和金额 -->
<view class="item-header"> <view class="item-header">
<view class="item-title">{{ item.title }}</view> <view class="item-title">{{ item.type }}</view>
<view <view class="item-amount" :class="{
class="item-amount"
:class="{
positive: item.amount > 0, positive: item.amount > 0,
negative: item.amount < 0, negative: item.amount < 0,
}" }">
>
{{ item.amount > 0 ? "+" : "-" }}¥{{ {{ item.amount > 0 ? "+" : "-" }}¥{{
Math.abs(item.amount).toFixed(2) Math.abs(item.amount).toFixed(2)
}} }}
@ -59,23 +28,23 @@
<view class="item-details"> <view class="item-details">
<view class="detail-row"> <view class="detail-row">
<text class="detail-label">消费编号:</text> <text class="detail-label">消费编号:</text>
<text class="detail-value">{{ item.consumptionNumber }}</text> <text class="detail-value">{{ item.order_no }}</text>
</view> </view>
<view class="detail-row"> <view class="detail-row">
<text class="detail-label">消费时间:</text> <text class="detail-label">消费时间:</text>
<text class="detail-value">{{ item.consumptionTime }}</text> <text class="detail-value">{{ item.finished_at ? dayjs(item.finished_at * 1000).format('YYYY-MM-DD HH:mm:ss') :'' }}</text>
</view> </view>
<view class="balance-row"> <view class="balance-row">
<view class="balance-item"> <view class="balance-item">
<text class="balance-label">账前金额:</text> <text class="balance-label">账前金额:</text>
<text class="balance-value"> <text class="balance-value">
¥{{ item.beforeBalance.toFixed(2) }} ¥{{ item.balance_before_cents / 100 }}
</text> </text>
</view> </view>
<view class="balance-item"> <view class="balance-item">
<text class="balance-label">账后金额:</text> <text class="balance-label">账后金额:</text>
<text class="balance-value"> <text class="balance-value">
¥{{ item.afterBalance.toFixed(2) }} ¥{{ item.balance_after_cents / 100 }}
</text> </text>
</view> </view>
</view> </view>
@ -84,41 +53,39 @@
</view> </view>
<!-- 空状态 --> <!-- 空状态 -->
<view v-if="filteredConsumptions.length === 0" class="empty-state"> <view v-if="list.length === 0 && loadingStatus !== 'loading'" class="empty-state">
<u-icon name="file-text" size="60" color="#ccc"></u-icon> <u-icon name="file-text" size="60" color="#ccc"></u-icon>
<text class="empty-text">暂无消费记录</text> <text class="empty-text">暂无消费记录</text>
</view> </view>
<uv-load-more v-else :status="loadingStatus" />
<!-- 加载更多 -->
<view v-if="hasMore && filteredConsumptions.length > 0" class="load-more">
<u-button
type="default"
size="small"
:loading="loading"
@click="loadMore"
>
{{ loading ? "加载中..." : "加载更多" }}
</u-button>
</view>
</view> </view>
</template> </template>
<script setup> <script setup>
import { computed, onMounted, ref } from "vue"; import {
import { onShow } from "@dcloudio/uni-app"; computed,
import { useAuthStore, useUserStore } from "@/store"; onMounted,
import HeaderCustom from "/components/HeaderCustom/HeaderCustom.vue"; ref
import RPC from "@/utils/request"; } from "vue";
import {
const authStore = useAuthStore(); onShow,
const userStore = useUserStore(); onReachBottom
} from "@dcloudio/uni-app";
// import {
const activeTab = ref("all"); useAuthStore,
const loading = ref(false); useUserStore
const hasMore = ref(true); } from "@/store";
const consumptions = ref([ import HeaderCustom from "/components/HeaderCustom/HeaderCustom.vue";
{ import RPC from "@/utils/request";
import dayjs from "dayjs";
const authStore = useAuthStore();
const userStore = useUserStore();
const active = ref('全部')
const list = ref([{
id: 1, id: 1,
title: "乘客电梯图纸生成", title: "乘客电梯图纸生成",
amount: -30.0, amount: -30.0,
@ -158,128 +125,102 @@ const consumptions = ref([
afterBalance: 2795.0, afterBalance: 2795.0,
type: "other", type: "other",
}, },
]); ]);
// const switchTab = (tab) => {
const filteredConsumptions = computed(() => { list.value = []
if (activeTab.value === "all") { active.value = tab
return consumptions.value; page.value = 1
if(tab === '全部') {
typeParams.value = ''
} }
return consumptions.value.filter((item) => item.type === activeTab.value); if(tab === '生成') {
}); typeParams.value = '生成'
//
const switchTab = (tab) => {
activeTab.value = tab;
};
//
const loadMore = async () => {
if (loading.value) return;
loading.value = true;
try {
// API
// const result = await RPC.get('/api/consumptions', {
// page: currentPage.value + 1,
// type: activeTab.value
// })
//
await new Promise((resolve) => setTimeout(resolve, 1000));
//
hasMore.value = false;
uni.showToast({
title: "没有更多数据了",
icon: "none",
});
} catch (error) {
console.error("加载更多失败:", error);
uni.showToast({
title: "加载失败,请重试",
icon: "none",
});
} finally {
loading.value = false;
} }
}; if(tab === '会员') {
typeParams.value = '会员'
// }
const loadConsumptions = async () => { getList()
try { }
// API const page = ref(1)
// const result = await RPC.get('/api/consumptions', { const typeParams = ref('')
// type: activeTab.value const loadingStatus = ref('loadmore')
// }) const count = ref(0);
// consumptions.value = result.data //
} catch (error) { const getList = () => {
console.error("加载消费记录失败:", error); uni.showLoading();
uni.showToast({ RPC.post('/wallet/txns/list', {
title: "加载失败,请重试", user_id: userStore.userInfo.id,
icon: "none", page:page.value,
}); size:20,
type:typeParams.value
}).then(res => {
list.value = [...list.value, ...res.list];
count.value = res.total;
if (list.value.length >= count.value) {
loadingStatus.value = "nomore";
} else {
loadingStatus.value = "loadmore";
}
}).catch(() => {
loadingStatus.value = "loadmore";
}).finally(() => {
uni.hideLoading();
})
} }
};
//
const onRefresh = async () => {
hasMore.value = true;
await loadConsumptions();
};
onMounted(() => { onMounted(() => {
loadConsumptions();
});
onShow(() => { });
onReachBottom(() => {
if (list.value.length >= count.value || loadingStatus.value === "loading")
return;
console.log("上拉加载:");
loadingStatus.value = "loading";
page.value = ++page.value;
getList();
});
onShow(() => {
// //
loadConsumptions(); list.value = []
}); page.value = 1
active.value = '全部'
typeParams.value = ''
getList();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.container { .container {
font-size: 14px; font-size: 14px;
min-height: 100vh; min-height: 100vh;
background-color: #f8f8f8; background-color: #f8f8f8;
} }
.filter-tabs { .tabBox {
height: 50px;
background-color: #fff;
display: flex; display: flex;
background: white;
padding: 0 16px;
border-bottom: 1px solid #e5e5e5;
.tab-item { .tabItem {
height: 100%;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
flex: 1; flex: 1;
text-align: center;
padding: 16px 0;
color: #666;
font-size: 14px;
position: relative;
&.active { &.selected {
color: #4285f4; color: #5479ED;
font-weight: 500; border-bottom: 1px solid #5479ED;
&::after {
content: "";
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 20px;
height: 2px;
background: #4285f4;
border-radius: 1px;
} }
} }
} }
}
.consumption-list { .consumption-list {
padding: 16px; padding: 16px;
.consumption-item { .consumption-item {
@ -356,9 +297,9 @@ onShow(() => {
} }
} }
} }
} }
.empty-state { .empty-state {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
@ -370,10 +311,6 @@ onShow(() => {
font-size: 14px; font-size: 14px;
margin-top: 16px; margin-top: 16px;
} }
} }
.load-more {
padding: 20px;
text-align: center;
}
</style> </style>

@ -604,19 +604,19 @@
onMounted(() => { onMounted(() => {
checkEnvironment(); checkEnvironment();
// #ifdef MP-WEIXIN // // #ifdef MP-WEIXIN
// // //
const urlParams = new URLSearchParams(window.location.search); // const urlParams = new URLSearchParams(window.location.search);
const code = urlParams.get("code"); // const code = urlParams.get("code");
const from = urlParams.get("from"); // const from = urlParams.get("from");
console.log('from',from) // console.log('from',from)
if (from && from === 'h5') { // if (from && from === 'h5') {
handleWechatH5Callback(code); // handleWechatH5Callback(code);
} // }
// JS-SDK // // JS-SDK
// initWechatJSSDK(); // // initWechatJSSDK();
// #endif // // #endif
}); });
</script> </script>

@ -16,7 +16,9 @@
</view> </view>
<view class="user-id">用户ID: {{userStore.userInfo.id}}</view> <view class="user-id">用户ID: {{userStore.userInfo.id}}</view>
<view class="membership"> <view class="membership">
会员等级: 年会员 (有效期至: 2026-05-15) 会员等级: <span v-if="memberInfo.is_vip">{{memberInfo.plan?.name}} (:
{{memberInfo.end_at ? dayjs(memberInfo.end_at * 1000).format('YYYY-MM-DD') : ''}})</span><span
v-else></span>
</view> </view>
</view> </view>
</view> </view>
@ -31,7 +33,7 @@
<view class="balance-header"> <view class="balance-header">
<view class="balance-label">账户余额</view> <view class="balance-label">账户余额</view>
</view> </view>
<view class="balance-amount">¥50.00</view> <view class="balance-amount">¥{{memberInfo.wallet_balance || 0}}</view>
</div> </div>
<uv-button type="primary" color="#fff" customStyle="color:#000;width:90px" shape="circle" @click="recharge"> <uv-button type="primary" color="#fff" customStyle="color:#000;width:90px" shape="circle" @click="recharge">
充值 充值
@ -45,7 +47,7 @@
:key="item.id" @click="selectPlan(item)"> :key="item.id" @click="selectPlan(item)">
<view class="tag" v-if="item.tags">{{item.tags}}</view> <view class="tag" v-if="item.tags">{{item.tags}}</view>
<view class="plan-name">{{item.name}}</view> <view class="plan-name">{{item.name}}</view>
<view class="plan-price">¥{{item.price_cents}}</view> <view class="plan-price">¥{{item.price}}</view>
</view> </view>
<!-- <view <!-- <view
class="membership-item" class="membership-item"
@ -122,7 +124,8 @@
onMounted onMounted
} from "vue"; } from "vue";
import { import {
onShow onShow,
onPullDownRefresh
} from "@dcloudio/uni-app"; } from "@dcloudio/uni-app";
import HeaderCustom from "/components/HeaderCustom/HeaderCustom.vue"; import HeaderCustom from "/components/HeaderCustom/HeaderCustom.vue";
import { import {
@ -130,11 +133,32 @@
useUserStore useUserStore
} from "@/store"; } from "@/store";
import RPC from "@/utils/request"; import RPC from "@/utils/request";
import dayjs from 'dayjs'
const modal = ref(null); const modal = ref(null);
const authStore = useAuthStore(); const authStore = useAuthStore();
const userStore = useUserStore(); const userStore = useUserStore();
const balance = ref(null)
// const getBalance = () => {
// RPC.post('/wallet/balance', {
// user_id: userStore.userInfo.id
// }).then(res => {
// balance.value = res.balance_cents || 0
// })
// }
const memberInfo = ref({})
const getMemberInfo = () => {
uni.showLoading();
RPC.post('/membership/user/info', {
user_id: userStore.userInfo.id
}).then(res => {
memberInfo.value = res || {}
}).finally(() => {
uni.hideLoading();
})
}
// //
const selectedPlan = ref(""); const selectedPlan = ref("");
const selectedPayment = ref("wxpay"); // const selectedPayment = ref("wxpay"); //
@ -153,7 +177,6 @@
selectedPlan.value = planList.value[0] ? planList.value[0].id : '' selectedPlan.value = planList.value[0] ? planList.value[0].id : ''
}) })
} }
getPlanList()
// //
const selectPlan = (plan) => { const selectPlan = (plan) => {
selectedPlan.value = plan.id; selectedPlan.value = plan.id;
@ -213,7 +236,7 @@
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
WeixinJSBridge.invoke( WeixinJSBridge.invoke(
"getBrandWCPayRequest", { "getBrandWCPayRequest", {
appId: orderInfo.appId, appId: 'wxc504638e03981812',
timeStamp: orderInfo.timeStamp, timeStamp: orderInfo.timeStamp,
nonceStr: orderInfo.nonceStr, nonceStr: orderInfo.nonceStr,
package: orderInfo.package, package: orderInfo.package,
@ -246,6 +269,20 @@
// #endif // #endif
}; };
function showModalAsync(options) {
return new Promise((resolve, reject) => {
uni.showModal({
...options,
success: (res) => {
resolve(res); // await
},
fail: (err) => {
reject(err); //
}
});
});
}
// H5 // H5
const alipayPay = async (orderInfo) => { const alipayPay = async (orderInfo) => {
// #ifdef H5 // #ifdef H5
@ -320,28 +357,45 @@
// 3. // 3.
let paymentResult; let paymentResult;
if (selectedPayment.value === "wxpay") { if (selectedPayment.value === "wxpay") {
const orderResult = await RPC.post('/membership/order/pay_by_wechat', { const res = await uni.login({
provider: 'weixin'
})
const orderResult = await RPC.post('/membership/order/pay_by_wechat_mini', {
code: res.code,
"order_no": orderNum.order_no "order_no": orderNum.order_no
}) })
uni.showLoading({ uni.showLoading({
title: "正在跳转微信支付...", title: "正在跳转微信支付...",
}); });
if (1 == 1) {
console.log('orderResult', orderResult) console.log('orderResult', orderResult)
return paymentResult = await wechatPay(orderResult);
}
paymentResult = await wechatPay(orderResult.wechatPayInfo);
} else if (selectedPayment.value === "alipay") { } else if (selectedPayment.value === "alipay") {
uni.showLoading({ uni.showLoading({
title: "正在跳转支付宝...", title: "正在跳转支付宝...",
}); });
paymentResult = await alipayPay(orderResult.alipayInfo); paymentResult = await alipayPay(orderResult.alipayInfo);
} else if (selectedPayment.value === 'wallet') {
const res = await showModalAsync({
title: '确认支付',
content: '确认使用钱包余额支付?'
});
//
if (res.confirm) {
paymentResult = await RPC.post('/membership/order/pay_by_wallet', {
order_no: orderNum.order_no
})
console.log('paymentResult', paymentResult)
} else if (res.cancel) {
console.log('用户点击了取消');
paymentResult={success:false}
}
} }
uni.hideLoading(); uni.hideLoading();
console.log('paymentResult111',paymentResult)
// 4. // 4.
if (paymentResult.success) { if (paymentResult?.success) {
if (paymentResult.redirect) { if (paymentResult.redirect) {
// H5 // H5
uni.showToast({ uni.showToast({
@ -351,21 +405,27 @@
}); });
} else { } else {
// //
setTimeout(() => {
uni.showToast({ uni.showToast({
title: "支付成功", title: "支付成功",
icon: "success", icon: "success",
}); });
setTimeout(()=>{
getMemberInfo()
},500)
}, 1000)
// getMemberInfo()
// //
setTimeout(() => { // setTimeout(() => {
// //
uni.navigateTo({ // uni.navigateTo({
url: `/pages/order-detail/order-detail?orderId=${orderResult.orderId}`, // url: `/pages/order-detail/order-detail?orderId=${orderResult.orderId}`,
}); // });
// //
// loadUserInfo(); // loadUserInfo();
}, 1500); // }, 1500);
} }
} }
} catch (error) { } catch (error) {
@ -484,12 +544,20 @@
// //
onMounted(() => { onMounted(() => {
checkEnvironment(); checkEnvironment();
handlePaymentCallback(); getPlanList()
// handlePaymentCallback();
}); });
// //
onShow(() => { onShow(() => {
handlePaymentCallback(); handlePaymentCallback();
// getBalance()
getMemberInfo()
});
onPullDownRefresh(() => {
getPlanList()
// getBalance()
getMemberInfo()
}); });
</script> </script>

@ -2,22 +2,28 @@
<view class="container"> <view class="container">
<uv-sticky bgColor="#fff" offsetTop="0"> <uv-sticky bgColor="#fff" offsetTop="0">
<div class="tabBox"> <div class="tabBox">
<div class="tabItem" :class="{selected:active==='全部'}" @click="() => active = '全部'"></div> <div class="tabItem" :class="{selected:active==='全部'}" @click="switchTab('全部')"></div>
<div class="tabItem" :class="{selected:active==='已支付'}" @click="() => active = '已支付'">已支付</div> <div class="tabItem" :class="{selected:active==='会员购买'}" @click="switchTab('会员购买')"></div>
<div class="tabItem" :class="{selected:active==='待支付'}" @click="() => active = '待支付'">待支付</div> <div class="tabItem" :class="{selected:active==='钱包充值'}" @click="switchTab('钱包充值')"></div>
</div> </div>
</uv-sticky> </uv-sticky>
<!-- 订单列表 --> <!-- 订单列表 -->
<view class="order-list"> <view class="order-list">
<view class="order-item" v-for="order in filteredOrders" :key="order.id"> <view class="order-item" v-for="order in list" :key="order.id">
<!-- 订单头部 --> <!-- 订单头部 -->
<view class="order-header"> <view class="order-header">
<view class="order-info"> <view class="order-info">
<text class="order-number">订单编号: {{ order.orderNumber }}</text> <text class="order-number">订单编号: {{ order.order_no }}</text>
<view class="order-type-tag"></view> <view class="order-type-tag" @click="copyOrderNo(order.order_no)"></view>
</view> </view>
<view class="order-status" :class="order.status"> <view class="order-status" :class="{paid:order.status === 'paid',pending:order.status === 'created' || order.status === 'pending',
{{ order.statusText }} cancelled:order.status === 'failed' || order.status === 'canceled' || order.status === 'refunded'}">
<span v-if="order.status === 'created'"></span>
<span v-if="order.status === 'pending'"></span>
<span v-if="order.status === 'paid'"></span>
<span v-if="order.status === 'failed'"></span>
<span v-if="order.status === 'canceled'"></span>
<span v-if="order.status === 'refunded'">退</span>
</view> </view>
</view> </view>
@ -25,50 +31,58 @@
<view class="order-details"> <view class="order-details">
<view class="detail-row"> <view class="detail-row">
<text class="label">用户名称:</text> <text class="label">用户名称:</text>
<text class="value">{{ order.userName }}</text> <text class="value">{{ order.user_name }}</text>
</view> </view>
<view class="detail-row"> <view class="detail-row">
<text class="label">用户ID:</text> <text class="label">用户ID:</text>
<text class="value">{{ order.userId }}</text> <text class="value">{{ order.user_id }}</text>
</view> </view>
<view class="detail-row"> <view class="detail-row">
<text class="label">订单类型:</text> <text class="label">订单类型:</text>
<text class="value">{{ order.orderType }}</text> <text class="value">{{ order.order_type }}</text>
</view> </view>
<view class="detail-row"> <view class="detail-row">
<text class="label">订单金额:</text> <text class="label">订单金额:</text>
<text class="value price">¥{{ order.amount }}</text> <text class="value price">¥{{ order.amount }}</text>
</view> </view>
<view class="detail-row" v-if="order.discount > 0"> <view class="detail-row">
<text class="label">支付渠道:</text>
<text class="value">
<template v-if="order.pay_channel === 'wallet'"></template>
<template v-if="order.pay_channel === 'wxpay'"></template>
<template v-if="order.pay_channel === 'alipay'"></template>
</text>
</view>
<!-- <view class="detail-row" v-if="order.discount > 0">
<text class="label">折扣金额:</text> <text class="label">折扣金额:</text>
<text class="value discount">-¥{{ order.discount }}</text> <text class="value discount">-¥{{ order.discount }}</text>
</view> </view> -->
<view class="detail-row"> <!-- <view class="detail-row">
<text class="label">实付金额:</text> <text class="label">实付金额:</text>
<text class="value final-price">¥{{ order.finalAmount }}</text> <text class="value final-price">¥{{ order.finalAmount }}</text>
</view> </view> -->
<view class="detail-row"> <view class="detail-row">
<text class="label">{{ order.status === 'pending' ? '创建时间:' : '支付时间:' }}</text> <text class="label">创建时间</text>
<text class="value">{{ order.payTime }}</text> <text class="value">{{ order.created_at ? dayjs(order.created_at * 1000).format('YYYY-MM-DD HH:mm:ss') :'' }}</text>
</view> </view>
</view> </view>
<!-- 订单操作 --> <!-- 订单操作 -->
<view class="order-actions"> <view class="order-actions" v-if="order.status === 'pending' || order.status === 'created'">
<div> <div>
<div class="countdown-text" v-if="order.status === 'pending'">: {{ order.countdown }} <!-- <div class="countdown-text" v-if="order.status === 'pending'">: {{ order.countdown }}
</div> </div> -->
</div> </div>
<div class="buttonBox"> <div class="buttonBox">
<template v-if="order.status === 'pending'"> <template v-if="order.status === 'pending' || order.status === 'created'">
<uv-button type="default" size="small" @click="cancelOrder(order)"> <uv-button type="error" size="small" @click="cancelOrder(order)">
取消订单 取消订单
</uv-button> </uv-button>
<uv-button type="error" size="small" @click="payOrder(order)"> <uv-button type="primary" size="small" @click="payOrder(order)">
去支付 去支付
</uv-button> </uv-button>
</template> </template>
<template v-else> <!-- <template v-else>
<uv-button type="default" size="small" @click="deleteOrder(order)"> <uv-button type="default" size="small" @click="deleteOrder(order)">
删除订单 删除订单
@ -76,40 +90,18 @@
<uv-button type="primary" color="#3F70FF" size="small" @click="viewOrderDetail(order)"> <uv-button type="primary" color="#3F70FF" size="small" @click="viewOrderDetail(order)">
查看详情 查看详情
</uv-button> </uv-button>
</template> </template> -->
</div> </div>
</view> </view>
<!-- 待支付订单底部 -->
<!-- <view v-if="order.status === 'pending'" class="pending-footer">
<view class="countdown">
<text class="countdown-text">支付剩余时间: {{ order.countdown }}</text>
</view>
<view class="pending-actions">
<uv-button
type="default"
size="large"
@click="cancelOrder(order)"
>
取消订单
</uv-button>
<uv-button
type="error"
size="large"
@click="payOrder(order)"
>
去支付
</uv-button>
</view>
</view> -->
</view> </view>
</view> </view>
<!-- 空状态 --> <!-- 空状态 -->
<view v-if="filteredOrders.length === 0" class="empty-state"> <view v-if="list.length === 0 && loadingStatus !== 'loading'" class="empty-state">
<u-icon name="file-text" size="60" color="#ccc"></u-icon> <u-icon name="file-text" size="60" color="#ccc"></u-icon>
<text class="empty-text">暂无订单记录</text> <text class="empty-text">暂无订单记录</text>
</view> </view>
<uv-load-more v-else :status="loadingStatus" />
</view> </view>
</template> </template>
@ -120,7 +112,8 @@
ref ref
} from "vue"; } from "vue";
import { import {
onShow onShow,
onReachBottom
} from "@dcloudio/uni-app"; } from "@dcloudio/uni-app";
import { import {
useAuthStore, useAuthStore,
@ -128,14 +121,26 @@
} from "@/store"; } from "@/store";
import HeaderCustom from '/components/HeaderCustom/HeaderCustom.vue' import HeaderCustom from '/components/HeaderCustom/HeaderCustom.vue'
import RPC from "@/utils/request"; import RPC from "@/utils/request";
import dayjs from "dayjs";
const active = ref('全部') const active = ref('全部')
const authStore = useAuthStore() const authStore = useAuthStore()
const userStore = useUserStore() const userStore = useUserStore()
// const copyOrderNo = (orderNo) => {
const activeTab = ref('all') uni.setClipboardData({
const orders = ref([{ data: orderNo,
success: () => {
uni.showToast({
title: '订单号已复制',
icon: 'success'
})
}
})
}
const list = ref([{
id: 1, id: 1,
orderNumber: 'ORD20230515001', orderNumber: 'ORD20230515001',
typeLabel: '续费', typeLabel: '续费',
@ -183,17 +188,17 @@
} }
]) ])
//
const filteredOrders = computed(() => {
if (activeTab.value === 'all') {
return orders.value
}
return orders.value.filter(order => order.type === activeTab.value)
})
// //
const switchTab = (tab) => { const switchTab = (tab) => {
activeTab.value = tab list.value = []
active.value = tab
page.value = 1
if(tab === '全部') {
typeParams.value = ''
} else {
typeParams.value = tab
}
getList()
} }
// //
@ -212,13 +217,12 @@
if (res.confirm) { if (res.confirm) {
try { try {
// API // API
// await RPC.post('/api/order/cancel', { orderId: order.id }) await RPC.post('/membership/order/cancel', { order_no: order.order_no })
// //
const index = orders.value.findIndex(item => item.id === order.id) const index = list.value.findIndex(item => item.id === order.id)
if (index !== -1) { if (index !== -1) {
orders.value[index].status = 'cancelled' list.value[index].status = 'canceled'
orders.value[index].statusText = '已取消'
} }
uni.showToast({ uni.showToast({
@ -272,33 +276,63 @@
// //
const payOrder = (order) => { const payOrder = (order) => {
uni.navigateTo({ uni.showModal({
url: `/pages/payment/payment?orderId=${order.id}` title: '确认支付',
content: '确定继续支付这个订单吗?',
success: async (res) => {
if (res.confirm) {
}
}
}) })
} }
// const page = ref(1)
const loadOrders = async () => { const typeParams = ref('')
try { const loadingStatus = ref('loadmore')
// API const count = ref(0);
// const result = await RPC.get('/api/orders') const getList = () => {
// orders.value = result.data uni.showLoading();
} catch (error) { RPC.post('/membership/order/list', {
console.error('加载订单失败:', error) user_id: userStore.userInfo.id,
uni.showToast({ page:page.value,
title: '加载失败,请重试', order_type:typeParams.value,
icon: 'none' size:20
}).then(res => {
list.value = [...list.value, ...res.list];
count.value = res.total;
if (list.value.length >= count.value) {
loadingStatus.value = "nomore";
} else {
loadingStatus.value = "loadmore";
}
}).catch(() => {
loadingStatus.value = "loadmore";
}).finally(() => {
uni.hideLoading();
}) })
} }
}
onMounted(() => { onMounted(() => {
loadOrders()
}) })
onReachBottom(() => {
if (list.value.length >= count.value || loadingStatus.value === "loading")
return;
console.log("上拉加载:");
loadingStatus.value = "loading";
page.value = ++page.value;
getList();
});
onShow(() => { onShow(() => {
// //
loadOrders() list.value = []
page.value = 1
active.value = '全部'
typeParams.value = ''
getList()
}) })
</script> </script>

@ -74,7 +74,7 @@
</view> </view>
<!-- 加载更多 --> <!-- 加载更多 -->
<uv-load-more :status="loadingStatus" @loadmore="loadmore" /> <uv-load-more v-else :status="loadingStatus" @loadmore="loadmore" />
</view> </view>
</template> </template>
@ -128,7 +128,7 @@ const downloadRecord = (record) => {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
// App使uni.downloadFile // App使uni.downloadFile
uni.downloadFile({ uni.downloadFile({
url: 'https://ksdt-1255846884.cos.ap-shanghai.myqcloud.com/lift-result/2025/09/24/d6180add4cd94875a1854a4febce8966.pdf', url: record.result_url,
success: (res) => { success: (res) => {
console.log(res); console.log(res);
if (res.statusCode === 200) { if (res.statusCode === 200) {
@ -200,6 +200,7 @@ const deleteRecord = (record) => {
// //
const loadRecords = async () => { const loadRecords = async () => {
uni.showLoading();
loadingStatus.value = "loading"; loadingStatus.value = "loading";
RPC.post("/planned_list", { page: page.value, page_size: 20 }) RPC.post("/planned_list", { page: page.value, page_size: 20 })
.then((res) => { .then((res) => {
@ -213,6 +214,8 @@ const loadRecords = async () => {
}) })
.catch(() => { .catch(() => {
loadingStatus.value = "loadmore"; loadingStatus.value = "loadmore";
}).finally(() => {
uni.hideLoading();
}); });
}; };

@ -0,0 +1,40 @@
订单列表的
"id": it.ID, // 订单ID
"order_no": it.OrderNo, // 订单号M=会员订单R=充值订单)
"user_id": it.UserID, // 用户ID
"user_name": userNameMap[it.UserID], // 用户名
"plan_id": it.PlanID, // 套餐ID充值订单为0
"plan_name": planName, // 套餐名称(充值订单固定为“钱包充值”)
"order_type": it.OrderType, // 订单类型:会员购买/钱包充值(中文)
"amount_cents": it.AmountCents.ToInt64(), // 订单金额(分)
"amount": it.AmountCents.String(), // 订单金额(元,字符串,保留两位小数)
"pay_channel": it.PayChannel, // 支付渠道wallet|wxpay|alipay|other
"status": it.Status, // 订单状态created|paid|canceled|refunded
"pay_time": it.PayTime, // 支付时间Unix 时间戳,秒)
"transaction_id": it.TransactionID, // 第三方交易号/平台流水号
"remark": it.Remark, // 备注
"created_at": it.CreatedAt, // 创建时间Unix 时间戳,秒)
"updated_at": it.UpdatedAt, // 更新时间Unix 时间戳,秒)
消费列表
"id": it.ID, // 流水ID
"user_id": it.UserID, // 用户ID
"user_name": userName, // 用户名
"type": it.Type, // 交易类型recharge(充值)|purchase(消费)
"amount_cents": it.AmountCents.ToInt64(), // 金额(分)
"amount": it.AmountCents.String(), // 金额(元,字符串,保留两位小数)
"related_order_id": it.RelatedOrderID, // 关联的订单ID可为空
"order_no": it.OrderNo, // 关联订单号M* 会员订单 / R* 充值订单)
"pay_channel": it.PayChannel, // 支付渠道wallet|wxpay|alipay|other
"status": it.Status, // 交易状态success|failed|pending
"remark": it.Remark, // 备注
"balance_before_cents": it.BalanceBeforeCents.ToInt64(), // 变动前余额(分)
"balance_after_cents": it.BalanceAfterCents.ToInt64(), // 变动后余额(分)
"finished_at": it.FinishedAt, // 完成时间Unix 时间戳,秒)
"external_txn_id": it.ExternalTxnID, // 外部交易号(第三方平台返回)
"currency": it.Currency, // 币种(默认 CNY
"created_at": it.CreatedAt, // 创建时间Unix 时间戳,秒)
})

@ -5,7 +5,7 @@
<view class="balance-card"> <view class="balance-card">
<view class="balance-info"> <view class="balance-info">
<view class="balance-label">当前余额</view> <view class="balance-label">当前余额</view>
<view class="balance-amount">¥{{ currentBalance }}</view> <view class="balance-amount">¥{{ memberInfo.wallet_balance || 0 }}</view>
</view> </view>
<view class="balance-icon"> <view class="balance-icon">
<uv-icon name="empty-coupon" color="#4285f4" size="40"></uv-icon> <uv-icon name="empty-coupon" color="#4285f4" size="40"></uv-icon>
@ -17,13 +17,8 @@
<view class="recharge-section"> <view class="recharge-section">
<view class="section-title">选择充值金额</view> <view class="section-title">选择充值金额</view>
<view class="amount-grid"> <view class="amount-grid">
<view <view class="amount-item" :class="{ active: selectedAmount === item.value }"
class="amount-item" v-for="item in rechargeAmounts" :key="item.value" @click="selectAmount(item.value)">
:class="{ active: selectedAmount === item.value }"
v-for="item in rechargeAmounts"
:key="item.value"
@click="selectAmount(item.value)"
>
<view class="amount-value">¥{{ item.value }}</view> <view class="amount-value">¥{{ item.value }}</view>
<!-- <view v-if="item.bonus" class="amount-bonus">{{ item.bonus }}</view> --> <!-- <view v-if="item.bonus" class="amount-bonus">{{ item.bonus }}</view> -->
</view> </view>
@ -34,15 +29,10 @@
<view class="custom-label">自定义金额</view> <view class="custom-label">自定义金额</view>
<view class="custom-input"> <view class="custom-input">
<text class="currency">¥</text> <text class="currency">¥</text>
<input <input class="amount-input" v-model="customAmount" type="digit" placeholder="请输入充值金额"
class="amount-input" @input="onCustomAmountInput" />
v-model="customAmount"
type="number"
placeholder="请输入充值金额"
@input="onCustomAmountInput"
/>
</view> </view>
<view class="amount-tips">充值金额范围¥1 - ¥50000</view> <!-- <view class="amount-tips">充值金额范围¥0.01 - ¥50000</view> -->
</view> </view>
</view> </view>
@ -51,11 +41,8 @@
<view class="section-title">选择支付方式</view> <view class="section-title">选择支付方式</view>
<view class="payment-list"> <view class="payment-list">
<!-- 微信支付 --> <!-- 微信支付 -->
<view <view class="payment-item" :class="{ active: selectedPayment === 'wechat' }"
class="payment-item" @click="selectPayment('wechat')">
:class="{ active: selectedPayment === 'wechat' }"
@click="selectPayment('wechat')"
>
<view class="payment-info"> <view class="payment-info">
<uv-icon name="weixin-fill" color="#07c160" size="28"></uv-icon> <uv-icon name="weixin-fill" color="#07c160" size="28"></uv-icon>
<view class="payment-details"> <view class="payment-details">
@ -63,20 +50,13 @@
<view class="payment-desc">安全快捷支持零钱和银行卡</view> <view class="payment-desc">安全快捷支持零钱和银行卡</view>
</view> </view>
</view> </view>
<uv-icon <uv-icon name="checkmark-circle-fill" :color="selectedPayment === 'wechat' ? '#4285f4' : '#ccc'"
name="checkmark-circle-fill" size="20"></uv-icon>
:color="selectedPayment === 'wechat' ? '#4285f4' : '#ccc'"
size="20"
></uv-icon>
</view> </view>
<!-- 支付宝支付 - 仅H5显示 --> <!-- 支付宝支付 - 仅H5显示 -->
<view <view v-if="showAlipay" class="payment-item" :class="{ active: selectedPayment === 'alipay' }"
v-if="showAlipay" @click="selectPayment('alipay')">
class="payment-item"
:class="{ active: selectedPayment === 'alipay' }"
@click="selectPayment('alipay')"
>
<view class="payment-info"> <view class="payment-info">
<uv-icon name="/static/imgs/alipay.png" color="#1677ff" size="28"></uv-icon> <uv-icon name="/static/imgs/alipay.png" color="#1677ff" size="28"></uv-icon>
<view class="payment-details"> <view class="payment-details">
@ -84,11 +64,8 @@
<view class="payment-desc">便民生活轻松支付</view> <view class="payment-desc">便民生活轻松支付</view>
</view> </view>
</view> </view>
<uv-icon <uv-icon name="checkmark-circle-fill" :color="selectedPayment === 'alipay' ? '#4285f4' : '#ccc'"
name="checkmark-circle-fill" size="20"></uv-icon>
:color="selectedPayment === 'alipay' ? '#4285f4' : '#ccc'"
size="20"
></uv-icon>
</view> </view>
</view> </view>
</view> </view>
@ -118,13 +95,8 @@
<text class="recharge-text">充值金额¥{{ finalAmount }}</text> <text class="recharge-text">充值金额¥{{ finalAmount }}</text>
<!-- <text v-if="bonusAmount > 0" class="bonus-text">¥{{ bonusAmount }}</text> --> <!-- <text v-if="bonusAmount > 0" class="bonus-text">¥{{ bonusAmount }}</text> -->
</view> </view>
<uv-button <uv-button type="primary" size="large" @click="confirmRecharge" :loading="recharging"
type="primary" :disabled="finalAmount <= 0">
size="large"
@click="confirmRecharge"
:loading="recharging"
:disabled="finalAmount <= 0"
>
立即充值 立即充值
</uv-button> </uv-button>
</view> </view>
@ -132,57 +104,95 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, onMounted } from "vue"; import {
import { onShow } from "@dcloudio/uni-app"; ref,
import { useAuthStore, useUserStore } from "@/store"; computed,
import RPC from "@/utils/request"; onMounted
} from "vue";
const authStore = useAuthStore(); import {
const userStore = useUserStore(); onShow
} from "@dcloudio/uni-app";
// import {
const currentBalance = ref(50.00); useAuthStore,
const selectedAmount = ref(0); useUserStore
const customAmount = ref(''); } from "@/store";
const selectedPayment = ref('wechat'); import RPC from "@/utils/request";
const recharging = ref(false);
const showAlipay = ref(true); const authStore = useAuthStore();
const userStore = useUserStore();
//
const rechargeAmounts = ref([ const memberInfo = ref({})
{ value: 10, bonus: 0 }, const getMemberInfo = () => {
{ value: 50, bonus: 0 }, uni.showLoading();
{ value: 100, bonus: 0 }, RPC.post('/membership/user/info', {
{ value: 200, bonus: 0 }, user_id: userStore.userInfo.id
{ value: 500, bonus: 0 }, }).then(res => {
{ value: 1000, bonus: 0 } memberInfo.value = res || {}
]); }).finally(() => {
uni.hideLoading();
// })
const finalAmount = computed(() => { }
//
const currentBalance = ref(0);
const selectedAmount = ref(0);
const customAmount = ref('');
const selectedPayment = ref('wechat');
const recharging = ref(false);
const showAlipay = ref(true);
//
const rechargeAmounts = ref([{
value: 10,
bonus: 0
},
{
value: 50,
bonus: 0
},
{
value: 100,
bonus: 0
},
{
value: 200,
bonus: 0
},
{
value: 500,
bonus: 0
},
{
value: 1000,
bonus: 0
}
]);
//
const finalAmount = computed(() => {
if (customAmount.value && parseFloat(customAmount.value) > 0) { if (customAmount.value && parseFloat(customAmount.value) > 0) {
return parseFloat(customAmount.value); return parseFloat(customAmount.value);
} }
return selectedAmount.value; return selectedAmount.value;
}); });
// //
const bonusAmount = computed(() => { const bonusAmount = computed(() => {
if (selectedAmount.value > 0) { if (selectedAmount.value > 0) {
const selected = rechargeAmounts.value.find(item => item.value === selectedAmount.value); const selected = rechargeAmounts.value.find(item => item.value === selectedAmount.value);
return selected ? selected.bonus : 0; return selected ? selected.bonus : 0;
} }
return 0; return 0;
}); });
// //
const selectAmount = (amount) => { const selectAmount = (amount) => {
selectedAmount.value = amount; selectedAmount.value = amount;
customAmount.value = ''; customAmount.value = '';
}; };
// //
const onCustomAmountInput = () => { const onCustomAmountInput = () => {
selectedAmount.value = 0; selectedAmount.value = 0;
// //
@ -194,15 +204,15 @@ const onCustomAmountInput = () => {
icon: 'none' icon: 'none'
}); });
} }
}; };
// //
const selectPayment = (payment) => { const selectPayment = (payment) => {
selectedPayment.value = payment; selectedPayment.value = payment;
}; };
// //
const checkEnvironment = () => { const checkEnvironment = () => {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
// //
showAlipay.value = false; showAlipay.value = false;
@ -217,10 +227,10 @@ const checkEnvironment = () => {
const isWechat = ua.indexOf('micromessenger') !== -1; const isWechat = ua.indexOf('micromessenger') !== -1;
selectedPayment.value = isWechat ? 'wechat' : 'alipay'; selectedPayment.value = isWechat ? 'wechat' : 'alipay';
// #endif // #endif
}; };
// //
const wechatPay = async (orderInfo) => { const wechatPay = async (orderInfo) => {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
// //
try { try {
@ -234,7 +244,10 @@ const wechatPay = async (orderInfo) => {
}); });
console.log('微信支付成功:', paymentResult); console.log('微信支付成功:', paymentResult);
return { success: true, data: paymentResult }; return {
success: true,
data: paymentResult
};
} catch (error) { } catch (error) {
console.error('微信支付失败:', error); console.error('微信支付失败:', error);
if (error.errMsg === 'requestPayment:fail cancel') { if (error.errMsg === 'requestPayment:fail cancel') {
@ -257,7 +270,10 @@ const wechatPay = async (orderInfo) => {
paySign: orderInfo.paySign paySign: orderInfo.paySign
}, (res) => { }, (res) => {
if (res.err_msg === 'get_brand_wcpay_request:ok') { if (res.err_msg === 'get_brand_wcpay_request:ok') {
resolve({ success: true, data: res }); resolve({
success: true,
data: res
});
} else if (res.err_msg === 'get_brand_wcpay_request:cancel') { } else if (res.err_msg === 'get_brand_wcpay_request:cancel') {
reject(new Error('用户取消支付')); reject(new Error('用户取消支付'));
} else { } else {
@ -269,23 +285,29 @@ const wechatPay = async (orderInfo) => {
// //
const payUrl = orderInfo.mwebUrl; const payUrl = orderInfo.mwebUrl;
window.location.href = payUrl; window.location.href = payUrl;
return { success: true, redirect: true }; return {
success: true,
redirect: true
};
} }
// #endif // #endif
}; };
// H5 // H5
const alipayPay = async (orderInfo) => { const alipayPay = async (orderInfo) => {
// #ifdef H5 // #ifdef H5
// H5 // H5
const payUrl = orderInfo.payUrl; const payUrl = orderInfo.payUrl;
window.location.href = payUrl; window.location.href = payUrl;
return { success: true, redirect: true }; return {
success: true,
redirect: true
};
// #endif // #endif
}; };
// //
const confirmRecharge = async () => { const confirmRecharge = async () => {
if (finalAmount.value <= 0) { if (finalAmount.value <= 0) {
uni.showToast({ uni.showToast({
title: '请选择充值金额', title: '请选择充值金额',
@ -294,13 +316,13 @@ const confirmRecharge = async () => {
return; return;
} }
if (finalAmount.value < 1) { // if (finalAmount.value < 1) {
uni.showToast({ // uni.showToast({
title: '充值金额不能少于1元', // title: '1',
icon: 'none' // icon: 'none'
}); // });
return; // return;
} // }
if (!selectedPayment.value) { if (!selectedPayment.value) {
uni.showToast({ uni.showToast({
@ -314,46 +336,50 @@ const confirmRecharge = async () => {
try { try {
// //
const orderParams = { // const orderParams = {
type: 'recharge', // type: 'recharge',
amount: finalAmount.value, // amount: finalAmount.value,
bonusAmount: bonusAmount.value, // bonusAmount: bonusAmount.value,
paymentMethod: selectedPayment.value, // paymentMethod: selectedPayment.value,
userId: userStore.userInfo?.id || 'mock_user_id', // userId: userStore.userInfo?.id || 'mock_user_id',
// #ifdef MP-WEIXIN // // #ifdef MP-WEIXIN
platform: 'mp-weixin', // platform: 'mp-weixin',
// #endif // // #endif
// #ifdef H5 // // #ifdef H5
platform: 'h5', // platform: 'h5',
// #endif // // #endif
}; // };
uni.showLoading({ uni.showLoading({
title: '正在创建订单...' title: '正在创建订单...'
}); });
// API // API
// const orderResult = await RPC.post('/api/recharge/create', orderParams); const orderNum = await RPC.post('/wallet/recharge', {
user_id: userStore.userInfo.id,
amount_cents: finalAmount.value * 100,
pay_channel: selectedPayment.value
})
console.log('orderNum', orderNum)
// //
const orderResult = { // const orderResult = {
orderId: 'RECHARGE_' + Date.now(), // orderId: 'RECHARGE_' + Date.now(),
amount: orderParams.amount, // amount: orderParams.amount,
// // //
wechatPayInfo: { // wechatPayInfo: {
appId: 'wx1234567890', // appId: 'wx1234567890',
timeStamp: String(Date.now()), // timeStamp: String(Date.now()),
nonceStr: 'random_string_' + Date.now(), // nonceStr: 'random_string_' + Date.now(),
package: 'prepay_id=wx_prepay_id_123456', // package: 'prepay_id=wx_prepay_id_123456',
signType: 'RSA', // signType: 'RSA',
paySign: 'mock_pay_sign_123456', // paySign: 'mock_pay_sign_123456',
mwebUrl: 'https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx_prepay_id_123456' // mwebUrl: 'https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx_prepay_id_123456'
}, // },
// // //
alipayInfo: { // alipayInfo: {
payUrl: 'https://openapi.alipay.com/gateway.do?mock_recharge_url' // payUrl: 'https://openapi.alipay.com/gateway.do?mock_recharge_url'
} // }
}; // };
uni.hideLoading(); uni.hideLoading();
@ -361,10 +387,18 @@ const confirmRecharge = async () => {
let paymentResult; let paymentResult;
if (selectedPayment.value === 'wechat') { if (selectedPayment.value === 'wechat') {
const res = await uni.login({
provider: 'weixin'
})
const orderResult = await RPC.post('/membership/order/pay_by_wechat_mini', {
code: res.code,
"order_no": orderNum.order_no
})
uni.showLoading({ uni.showLoading({
title: '正在跳转微信支付...' title: "正在跳转微信支付...",
}); });
paymentResult = await wechatPay(orderResult.wechatPayInfo); console.log('orderResult', orderResult)
paymentResult = await wechatPay(orderResult);
} else if (selectedPayment.value === 'alipay') { } else if (selectedPayment.value === 'alipay') {
uni.showLoading({ uni.showLoading({
title: '正在跳转支付宝...' title: '正在跳转支付宝...'
@ -390,12 +424,12 @@ const confirmRecharge = async () => {
icon: 'success' icon: 'success'
}); });
//
currentBalance.value += finalAmount.value + bonusAmount.value;
// //
selectedAmount.value = 0; selectedAmount.value = 0;
customAmount.value = ''; customAmount.value = '';
// setTimeout(() => {
// getMemberInfo()
// },1000)
// //
setTimeout(() => { setTimeout(() => {
@ -422,10 +456,10 @@ const confirmRecharge = async () => {
} finally { } finally {
recharging.value = false; recharging.value = false;
} }
}; };
// //
const handlePaymentCallback = () => { const handlePaymentCallback = () => {
// #ifdef H5 // #ifdef H5
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const orderId = urlParams.get('orderId'); const orderId = urlParams.get('orderId');
@ -459,10 +493,10 @@ const handlePaymentCallback = () => {
} }
} }
// #endif // #endif
}; };
// //
const loadUserBalance = async () => { const loadUserBalance = async () => {
try { try {
// API // API
// const result = await RPC.get('/api/user/balance'); // const result = await RPC.get('/api/user/balance');
@ -470,27 +504,28 @@ const loadUserBalance = async () => {
} catch (error) { } catch (error) {
console.error('加载余额失败:', error); console.error('加载余额失败:', error);
} }
}; };
onMounted(() => { onMounted(() => {
checkEnvironment(); checkEnvironment();
loadUserBalance(); // loadUserBalance();
handlePaymentCallback(); // handlePaymentCallback();
}); });
onShow(() => { onShow(() => {
handlePaymentCallback(); handlePaymentCallback();
}); getMemberInfo()
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.container { .container {
min-height: 100vh; min-height: 100vh;
background-color: #f8f8f8; background-color: #f8f8f8;
padding-bottom: 120px; padding-bottom: 120px;
} }
.balance-section { .balance-section {
padding: 20px 16px; padding: 20px 16px;
background: linear-gradient(135deg, #4285f4 0%, #6fa8f5 100%); background: linear-gradient(135deg, #4285f4 0%, #6fa8f5 100%);
@ -520,11 +555,11 @@ onShow(() => {
opacity: 0.8; opacity: 0.8;
} }
} }
} }
.recharge-section, .recharge-section,
.payment-section, .payment-section,
.notice-section { .notice-section {
margin: 16px; margin: 16px;
background: white; background: white;
border-radius: 12px; border-radius: 12px;
@ -536,9 +571,9 @@ onShow(() => {
color: #333; color: #333;
margin-bottom: 16px; margin-bottom: 16px;
} }
} }
.amount-grid { .amount-grid {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 12px; gap: 12px;
@ -569,9 +604,9 @@ onShow(() => {
color: #ff4d4f; color: #ff4d4f;
} }
} }
} }
.custom-amount { .custom-amount {
.custom-label { .custom-label {
font-size: 14px; font-size: 14px;
color: #666; color: #666;
@ -605,9 +640,9 @@ onShow(() => {
font-size: 12px; font-size: 12px;
color: #999; color: #999;
} }
} }
.payment-list { .payment-list {
.payment-item { .payment-item {
display: flex; display: flex;
align-items: center; align-items: center;
@ -646,9 +681,9 @@ onShow(() => {
} }
} }
} }
} }
.notice-list { .notice-list {
.notice-item { .notice-item {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
@ -666,9 +701,9 @@ onShow(() => {
line-height: 1.4; line-height: 1.4;
} }
} }
} }
.bottom-section { .bottom-section {
position: fixed; position: fixed;
bottom: 0; bottom: 0;
left: 0; left: 0;
@ -695,5 +730,5 @@ onShow(() => {
margin-left: 4px; margin-left: 4px;
} }
} }
} }
</style> </style>
Loading…
Cancel
Save