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/cryptos/Recharge/rechargeList.vue |  560 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 432 insertions(+), 128 deletions(-)

diff --git a/src/views/cryptos/Recharge/rechargeList.vue b/src/views/cryptos/Recharge/rechargeList.vue
index 467d775..3880072 100644
--- a/src/views/cryptos/Recharge/rechargeList.vue
+++ b/src/views/cryptos/Recharge/rechargeList.vue
@@ -1,162 +1,466 @@
 <template>
-  <div id="cryptos">
-    <div class="recharge box-border">
-      <assets-head :title="$t('充值通道')" v-if="!isForeign" :back-func="backFunc">
-        <img src="../../../assets/image/assets-center/exchange.png" alt="exchange-img" class="w-44 h-38"
-          @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')" />
-      </assets-head>
-      <assets-head v-else :title="$t('充值通道')">
-        <img src="../../../assets/image/assets-center/exchange.png" alt="exchange-img" class="w-44 h-38"
-          @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')" />
-      </assets-head>
-      <div class="pl-36 pr-36">
-        <div class="recharge-title font-35 textColor">{{ $t('请选择充值币种') }}</div>
-        <div class="recharge-list flex justify-between">
-          <div class="item-view flex flex-col items-center justify-center text-center w-189 h-220 box-border"
-            @click="selectSymbol('usdt')">
-            <img :src="`${HOST_URL}/symbol/usdt.png`" class="w-92 h-92" />
-            <div class="text-grey font-26 mt-32">{{ $t('USDT充值') }}</div>
-          </div>
-          <div class="item-view flex flex-col items-center justify-center text-center w-189 h-220 box-border"
-            @click="selectSymbol('usdc')">
-            <img :src="`${HOST_URL}/symbol/usdc.png`" class="w-92 h-92" />
-            <div class="text-grey font-26 mt-32">{{ $t('USDC充值') }}</div>
-          </div>
-          <div class="item-view  flex flex-col items-center justify-center text-center w-189 h-220 box-border"
-            @click="selectSymbol('btc')">
-            <img :src="`${HOST_URL}/symbol/btc.png`" class="w-92 h-92" />
-            <div class="text-grey font-26 mt-32">{{ $t('BTC充值') }}</div>
-          </div>
-          <div class="item-view flex flex-col items-center justify-center text-center w-189 h-220 box-border"
-            @click="selectSymbol('eth')">
-            <img :src="`${HOST_URL}/symbol/eth.png`" class="w-92 h-92" />
-            <div class="text-grey font-26 mt-32">{{ $t('ETH充值') }}</div>
+  <div id="cryptos" class="deposit-page">
+    <assets-head :title="$t('订金')" :show-left="true" :back-func="onBack">
+      <template v-if="step === 'list'">
+        <img
+          src="../../../assets/image/assets-center/exchange.png"
+          alt=""
+          class="deposit-head-icon"
+          @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')"
+        />
+      </template>
+    </assets-head>
+
+    <!-- 图一:列表 -->
+    <template v-if="step === 'list'">
+      <div class="deposit-body">
+        <div class="deposit-search-wrap">
+          <van-icon name="search" class="deposit-search-icon" />
+          <input
+            v-model="searchKeyword"
+            type="text"
+            class="deposit-search-input"
+            :placeholder="$t('search')"
+          />
+        </div>
+        <div class="deposit-section-title">{{ $t('Popular coins') }}</div>
+        <div class="deposit-popular">
+          <div class="deposit-coin-btn" @click="selectCoin('usdt')">USDT</div>
+        </div>
+        <div class="deposit-section-title">{{ $t('List of coins') }}</div>
+        <div class="deposit-coin-list">
+          <div
+            v-for="item in filteredCoins"
+            :key="item.symbol"
+            class="deposit-coin-item"
+            @click="selectCoin(item.symbol)"
+          >
+            <img :src="`${HOST_URL}/symbol/${item.symbol}.png`" alt="" class="deposit-coin-icon" />
+            <span class="deposit-coin-symbol">{{ item.symbol.toUpperCase() }}</span>
           </div>
         </div>
       </div>
+    </template>
 
-      <div class="reminder">{{ $t('充值提示') }}</div>
-
-      <!-- <div class="textColor mt-40">
-        <div class="pl-36 pr-36 h-90 lh-90 border-b-color flex justify-between font-28" v-for="(item, index) in list"
-          :key="index" @click="toPath(item.url)">
-          <div class="flex items-center">
-            <img :src="handleImage(item.imgPath)" class="w-44 h-44 rounded-full mr-20" />
-            <span class="textColor">{{ item.name }} {{ $t('官方充值通道') }}</span>
-          </div>
-          <div>
-            <van-icon class="textColor" name="arrow" />
+    <!-- 图二:已选币种 + 选择网络 -->
+    <template v-else>
+      <div class="deposit-body deposit-body-selected">
+        <div class="deposit-card" @click="step = 'list'">
+          <img :src="`${HOST_URL}/symbol/${selectedSymbol}.png`" alt="" class="deposit-card-icon" />
+          <span class="deposit-card-symbol">{{ selectedSymbol.toUpperCase() }}</span>
+          <van-icon name="arrow" class="deposit-card-arrow" />
+        </div>
+        <div class="deposit-card deposit-card-network">
+          <div class="deposit-network-label">{{ $t('Deposit network') }}</div>
+          <div class="deposit-choice-btn" @click="showNetworkSheet = true">
+            <span class="deposit-choice-text">{{ selectedChain ? selectedChain.blockchain_name : $t('Choice Network') }}</span>
+            <van-icon name="arrow-down" class="deposit-choice-arrow" />
           </div>
         </div>
-      </div> -->
-    </div>
+
+        <!-- 选中网络后下方显示充值详情 -->
+        <div v-if="selectedChain && selectedChain.address" class="deposit-detail">
+          <div class="deposit-detail-qr-wrap">
+            <canvas ref="qrcodeCanvas" class="deposit-detail-qr"></canvas>
+          </div>
+          <div class="deposit-detail-address-label">{{ $t('Deposit address') }}:</div>
+          <div class="deposit-detail-address-row">
+            <span class="deposit-detail-address-text">{{ selectedChain.address }}</span>
+            <img :src="copyImg" alt="copy" class="deposit-detail-copy-btn" @click="copyAddress" />
+          </div>
+        </div>
+      </div>
+    </template>
+
+    <!-- 图三:底部弹框 选择充值链 -->
+    <van-action-sheet
+      v-model:show="showNetworkSheet"
+      class="deposit-sheet"
+    >
+      <div class="deposit-sheet-content">
+        <div class="deposit-sheet-head">
+          <span class="deposit-sheet-title">{{ $t('Choice Network') }}</span>
+          <van-icon name="cross" class="deposit-sheet-close" @click="showNetworkSheet = false" />
+        </div>
+        <p class="deposit-sheet-tip">
+          {{ $t('Tip: choose a network consistent with the withdraw platform to top up, otherwise you will lose this funds') }}
+        </p>
+        <div
+          v-for="(chain, index) in chainList"
+          :key="index"
+          class="deposit-sheet-item"
+          @click="onSelectChain(chain)"
+        >
+          {{ chain.blockchain_name }}
+        </div>
+      </div>
+    </van-action-sheet>
   </div>
 </template>
 
 <script>
-import assetsHead from "@/components/Transform/assets-head/index.vue";
-import { HOST_URL } from '@/config'
-import { Icon } from 'vant';
+import QRCode from 'qrcode';
+import { showToast } from 'vant';
+import assetsHead from '@/components/Transform/assets-head/index.vue';
+import { HOST_URL } from '@/config';
+import Axios from '@/service/recharge.js';
+import copyImg from '@/assets/imgs/new/copy.png';
+
+const COINS = [
+  { symbol: 'usdt', name: 'USDT' },
+  { symbol: 'usdc', name: 'USDC' },
+  { symbol: 'btc', name: 'BTC' },
+  { symbol: 'eth', name: 'ETH' },
+];
+
 export default {
   name: 'rechageList',
-  components: {
-    assetsHead,
-    [Icon.name]: Icon,
-  },
+  components: { assetsHead },
   data() {
     return {
-      list: [
-        {
-          name: 'Huobi',
-          url: 'https://www.huobi.com/en-us/',
-          imgPath: new URL('@/assets/image/huobi.png', import.meta.url),
-        },
-        {
-          name: 'Binance',
-          url: 'https://www.binance.com/en',
-          imgPath: new URL('@/assets/image/bian.png', import.meta.url),
-        },
-        {
-          name: 'Coinbase',
-          url: 'https://www.coinbase.com/',
-          imgPath: new URL('@/assets/image/coinbase.png', import.meta.url),
-        },
-        {
-          name: 'Crypto',
-          url: 'https://www.crypto.com/',
-          imgPath: new URL('@/assets/image/crypto.png', import.meta.url),
-        }
-      ],
-      isForeign: false,
       HOST_URL,
-    }
+      step: 'list',
+      searchKeyword: '',
+      selectedSymbol: '',
+      chainList: [],
+      selectedChain: null,
+      showNetworkSheet: false,
+      isForeign: false,
+      copyImg,
+    };
+  },
+  computed: {
+    filteredCoins() {
+      const k = (this.searchKeyword || '').trim().toLowerCase();
+      if (!k) return COINS;
+      return COINS.filter((c) => c.symbol.toLowerCase().includes(k) || c.name.toLowerCase().includes(k));
+    },
   },
   created() {
     if (this.$route.query.isForeign) {
-      this.isForeign = this.$route.query.isForeign
+      this.isForeign = this.$route.query.isForeign;
     }
   },
   methods: {
-    handleImage(url) {
-      return new URL(url, import.meta.url).href
+    onBack() {
+      if (this.step === 'selected') {
+        this.step = 'list';
+        this.selectedSymbol = '';
+        this.selectedChain = null;
+        this.chainList = [];
+      } else {
+        this.$router.push('/quotes/index?tabActive=1');
+      }
     },
-    toPath(url) {
-      const a = document.createElement('a');
-      a.href = url;
-      a.target = "_bank";
-      document.body.append(a);
-      a.click();
-      document.body.removeChild(a)
-      // if (navigator.userAgent.search('Html5Plus') != -1) {
-      //     plus.runtime.openURL(url)
-      // } else {
-      //     window.open(url)
-      // }
+    selectCoin(symbol) {
+      this.selectedSymbol = symbol;
+      this.selectedChain = null;
+      this.chainList = [];
+      Axios.getBlock({ coin: symbol })
+        .then((res) => {
+          this.chainList = Array.isArray(res) ? res : [];
+          this.step = 'selected';
+        })
+        .catch(() => {
+          this.chainList = [];
+          this.step = 'selected';
+        });
     },
-    backFunc() {
-      this.$router.push('/quotes/index?tabActive=1')
+    onSelectChain(chain) {
+      this.selectedChain = chain;
+      this.showNetworkSheet = false;
+      this.$nextTick(() => this.drawQR());
     },
-    selectSymbol(symbol) {
-      this.$router.push({
-        path: "/cryptos/recharge/rechargePage",
-        query: {
-          'symbol': symbol
-        }
-      });
+    drawQR() {
+      if (!this.selectedChain || !this.selectedChain.address || !this.$refs.qrcodeCanvas) return;
+      const opts = {
+        errorCorrectionLevel: 'H',
+        width: 200,
+        margin: 4,
+        color: { dark: '#333333', light: '#fff' },
+      };
+      QRCode.toCanvas(this.$refs.qrcodeCanvas, this.selectedChain.address, opts, () => {});
     },
-    goRouter(params) {
-      this.$router.push({
-        path: params,
-        query: {
-          back: "1"
-        }
-      });
-    }
-  }
-}
+    copyAddress() {
+      const address = this.selectedChain?.address;
+      if (!address) return;
+      if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) {
+        navigator.clipboard.writeText(address).then(() => showToast(this.$t('复制成功'))).catch(() => this.copyFallback(address));
+      } else {
+        this.copyFallback(address);
+      }
+    },
+    copyAddressFallback(text) {
+      this.copyFallback(text);
+    },
+    copyFallback(text) {
+      const textarea = document.createElement('textarea');
+      textarea.value = text;
+      textarea.style.position = 'fixed';
+      textarea.style.opacity = '0';
+      document.body.appendChild(textarea);
+      textarea.select();
+      try {
+        document.execCommand('copy');
+        showToast(this.$t('复制成功'));
+      } catch (e) {}
+      document.body.removeChild(textarea);
+    },
+    goRouter(path) {
+      this.$router.push({ path, query: { back: '1' } });
+    },
+  },
+};
 </script>
+
 <style lang="scss" scoped>
-@import "@/assets/init.scss";
+.deposit-page {
+  min-height: 100vh;
+  background: #fff !important;
+  padding-bottom: 2.5rem;
+}
+.deposit-head-icon {
+  width: 1.375rem;
+  height: 1.1875rem;
+}
 
-#cryptos {
-  .recharge {
-    width: 100%;
-    box-sizing: border-box;
-  }
+.deposit-body {
+  padding: 1rem 1.5rem;
+}
+.deposit-body-selected {
+  padding-top: 1.5rem;
+}
 
-  .recharge-title {
-    margin: 86px 0 104px 0;
-  }
+/* 图一:搜索 */
+.deposit-search-wrap {
+  display: flex;
+  align-items: center;
+  height: 3.25rem;
+  padding: 0 1rem;
+  background: #f5f5f5;
+  border-radius: 0.5rem;
+  margin-bottom: 1.5rem;
+}
+.deposit-search-icon {
+  color: #999;
+  font-size: 28px;
+  margin-right: 0.75rem;
+}
+.deposit-search-input {
+  flex: 1;
+  border: none;
+  background: transparent;
+  font-size: 28px;
+  outline: none;
+}
+.deposit-search-input::placeholder {
+  color: #9b9b9b;
+}
 
-  .recharge-list>div {
-    border: 2px solid $bg_dark;
-    border-radius: 15px;
-    box-sizing: border-box;
-  }
+.deposit-section-title {
+  font-size: 26px;
+  color: #9b9b9b;
+  margin-bottom: 0.75rem;
+}
+.deposit-popular {
+  margin-bottom: 1.5rem;
+}
+.deposit-coin-btn {
+  display: inline-block;
+  padding: 0.875rem 1.75rem;
+  background: #f5f5f5;
+  border-radius: 0.5rem;
+  font-size: 28px;
+  color: #333;
+  cursor: pointer;
+}
+.deposit-coin-list {
+  display: flex;
+  flex-direction: column;
+  gap: 0;
+}
+.deposit-coin-item {
+  display: flex;
+  align-items: center;
+  padding: 1.125rem 0;
+  border-bottom: 1px solid #f0f0f0;
+  cursor: pointer;
+}
+.deposit-coin-item:last-child {
+  border-bottom: none;
+}
+.deposit-coin-icon {
+  width: 3rem;
+  height: 3rem;
+  border-radius: 50%;
+  margin-right: 1rem;
+}
+.deposit-coin-symbol {
+  font-size: 28px;
+  color: #333;
+  font-weight: 500;
+}
 
-  .reminder {
-    font-size: 2rem;
-    padding: 2rem;
-  }
+/* 图二:卡片 */
+.deposit-card {
+  background: #f6f6f6;
+  border-radius: 0.5rem;
+  padding: 1.25rem;
+  margin-bottom: 1.5rem;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
+}
+/* 第一个卡片:图标+币种+箭头同一行 */
+.deposit-card:first-child {
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+}
+.deposit-card:first-child .deposit-card-icon {
+  flex-shrink: 0;
+}
+.deposit-card:first-child .deposit-card-symbol {
+  flex: 1;
+  min-width: 0;
+}
+.deposit-card:first-child .deposit-card-arrow {
+  flex-shrink: 0;
+  margin-top: 0;
+}
+.deposit-card-network {
+  cursor: default;
+}
+.deposit-card-icon {
+  width: 3.25rem;
+  height: 3.25rem;
+  border-radius: 50%;
+  margin-right: 1rem;
+  vertical-align: middle;
+}
+.deposit-card-symbol {
+  font-size: 28px;
+  color: #333;
+  font-weight: 600;
+  vertical-align: middle;
+}
+.deposit-card-arrow {
+  color: #999;
+  font-size: 28px;
+}
+.deposit-network-label {
+  font-size: 26px;
+  color: #9b9b9b;
+  margin-bottom: 0.625rem;
+}
+.deposit-choice-btn {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0.875rem 10px;
+  border-radius: 10px;
+  cursor: pointer;
+  background-color: #fff;
+}
+.deposit-choice-text {
+  font-size: 28px;
+  color: #333;
+}
+.deposit-choice-arrow {
+  color: #999;
+  font-size: 28px;
+}
+.deposit-next-btn {
+  width: 100%;
+  height: 3.5rem;
+  margin-top: 1.5rem;
+  border: none;
+  border-radius: 0.5rem;
+  background: linear-gradient(90deg, #a443cf, #5e2bc8);
+  color: #fff;
+  font-size: 28px;
+  font-weight: 600;
+  cursor: pointer;
+}
+
+/* 图三:底部弹框 */
+.deposit-sheet-content {
+  padding: 0 1.5rem 2rem;
+  background-color: #fff;
+}
+.deposit-sheet-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 2.5rem  0.75rem;
+  margin-bottom: 0.75rem;
+}
+.deposit-sheet-title {
+  font-size: 35px;
+  font-weight: 600;
+  color: #333;
+}
+.deposit-sheet-close {
+  font-size: 28px;
+  color: #999;
+  cursor: pointer;
+}
+.deposit-sheet-tip {
+  font-size: 26px;
+  line-height: 1.5;
+  margin-bottom: 1.75rem;
+  padding: 20px 10px;
+  background-color: #F6F6F6;
+}
+.deposit-sheet-item {
+  padding: 2rem 1.5rem;
+  border-radius: 1rem;
+  margin-bottom: 0.75rem;
+  font-size: 35px;
+  color: #333;
+  cursor: pointer;
+  border: 1px solid #f2f2f2;
+}
+.deposit-sheet-item:last-child {
+  margin-bottom: 0;
+}
+
+/* 充值详情:二维码 + 地址(选中网络后下方显示) */
+.deposit-detail {
+  margin-top: 1.5rem;
+  padding: 1.5rem 0;
+  border-top: 1px solid #f0f0f0;
+  text-align: left;
+}
+.deposit-detail-qr-wrap {
+  display: flex;
+  justify-content: center;
+  margin-bottom: 1.25rem;
+}
+.deposit-detail-qr {
+  display: block;
+}
+.deposit-detail-address-label {
+  font-size: 26px;
+  color: #9b9b9b;
+  margin-bottom: 0.5rem;
+}
+.deposit-detail-address-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 0.5rem;
+}
+.deposit-detail-address-text {
+  flex: 1;
+  min-width: 0;
+  font-size: 26px;
+  color: #333;
+  word-break: break-all;
+}
+.deposit-detail-copy-btn {
+  width: 2.5rem;
+  height: 2.5rem;
+  cursor: pointer;
+  flex-shrink: 0;
+  object-fit: contain;
 }
 </style>

--
Gitblit v1.9.3