jcloud/dashboard/src2/components/BuyPrepaidCreditsForm.vue
2025-04-12 17:39:38 +08:00

243 lines
5.5 KiB
Vue
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.

<template>
<div>
<FormControl
:label="`支付金额`"
class="mb-3"
v-model.number="creditsToBuy"
name="amount"
autocomplete="off"
type="number"
:min="minimumAmount"
:error="amountError"
>
<template #prefix>
<div class="grid w-4 place-items-center text-sm text-gray-700">
{{ $team.pg.currency === 'CNY' ? '¥' : '$' }}
</div>
</template>
</FormControl>
</div>
<div class="mt-4">
<div class="text-xs text-gray-600">支付方式</div>
<div class="mt-1.5 grid grid-cols-1 gap-2 sm:grid-cols-2">
<label
class="payment-option"
:class="{'payment-option-active': paymentGateway === 'Alipay'}"
>
<div class="payment-icon">
<AlipayLogo />
</div>
<input type="radio" v-model="paymentGateway" value="Alipay" class="hidden-radio">
<span class="checkmark-circle" v-if="paymentGateway === 'Alipay'">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="checkmark-icon">
<path fill="currentColor" d="M9.55 18l-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"/>
</svg>
</span>
</label>
<label
class="payment-option"
:class="{'payment-option-active': paymentGateway === 'WeChatPay'}"
>
<div class="payment-icon">
<WeChatPayLogo />
</div>
<input type="radio" v-model="paymentGateway" value="WeChatPay" class="hidden-radio">
<span class="checkmark-circle" v-if="paymentGateway === 'WeChatPay'">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="checkmark-icon">
<path fill="currentColor" d="M9.55 18l-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"/>
</svg>
</span>
</label>
</div>
</div>
<div class="text-xs text-gray-500 mt-2 mb-4" v-if="$team.pg.currency === 'CNY'">
使用{{ paymentGateway === 'Alipay' ? '支付宝' : '微信' }}支付快速便捷余额将在支付成功后立即到账
</div>
<BuyPrepaidCreditsAlipay
v-if="paymentGateway === 'Alipay'"
:amount="creditsToBuy"
:minimumAmount="minimumAmount"
:isOnboarding="isOnboarding"
@success="onSuccess"
@cancel="onCancel"
/>
<BuyPrepaidCreditsWeChatPay
v-if="paymentGateway === 'WeChatPay'"
:amount="creditsToBuy"
:minimumAmount="minimumAmount"
:isOnboarding="isOnboarding"
@success="onSuccess"
@cancel="onCancel"
/>
</template>
<script>
import BuyPrepaidCreditsAlipay from './BuyPrepaidCreditsAlipay.vue';
import BuyPrepaidCreditsWeChatPay from './BuyPrepaidCreditsWeChatPay.vue';
import AlipayLogo from '../logo/AlipayLogo.vue';
import WeChatPayLogo from '../logo/WeChatPayLogo.vue';
export default {
name: 'BuyPrepaidCreditsForm',
components: {
BuyPrepaidCreditsAlipay,
BuyPrepaidCreditsWeChatPay,
AlipayLogo,
WeChatPayLogo
},
data() {
return {
paymentGateway: 'Alipay', // 默认使用支付宝
creditsToBuy: this.minimumAmount || 0,
amountError: ''
};
},
props: {
modelValue: {
default: false
},
minimumAmount: {
type: Number,
default: 0
},
isOnboarding: {
type: Boolean,
default: false
}
},
emits: ['success', 'cancel'],
methods: {
onSuccess() {
this.$emit('success');
},
onCancel() {
this.$emit('cancel');
}
}
};
</script>
<style scoped>
.payment-option {
position: relative;
display: flex;
align-items: center;
justify-content: flex-start;
flex: 1;
border: 1px solid #ddd;
border-radius: 6px;
padding: 12px;
cursor: pointer;
transition: all 0.2s;
}
.payment-option:hover {
border-color: #ccc;
background-color: #f9fafb;
}
.payment-option-active,
.payment-option-active:has(input[value="Alipay"]:checked) {
border-color: #1677ff;
border-width: 2px;
box-shadow: 0 0 0 1px rgba(22, 119, 255, 0.1);
}
.payment-option-active:has(input[value="WeChatPay"]:checked) {
border-color: #22AC38;
box-shadow: 0 0 0 1px rgba(34, 172, 56, 0.1);
}
.payment-icon {
display: flex;
align-items: center;
justify-content: center;
height: auto;
width: 90px;
max-width: 90px;
min-width: 60px;
flex-shrink: 0;
}
.alipay-svg, .wechat-svg {
width: 100%;
height: auto;
max-height: 30px;
}
.payment-label {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ml-2 {
margin-left: 8px;
}
.hidden-radio {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.checkmark-circle {
position: absolute;
top: 12px;
right: 12px;
width: 18px;
height: 18px;
border-radius: 50%;
background-color: #1677ff;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.checkmark-icon {
width: 14px;
height: 14px;
}
.payment-option-active:has(input[value="WeChatPay"]:checked) .checkmark-circle {
background-color: #22AC38;
}
/* 响应式设计 */
@media (max-width: 640px) {
.payment-options {
flex-direction: column;
}
.payment-option {
padding: 10px;
}
.payment-icon {
width: 70px;
min-width: 50px;
}
.alipay-svg, .wechat-svg {
max-height: 24px;
}
.checkmark-circle {
top: 50%;
transform: translateY(-50%);
right: 10px;
width: 16px;
height: 16px;
}
.checkmark-icon {
width: 12px;
height: 12px;
}
}
</style>