优化移动端收款账号管理
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
@@ -1,7 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, watch } from 'vue'
|
import { computed, ref, watch } from 'vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { Upload, Delete, Loading } from '@element-plus/icons-vue'
|
import { Upload, Delete, Loading } from '@element-plus/icons-vue'
|
||||||
|
import alipayReceiveQrExample from '@/assets/alipay-receive-qr-example.png'
|
||||||
import wechatReceiveQrExample from '@/assets/wechat-receive-qr-example.png'
|
import wechatReceiveQrExample from '@/assets/wechat-receive-qr-example.png'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -33,6 +34,39 @@ const form = ref<CreatePaymentAccountRequest>({
|
|||||||
bank_branch: '',
|
bank_branch: '',
|
||||||
certificate_urls: [],
|
certificate_urls: [],
|
||||||
})
|
})
|
||||||
|
const receiveQrTip = computed(() => {
|
||||||
|
if (form.value.account_type === 'alipay') {
|
||||||
|
return {
|
||||||
|
title: '支付宝收款二维码上传提醒',
|
||||||
|
lines: [
|
||||||
|
'请在支付宝收钱码页面保存收钱码,上传保存后的二维码图片。',
|
||||||
|
'不要上传收钱码截图、聊天截图或带页面背景的整屏截图。',
|
||||||
|
],
|
||||||
|
image: alipayReceiveQrExample,
|
||||||
|
alt: '支付宝收款二维码示例',
|
||||||
|
label: '支付宝收款二维码',
|
||||||
|
hint: '请上传保存后的支付宝收款二维码图片(可选,最多3张)',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (form.value.account_type === 'wechat') {
|
||||||
|
return {
|
||||||
|
title: '微信收款二维码上传提醒',
|
||||||
|
lines: [
|
||||||
|
'请在微信收款码页面点击保存收款码,上传保存后的二维码图片。',
|
||||||
|
'不要上传收款码截图、聊天截图或带页面背景的整屏截图。',
|
||||||
|
],
|
||||||
|
image: wechatReceiveQrExample,
|
||||||
|
alt: '微信收款二维码示例',
|
||||||
|
label: '微信收款二维码',
|
||||||
|
hint: '请上传保存后的微信收款二维码图片(可选,最多3张)',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
})
|
||||||
|
const certificateLabel = computed(() => receiveQrTip.value?.label || '凭证截图')
|
||||||
|
const certificateHint = computed(
|
||||||
|
() => receiveQrTip.value?.hint || '可上传收款码截图等凭证(可选,最多3张)'
|
||||||
|
)
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.modelValue,
|
() => props.modelValue,
|
||||||
@@ -196,21 +230,16 @@ function removeImage(index: number) {
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-form-item :label="form.account_type === 'wechat' ? '收款二维码' : '凭证截图'">
|
<el-form-item :label="certificateLabel">
|
||||||
<div v-if="form.account_type === 'wechat'" class="wechat-qr-tip">
|
<div v-if="receiveQrTip" class="receive-qr-tip">
|
||||||
<div>
|
<div>
|
||||||
<strong>微信收款二维码上传提醒</strong>
|
<strong>{{ receiveQrTip.title }}</strong>
|
||||||
<p>请在微信收款码页面点击保存收款码,上传保存后的二维码图片。</p>
|
<p v-for="line in receiveQrTip.lines" :key="line">{{ line }}</p>
|
||||||
<p>不要上传收款码截图、聊天截图或带页面背景的整屏截图。</p>
|
|
||||||
</div>
|
</div>
|
||||||
<img :src="wechatReceiveQrExample" alt="微信收款二维码示例" />
|
<img :src="receiveQrTip.image" :alt="receiveQrTip.alt" />
|
||||||
</div>
|
</div>
|
||||||
<div style="font-size: 12px; color: #999; margin-bottom: 8px">
|
<div style="font-size: 12px; color: #999; margin-bottom: 8px">
|
||||||
{{
|
{{ certificateHint }}
|
||||||
form.account_type === 'wechat'
|
|
||||||
? '请上传保存后的微信收款二维码图片(可选,最多3张)'
|
|
||||||
: '可上传收款码截图等凭证(可选,最多3张)'
|
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="certificate-upload">
|
<div class="certificate-upload">
|
||||||
<div v-for="(url, index) in form.certificate_urls" :key="url" class="certificate-item">
|
<div v-for="(url, index) in form.certificate_urls" :key="url" class="certificate-item">
|
||||||
@@ -284,7 +313,7 @@ function removeImage(index: number) {
|
|||||||
gap: 12px;
|
gap: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip {
|
.receive-qr-tip {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1fr) 128px;
|
grid-template-columns: minmax(0, 1fr) 128px;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
@@ -298,20 +327,20 @@ function removeImage(index: number) {
|
|||||||
color: #92400e;
|
color: #92400e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip strong {
|
.receive-qr-tip strong {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
color: #c2410c;
|
color: #c2410c;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip p {
|
.receive-qr-tip p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip img {
|
.receive-qr-tip img {
|
||||||
display: block;
|
display: block;
|
||||||
width: 128px;
|
width: 128px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
|||||||
@@ -7,17 +7,21 @@ import {
|
|||||||
cancelWithdrawal,
|
cancelWithdrawal,
|
||||||
createPaymentAccount,
|
createPaymentAccount,
|
||||||
createWithdrawal,
|
createWithdrawal,
|
||||||
|
deletePaymentAccount,
|
||||||
fetchPaymentAccounts,
|
fetchPaymentAccounts,
|
||||||
fetchWithdrawals,
|
fetchWithdrawals,
|
||||||
|
setDefaultPaymentAccount,
|
||||||
type AccountType,
|
type AccountType,
|
||||||
type PaymentAccount,
|
type PaymentAccount,
|
||||||
type WithdrawalRequest,
|
type WithdrawalRequest,
|
||||||
|
updatePaymentAccount,
|
||||||
} from '@/features/wallet/api/withdrawal'
|
} from '@/features/wallet/api/withdrawal'
|
||||||
import { fetchWalletBalance, type WalletAccount } from '@/features/wallet/api/wallet'
|
import { fetchWalletBalance, type WalletAccount } from '@/features/wallet/api/wallet'
|
||||||
import { uploadFile } from '@/shared/api/files'
|
import { uploadFile } from '@/shared/api/files'
|
||||||
import { readError } from '@/shared/utils/error'
|
import { readError } from '@/shared/utils/error'
|
||||||
import { formatCent, formatMoney, yuanToCent } from '@/shared/utils/money'
|
import { formatCent, formatMoney, yuanToCent } from '@/shared/utils/money'
|
||||||
import { formatDateMinute } from '@/shared/utils/time'
|
import { formatDateMinute } from '@/shared/utils/time'
|
||||||
|
import alipayReceiveQrExample from '@/assets/alipay-receive-qr-example.png'
|
||||||
import wechatReceiveQrExample from '@/assets/wechat-receive-qr-example.png'
|
import wechatReceiveQrExample from '@/assets/wechat-receive-qr-example.png'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -25,11 +29,13 @@ const router = useRouter()
|
|||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const submitting = ref(false)
|
const submitting = ref(false)
|
||||||
const addingAccount = ref(false)
|
const addingAccount = ref(false)
|
||||||
|
const managingAccountId = ref(0)
|
||||||
const uploadingCertificate = ref(false)
|
const uploadingCertificate = ref(false)
|
||||||
const showAccountPopup = ref(false)
|
const showAccountPopup = ref(false)
|
||||||
const account = ref<WalletAccount | null>(null)
|
const account = ref<WalletAccount | null>(null)
|
||||||
const paymentAccounts = ref<PaymentAccount[]>([])
|
const paymentAccounts = ref<PaymentAccount[]>([])
|
||||||
const withdrawals = ref<WithdrawalRequest[]>([])
|
const withdrawals = ref<WithdrawalRequest[]>([])
|
||||||
|
const editingAccount = ref<PaymentAccount | null>(null)
|
||||||
|
|
||||||
const MIN_AMOUNT = 10
|
const MIN_AMOUNT = 10
|
||||||
const MAX_AMOUNT = 5000
|
const MAX_AMOUNT = 5000
|
||||||
@@ -51,6 +57,35 @@ const accountForm = reactive({
|
|||||||
const selectedAccount = computed(() =>
|
const selectedAccount = computed(() =>
|
||||||
paymentAccounts.value.find(item => item.id === withdrawForm.payment_account_id)
|
paymentAccounts.value.find(item => item.id === withdrawForm.payment_account_id)
|
||||||
)
|
)
|
||||||
|
const canAddMore = computed(() => paymentAccounts.value.length < 5)
|
||||||
|
const accountPopupTitle = computed(() => (editingAccount.value ? '管理收款账号' : '添加收款账号'))
|
||||||
|
const receiveQrTip = computed(() => {
|
||||||
|
if (accountForm.account_type === 'alipay') {
|
||||||
|
return {
|
||||||
|
title: '支付宝收款二维码上传提醒',
|
||||||
|
lines: [
|
||||||
|
'请在支付宝收钱码页面保存收钱码,上传保存后的二维码图片。',
|
||||||
|
'不要上传收钱码截图、聊天截图或带页面背景的整屏截图。',
|
||||||
|
],
|
||||||
|
image: alipayReceiveQrExample,
|
||||||
|
alt: '支付宝收款二维码示例',
|
||||||
|
label: '支付宝收款二维码',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (accountForm.account_type === 'wechat') {
|
||||||
|
return {
|
||||||
|
title: '微信收款二维码上传提醒',
|
||||||
|
lines: [
|
||||||
|
'请在微信收款码页面点击保存收款码,上传保存后的二维码图片。',
|
||||||
|
'不要上传收款码截图、聊天截图或带页面背景的整屏截图。',
|
||||||
|
],
|
||||||
|
image: wechatReceiveQrExample,
|
||||||
|
alt: '微信收款二维码示例',
|
||||||
|
label: '微信收款二维码',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
})
|
||||||
|
|
||||||
const amountValue = computed(() => Number(withdrawForm.amount || 0))
|
const amountValue = computed(() => Number(withdrawForm.amount || 0))
|
||||||
const amountCent = computed(() => yuanToCent(amountValue.value))
|
const amountCent = computed(() => yuanToCent(amountValue.value))
|
||||||
@@ -144,6 +179,7 @@ async function handleCancel(item: WithdrawalRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openAccountPopup() {
|
function openAccountPopup() {
|
||||||
|
editingAccount.value = null
|
||||||
Object.assign(accountForm, {
|
Object.assign(accountForm, {
|
||||||
account_type: 'alipay' as AccountType,
|
account_type: 'alipay' as AccountType,
|
||||||
account_name: '',
|
account_name: '',
|
||||||
@@ -155,12 +191,25 @@ function openAccountPopup() {
|
|||||||
showAccountPopup.value = true
|
showAccountPopup.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleAddAccount() {
|
function openEditAccountPopup(item: PaymentAccount) {
|
||||||
|
editingAccount.value = item
|
||||||
|
Object.assign(accountForm, {
|
||||||
|
account_type: item.account_type,
|
||||||
|
account_name: item.account_name,
|
||||||
|
account_no: item.account_no,
|
||||||
|
bank_name: item.bank_name || '',
|
||||||
|
bank_branch: item.bank_branch || '',
|
||||||
|
certificate_urls: [...(item.certificate_urls || [])],
|
||||||
|
})
|
||||||
|
showAccountPopup.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleSaveAccount() {
|
||||||
if (!accountForm.account_name.trim()) {
|
if (!accountForm.account_name.trim()) {
|
||||||
showToast({ message: '请输入账户名', icon: 'warning-o' })
|
showToast({ message: '请输入账户名', icon: 'warning-o' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!accountForm.account_no.trim()) {
|
if (!editingAccount.value && !accountForm.account_no.trim()) {
|
||||||
showToast({
|
showToast({
|
||||||
message: accountForm.account_type === 'bank' ? '请输入银行卡号' : '请输入账号',
|
message: accountForm.account_type === 'bank' ? '请输入银行卡号' : '请输入账号',
|
||||||
icon: 'warning-o',
|
icon: 'warning-o',
|
||||||
@@ -174,25 +223,85 @@ async function handleAddAccount() {
|
|||||||
|
|
||||||
addingAccount.value = true
|
addingAccount.value = true
|
||||||
try {
|
try {
|
||||||
const created = await createPaymentAccount({
|
if (editingAccount.value) {
|
||||||
account_type: accountForm.account_type,
|
await updatePaymentAccount(editingAccount.value.id, {
|
||||||
account_name: accountForm.account_name.trim(),
|
bank_branch: accountForm.account_type === 'bank' ? accountForm.bank_branch.trim() : '',
|
||||||
account_no: accountForm.account_no.trim(),
|
certificate_urls: accountForm.certificate_urls,
|
||||||
bank_name: accountForm.account_type === 'bank' ? accountForm.bank_name.trim() : '',
|
})
|
||||||
bank_branch: accountForm.account_type === 'bank' ? accountForm.bank_branch.trim() : '',
|
showToast({ message: '收款账号已更新', icon: 'passed' })
|
||||||
certificate_urls: accountForm.certificate_urls,
|
showAccountPopup.value = false
|
||||||
})
|
editingAccount.value = null
|
||||||
showToast({ message: '收款账号已添加', icon: 'passed' })
|
await loadData()
|
||||||
showAccountPopup.value = false
|
} else {
|
||||||
await loadData()
|
const created = await createPaymentAccount({
|
||||||
withdrawForm.payment_account_id = created.id
|
account_type: accountForm.account_type,
|
||||||
|
account_name: accountForm.account_name.trim(),
|
||||||
|
account_no: accountForm.account_no.trim(),
|
||||||
|
bank_name: accountForm.account_type === 'bank' ? accountForm.bank_name.trim() : '',
|
||||||
|
bank_branch: accountForm.account_type === 'bank' ? accountForm.bank_branch.trim() : '',
|
||||||
|
certificate_urls: accountForm.certificate_urls,
|
||||||
|
})
|
||||||
|
showToast({ message: '收款账号已添加', icon: 'passed' })
|
||||||
|
showAccountPopup.value = false
|
||||||
|
editingAccount.value = null
|
||||||
|
await loadData()
|
||||||
|
withdrawForm.payment_account_id = created.id
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showToast({ message: readError(error, '添加失败'), icon: 'cross' })
|
showToast({
|
||||||
|
message: readError(error, editingAccount.value ? '更新失败' : '添加失败'),
|
||||||
|
icon: 'cross',
|
||||||
|
})
|
||||||
} finally {
|
} finally {
|
||||||
addingAccount.value = false
|
addingAccount.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function handleSetDefaultAccount(item: PaymentAccount) {
|
||||||
|
if (item.is_default || managingAccountId.value) return
|
||||||
|
managingAccountId.value = item.id
|
||||||
|
try {
|
||||||
|
await setDefaultPaymentAccount(item.id)
|
||||||
|
showToast({ message: '已设为默认账号', icon: 'passed' })
|
||||||
|
withdrawForm.payment_account_id = item.id
|
||||||
|
await loadData()
|
||||||
|
} catch (error) {
|
||||||
|
showToast({ message: readError(error, '设置失败'), icon: 'cross' })
|
||||||
|
} finally {
|
||||||
|
managingAccountId.value = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleDeleteAccount(item: PaymentAccount) {
|
||||||
|
if (managingAccountId.value) return
|
||||||
|
try {
|
||||||
|
await showDialog({
|
||||||
|
title: '删除收款账号',
|
||||||
|
message: `确定删除 ${accountTypeLabel(item.account_type)} · ${item.account_name} 吗?删除后不会影响已提交的提现记录。`,
|
||||||
|
confirmButtonText: '确认删除',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
showCancelButton: true,
|
||||||
|
})
|
||||||
|
} catch {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
managingAccountId.value = item.id
|
||||||
|
try {
|
||||||
|
await deletePaymentAccount(item.id)
|
||||||
|
showToast({ message: '收款账号已删除', icon: 'passed' })
|
||||||
|
if (editingAccount.value?.id === item.id) {
|
||||||
|
showAccountPopup.value = false
|
||||||
|
editingAccount.value = null
|
||||||
|
}
|
||||||
|
await loadData()
|
||||||
|
} catch (error) {
|
||||||
|
showToast({ message: readError(error, '删除失败'), icon: 'cross' })
|
||||||
|
} finally {
|
||||||
|
managingAccountId.value = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function handleCertificateUpload(event: Event) {
|
async function handleCertificateUpload(event: Event) {
|
||||||
const input = event.target as HTMLInputElement
|
const input = event.target as HTMLInputElement
|
||||||
const file = input.files?.[0]
|
const file = input.files?.[0]
|
||||||
@@ -293,9 +402,9 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
<section class="withdraw-card">
|
<section class="withdraw-card">
|
||||||
<div class="section-title">
|
<div class="section-title">
|
||||||
<h2>申请提现</h2>
|
<h2>申请提现</h2>
|
||||||
<button type="button" @click="openAccountPopup">
|
<button type="button" :disabled="!canAddMore" @click="openAccountPopup">
|
||||||
<van-icon name="plus" :size="14" />
|
<van-icon name="plus" :size="14" />
|
||||||
添加账号
|
{{ canAddMore ? '添加账号' : '已达上限' }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -311,27 +420,46 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
|
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="account-list">
|
<div class="account-list">
|
||||||
<button
|
<article
|
||||||
v-for="item in paymentAccounts"
|
v-for="item in paymentAccounts"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
type="button"
|
|
||||||
class="account-option"
|
class="account-option"
|
||||||
:class="{ active: item.id === withdrawForm.payment_account_id }"
|
:class="{ active: item.id === withdrawForm.payment_account_id }"
|
||||||
@click="selectAccount(item.id)"
|
|
||||||
>
|
>
|
||||||
<span class="account-icon">
|
<button type="button" class="account-select" @click="selectAccount(item.id)">
|
||||||
<van-icon :name="accountTypeIcon(item.account_type)" :size="18" />
|
<span class="account-icon">
|
||||||
</span>
|
<van-icon :name="accountTypeIcon(item.account_type)" :size="18" />
|
||||||
<span class="account-main">
|
</span>
|
||||||
<strong>{{ accountTypeLabel(item.account_type) }} · {{ item.account_name }}</strong>
|
<span class="account-main">
|
||||||
<small>{{ item.account_no }}</small>
|
<strong>{{ accountTypeLabel(item.account_type) }} · {{ item.account_name }}</strong>
|
||||||
</span>
|
<small>{{ item.account_no }}</small>
|
||||||
<van-tag v-if="item.is_default" type="warning" plain>默认</van-tag>
|
</span>
|
||||||
<van-icon
|
<van-tag v-if="item.is_default" type="warning" plain>默认</van-tag>
|
||||||
:name="item.id === withdrawForm.payment_account_id ? 'checked' : 'circle'"
|
<van-icon
|
||||||
:size="18"
|
:name="item.id === withdrawForm.payment_account_id ? 'checked' : 'circle'"
|
||||||
/>
|
:size="18"
|
||||||
</button>
|
/>
|
||||||
|
</button>
|
||||||
|
<div class="account-actions">
|
||||||
|
<button
|
||||||
|
v-if="!item.is_default"
|
||||||
|
type="button"
|
||||||
|
:disabled="managingAccountId === item.id"
|
||||||
|
@click="handleSetDefaultAccount(item)"
|
||||||
|
>
|
||||||
|
设默认
|
||||||
|
</button>
|
||||||
|
<button type="button" @click="openEditAccountPopup(item)">管理</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="danger"
|
||||||
|
:disabled="managingAccountId === item.id"
|
||||||
|
@click="handleDeleteAccount(item)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<van-field
|
<van-field
|
||||||
@@ -419,21 +547,22 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
class="account-popup"
|
class="account-popup"
|
||||||
>
|
>
|
||||||
<div class="popup-body">
|
<div class="popup-body">
|
||||||
<h2>添加收款账号</h2>
|
<h2>{{ accountPopupTitle }}</h2>
|
||||||
<van-radio-group
|
<van-radio-group
|
||||||
v-model="accountForm.account_type"
|
v-model="accountForm.account_type"
|
||||||
direction="horizontal"
|
direction="horizontal"
|
||||||
class="type-tabs"
|
class="type-tabs"
|
||||||
>
|
>
|
||||||
<van-radio name="alipay">支付宝</van-radio>
|
<van-radio name="alipay" :disabled="!!editingAccount">支付宝</van-radio>
|
||||||
<van-radio name="wechat">微信</van-radio>
|
<van-radio name="wechat" :disabled="!!editingAccount">微信</van-radio>
|
||||||
<van-radio name="bank">银行卡</van-radio>
|
<van-radio name="bank" :disabled="!!editingAccount">银行卡</van-radio>
|
||||||
</van-radio-group>
|
</van-radio-group>
|
||||||
|
|
||||||
<van-field
|
<van-field
|
||||||
v-model.trim="accountForm.account_name"
|
v-model.trim="accountForm.account_name"
|
||||||
label="账户名"
|
label="账户名"
|
||||||
placeholder="必须与实名认证姓名一致"
|
placeholder="必须与实名认证姓名一致"
|
||||||
|
:disabled="!!editingAccount"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<van-field
|
<van-field
|
||||||
@@ -446,6 +575,7 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
? '微信号'
|
? '微信号'
|
||||||
: '银行卡号'
|
: '银行卡号'
|
||||||
"
|
"
|
||||||
|
:disabled="!!editingAccount"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<template v-if="accountForm.account_type === 'bank'">
|
<template v-if="accountForm.account_type === 'bank'">
|
||||||
@@ -453,6 +583,7 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
v-model.trim="accountForm.bank_name"
|
v-model.trim="accountForm.bank_name"
|
||||||
label="银行名称"
|
label="银行名称"
|
||||||
placeholder="如:中国工商银行"
|
placeholder="如:中国工商银行"
|
||||||
|
:disabled="!!editingAccount"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<van-field v-model.trim="accountForm.bank_branch" label="开户支行" placeholder="可选" />
|
<van-field v-model.trim="accountForm.bank_branch" label="开户支行" placeholder="可选" />
|
||||||
@@ -462,20 +593,17 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
账户名必须与实名认证姓名一致;提现将转账到该收款账号,请确认账号信息准确。
|
账户名必须与实名认证姓名一致;提现将转账到该收款账号,请确认账号信息准确。
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="accountForm.account_type === 'wechat'" class="wechat-qr-tip">
|
<div v-if="receiveQrTip" class="receive-qr-tip">
|
||||||
<div>
|
<div>
|
||||||
<strong>微信收款二维码上传提醒</strong>
|
<strong>{{ receiveQrTip.title }}</strong>
|
||||||
<p>请在微信收款码页面点击保存收款码,上传保存后的二维码图片。</p>
|
<p v-for="line in receiveQrTip.lines" :key="line">{{ line }}</p>
|
||||||
<p>不要上传收款码截图、聊天截图或带页面背景的整屏截图。</p>
|
|
||||||
</div>
|
</div>
|
||||||
<img :src="wechatReceiveQrExample" alt="微信收款二维码示例" />
|
<img :src="receiveQrTip.image" :alt="receiveQrTip.alt" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section class="certificate-section">
|
<section class="certificate-section">
|
||||||
<div class="certificate-title">
|
<div class="certificate-title">
|
||||||
<span>{{
|
<span>{{ receiveQrTip?.label || '收款码/凭证截图' }}</span>
|
||||||
accountForm.account_type === 'wechat' ? '微信收款二维码' : '收款码/凭证截图'
|
|
||||||
}}</span>
|
|
||||||
<small>最多3张</small>
|
<small>最多3张</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="certificate-grid">
|
<div class="certificate-grid">
|
||||||
@@ -508,10 +636,22 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
round
|
round
|
||||||
type="primary"
|
type="primary"
|
||||||
:loading="addingAccount"
|
:loading="addingAccount"
|
||||||
loading-text="添加中..."
|
:loading-text="editingAccount ? '保存中...' : '添加中...'"
|
||||||
@click="handleAddAccount"
|
@click="handleSaveAccount"
|
||||||
>
|
>
|
||||||
保存账号
|
{{ editingAccount ? '保存变更' : '保存账号' }}
|
||||||
|
</van-button>
|
||||||
|
<van-button
|
||||||
|
v-if="editingAccount"
|
||||||
|
block
|
||||||
|
round
|
||||||
|
plain
|
||||||
|
type="danger"
|
||||||
|
class="delete-account-btn"
|
||||||
|
:loading="managingAccountId === editingAccount.id"
|
||||||
|
@click="handleDeleteAccount(editingAccount)"
|
||||||
|
>
|
||||||
|
删除此账号
|
||||||
</van-button>
|
</van-button>
|
||||||
</div>
|
</div>
|
||||||
</van-popup>
|
</van-popup>
|
||||||
@@ -616,6 +756,10 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.section-title button:disabled {
|
||||||
|
color: #98a2b3;
|
||||||
|
}
|
||||||
|
|
||||||
.section-title span {
|
.section-title span {
|
||||||
color: #98a2b3;
|
color: #98a2b3;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@@ -647,16 +791,11 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
|
|
||||||
.account-option {
|
.account-option {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 34px 1fr auto 20px;
|
|
||||||
align-items: center;
|
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
width: 100%;
|
|
||||||
min-height: 64px;
|
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border: 1px solid #eaecf0;
|
border: 1px solid #eaecf0;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
text-align: left;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.account-option.active {
|
.account-option.active {
|
||||||
@@ -664,6 +803,19 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
background: #fff7ed;
|
background: #fff7ed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.account-select {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 34px 1fr auto 20px;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 44px;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
.account-icon {
|
.account-icon {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -697,6 +849,29 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.account-actions {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 8px;
|
||||||
|
padding-top: 8px;
|
||||||
|
border-top: 1px solid #f2f4f7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-actions button {
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
color: #ff6a00;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-actions button.danger {
|
||||||
|
color: #b42318;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-actions button:disabled {
|
||||||
|
color: #98a2b3;
|
||||||
|
}
|
||||||
|
|
||||||
:deep(.van-cell) {
|
:deep(.van-cell) {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
@@ -800,6 +975,10 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
color: #101828;
|
color: #101828;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.delete-account-btn {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.type-tabs {
|
.type-tabs {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
@@ -819,7 +998,7 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip {
|
.receive-qr-tip {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1fr) 108px;
|
grid-template-columns: minmax(0, 1fr) 108px;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
@@ -832,20 +1011,20 @@ function statusType(status: string): 'primary' | 'success' | 'danger' | 'warning
|
|||||||
color: #92400e;
|
color: #92400e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip strong {
|
.receive-qr-tip strong {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
color: #c2410c;
|
color: #c2410c;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip p {
|
.receive-qr-tip p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.55;
|
line-height: 1.55;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wechat-qr-tip img {
|
.receive-qr-tip img {
|
||||||
display: block;
|
display: block;
|
||||||
width: 108px;
|
width: 108px;
|
||||||
border: 1px solid #fde6c8;
|
border: 1px solid #fde6c8;
|
||||||
|
|||||||
Reference in New Issue
Block a user