From 90a4efc81a90d177be66bd94ad0e695d8c56f014 Mon Sep 17 00:00:00 2001 From: Seven Date: Mon, 19 Jan 2026 00:55:56 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=BD=AC=E8=B4=A6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=BD=AC=E8=B4=A6?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8F=8A=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BA=A4=E6=98=93=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.ts | 5 + src/views/profile/index.vue | 3 +- src/views/security/index.vue | 10 +- src/views/transfer/index.vue | 581 +++++++++++++++++++++++++++++++++++ 4 files changed, 594 insertions(+), 5 deletions(-) create mode 100644 src/views/transfer/index.vue diff --git a/src/router/index.ts b/src/router/index.ts index 5824f91..00f4c1a 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -129,6 +129,11 @@ const routes: Array = [ component: () => import("@/views/withdraw/index.vue"), meta: { requiresAuth: true }, }, + { + path: "/transfer", + component: () => import("@/views/transfer/index.vue"), + meta: { requiresAuth: true }, + }, ]; const router = createRouter({ diff --git a/src/views/profile/index.vue b/src/views/profile/index.vue index a710818..ceaea81 100644 --- a/src/views/profile/index.vue +++ b/src/views/profile/index.vue @@ -122,7 +122,8 @@ async function handleLogout() {
diff --git a/src/views/security/index.vue b/src/views/security/index.vue index ee58e5e..ffcddb1 100644 --- a/src/views/security/index.vue +++ b/src/views/security/index.vue @@ -4,9 +4,9 @@ import { checkmarkCircleOutline, chevronForwardOutline, closeCircleOutline, keyO import { client, safeClient } from "@/api"; const router = useRouter(); -const { data: status, refresh } = await safeClient(() => client.api.user.security["transaction-password"].status.get()); - +const { data: status, execute } = await safeClient(() => client.api.user.security["transaction-password"].status.get()); const hasPaymentPassword = computed(() => status.value?.enabled ?? false); +const toggleInst = ref(null); async function showToast(message: string, color: "success" | "danger" | "warning" = "success") { const toast = await toastController.create({ @@ -50,6 +50,7 @@ async function handleTogglePaymentPassword() { }, { text: "确认", + role: "confirm", handler: async (data) => { if (!data.oldPassword) { await showToast("请输入交易密码", "danger"); @@ -66,7 +67,7 @@ async function handleTogglePaymentPassword() { if (!error.value) { await showToast("交易密码功能已关闭", "warning"); - await refresh(); + await execute(); return true; } return false; @@ -132,7 +133,7 @@ async function handleTogglePaymentPassword() { if (!error.value) { await showToast("交易密码设置成功"); - await refresh(); + await execute(); return true; } return false; @@ -197,6 +198,7 @@ async function handleTogglePaymentPassword() { {{ status?.enabled ? '已启用' : '未启用' }}
+import type { Treaty } from "@elysiajs/eden"; +import type { client } from "@/api"; +import { alertController, toastController } from "@ionic/vue"; +import { callOutline, checkmarkCircleOutline, documentTextOutline, keyOutline, personOutline, walletOutline } from "ionicons/icons"; +import { safeClient } from "@/api"; + +type Wallet = Treaty.Data[number]; + +const router = useRouter(); +const walletStore = useWalletStore(); +const { wallets } = storeToRefs(walletStore); +const filterWallets = computed(() => wallets.value.filter(w => w.walletType.allowTransfer === true)); + +// 转账金额 +const transferAmount = ref(""); +const quickAmounts = [100, 500, 1000, 2000]; + +// 选中的钱包 +const selectedWallet = ref(null); + +// 收款人手机号 +const recipientPhone = ref(""); + +// 交易密码 +const transactionPassword = ref(""); + +onMounted(async () => { + await walletStore.syncWallets(); + if (wallets.value.length > 0) { + selectedWallet.value = wallets.value[0]; + } +}); + +// 可转账余额 +const availableBalance = computed(() => { + return Number(selectedWallet.value?.available) || 0; +}); + +function selectQuickAmount(amount: number) { + if (amount <= availableBalance.value) { + transferAmount.value = amount.toString(); + } + else { + showToast("转账金额不能大于可用余额", "warning"); + } +} + +function selectAllAmount() { + transferAmount.value = availableBalance.value.toString(); +} + +function selectWallet(wallet: Wallet) { + selectedWallet.value = wallet; + // 重新验证转账金额 + const amount = Number.parseFloat(transferAmount.value); + if (amount > availableBalance.value) { + transferAmount.value = ""; + } +} + +async function showToast(message: string, color: "success" | "danger" | "warning" = "success") { + const toast = await toastController.create({ + message, + duration: 2000, + position: "top", + color, + }); + await toast.present(); +} + +// 验证手机号 +function validatePhone(phone: string): boolean { + const phoneRegex = /^1[3-9]\d{9}$/; + return phoneRegex.test(phone); +} + +async function handleSubmit() { + const amount = Number.parseFloat(transferAmount.value); + + // 验证转账金额 + if (!transferAmount.value || Number.isNaN(amount) || amount <= 0) { + await showToast("请输入有效的转账金额", "warning"); + return; + } + + if (amount < 1) { + await showToast("转账金额不能低于1元", "warning"); + return; + } + + if (amount > availableBalance.value) { + await showToast("转账金额不能大于可用余额", "warning"); + return; + } + + // 验证钱包选择 + if (!selectedWallet.value) { + await showToast("请选择转账钱包", "warning"); + return; + } + + // 验证收款人手机号 + if (!recipientPhone.value) { + await showToast("请输入收款人手机号", "warning"); + return; + } + + if (!validatePhone(recipientPhone.value)) { + await showToast("请输入正确的手机号码", "warning"); + return; + } + + // 验证交易密码 + if (!transactionPassword.value) { + await showToast("请输入交易密码", "warning"); + return; + } + + if (transactionPassword.value.length < 6) { + await showToast("交易密码至少6位", "warning"); + return; + } + + const alert = await alertController.create({ + header: "确认转账", + message: ` +
+

转账金额:¥${amount.toFixed(2)}

+

转账钱包:${selectedWallet.value.walletType.name}

+

收款人:${recipientPhone.value}

+
+ `, + buttons: [ + { + text: "取消", + role: "cancel", + }, + { + text: "确认转账", + handler: async () => { + // TODO: 调用转账 API + // const { error } = await safeClient(client.api.transfer.post({ + // walletId: selectedWallet.value.id, + // amount, + // recipientPhone: recipientPhone.value, + // transactionPassword: transactionPassword.value, + // })); + + await showToast("转账成功"); + transferAmount.value = ""; + recipientPhone.value = ""; + transactionPassword.value = ""; + await walletStore.syncWallets(); + }, + }, + ], + }); + + await alert.present(); +} + +function goToRecords() { + // router.push("/transfer/records"); + showToast("功能开发中", "warning"); +} + + + + +