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