| | |
| | | </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> |
| | | |
| | |
| | | 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> |
| | | |
| | | .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> |