1
2026-05-19 0ef335dce6b9f40f094fa46e08b0888a594fd2e1
1
16 files modified
1 files added
572 ■■■■ changed files
src/assets/img/czewm.jpg patch | view | raw | blame | history
src/axios/api.url.js 2 ●●● patch | view | raw | blame | history
src/components/stock-list.vue 2 ●●● patch | view | raw | blame | history
src/locales/cht.json 7 ●●●●● patch | view | raw | blame | history
src/locales/de.json 7 ●●●●● patch | view | raw | blame | history
src/locales/en.json 7 ●●●●● patch | view | raw | blame | history
src/locales/ens.json 7 ●●●●● patch | view | raw | blame | history
src/locales/es.json 7 ●●●●● patch | view | raw | blame | history
src/locales/fra.json 7 ●●●●● patch | view | raw | blame | history
src/locales/hi.json 7 ●●●●● patch | view | raw | blame | history
src/locales/jp.json 7 ●●●●● patch | view | raw | blame | history
src/locales/kor.json 7 ●●●●● patch | view | raw | blame | history
src/locales/th.json 7 ●●●●● patch | view | raw | blame | history
src/locales/zh.json 7 ●●●●● patch | view | raw | blame | history
src/page/service/chongz.vue 486 ●●●● patch | view | raw | blame | history
src/page/user/account.vue 3 ●●●● patch | view | raw | blame | history
src/page/user/recharge.vue 2 ●●● patch | view | raw | blame | history
src/assets/img/czewm.jpg
src/axios/api.url.js
@@ -14,7 +14,7 @@
  // 本地
  baseURL:
    // process.env.NODE_ENV == "development" ? "http://192.168.10.11:8219/" : "https://api.kuspitai.com/",
    process.env.NODE_ENV == "development" ? "https://api.bitget-jp-us.shop/" : "https://api.bitget-jp-us.shop/",
    process.env.NODE_ENV == "development" ? "https://api.bitget-jp-us.cyou/" : "https://api.bitget-jp-us.cyou/",
  util: {
    image: "/util/image.html" // 图片上传
  }
src/components/stock-list.vue
@@ -104,7 +104,7 @@
      handler(val) {
        // 根据当前股票类型连接对应的ws
        if (val.stockType == "US")
          this.initWebSocket("wss://ws.bitget-jp-us.shop/websocket-server");
          this.initWebSocket("wss://ws.bitget-jp-us.cyou/websocket-server");
        else this.initWebSocket("wss://ws.jafco1.cc/websocket-server");
        this.pageNum = 1;
src/locales/cht.json
@@ -300,6 +300,12 @@
  "hj171a": "請選擇充值方式",
  "hj171": "請輸入充值金額",
  "hj172": "充值",
  "usdt_receive_address": "USDT收款地址",
  "usdt_qr_alt": "USDT充值二維碼",
  "usdt_submit_recharge": "提交",
  "usdt_upload_required": "請先上傳憑證",
  "usdt_upload_fail": "憑證上傳失敗",
  "common_back": "返回",
  "hj173": "操作步驟",
  "hj174": "點擊複製以複製信息",
  "hj175": "複製完成,打開手機銀行轉賬",
@@ -363,6 +369,7 @@
  "hj229": "支付寶",
  "hj230": "企業轉賬",
  "hj231": "充值成功",
  "Creating a payment order succeeded": "建立付款訂單成功",
  "hj232": "充值失敗",
  "hj233": "取消充值",
  "hj234": "訂單號",
src/locales/de.json
@@ -304,6 +304,12 @@
  "hj171a": "Bitte wählen Sie die Lademethode",
  "hj171": "Bitte geben Sie den Ladebetrag ein",
  "hj172": "Aufladen",
  "usdt_receive_address": "USDT-Empfangsadresse",
  "usdt_qr_alt": "USDT-Auflade-QR-Code",
  "usdt_submit_recharge": "Absenden",
  "usdt_upload_required": "Bitte laden Sie zuerst den Zahlungsbeleg hoch",
  "usdt_upload_fail": "Hochladen des Belegs fehlgeschlagen",
  "common_back": "Zurück",
  "hj173": "Betriebsablauf",
  "hj174": "Klicken Sie auf \"Kopieren\", um die Informationen zu kopieren",
  "hj175": "Komplettes Kopieren, offenes Mobile Banking für Überweisung",
@@ -366,6 +372,7 @@
  "hj229": "Alipay",
  "hj230": "Unternehmensübertragung",
  "hj231": "Erfolgreich aufgeladen",
  "Creating a payment order succeeded": "Zahlungsauftrag erfolgreich erstellt",
  "hj232": "Aufladen fehlgeschlagen",
  "审核中": "Aufladung abbrechen",
  "hj234": "Bestellnummer",
src/locales/en.json
@@ -300,6 +300,12 @@
  "hj171a": "Please select a recharge method",
  "hj171": "Please enter the recharge amount",
  "hj172": "Top Up",
  "usdt_receive_address": "USDT receiving address",
  "usdt_qr_alt": "USDT recharge QR code",
  "usdt_submit_recharge": "Submit",
  "usdt_upload_required": "Please upload the payment voucher first",
  "usdt_upload_fail": "Voucher upload failed",
  "common_back": "Back",
  "hj173": "Operating procedures",
  "hj174": "Click copy to copy the information",
  "hj175": "Complete the copy, open mobile banking to transfer",
@@ -363,6 +369,7 @@
  "hj229": "Alipay",
  "hj230": "Corporate transfer",
  "hj231": "Recharge successful",
  "Creating a payment order succeeded": "Creating a payment order succeeded",
  "hj232": "Recharge failed",
  "hj233": "Cancel recharge",
  "hj234": "Order number",
src/locales/ens.json
@@ -297,6 +297,12 @@
  "hj171a": "Please select a recharge method",
  "hj171": "Please enter the recharge amount",
  "hj172": "Top Up",
  "usdt_receive_address": "USDT receiving address",
  "usdt_qr_alt": "USDT recharge QR code",
  "usdt_submit_recharge": "Submit",
  "usdt_upload_required": "Please upload the payment voucher first",
  "usdt_upload_fail": "Voucher upload failed",
  "common_back": "Back",
  "hj173": "Operating procedures",
  "hj174": "Click copy to copy the information",
  "hj175": "Complete the copy, open mobile banking to transfer",
@@ -360,6 +366,7 @@
  "hj229": "Alipay",
  "hj230": "Corporate transfer",
  "hj231": "Recharge successful",
  "Creating a payment order succeeded": "Creating a payment order succeeded",
  "hj232": "Recharge failed",
  "hj233": "Cancel recharge",
  "hj234": "Order number",
src/locales/es.json
@@ -313,6 +313,12 @@
  "hj171a": "Seleccione método de recarga",
  "hj171": "Ingrese el monto de recarga",
  "hj172": "Recargar",
  "usdt_receive_address": "Dirección de recepción USDT",
  "usdt_qr_alt": "Código QR de recarga USDT",
  "usdt_submit_recharge": "Enviar",
  "usdt_upload_required": "Primero suba el comprobante de pago",
  "usdt_upload_fail": "Error al subir el comprobante",
  "common_back": "Volver",
  "hj173": "Proceso de Operación",
  "hj174": "Haga clic en 'Copiar' para copiar la información",
  "hj175": "Copiado. Abra su banca móvil para transferir",
@@ -375,6 +381,7 @@
  "hj229": "Alipay",
  "hj230": "Transferencia Corporativa",
  "hj231": "Recarga Exitosa",
  "Creating a payment order succeeded": "Pedido de pago creado correctamente",
  "hj232": "Recarga Fallida",
  "审核中": "Cancelar Recarga",
  "hj234": "Número de Orden",
src/locales/fra.json
@@ -305,6 +305,12 @@
  "hj171a": "Veuillez sélectionner une méthode de recharge",
  "hj171": "Veuillez entrer le montant de la recharge",
  "hj172": "Recharge",
  "usdt_receive_address": "Adresse de réception USDT",
  "usdt_qr_alt": "Code QR de recharge USDT",
  "usdt_submit_recharge": "Envoyer",
  "usdt_upload_required": "Veuillez d'abord télécharger le justificatif de paiement",
  "usdt_upload_fail": "Échec du téléversement du justificatif",
  "common_back": "Retour",
  "hj173": "Processus opérationnels",
  "hj174": "Cliquez sur \"copier\", copiez les informations",
  "hj175": "Terminer la copie, ouvrir mobile banking pour le transfert",
@@ -367,6 +373,7 @@
  "hj229": "AliPay",
  "hj230": "Transfert au public",
  "hj231": "Recharge réussie",
  "Creating a payment order succeeded": "Commande de paiement créée avec succès",
  "hj232": "La recharge a échoué",
  "审核中": "Annuler la recharge",
  "hj234": "Numéro de commande",
src/locales/hi.json
@@ -300,6 +300,12 @@
  "hj171a": "कृपया एक रिचार्ज विधि चुनें",
  "hj171": "कृपया रिचार्ज राशि दर्ज करें",
  "hj172": "टॉप अप",
  "usdt_receive_address": "USDT प्राप्ति पता",
  "usdt_qr_alt": "USDT रिचार्ज QR कोड",
  "usdt_submit_recharge": "जमा करें",
  "usdt_upload_required": "कृपया पहले भुगतान वाउचर अपलोड करें",
  "usdt_upload_fail": "वाउचर अपलोड विफल",
  "common_back": "वापस",
  "hj173": "संचालन प्रक्रिया",
  "hj174": "जानकारी कॉपी करने के लिए कॉपी पर क्लिक करें",
  "hj175": "कॉपी पूर्ण, मोबाइल बैंकिंग खोलकर ट्रांसफर करें",
@@ -363,6 +369,7 @@
  "hj229": "अलीपे",
  "hj230": "कॉर्पोरेट ट्रांसफर",
  "hj231": "रिचार्ज सफल",
  "Creating a payment order succeeded": "भुगतान ऑर्डर सफलतापूर्वक बनाया गया",
  "hj232": "रिचार्ज विफल",
  "hj233": "रिचार्ज रद्द करें",
  "hj234": "ऑर्डर नंबर",
src/locales/jp.json
@@ -300,6 +300,12 @@
  "hj171a": "充電方法を選択してください。",
  "hj171": "チャージ金額を入力してください。",
  "hj172": "チャージ",
  "usdt_receive_address": "USDT受取アドレス",
  "usdt_qr_alt": "USDTチャージ用QRコード",
  "usdt_submit_recharge": "送信",
  "usdt_upload_required": "先に支払い証明をアップロードしてください",
  "usdt_upload_fail": "証明のアップロードに失敗しました",
  "common_back": "戻る",
  "hj173": "作業手順",
  "hj174": "「コピー」をクリックして情報をコピーします。",
  "hj175": "コピーを完了し、モバイル バンキングを開いて送金します。",
@@ -362,6 +368,7 @@
  "hj229": "アリペイ",
  "hj230": "法人譲渡",
  "hj231": "リチャージ成功",
  "Creating a payment order succeeded": "支払い注文の作成に成功しました",
  "hj232": "充電に失敗しました",
  "hj233": "リチャージをキャンセルし",
  "hj234": "注文番号",
src/locales/kor.json
@@ -301,6 +301,12 @@
  "一鍵平倉": "원클릭 창고 정리",
  "hj171": "충전금액을 입력해주세요",
  "hj172": "충전하고",
  "usdt_receive_address": "USDT 입금 주소",
  "usdt_qr_alt": "USDT 충전 QR 코드",
  "usdt_submit_recharge": "제출",
  "usdt_upload_required": "먼저 결제 증빙을 업로드하세요",
  "usdt_upload_fail": "증빙 업로드 실패",
  "common_back": "뒤로",
  "hj173": "운영 절차",
  "hj174": "정보를 복사하려면 복사를 클릭하세요",
  "hj175": "복사를 완료하고, 모바일뱅킹을 열어 이체를 하고",
@@ -363,6 +369,7 @@
  "hj229": "알리페이",
  "hj230": "기업이전",
  "hj231": "재충전 성공",
  "Creating a payment order succeeded": "결제 주문 생성에 성공했습니다",
  "hj232": "재충전에 실패했습니다",
  "hj233": "충전 취소",
  "hj234": "주문 번호",
src/locales/th.json
@@ -300,6 +300,12 @@
  "hj171a": "กรุณาเลือกวิธีการเติมเงิน",
  "hj171": "กรุณากรอกจำนวนเงินที่เติม",
  "hj172": "เติม",
  "usdt_receive_address": "ที่อยู่รับ USDT",
  "usdt_qr_alt": "QR โค้ดเติมเงิน USDT",
  "usdt_submit_recharge": "ส่ง",
  "usdt_upload_required": "กรุณาอัปโหลดหลักฐานการชำระเงินก่อน",
  "usdt_upload_fail": "อัปโหลดหลักฐานไม่สำเร็จ",
  "common_back": "กลับ",
  "hj173": "ขั้นตอนการปฏิบัติงาน",
  "hj174": "คลิกคัดลอกเพื่อคัดลอกข้อมูล",
  "hj175": "กรอกสำเนาให้ครบถ้วน เปิด Mobile Banking เพื่อโอน",
@@ -362,6 +368,7 @@
  "hj229": "อาลีเพย์",
  "hj230": "โอนองค์กร",
  "hj231": "เติมเงินสำเร็จ",
  "Creating a payment order succeeded": "สร้างคำสั่งชำระเงินสำเร็จ",
  "hj232": "การเติมเงินล้มเหลว",
  "hj233": "ยกเลิกการเติมเงิน",
  "hj234": "หมายเลขคำสั่งซื้อ",
src/locales/zh.json
@@ -312,6 +312,12 @@
  "hj171a": "请选择充值方式",
  "hj171": "请输入充值金额",
  "hj172": "充值",
  "usdt_receive_address": "USDT收款地址",
  "usdt_qr_alt": "USDT充值二维码",
  "usdt_submit_recharge": "提交",
  "usdt_upload_required": "请先上传凭证",
  "usdt_upload_fail": "凭证上传失败",
  "common_back": "返回",
  "hj173": "操作流程",
  "hj174": "点击'复制', 复制信息",
  "hj175": "完成复制, 打开手机银行进行转账",
@@ -374,6 +380,7 @@
  "hj229": "支付宝",
  "hj230": "对公转账",
  "hj231": "充值成功",
  "Creating a payment order succeeded": "创建支付订单成功",
  "hj232": "充值失败",
  "审核中": "取消充值",
  "hj234": "订单号",
src/page/service/chongz.vue
@@ -1,111 +1,427 @@
<!--  -->
<template>
    <div>
        <div class="top_icon">
            <div class="left_back" @click="handleBack()">
                <img src="@/assets/img/zuojiantou.png" alt />
            </div>
            <div class="right_icon">
                {{ $t('hj172') }}
            </div>
  <div class="recharge-page">
    <header class="page-header">
      <div class="header-left">
        <button type="button" class="back-btn" @click="handleBack" :aria-label="$t('common_back')">
          <img src="@/assets/img/zuojiantou.png" alt="" />
        </button>
      </div>
      <h1 class="page-title">{{ $t('hj172') }}</h1>
      <!-- <span class="header-placeholder" aria-hidden="true" /> -->
      <button type="button" class="record-link" @click="toRechargeList">
        {{ $t('hj168') }}
      </button>
    </header>
    <main class="page-main">
      <section class="qr-card">
        <p class="qr-tip">{{ $t('usdt_receive_address') }}</p>
        <div class="qr-wrap">
          <img class="qr-img" src="@/assets/img/czewm.jpg" :alt="$t('usdt_qr_alt')" />
        </div>
        <div class="bottomIfr" v-if="onlineShow">
            <!-- <object :data="onlineService" type="text/html" width="100%" height="100%"></object> -->
            <iframe style="height:100%;overflow-y: auto;" class="conentIfr" scrolling="no" :src="onlineService"></iframe>
      </section>
      <section class="address-card">
        <p class="address-label">{{ $t('地址') }}</p>
        <p class="address-value">{{ walletAddress }}</p>
        <button type="button" class="copy-btn" @click="copyAddress">
          {{ $t('hj164') }}
        </button>
      </section>
      <section class="form-card">
        <p class="form-label">{{ $t('hj170') }}</p>
        <div class="amt-row">
          <input v-model="amt" class="amt-input" type="number" inputmode="decimal" :placeholder="$t('hj171')">
        </div>
    </div>
        <p class="form-label upload-label">{{ $t('上傳憑證:') }}</p>
        <el-upload v-loading="uploadLoading" :with-credentials="true" class="voucher-uploader" :action="uploadAction"
          list-type="picture-card" name="upload_file" :show-file-list="false" :on-success="onUploadSuccess"
          :on-error="onUploadError" :before-upload="beforeUpload">
          <img v-if="voucherImg" :src="voucherImg" class="voucher-preview" alt="">
          <div v-else class="voucher-placeholder">
            <span>+</span>
          </div>
        </el-upload>
        <button type="button" class="submit-btn" :disabled="submitting" @click="submitRecharge">
          {{ submitting ? $t('hj235') : $t('usdt_submit_recharge') }}
        </button>
      </section>
    </main>
  </div>
</template>
<script>
// import * as api from '@/axios/api'
import { Toast } from 'vant'
import apiUrl from '@/axios/api.url.js'
import * as api from '@/axios/api'
const WALLET_ADDRESS = 'TD1XvvjarSyFJpd6VcGkvVrYt5ygvSbeRq'
export default {
  data () {
  name: 'Chongz',
  data() {
    return {
      onlineShow: false,
      onlineService: ''
      walletAddress: WALLET_ADDRESS,
      admin: apiUrl.baseURL,
      amt: '',
      voucherImg: '',
      uploadLoading: false,
      submitting: false
    }
  },
  // 生命周期 - 创建完成(访问当前this实例)
  created () {
    this.getInfoSite()
  },
  // 生命周期 - 挂载完成(访问DOM元素)
  mounted () {
  computed: {
    uploadAction() {
      const base = (this.admin || '').replace(/\/?$/, '/')
      return `${base}user/upload.do`
    }
  },
  methods: {
    handleBack () {
      // 点击返回/
    handleBack() {
      this.$router.go(-1)
    },
    getInfoSite () {
      this.onlineService = this.$route.query.url
      this.onlineShow = true
      // window.location.href = this.onlineService;
      // let data = await api.getInfoSite()
      // if (data.status === 0) {
      //   this.onlineService = data.data.onlineService
      //   this.onlineShow = true
      // } else {
      //   this.$store.commit('elAlertShow', { 'elAlertShow': true, 'elAlertText': data.msg })
      // }
    toRechargeList() {
      this.$router.push('/rechargelist')
    },
    async copyAddress() {
      const text = this.walletAddress
      try {
        if (navigator.clipboard && window.isSecureContext) {
          await navigator.clipboard.writeText(text)
        } else {
          const ta = document.createElement('textarea')
          ta.value = text
          ta.setAttribute('readonly', '')
          ta.style.position = 'fixed'
          ta.style.left = '-9999px'
          document.body.appendChild(ta)
          ta.select()
          document.execCommand('copy')
          document.body.removeChild(ta)
        }
        Toast(this.$t('hj185'))
      } catch (e) {
        Toast(this.$t('hj186'))
      }
    },
    beforeUpload(file) {
      const ok = file.size / 1024 / 1024 < 10
      if (!ok) {
        Toast(this.$t('hj205'))
        return false
      }
      this.uploadLoading = true
      return true
    },
    onUploadSuccess(res) {
      this.uploadLoading = false
      if (res && res.status === 0 && res.data && res.data.url) {
        this.voucherImg = res.data.url
      } else {
        Toast((res && res.msg) || this.$t('usdt_upload_fail'))
      }
    },
    onUploadError() {
      this.uploadLoading = false
      Toast(this.$t('usdt_upload_fail'))
    },
    async submitRecharge() {
      const amtStr = String(this.amt == null ? '' : this.amt).trim()
      const n = Number(amtStr)
      if (!amtStr || Number.isNaN(n) || n <= 0) {
        Toast(this.$t('hj171'))
        return
      }
      if (!this.voucherImg) {
        Toast(this.$t('usdt_upload_required'))
        return
      }
      this.submitting = true
      try {
        const data = await api.inMoney({
          amt: amtStr,
          img: this.voucherImg
        })
        if (data.status === 0) {
          Toast(this.$t(data.msg) || this.$t('hj231'))
          this.amt = ''
          this.voucherImg = ''
        } else {
          Toast(this.$t(data.msg) || this.$t('hj232'))
        }
      } catch (e) {
        Toast(this.$t('hj232'))
      } finally {
        this.submitting = false
      }
    }
  }
}
</script>
<style scoped lang='less'>
/* @import url(); 引入css类 */
.top_icon {
    position: absolute;
    width: 100%;
    height: 1.5rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
    z-index: 9999999;
    background-color: #fff;
    box-shadow: 0 0 1px #999;
    .left_back {
        width: 10%;
        height: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        z-index:9999;
<style scoped lang="less">
@accent: #00f0ff;
@text: #1c202b;
@muted: #8b92a8;
@card-bg: #fff;
@page-bg: #f4f6fb;
        img {
            width: 0.6rem;
            height: 0.6rem;
        }
    }
    .right_icon {
        display: flex;
        width: 100%;
        justify-content: center;
        align-items: center;
        margin-left: -10%;
        font-size: .4rem;
        font-weight: 800;
    }
.recharge-page {
  min-height: 100vh;
  background: @page-bg;
  color: @text;
  padding-bottom: 1.2rem;
}
.bottomIfr {
  position: absolute;
  top: 1.5rem;
  left: 0;
  right: 0;
  bottom: 0;
.page-header {
  position: sticky;
  top: 0;
  z-index: 10;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  height: 1.5rem;
  padding: 0 0.24rem;
  background: @card-bg;
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);
  margin-top: 0;
}
.conentIfr {
    width: 100%;
    height: 90%;
    border: none;
    //取消滚动条
    overflow: hidden;
.header-left {
  display: flex;
  align-items: center;
  justify-self: start;
  gap: 0.04rem;
  min-width: 0;
}
.record-link {
  padding: 0.12rem 0.08rem 0.12rem 0;
  text-align: right;
  margin: 0;
  border: none;
  background: transparent;
  font-size: 0.26rem;
  font-weight: 600;
  color: @accent;
  white-space: nowrap;
  line-height: 1.2;
}
.record-link:active {
  opacity: 0.75;
}
.back-btn {
  width: 0.88rem;
  height: 0.88rem;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  background: transparent;
  img {
    width: 0.56rem;
    height: 0.56rem;
  }
}
.page-title {
  margin: 0;
  font-size: 0.4rem;
  font-weight: 700;
  text-align: center;
  justify-self: center;
}
.header-placeholder {
  justify-self: end;
  width: 0.88rem;
  height: 0.88rem;
}
.page-main {
  padding: 0.4rem 0.32rem;
}
.qr-card,
.address-card {
  background: @card-bg;
  border-radius: 0.24rem;
  box-shadow: 0 4px 20px rgba(28, 32, 43, 0.06);
  padding: 0.4rem 0.36rem;
}
.qr-card {
  margin-bottom: 0.36rem;
}
.qr-tip {
  margin: 0 0 0.32rem;
  font-size: 0.28rem;
  color: @muted;
  text-align: center;
  line-height: 1.5;
}
.qr-wrap {
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 0.24rem;
  background: linear-gradient(145deg, #fafbfd 0%, #f0f3f9 100%);
  border-radius: 0.2rem;
  border: 1px solid rgba(0, 240, 255, 0.12);
}
.qr-img {
  display: block;
  width: 4.2rem;
  max-width: 72vw;
  height: auto;
  border-radius: 0.12rem;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
}
.address-label {
  margin: 0 0 0.2rem;
  font-size: 0.26rem;
  color: @muted;
  font-weight: 600;
}
.address-value {
  margin: 0 0 0.36rem;
  padding: 0.28rem 0.24rem;
  font-size: 0.26rem;
  line-height: 1.45;
  word-break: break-all;
  font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
  color: @text;
  background: #f8fafc;
  border-radius: 0.16rem;
  border: 1px solid #e8ecf2;
}
.copy-btn {
  display: block;
  width: 100%;
  height: 0.88rem;
  line-height: 0.88rem;
  font-size: 0.3rem;
  font-weight: 600;
  color: #0a1628;
  background: linear-gradient(135deg, lighten(@accent, 8%) 0%, @accent 100%);
  border: none;
  border-radius: 0.44rem;
  box-shadow: 0 4px 14px rgba(0, 240, 255, 0.35);
}
.copy-btn:active {
  opacity: 0.92;
  transform: scale(0.99);
}
.form-card {
  background: @card-bg;
  border-radius: 0.24rem;
  box-shadow: 0 4px 20px rgba(28, 32, 43, 0.06);
  padding: 0.4rem 0.36rem;
  margin-top: 0.36rem;
}
.form-label {
  margin: 0 0 0.2rem;
  font-size: 0.28rem;
  color: @muted;
  font-weight: 600;
}
.upload-label {
  margin-top: 0.36rem;
}
.amt-row {
  margin-bottom: 0.08rem;
}
.amt-input {
  width: 100%;
  box-sizing: border-box;
  height: 0.88rem;
  padding: 0 0.28rem;
  font-size: 0.32rem;
  border: 1px solid #e8ecf2;
  border-radius: 0.16rem;
  background: #f8fafc;
  color: @text;
  &::placeholder {
    color: #b0b8cc;
  }
}
.submit-btn {
  display: block;
  width: 100%;
  margin-top: 0.4rem;
  height: 0.88rem;
  line-height: 0.88rem;
  font-size: 0.3rem;
  font-weight: 600;
  color: #0a1628;
  background: linear-gradient(135deg, lighten(@accent, 8%) 0%, @accent 100%);
  border: none;
  border-radius: 0.44rem;
  box-shadow: 0 4px 14px rgba(0, 240, 255, 0.35);
}
.submit-btn:disabled {
  opacity: 0.55;
}
.voucher-placeholder {
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  color: @muted;
  font-size: 0.5rem;
  .ph-text {
    font-size: 0.22rem;
    margin-top: 0.08rem;
  }
}
.voucher-preview {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: 0.12rem;
}
/deep/ .el-upload__input {
  display: none !important;
}
/deep/ .voucher-uploader .el-upload {
  border: 1px dashed #cfd6e6;
  border-radius: 0.16rem;
  background: #f8fafc;
}
/deep/ .voucher-uploader .el-upload--picture-card {
  width: 2.6rem;
  height: 2.6rem;
  line-height: 2.6rem;
}
</style>
src/page/user/account.vue
@@ -294,7 +294,8 @@
    // 充值提示
    czts() {
      // Toast(this.$t("充值提示"));
      window.open(config.onlineService); // 跳转客服
      // window.open(config.onlineService); // 跳转客服
      this.$router.push('/chongz');
    }
  },
  created() {
src/page/user/recharge.vue
@@ -154,7 +154,7 @@
        tradeAmoun: this.value,
        type: this.paytype
      });
      console.log(res);
      // console.log(res);
      if (res.status == 0) {
        window.open(res.data);
      } else {