This commit is contained in:
parent
9343b288ec
commit
f0140d85e6
@ -64,7 +64,7 @@
|
|||||||
class="group relative flex h-[46px] items-center overflow-hidden rounded-[32px] bg-[#ADFF5B] p-[3px]"
|
class="group relative flex h-[46px] items-center overflow-hidden rounded-[32px] bg-[#ADFF5B] p-[3px]"
|
||||||
>
|
>
|
||||||
<div class="flex h-full items-center px-6 text-xl font-bold text-black">
|
<div class="flex h-full items-center px-6 text-xl font-bold text-black">
|
||||||
{{ values.type === 'USDT(TRC20)' ? '₮' : '¥' }}
|
{{ values.type === 'USDT(TRC20)' ? '₮' : '$' }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<FormControl>
|
<FormControl>
|
||||||
@ -101,12 +101,12 @@
|
|||||||
}
|
}
|
||||||
"
|
"
|
||||||
class="h-full flex-1 rounded-[28px]! border-none bg-[#222222] px-4 text-center text-sm font-bold text-white placeholder:text-white/20 focus:ring-0! focus-visible:ring-0!"
|
class="h-full flex-1 rounded-[28px]! border-none bg-[#222222] px-4 text-center text-sm font-bold text-white placeholder:text-white/20 focus:ring-0! focus-visible:ring-0!"
|
||||||
:placeholder="values.type === 'USDT(TRC20)' ? '不小于30USDT' : '不小于200RMB'"
|
:placeholder="values.type === 'USDT(TRC20)' ? '不小于30USDT' : '不小于30$'"
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|
||||||
<div class="flex h-full items-center px-6 text-sm font-bold text-black">
|
<div class="flex h-full items-center px-6 text-sm font-bold text-black">
|
||||||
{{ values.type === 'USDT(TRC20)' ? 'USDT' : 'RMB' }}
|
{{ values.type === 'USDT(TRC20)' ? 'USDT' : '$' }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<FormMessage class="ml-4 text-red-400" />
|
<FormMessage class="ml-4 text-red-400" />
|
||||||
@ -116,11 +116,30 @@
|
|||||||
<FormField v-if="values.type !== 'USDT(TRC20)'" name="avatar">
|
<FormField v-if="values.type !== 'USDT(TRC20)'" name="avatar">
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormLabel class="mb-4 block text-sm font-bold text-white">收款码</FormLabel>
|
<FormLabel class="mb-4 block text-sm font-bold text-white">收款码</FormLabel>
|
||||||
|
<input
|
||||||
|
ref="fileInputRef"
|
||||||
|
type="file"
|
||||||
|
accept="image/*"
|
||||||
|
class="hidden"
|
||||||
|
@change="onFileChange"
|
||||||
|
/>
|
||||||
<div
|
<div
|
||||||
class="flex cursor-pointer flex-col items-center justify-center rounded-[32px] border-2 border-dashed border-white/10 bg-[#222222] p-10 transition-all hover:border-[#ADFF5B]/50 hover:bg-[#2a2a2a]"
|
class="group relative flex cursor-pointer flex-col items-center justify-center overflow-hidden rounded-[32px] border-2 border-dashed border-white/10 bg-[#222222] transition-all hover:border-[#ADFF5B]/50 hover:bg-[#2a2a2a]"
|
||||||
|
:class="[values.avatar ? 'h-auto min-h-[160px] p-2' : 'p-10']"
|
||||||
|
@click="fileInputRef?.click()"
|
||||||
>
|
>
|
||||||
<Upload class="mb-3 h-12 w-12 text-white/20" />
|
<template v-if="values.avatar">
|
||||||
<span class="text-base font-medium text-white/30">点击上传高清收款二维码</span>
|
<img :src="values.avatar" class="max-h-[300px] w-full rounded-2xl object-contain" />
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 flex items-center justify-center bg-black/60 opacity-0 transition-opacity group-hover:opacity-100"
|
||||||
|
>
|
||||||
|
<span class="text-sm font-bold text-white">点击更换图片</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<Upload class="mb-3 h-12 w-12 text-white/20" />
|
||||||
|
<span class="text-base font-medium text-white/30">点击上传高清收款二维码</span>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<FormMessage class="ml-4 text-red-400" />
|
<FormMessage class="ml-4 text-red-400" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
@ -170,8 +189,71 @@ const emit = defineEmits(['confirm'])
|
|||||||
|
|
||||||
const open = ref(false)
|
const open = ref(false)
|
||||||
const isPending = ref(false) // 手动管理加载状态
|
const isPending = ref(false) // 手动管理加载状态
|
||||||
|
const fileInputRef = ref<HTMLInputElement | null>(null)
|
||||||
const ACCOUNT_TYPE = ['USDT(TRC20)', '微信', '支付宝'] as const
|
const ACCOUNT_TYPE = ['USDT(TRC20)', '微信', '支付宝'] as const
|
||||||
|
|
||||||
|
const compressImage = (file: File, quality = 0.7, maxWidth = 1024): Promise<string> => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader()
|
||||||
|
reader.readAsDataURL(file)
|
||||||
|
reader.onload = (e) => {
|
||||||
|
const img = new Image()
|
||||||
|
img.src = e.target?.result as string
|
||||||
|
img.onload = () => {
|
||||||
|
const canvas = document.createElement('canvas')
|
||||||
|
let width = img.width
|
||||||
|
let height = img.height
|
||||||
|
|
||||||
|
if (width > maxWidth) {
|
||||||
|
height = (maxWidth / width) * height
|
||||||
|
width = maxWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.width = width
|
||||||
|
canvas.height = height
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d')
|
||||||
|
ctx?.drawImage(img, 0, 0, width, height)
|
||||||
|
|
||||||
|
const compressedBase64 = canvas.toDataURL('image/jpeg', quality)
|
||||||
|
resolve(compressedBase64)
|
||||||
|
}
|
||||||
|
img.onerror = reject
|
||||||
|
}
|
||||||
|
reader.onerror = reject
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const onFileChange = async (e: Event) => {
|
||||||
|
const file = (e.target as HTMLInputElement).files?.[0]
|
||||||
|
if (!file) return
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 压缩图片
|
||||||
|
const compressedBase64 = await compressImage(file)
|
||||||
|
|
||||||
|
// 计算压缩后的大小
|
||||||
|
const base64Length = compressedBase64.split(',')[1].length
|
||||||
|
const sizeInBytes = base64Length * (3 / 4)
|
||||||
|
|
||||||
|
if (sizeInBytes > 2 * 1024 * 1024) {
|
||||||
|
// 限制 2MB
|
||||||
|
toast.error('图片过大,压缩后仍超过 2MB')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setFieldValue('avatar', compressedBase64)
|
||||||
|
} catch (err) {
|
||||||
|
console.error('图片处理失败:', err)
|
||||||
|
toast.error('图片处理失败,请重试')
|
||||||
|
} finally {
|
||||||
|
// 重置 input,允许重新选择同一张图
|
||||||
|
if (e.target) {
|
||||||
|
;(e.target as HTMLInputElement).value = ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// --- 表单验证 Schema ---
|
// --- 表单验证 Schema ---
|
||||||
const formSchema = toTypedSchema(
|
const formSchema = toTypedSchema(
|
||||||
z
|
z
|
||||||
@ -210,15 +292,22 @@ const onSubmit = handleSubmit(async (val) => {
|
|||||||
const amount = parseFloat(val.money)
|
const amount = parseFloat(val.money)
|
||||||
|
|
||||||
// 1. 基础校验
|
// 1. 基础校验
|
||||||
// if (amount > props.commission / 100) return toast.error('佣金不足')
|
const minAmount = 30
|
||||||
const minAmount = val.type === 'USDT(TRC20)' ? 30 : 200
|
|
||||||
if (amount < minAmount)
|
if (amount < minAmount)
|
||||||
return toast.error(`金额不能小于${minAmount}${val.type === 'USDT(TRC20)' ? 'USDT' : 'RMB'}`)
|
return toast.error(`金额不能小于${minAmount}${val.type === 'USDT(TRC20)' ? 'USDT' : '$'}`)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
isPending.value = true
|
isPending.value = true
|
||||||
|
|
||||||
// 2. 检查是否有未完成工单
|
// 2. 获取最新佣金进行校验
|
||||||
|
const userInfo = await request.get<any>('/api/v1/public/user/info')
|
||||||
|
const latestCommission = userInfo?.commission || 0
|
||||||
|
if (Math.round(amount * 100) > latestCommission) {
|
||||||
|
toast.error('佣金不足')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 检查是否有未完成工单
|
||||||
const data = await request.get<any>('/api/v1/public/ticket/list', {
|
const data = await request.get<any>('/api/v1/public/ticket/list', {
|
||||||
page: 1,
|
page: 1,
|
||||||
size: 1,
|
size: 1,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user