From ef52095f5e9f0a9fe2da779bb1573947d77d75b6 Mon Sep 17 00:00:00 2001
From: jhzh <1628036192@qq.com>
Date: Fri, 22 May 2026 10:53:01 +0800
Subject: [PATCH] 1
---
src/views/my/transfer.vue | 363 ++++++++++++++++++++++++++++++++++-----------------
1 files changed, 238 insertions(+), 125 deletions(-)
diff --git a/src/views/my/transfer.vue b/src/views/my/transfer.vue
index 8f8ee07..5983496 100644
--- a/src/views/my/transfer.vue
+++ b/src/views/my/transfer.vue
@@ -6,46 +6,66 @@
</template>
</fx-header>
- <div style="position: relative;">
- <div class="card">
- <!-- <van-field v-model="startValue" :label="$t('从')" type="digit" @blur="getassets" /> -->
- <div>{{ $t('从') }}</div>
- <div class="mt-3">{{ swapValue ? $t('资金账户') : $t('交易账户') }}</div>
- </div>
-
- <div class="card mt-5">
- <!-- <van-field v-model="endValue" :label="$t('至')" type="digit" @blur="getassets" /> -->
- <div>{{ $t('至') }}</div>
- <div class="mt-3">{{ swapValue ? $t('交易账户') : $t('资金账户') }}</div>
- </div>
-
- <img src="@/assets/imgs/my/交换.png" class="swap" @click="onSwap">
- </div>
-
- <div class="mt-10 transfer_label">{{ $t('资产') }}</div>
- <div class="card mt-3">
- <span>USDT</span>
- </div>
-
- <div class="mt-10 transfer_label">{{ $t('数量') }}</div>
- <div class="card mt-3 flex juc-between items-center">
- <van-field v-model="moneyRevise" type="number" :placeholder="$t('输入金额')">
- <template #button>
- <div class="label_but flex flex-end items-center">
- <span class="mr-3">USDT</span>
- <van-button type="default" size="small" round @click="Maximum">{{ $t('最大') }}</van-button>
+ <div class="transfer-body">
+ <!-- 上方卡片:转出账户 -->
+ <div class="transfer-card">
+ <div class="transfer-card-head">
+ <span class="transfer-card-title">{{ swapValue ? $t('来自用户钱包') : $t('期货钱包') }}</span>
+ <span class="transfer-card-balance">{{ $t('balance') }}: {{ fromBalance }}</span>
+ </div>
+ <div class="transfer-card-row">
+ <div class="transfer-currency">
+ <span>USDT</span>
</div>
- </template>
- </van-field>
- </div>
- <div class="hint">
- <span>{{ $t('最多可转') }}</span>
- {{ maxMoneyRevise }} USDT
- </div>
+ <div class="transfer-input-wrap">
+ <van-field
+ v-model="moneyRevise"
+ type="number"
+ :placeholder="$t('请输入数量')"
+ class="transfer-input"
+ >
+ <template #button>
+ <span class="transfer-max" @click="Maximum">{{ $t('最大') }}</span>
+ </template>
+ </van-field>
+ </div>
+ </div>
+ </div>
- <van-button type="primary" round color="#f7b600" @click="submit" size="large" :disabled="!submitThrough">
- {{ $t('确认') }}
- </van-button>
+ <!-- 中间:紫色交换图标 -->
+ <div class="transfer-swap-wrap" @click="onSwap">
+ <div class="transfer-swap-circle">
+ <img src="@/assets/imgs/my/交换.png" alt="" class="transfer-swap-icon" />
+ </div>
+ </div>
+
+ <!-- 下方卡片:转入账户 -->
+ <div class="transfer-card">
+ <div class="transfer-card-head">
+ <span class="transfer-card-title">{{ swapValue ? $t('期货钱包') : $t('来自用户钱包') }}</span>
+ <span class="transfer-card-balance">{{ $t('balance') }}: {{ toBalance }}U</span>
+ </div>
+ <div class="transfer-card-row transfer-card-row--readonly">
+ <div class="transfer-currency">
+ <span>USDT</span>
+ </div>
+ <div class="transfer-approx">≈{{ toBalance }}</div>
+ </div>
+ </div>
+
+ <div class="transfer-hint">
+ <span>{{ $t('最多可转') }}</span> {{ maxMoneyRevise }} USDT
+ </div>
+
+ <van-button
+ type="button"
+ class="transfer-submit"
+ :disabled="!submitThrough"
+ @click="submit"
+ >
+ {{ $t('提交') }}
+ </van-button>
+ </div>
</div>
</template>
@@ -53,113 +73,206 @@
import { ref, computed } from "vue";
import { useI18n } from "vue-i18n";
import { _transfer, _getassets } from "@/service/user.api.js";
-import { showToast } from 'vant'
+import { showToast } from 'vant';
-const { t } = useI18n()
+const { t } = useI18n();
-const moneyRevise = ref(0); // 划转金额
-const maxMoneyRevise = ref(0); // 最大划转金额
-const swapValue = ref(true) // 上下是否有交换
+const moneyRevise = ref('');
+const maxMoneyRevise = ref(0);
+const capitalBalance = ref('0');
+const contractBalance = ref('0');
+const swapValue = ref(true); // true: 资金账户 -> 交易账户
-const Maximum = () => { // 数量选择最大
- moneyRevise.value = maxMoneyRevise.value
-}
+const fromBalance = computed(() => swapValue.value ? capitalBalance.value : contractBalance.value);
+const toBalance = computed(() => swapValue.value ? contractBalance.value : capitalBalance.value);
-const submitThrough = computed(() => { // 判断是否可以提交
- return moneyRevise.value > 0
-})
+const submitThrough = computed(() => {
+ const n = Number(moneyRevise.value);
+ return !isNaN(n) && n > 0;
+});
-const submit = () => { // 提交
+const Maximum = () => {
+ moneyRevise.value = String(maxMoneyRevise.value);
+};
+
+const submit = () => {
+ const amount = Number(moneyRevise.value);
+ if (!submitThrough.value) return;
_transfer({
- deductAccount: swapValue.value ? 'capital' : 'contract', // 划转账户
- receiveAccount: swapValue.value ? 'contract' : 'capital', // 接收账户
- moneyRevise: moneyRevise.value,
- }).then(res => {
- showToast({
- message: t('操作成功'),
- forbidClick: true,
- duration: 2000
- })
- getassets()
- })
-}
+ deductAccount: swapValue.value ? 'capital' : 'contract',
+ receiveAccount: swapValue.value ? 'contract' : 'capital',
+ moneyRevise: amount,
+ }).then(() => {
+ showToast({ message: t('操作成功'), forbidClick: true, duration: 2000 });
+ moneyRevise.value = '';
+ getassets();
+ }).catch(() => {});
+};
-const getassets = () => { // 获取资产
+const getassets = () => {
_getassets().then(res => {
- swapValue.value ? maxMoneyRevise.value = res.capitalUSDT : maxMoneyRevise.value = res.contract // 根据上下是否颠倒来判断取的哪个值
- })
-}
-getassets()
+ capitalBalance.value = res.capitalUSDT != null ? res.capitalUSDT : '0';
+ contractBalance.value = res.contract != null ? res.contract : '0';
+ maxMoneyRevise.value = swapValue.value ? (res.capitalUSDT ?? 0) : (res.contract ?? 0);
+ }).catch(() => {});
+};
+getassets();
-const onSwap = () => { // 交换
- swapValue.value = !swapValue.value
- getassets()
-}
-
+const onSwap = () => {
+ swapValue.value = !swapValue.value;
+ moneyRevise.value = '';
+ getassets();
+};
</script>
<style lang="scss" scoped>
+@import '@/assets/theme/index.scss';
+
.transfer {
- padding: 0rem 1.2rem 2rem 1.2rem;
+ min-height: 100vh;
+ background: #f6f5fa;
+ padding-bottom: 2rem;
+}
- :deep(.van-cell) {
- background: none;
- padding: 0;
- }
+.transfer-body {
+ padding: 0 1.2rem 2rem;
+ position: relative;
+}
- :deep(.van-cell::after) {
- display: none;
- }
+.transfer-card {
+ background: #fff;
+ border-radius: 1.5rem;
+ padding: 2rem 1.2rem;
+ font-size: 16px;
+}
- :deep(.van-dropdown-menu__bar) {
- background-color: rgba($color: #000000, $alpha: 0);
- box-shadow: none;
- }
+.transfer-card-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2rem;
+ margin-top: 2rem;
+}
- :deep(.van-dropdown-menu__title:after) {
- border-color: transparent transparent #000 #000;
- right: 10px;
- }
+.transfer-card-title {
+ color: #333;
+ font-weight: 500;
+}
- :deep(.van-dropdown-menu__title) {
- width: 100%;
- }
+.transfer-card-balance {
+ color: #333;
+ font-size: 16px;
+}
- :deep(.van-dropdown-item__content) {
- padding: 8px 16px;
- }
+.transfer-card-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+ margin-top: 2rem;
+ margin-bottom: 2rem;
- .card {
- background: $input_background;
- padding: 2rem 1.2rem;
- border-radius: 0.5rem;
- font-size: 16px;
- }
-
- .swap {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 4rem;
- }
-
- .hint {
- font-size: 12px;
- margin-bottom: 150px;
-
- span {
- color: $text_color5;
- }
- }
-
- .label_but {
- color: $text_color4;
- }
-
- .transfer_label {
- font-size: 16px;
+ &.transfer-card-row--readonly {
}
}
-</style>
\ No newline at end of file
+
+.transfer-currency {
+ display: flex;
+ align-items: center;
+ color: #333;
+ font-size: 16px;
+}
+
+.transfer-input-wrap {
+ flex: 1;
+ min-width: 0;
+}
+
+.transfer-input {
+ padding: 0;
+ margin: 0;
+ font-size: 16px;
+ background: transparent;
+ text-align: right;
+
+ :deep(.van-field__body) {
+ background: transparent;
+ }
+ :deep(.van-field__control) {
+ text-align: right;
+ &::placeholder {
+ color: #999;
+ }
+ }
+ :deep(.van-field__button) {
+ padding-left: 0.5rem;
+ }
+}
+
+.transfer-max {
+ font-size: 16px;
+ color: #7c3aed;
+ cursor: pointer;
+}
+
+.transfer-approx {
+ font-size: 16px;
+ color: #333;
+}
+
+/* 中间交换按钮:紫色渐变圆 */
+.transfer-swap-wrap {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 0.8rem 0;
+ position: relative;
+ z-index: 1;
+}
+
+.transfer-swap-circle {
+ width: 4rem;
+ height: 4rem;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #7c3aed, #5b21b6);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 2px 12px rgba(124, 58, 237, 0.4);
+ cursor: pointer;
+}
+
+.transfer-swap-icon {
+ width: 2rem;
+ height: 2rem;
+ filter: brightness(0) invert(1);
+}
+
+.transfer-hint {
+ font-size: 12px;
+ margin-top: 1rem;
+ margin-bottom: 2rem;
+ color: #999;
+
+ span {
+ color: #999;
+ }
+}
+
+.transfer-submit {
+ width: 100%;
+ height: 48px;
+ line-height: 48px;
+ font-size: 16px;
+ font-weight: 600;
+ color: #fff;
+ background: linear-gradient(90deg, #7c3aed, #5b21b6);
+ border: none;
+ border-radius: 0.5rem;
+
+ &:disabled {
+ opacity: 0.5;
+ }
+}
+</style>
--
Gitblit v1.9.3