1
李凌
2025-09-19 e1e51991ad91c14fa00c5cf46f95e514f676ac4d
1
45 files modified
1 files added
1896 ■■■■■ changed files
src/components/Transform/application/application.vue 7 ●●●● patch | view | raw | blame | history
src/components/Transform/cryptos-trade-deep-data/index.vue 12 ●●●●● patch | view | raw | blame | history
src/components/Transform/ex-header/index.vue 7 ●●●● patch | view | raw | blame | history
src/components/Transform/mining-account/index.vue 523 ●●●● patch | view | raw | blame | history
src/components/Transform/mining-exchange-input/index.vue 8 ●●●● patch | view | raw | blame | history
src/components/Transform/trade-order-area/index.vue 8 ●●●● patch | view | raw | blame | history
src/components/application/application.vue 141 ●●●● patch | view | raw | blame | history
src/i18n/Deutsch.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/Italy.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/Japanese.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/Portuguese.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/Spanish.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/cn.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/en.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/fa.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/korean.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/th.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/vi.js 5 ●●●●● patch | view | raw | blame | history
src/i18n/zhcn.js 5 ●●●●● patch | view | raw | blame | history
src/router/index.js 7 ●●●●● patch | view | raw | blame | history
src/service/login.api.js 2 ●●● patch | view | raw | blame | history
src/service/request.js 1 ●●●● patch | view | raw | blame | history
src/service/user.api.js 11 ●●●●● patch | view | raw | blame | history
src/utils/utis.js 9 ●●●● patch | view | raw | blame | history
src/views/C2C/c2c-order-list/components/TradeSuccessDetail.vue 7 ●●●● patch | view | raw | blame | history
src/views/C2C/c2c-trade/components/TradeSuccessDetail.vue 7 ●●●● patch | view | raw | blame | history
src/views/C2C/c2c-trade/page/SellGenerate.vue 21 ●●●●● patch | view | raw | blame | history
src/views/C2C/c2cOrder/components/appeal/AppealWaiting.vue 52 ●●●● patch | view | raw | blame | history
src/views/C2C/c2cOrder/order-generation/orderGeneration.vue 8 ●●●● patch | view | raw | blame | history
src/views/ICO/ico.vue 93 ●●●●● patch | view | raw | blame | history
src/views/cryptos/AboutUs/index.vue 8 ●●●●● patch | view | raw | blame | history
src/views/cryptos/AccountChange/index.vue 13 ●●●●● patch | view | raw | blame | history
src/views/cryptos/Exchange/exchangePage.vue 6 ●●●● patch | view | raw | blame | history
src/views/cryptos/Recharge/rechargePage.vue 6 ●●●● patch | view | raw | blame | history
src/views/cryptos/Recharge/rechargeSubmit.vue 204 ●●●● patch | view | raw | blame | history
src/views/cryptos/TrendDetails/index.vue 7 ●●●●● patch | view | raw | blame | history
src/views/cryptos/Withdraw/withdrawSumbit.vue 154 ●●●● patch | view | raw | blame | history
src/views/homePage/index.vue 2 ●●● patch | view | raw | blame | history
src/views/login/index.vue 34 ●●●●● patch | view | raw | blame | history
src/views/my/assets.vue 20 ●●●●● patch | view | raw | blame | history
src/views/my/index.vue 3 ●●●● patch | view | raw | blame | history
src/views/order/order-submit.vue 13 ●●●●● patch | view | raw | blame | history
src/views/register/index.vue 7 ●●●● patch | view | raw | blame | history
src/views/resetVerify/index.vue 24 ●●●● patch | view | raw | blame | history
src/views/safety/index.vue 10 ●●●● patch | view | raw | blame | history
src/views/safety/resetPhoneEmail.vue 401 ●●●●● patch | view | raw | blame | history
src/components/Transform/application/application.vue
@@ -37,6 +37,7 @@
import { Image as VanImage } from 'vant';
import assetsHead from "@/components/Transform/assets-head/index.vue";
import { dataTimeEx } from '@/utils/utis'
import { customerServiceUrl } from "@/config";
export default {
  name: 'rechargeSubmit',
  components: {
@@ -70,7 +71,11 @@
      this.time = dataTimeEx(Date.parse(new Date()), true);
    },
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
}
src/components/Transform/cryptos-trade-deep-data/index.vue
@@ -7,12 +7,12 @@
      </div>
      <div class="text-right items-end justify-end">
        <div class="">{{ $t('数量') }}</div>
        <div class="mt-5">({{ symbol_data.toUpperCase() || '--' }})</div>
        <div class="mt-5">({{ symbol_name.toUpperCase() || '--' }})</div>
      </div>
    </div>
    <div v-if="showType == 0 || showType == 2" class="flex justify-between pt-6 font-26" v-for="(item, index) in redData"
      :key="item + index" @click="onPrice(item.price)" :style="{
    <div v-if="showType == 0 || showType == 2" class="flex justify-between pt-6 font-26"
      v-for="(item, index) in redData" :key="item + index" @click="onPrice(item.price)" :style="{
        'background': `linear-gradient(to right,${THEME == 'dark' ? '#131A2E' : '#fff'} 0%` +
          (item.amount / greenData[greenData.length - 1].amount) * 100 + '%,rgba(246,70,93,.1) ' +
          (item.amount / greenData[greenData.length - 1].amount) * 100 + '%,rgba(246,70,93,.1) 100%)'
@@ -44,7 +44,7 @@
<script>
import { WS_URL } from '@/config'
import { fixDate } from "@/utils/utis";
import { fixDate, strToArr } from "@/utils/utis";
import { THEME } from '@/config/theme'
import { _getHomeList } from '@/service/home.api'
import { mapGetters } from 'vuex'
@@ -79,7 +79,8 @@
      greenData: init,
      redData: init,
      socket: null,
      symbol_data: ''
      symbol_data: '',
      symbol_name: '',
    }
  },
  mounted() {
@@ -111,6 +112,7 @@
    getHomeList() {
      _getHomeList(this.symbol).then((res) => {
        this.symbol_data = res[0].symbol_data
        this.symbol_name = strToArr(res[0].name, '/')[0]
        let numberText = res[0].close.toString()
        let numberLength = (numberText.substring(numberText.indexOf('.') + 1, numberText.length)).length
src/components/Transform/ex-header/index.vue
@@ -14,6 +14,7 @@
<script>
import { THEME } from '@/config/theme'
import { customerServiceUrl } from "@/config";
export default {
  props: {
    unread_num: {
@@ -50,7 +51,11 @@
      this.tabList[index]['data'] = this.tabList[index]['data'].filter(item => item.symbol.includes(this.keywords))
    },
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
}
src/components/Transform/mining-account/index.vue
@@ -37,287 +37,292 @@
</template>
<script>
    import MiningExchangeInput from "../mining-exchange-input/index.vue";
    import {
        Grid,
        GridItem,
        Popup,
        Icon,
        showToast
    } from "vant";
    // import { mapState } from "vuex";
    import {
        _exchangeRage,
        _getAllWallet,
        _initWidthdrawl,
        _widthdrawl,
        _records
    } from "@/service/fund.api";
    import {
        mapGetters
    } from "vuex";
    import {
        List,
        PullRefresh
    } from 'vant';
    import {
        debounce
    } from '@/utils'
    export default {
        name: "MiningAcccount",
        components: {
            [Grid.name]: Grid,
            [GridItem.name]: GridItem,
            [Popup.name]: Popup,
            [Icon.name]: Icon,
            MiningExchangeInput,
            [List.name]: List,
            [PullRefresh.name]: PullRefresh
import MiningExchangeInput from "../mining-exchange-input/index.vue";
import {
    Grid,
    GridItem,
    Popup,
    Icon,
    showToast
} from "vant";
// import { mapState } from "vuex";
import {
    _exchangeRage,
    _getAllWallet,
    _initWidthdrawl,
    _widthdrawl,
    _records
} from "@/service/fund.api";
import {
    mapGetters
} from "vuex";
import {
    List,
    PullRefresh
} from 'vant';
import {
    debounce
} from '@/utils'
export default {
    name: "MiningAcccount",
    components: {
        [Grid.name]: Grid,
        [GridItem.name]: GridItem,
        [Popup.name]: Popup,
        [Icon.name]: Icon,
        MiningExchangeInput,
        [List.name]: List,
        [PullRefresh.name]: PullRefresh
    },
    props: {
        show: {
            type: Boolean,
            default: false,
        },
        props: {
            show: {
                type: Boolean,
                default: false,
    },
    computed: {
        ...mapGetters('user', ['userInfo']),
        tabList() {
            return [{
                id: 1,
                text: this.$t('提幣')
            },
            {
                id: 2,
                text: this.$t('交易記錄')
            }
            ]
        },
        computed: {
            ...mapGetters('user', ['userInfo']),
            tabList() {
                return [{
                        id: 1,
                        text: this.$t('提幣')
                    },
                    {
                        id: 2,
                        text: this.$t('交易記錄')
                    }
                ]
            },
            addr() {
                const account = this.userInfo.account
                return account && account.substr(0, 5) + '********' + account.substr(account.length - 5)
            },
            amountAvailable() {
                console.log(this.form.symbol)
                console.log(this.wallets)
                let res
                let dataInfo = this.wallets.find(item => item.symbol_data.toUpperCase() === this.form.symbol.toUpperCase())
        addr() {
            const account = this.userInfo.account
            return account && account.substr(0, 5) + '********' + account.substr(account.length - 5)
        },
        amountAvailable() {
            // console.log("ddddddddddddddddddd", this.form.iconImg1, this.wallets)
            let res
            let dataInfo = this.wallets.find(item => item.symbol_data.toUpperCase() == this.form.iconImg1.toUpperCase())
                if (dataInfo) {
                    res = dataInfo.usable
                } else {
                    res = 0
                }
                return res
            },
            if (dataInfo) {
                res = dataInfo.usable
            } else {
                res = 0
            }
            return res
        },
        data() {
            return {
                showPopup: false,
                activeRecord: 'exchange',
                valueTwo: 0,
    },
    data() {
        return {
            showPopup: false,
            activeRecord: 'exchange',
            valueTwo: 0,
            rate: 0,
            form: { // 闪兑
                symbol: 'USDC',
                symbol_to: 'USDT',
                name: '',
                volume: '',
                rate: 0,
                form: { // 闪兑
                    symbol: 'USDC',
                    symbol_to: 'USDT',
                    volume: '',
                    rate: 0,
                    iconImg2: '',
                    iconImg1: '',
                    symbol_ex: '',
                    symbol_to_ex: '',
                iconImg2: '',
                iconImg1: '',
                symbol_ex: '',
                symbol_to_ex: '',
                },
                interval: null,
                actions: [],
                balance: 0, // 质押余额
                page: 1,
                loading: false, // 当loading为true时,转圈圈
                finished: false, // 数据是否请求结束,结束会先显示'已经全部加载完毕'
                noData: false, // 如果没有数据,显示暂无数据
                wallets: [], // 钱包列表
                active: 0,
            },
            interval: null,
            actions: [],
            balance: 0, // 质押余额
            page: 1,
            loading: false, // 当loading为true时,转圈圈
            finished: false, // 数据是否请求结束,结束会先显示'已经全部加载完毕'
            noData: false, // 如果没有数据,显示暂无数据
            wallets: [], // 钱包列表
            active: 0,
        }
    },
    created() {
        let obj = {
            symbolType: 'cryptos'
        }
        _getAllWallet(obj).then(data => {
            this.actions = []
            data.extends.map(item => {
                this.actions.push({
                    symbol: item.symbol,
                    name: item.name,
                    symbol_data: item.symbol,
                    usable: item.usable,
                    usdt: item.usdt,
                    symbol_data: item.symbol_data
                })
            })
            this.wallets = data.extends
            console.log("this.actions", this.actions[0].symbol_data);
            this.form.symbol = this.strToArr(this.actions[0].name, '/')[0]
            this.form.symbol_to = this.strToArr(this.actions[1].name, '/')[0]
            this.form.iconImg1 = this.actions[0].symbol_data
            this.form.iconImg2 = this.actions[1].symbol_data
            this.form.symbol_ex = this.actions[0].symbol
            this.form.symbol_to_ex = this.actions[1].symbol
        })
    },
    methods: {
        onMax() { // 最大
            if (this.amountAvailable / 1) {
                this.form.volume = this.amountAvailable
                this.debounceFn()
            } else {
                showToast(this.$t('你没有可提数量'))
            }
        },
        created() {
            let obj = {
                symbolType: 'cryptos'
        onInput(e) { // 获取最新
            this.form.volume = e.target.value
            this.clearInterval()
            if (this.form.volume == '') {
                this.form.get_volume = ''
            } else {
                this.debounceFn()
            }
            _getAllWallet(obj).then(data => {
                this.actions = []
                data.extends.map(item => {
                    this.actions.push({
                        symbol: item.symbol,
                        name: item.symbol,
                        symbol_data: item.symbol,
                        usable: item.usable,
                        usdt: item.usdt,
                        symbol_data: item.symbol_data
                    })
                })
                this.wallets = data.extends
                console.log("this.actions",this.actions[0].symbol_data);
                this.form.symbol = this.actions[0].symbol_data
                this.form.symbol_to = this.actions[1].symbol_data
                this.form.iconImg1 = this.actions[0].symbol_data
                this.form.iconImg2 = this.actions[1].symbol_data
                this.form.symbol_ex = this.actions[0].symbol
                this.form.symbol_to_ex = this.actions[1].symbol
        },
        debounceFn: debounce(function () {
            this.fetchRate(true)
        }, 300),
        fetchRate(callback) { // interval
            let obj = {
                symbol: this.form.symbol_ex,
                symbol_to: this.form.symbol_to_ex,
                volume: this.form.volume
            }
            _exchangeRage(obj).then(data => {
                const {
                    get_rate
                } = data
                this.form.rate = get_rate
                this.clearInterval()
                if (callback && typeof callback === 'function') {
                    callback()
                }
            })
        },
        methods: {
            onMax() { // 最大
                if (this.amountAvailable / 1) {
                    this.form.volume = this.amountAvailable
                    this.debounceFn()
                } else {
                    showToast(this.$t('你没有可提数量'))
                }
            },
            onInput(e) { // 获取最新
                this.form.volume = e.target.value
                this.clearInterval()
                if (this.form.volume == '') {
                    this.form.get_volume = ''
                } else {
                    this.debounceFn()
                }
            },
            debounceFn: debounce(function() {
        onSwitch() { // 交换
            const temp = this.form.symbol
            this.form.symbol = this.form.symbol_to
            this.form.symbol_to = temp
            const tempImg = this.form.iconImg1
            this.form.iconImg1 = this.form.iconImg2
            this.form.iconImg2 = tempImg
            const tempsymbol = this.form.symbol_ex
            this.form.symbol_ex = this.form.symbol_to_ex
            this.form.symbol_to_ex = tempsymbol
                this.fetchRate(true)
            }, 300),
            fetchRate(callback) { // interval
                let obj = {
                    symbol: this.form.symbol_ex,
                    symbol_to: this.form.symbol_to_ex,
                    volume: this.form.volume
                }
                _exchangeRage(obj).then(data => {
                    const {
                        get_rate
                    } = data
                    this.form.rate = get_rate
                    this.clearInterval()
                    if (callback && typeof callback === 'function') {
                        callback()
                    }
                })
            },
            onSwitch() { // 交换
                const temp = this.form.symbol
                this.form.symbol = this.form.symbol_to
                this.form.symbol_to = temp
                const tempImg = this.form.iconImg1
                this.form.iconImg1 = this.form.iconImg2
                this.form.iconImg2 = tempImg
                const tempsymbol = this.form.symbol_ex
                this.form.symbol_ex = this.form.symbol_to_ex
                this.form.symbol_to_ex = tempsymbol
            this.form.volume = ''
            console.log("this.form", this.form);
            this.clearInterval()
        },
        onSelect(type, evt) { // 选择
            if (evt.type == 0) {
                this.form['symbol'] = this.strToArr(evt.item.name, '/')[0]
                this.form['iconImg1'] = evt.item.symbol_data
                this.form['symbol_ex'] = evt.item.symbol
            } else {
                this.form['symbol_to'] = this.strToArr(evt.item.name, '/')[0]
                this.form['iconImg2'] = evt.item.symbol_data
                this.form['symbol_to_ex'] = evt.item.symbol
            }
            if (this.form.symbol !== this.form.symbol_to) {
                this.form.volume = ''
                console.log("this.form",this.form);
                this.clearInterval()
            },
            onSelect(type, evt) { // 选择
                if (evt.type == 0) {
                    this.form['symbol'] = evt.item.symbol_data
                    this.form['iconImg1'] = evt.item.symbol_data
                    this.form['symbol_ex'] = evt.item.symbol
                } else {
                    this.form['symbol_to'] = evt.item.symbol_data
                    this.form['iconImg2'] = evt.item.symbol_data
                    this.form['symbol_to_ex'] = evt.item.symbol
                }
                if (this.form.symbol !== this.form.symbol_to) {
                    this.form.volume = ''
                }
                this.clearInterval()
            },
            onConfirm() { // 闪兑
                this.clearInterval()
                if (this.form.volume == '') {
                    showToast(this.$t('请输入数量'));
                } else {
                    this.fetchRate(() => {
                        this.$emit("exchange", this.form);
                    })
                }
            },
            clearInterval() { // 清除定时器
                clearInterval(this.interval)
                this.interval = null
            }
            this.clearInterval()
        },
        onConfirm() { // 闪兑
            this.clearInterval()
            if (this.form.volume == '') {
                showToast(this.$t('请输入数量'));
            } else {
                this.fetchRate(() => {
                    this.$emit("exchange", this.form);
                })
            }
        },
        beforeUnmount() {
            // console.log('beforeDestroy')
            this.clearInterval()
        }
    };
        clearInterval() { // 清除定时器
            clearInterval(this.interval)
            this.interval = null
        },
        strToArr(str, separator = ',') {
            if (typeof str !== 'string') return [];
            return str.split(separator);
        },
    },
    beforeUnmount() {
        // console.log('beforeDestroy')
        this.clearInterval()
    }
};
</script>
<style scoped lang="scss">
    @import "@/assets/init.scss";
@import "@/assets/init.scss";
    #cryptos {
        .account_card {
#cryptos {
    .account_card {
        background: $inp-b !important;
        border-radius: 2.5rem;
        padding: 1.2rem 2.5rem;
        div {
            background: $inp-b !important;
            border-radius: 2.5rem;
            padding: 1.2rem 2.5rem;
            div {
                background: $inp-b !important;
            }
        }
        .exchange-btn {
            bottom: 48px;
            left: 0;
            font-size: 36px;
            p {
                border-radius: 4rem;
            }
        }
        .active {
            color: $black;
            &:after {
                content: '';
                display: block;
                position: absolute;
                bottom: 0;
                width: 140px;
                height: 8px;
                background: $active_line;
                margin: 0 auto;
            }
        }
        .convert-box {
            background: $mainbgWhiteColor;
            margin: -2rem auto;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            width: 6rem;
            height: 6rem;
            position: relative;
            img {
                width: 50%;
                height: 50%;
            }
        }
        .btnMain {
            background: linear-gradient(90deg, #2C64D4 0%, #38AEEA 100%);
            border-radius: 5px;
            font-weight: bold;
        }
    }
    .exchange-btn {
        bottom: 48px;
        left: 0;
        font-size: 36px;
        p {
            border-radius: 4rem;
        }
    }
    .active {
        color: $black;
        &:after {
            content: '';
            display: block;
            position: absolute;
            bottom: 0;
            width: 140px;
            height: 8px;
            background: $active_line;
            margin: 0 auto;
        }
    }
    .convert-box {
        background: $mainbgWhiteColor;
        margin: -2rem auto;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        width: 6rem;
        height: 6rem;
        position: relative;
        img {
            width: 50%;
            height: 50%;
        }
    }
    .btnMain {
        background: linear-gradient(90deg, #2C64D4 0%, #38AEEA 100%);
        border-radius: 5px;
        font-weight: bold;
    }
}
</style>
src/components/Transform/mining-exchange-input/index.vue
@@ -72,7 +72,7 @@
                  class="w-30 h-30 rounded-full mr-10 currency-icon" />
              </div>
              <div>
                <div class="item-title textColor">{{ item.symbol_data.toUpperCase() }}</div>
                <div class="item-title textColor">{{ strToArr(item.name.toUpperCase(),'/')[0] }}</div>
              </div>
            </div>
            <div class="text-right" v-if="activeIndex == 0">
@@ -234,7 +234,11 @@
      } else {
        this.currencyList = this.allCurrencyList
      }
    }
    },
        strToArr(str, separator = ',') {
            if (typeof str !== 'string') return [];
            return str.split(separator);
        },
  },
};
</script>
src/components/Transform/trade-order-area/index.vue
@@ -27,10 +27,10 @@
      <span>{{ title }}</span>
    </div>
    <template  v-if="initClose.status / 1 === 0">
    <!-- <template  v-if="initClose.status / 1 === 0">
      <div class="flex justify-center items-center h-66 buy-item">{{ $t('停牌中,禁止交易') }}</div>
    </template>
    <template v-else>
    </template> -->
    <!-- <template v-else> -->
      <div class="flex total-list">
        <div class="total-div" :class="[!isTotal ? 'active-bg' : '']" @click="checkIsTotal(false)">
          {{ $t('数量') }}
@@ -76,7 +76,7 @@
        :class="currentType === 'open' ? 'bg-green' : 'bg-red'" @click="order()">
        {{ currentType == 'open' ? $t('买入') : $t('卖出') }}
      </div>
    </template>
    <!-- </template> -->
  </div>
</template>
src/components/application/application.vue
@@ -6,7 +6,7 @@
      <div class="content-box">
        <div class="flex flex-col items-center justify-center mt96">
          <van-image width="162" height="142" src="'../../assets/image/assets-center/success.png'" />
          <div class="font-45 font-700 success-title textColor">{{ title }} {{$t('申请已提交')}}</div>
          <div class="font-45 font-700 success-title textColor">{{ title }} {{ $t('申请已提交') }}</div>
        </div>
        <div class="mb87">
          <div class="font-35 textColor">{{ title }} {{ $t('申请已提交') }}</div>
@@ -25,7 +25,8 @@
        <!--         </div>-->
      </div>
      <div class="btn-wrap">
        <button class="btnMain text-white next-btn font-35" @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')">
        <button class="btnMain text-white next-btn font-35"
          @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')">
          {{ $t('查看') }} {{ title }} {{ $t('历史') }}</button>
      </div>
    </div>
@@ -35,86 +36,94 @@
<script>
import { Image as VanImage } from 'vant';
import assetsHead from "@/components/Transform/assets-head/index.vue";
import { customerServiceUrl } from "@/config";
import { dataTimeEx } from '@/utils/utis'
export default {
    name:'rechargeSubmit',
    components:{
        assetsHead,
        [VanImage.name]:VanImage
  name: 'rechargeSubmit',
  components: {
    assetsHead,
    [VanImage.name]: VanImage
  },
  props: {
    title: {
      type: String,
      default: ""
    }
  },
  data() {
    return {
      time: ''
    }
  },
  created() {
    this.getTime()
  },
  methods: {
    onClickLeft() {
      this.$router.go(-1);
    },
    props:{
        title:{
            type:String,
            default:""
        }
    goRouter(params) {
      this.$router.push({
        path: params
      });
    },
    data() {
        return {
          time:''
        }
    getTime() {
      this.time = dataTimeEx(Date.parse(new Date()), true);
    },
    created() {
      this.getTime()
    },
    methods:{
        onClickLeft() {
            this.$router.go(-1);
        },
        goRouter(params) {
            this.$router.push({
                path:params
            });
        },
        getTime(){
          this.time = dataTimeEx(Date.parse(new Date()),true);
        },
      tokefu() {
    tokefu() {
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
}
</script>
<style lang="scss" scoped>
@import "@/assets/init.scss";
#cryptos{
#cryptos {
  .page-box {
  box-sizing: border-box;
}
.btn-wrap {
  position: fixed;
  left: 0;
  bottom: 86px;
  width: 100%;
  padding: 0 30px;
  box-sizing: border-box;
}
.mt96 {
    margin-top:114px;
}
.success-title{
    margin-top:70px;
    margin-bottom:115px;
}
    box-sizing: border-box;
  }
.mt14{
    margin-top:14px;
}
  .btn-wrap {
    position: fixed;
    left: 0;
    bottom: 86px;
    width: 100%;
    padding: 0 30px;
    box-sizing: border-box;
  }
.mb87{
     margin-bottom:87px;
}
  .mt96 {
    margin-top: 114px;
  }
.service-text{
    text-decoration:underline;
}
.next-btn{
  width:100%;
  height:96px;
  border:none;
  outline:none;
  border-radius: 8px;
}
}
  .success-title {
    margin-top: 70px;
    margin-bottom: 115px;
  }
  .mt14 {
    margin-top: 14px;
  }
  .mb87 {
    margin-bottom: 87px;
  }
  .service-text {
    text-decoration: underline;
  }
  .next-btn {
    width: 100%;
    height: 96px;
    border: none;
    outline: none;
    border-radius: 8px;
  }
}
</style>
src/i18n/Deutsch.js
@@ -2836,4 +2836,9 @@
    "反洗钱协议": "Anti-Geldwäsche-Vereinbarung",
    "法律声明": "Rechtlicher Hinweis",
    "金融服务牌照": "Finanzdienstleistungslizenz",
    "充值记录": "Aufladeprotokoll",
    "当日": "Ist das",
    "最低认购": "Mindestzeichnung",
    "币种数量": "Menge der währung",
    "进度": "Fortschritt",
}
src/i18n/Italy.js
@@ -2926,4 +2926,9 @@
    "反洗钱协议": "Accordo antiriciclaggio",
    "法律声明": "Dichiarazione legale",
    "金融服务牌照": "Licenza di servizi finanziari",
    "充值记录": "Registro di ricarica",
    "当日": "Oggi",
    "最低认购": "Sottoscrizione minima",
    "币种数量": "Menge der Währung",
    "进度": "Fortschritt",
}
src/i18n/Japanese.js
@@ -2694,4 +2694,9 @@
    "反洗钱协议": "マネーロンダリング防止契約",
    "法律声明": "法的声明",
    "金融服务牌照": "金融サービスライセンス",
    "充值记录": "入金記録",
    "当日": "当日",
    "最低认购": "最低申込",
    "币种数量": "通貨数量",
    "进度": "進捗",
}
src/i18n/Portuguese.js
@@ -646,4 +646,9 @@
    "反洗钱协议": "Acordo de Prevenção à Lavagem de Dinheiro",
    "法律声明": "Declaração Legal",
    "金融服务牌照": "Licença de Serviços Financeiros",
    "充值记录": "Registro de recarga",
    "当日": "Hoje",
    "最低认购": "Subscrição mínima",
    "币种数量": "Quantidade de moeda",
    "进度": "Progresso",
}
src/i18n/Spanish.js
@@ -2609,4 +2609,9 @@
    "反洗钱协议": "Acuerdo de prevención de lavado de dinero",
    "法律声明": "Declaración legal",
    "金融服务牌照": "Licencia de servicios financieros",
    "充值记录": "Registro de recarga",
    "当日": "Hoy",
    "最低认购": "Suscripción mínima",
    "币种数量": "Cantidad de moneda",
    "进度": "Progreso",
}
src/i18n/cn.js
@@ -2815,4 +2815,9 @@
    "反洗钱协议": "反洗錢協議",
    "法律声明": "法律聲明",
    "金融服务牌照": "金融服務牌照",
    "充值记录": "充值記錄",
    "当日": "當日",
    "最低认购": "最低認購",
    "币种数量": "幣種數量",
    "进度": "進度",
}
src/i18n/en.js
@@ -2790,4 +2790,9 @@
    "反洗钱协议": "Anti-Money Laundering Agreement",
    "法律声明": "Legal Statement",
    "金融服务牌照": "Financial Services License",
    "充值记录": "Recharge record",
    "当日": "Today",
    "最低认购": "Minimum subscription",
    "币种数量": "Currency quantity",
    "进度": "Progress",
}
src/i18n/fa.js
@@ -2733,4 +2733,9 @@
    "反洗钱协议": "Accord de lutte contre le blanchiment d'argent",
    "法律声明": "Mention légale",
    "金融服务牌照": "Licence de services financiers",
    "充值记录": "Recharge record",
    "当日": "Aujourd'hui",
    "最低认购": "Souscription minimale",
    "币种数量": "Menge der Währung",
    "进度": "Fortschritt",
}
src/i18n/korean.js
@@ -2830,4 +2830,9 @@
    "反洗钱协议": "자금세탁 방지 계약",
    "法律声明": "법적 선언",
    "金融服务牌照": "금융 서비스 라이센스",
    "充值记录": "충전 기록",
    "当日": "당일",
    "最低认购": "최소 구독",
    "币种数量": "통화 수량",
    "进度": "진행 상황",
}
src/i18n/th.js
@@ -2801,4 +2801,9 @@
    "反洗钱协议": "ข้อตกลงการป้องกันการฟอกเงิน",
    "法律声明": "คำชี้แจงทางกฎหมาย",
    "金融服务牌照": "ใบอนุญาตบริการทางการเงิน",
    "充值记录": "บันทึกการเติมเงิน",
    "当日": "วันนี้",
    "最低认购": "การจองซื้อขั้นต่ำ",
    "币种数量": "จำนวนเงินตรา",
    "进度": "ความก้าวหน้า",
}
src/i18n/vi.js
@@ -2780,4 +2780,9 @@
    "反洗钱协议": "Thỏa thuận chống rửa tiền",
    "法律声明": "Tuyên bố pháp lý",
    "金融服务牌照": "Giấy phép dịch vụ tài chính",
    "充值记录": "Lịch sử nạp tiền",
    "当日": "Ngày nay",
    "最低认购": "Đăng ký tối thiểu",
    "币种数量": "Số lượng tiền tệ",
    "进度": "Tiến độ",
}
src/i18n/zhcn.js
@@ -2795,4 +2795,9 @@
    "反洗钱协议": "反洗钱协议",
    "法律声明": "法律声明",
    "金融服务牌照": "金融服务牌照",
    "充值记录": "充值记录",
    "当日": "当日",
    "最低认购": "最低认购",
    "币种数量": "币种数量",
    "进度": "进度",
}
src/router/index.js
@@ -1425,6 +1425,13 @@
                import( /* webpackChunkName: "changeFundsPassword" */ /* webpackPrefetch: true */
                    '@/views/changeFundsPassword/index.vue')
        },
        { //重置邮箱/手机号
            path: '/resetPhoneEmail',
            name: 'resetPhoneEmail',
            component: () =>
                import( /* webpackChunkName: "changeFundsPassword" */ /* webpackPrefetch: true */
                    '@/views/safety/resetPhoneEmail.vue')
        },
        { //绑定验证
            path: '/bindVerify',
            name: 'bindVerify',
src/service/login.api.js
@@ -53,4 +53,4 @@
        method: "get",
        data: params
    })
};
};
src/service/request.js
@@ -81,6 +81,7 @@
    case 403:   // 登录状态已过期,您可以继续留在该页面,或者重新登录 
      userStore.userInfo = {}
      store.state.user.userInfo = {}
      showToast({ type: 'warning', message: i18n.global.t('请重新登录')})
      router.push({
        path: '/login'
      })
src/service/user.api.js
@@ -374,4 +374,13 @@
        method: "POST",
        params,
    })
}
}
//重置账户密码
export const _registerEorP = (params) => {
    return request({
        url: `${API_PREFIX}/user/resetUserName`,
        method: METHODS.POST,
        data: params
    })
};
src/utils/utis.js
@@ -264,4 +264,11 @@
export const handleImage = (url) => {
  return new URL(url, import.meta.url).href
}
}
// 字符串转数组
export const strToArr = (str, separator = ',') => {
    if (typeof str !== 'string') return [];
    return str.split(separator);
}
src/views/C2C/c2c-order-list/components/TradeSuccessDetail.vue
@@ -92,6 +92,7 @@
import OrderData from "./OrderData.vue";
import Evaluation from "./Evaluation.vue";
import otcApi from "@/service/otc";
import { customerServiceUrl } from "@/config";
export default {
  name: "TradeSuccessDetail",
  props: ['title', 'back'],
@@ -145,7 +146,11 @@
      return str
    },
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
}
src/views/C2C/c2c-trade/components/TradeSuccessDetail.vue
@@ -92,6 +92,7 @@
import OrderData from "../../c2cOrder/components/order-data/OrderData.vue";
import Evaluation from "../../c2cOrder/payment/components/Evaluation.vue";
import otcApi from "@/service/otc";
import { customerServiceUrl } from "@/config";
export default {
  name: "TradeSuccessDetail",
  props: ['title', 'back'],
@@ -145,7 +146,11 @@
      return str
    },
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
}
src/views/C2C/c2c-trade/page/SellGenerate.vue
@@ -10,7 +10,7 @@
            <div class="font-48">{{ $t('等待买家付款') }}</div>
            <div class="mt-16 font-24">{{ $t('预计收到付款') }} <span style="color: #1D91FF">{{
              orderDetail.expireTime
            }}{{ $t('分钟') }}</span>
                }}{{ $t('分钟') }}</span>
            </div>
          </div>
          <div class="w-140 h-144">
@@ -87,9 +87,10 @@
          :create-order-time="fullTime(orderDetail.createTime)" :seller-name="orderDetail.c2cUserNickName"
          :unit-price="orderDetail.symbolValue" />
        <!--   已超时   -->
        <cancel-success v-if="timeout" :title="$t('出售')" :count="orderDetail.coinAmount" :total-price="orderDetail.amount"
          :order-number="orderDetail.orderNo" :create-order-time="fullTime(orderDetail.createTime)"
          :seller-name="orderDetail.c2cUserNickName" :unit-price="orderDetail.symbolValue">
        <cancel-success v-if="timeout" :title="$t('出售')" :count="orderDetail.coinAmount"
          :total-price="orderDetail.amount" :order-number="orderDetail.orderNo"
          :create-order-time="fullTime(orderDetail.createTime)" :seller-name="orderDetail.c2cUserNickName"
          :unit-price="orderDetail.symbolValue">
          <template #title>{{ $t('已超时') }}</template>
          <template #desc>{{ $t('买家付款超时,您的订单已取消') }}</template>
        </cancel-success>
@@ -110,6 +111,7 @@
import otcApi from "@/service/otc";
import { formatTime } from "@/utils/utis";
import { customerServiceUrl } from "@/config";
import { SET_ORDER_INFO } from "@/store/const.store";
export default {
@@ -141,10 +143,10 @@
    }
  },
  setup() {
    onBeforeUnmount(()=>{
    onBeforeUnmount(() => {
      let end = setInterval(function () { }, 10000);
      for (let i = 1; i <= end; i++) {
          clearInterval(i);
        clearInterval(i);
      }
    })
  },
@@ -214,7 +216,11 @@
      return formatTime(new Date(time), 'yyyy-MM-dd hh:mm:ss')
    },
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  },
  watch: {
@@ -252,6 +258,7 @@
<style lang="scss" scoped>
@import "@/assets/css/copy2.scss";
.border-ra {
  border-radius: 20px;
}
src/views/C2C/c2cOrder/components/appeal/AppealWaiting.vue
@@ -1,41 +1,41 @@
<template>
<div class="w-full h-full">
  <order-nav :title="$t('申述提交')" :back="false" @back="hide"/>
  <div class="mt-70">
    <div class="text-center">
      <img class="w-122 h-122" style="margin: 0 auto;" src="@/assets/image/c2c/Group100.png" alt="">
      <div class="mt-35 font-700 font-56 textColor">{{$t('提交成功')}}</div>
      <div class="mt-10 font-28 text-grey">
        <p class="mb-15">{{$t('您的资料已成功上传!')}}</p>
        <p>{{$t('系统将在三个工作日内审核完毕,请您耐心等候。')}}</p>
  <div class="w-full h-full">
    <order-nav :title="$t('申述提交')" :back="false" @back="hide" />
    <div class="mt-70">
      <div class="text-center">
        <img class="w-122 h-122" style="margin: 0 auto;" src="@/assets/image/c2c/Group100.png" alt="">
        <div class="mt-35 font-700 font-56 textColor">{{ $t('提交成功') }}</div>
        <div class="mt-10 font-28 text-grey">
          <p class="mb-15">{{ $t('您的资料已成功上传!') }}</p>
          <p>{{ $t('系统将在三个工作日内审核完毕,请您耐心等候。') }}</p>
        </div>
      </div>
    </div>
    <div class="px-33 mt-92">
      <van-button color="#1D91FF" class="w-full h-100 rounded-xl" type="info" @click="tokefu">{{ $t('联系客服') }}
      </van-button>
      <div @click="hide" class="mt-34 font-36 text-center" style="color: #1D91FF">{{ $t('返回') }}</div>
    </div>
  </div>
  <div class="px-33 mt-92">
    <van-button
        color="#1D91FF"
        class="w-full h-100 rounded-xl"
        type="info"
        @click="tokefu"
    >{{$t('联系客服')}}
    </van-button>
    <div @click="hide" class="mt-34 font-36 text-center" style="color: #1D91FF">{{$t('返回')}}</div>
  </div>
</div>
</template>
<script>
import {Button} from "vant";
import { Button } from "vant";
import OrderNav from "@/components/order-nav/OrderNav.vue";
import { customerServiceUrl } from "@/config";
export default {
  name: "AppealWaiting",
  components: {
    [Button.name]:Button,
    [Button.name]: Button,
    OrderNav,
  },
  methods:{
  methods: {
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    },
    hide() {
      console.log(213)
@@ -45,6 +45,4 @@
}
</script>
<style scoped>
</style>
<style scoped></style>
src/views/C2C/c2cOrder/order-generation/orderGeneration.vue
@@ -79,7 +79,7 @@
import OrderNav from "@/components/order-nav/OrderNav.vue";
import OrderData from "../components/order-data/OrderData.vue";
import otcApi from "@/service/otc";
import { customerServiceUrl } from "@/config";
export default {
  name: "orderGeneration",
@@ -120,7 +120,11 @@
      this.$router.push({ path: '/chat' })
    },
    tokefu() {
      this.$router.push('/customerService')
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  },
  computed: {
src/views/ICO/ico.vue
@@ -4,9 +4,9 @@
            <template v-slot:title>
                <div>STO</div>
            </template>
            <template v-slot:right>
            <!-- <template v-slot:right>
                <van-icon name="todo-list-o" @click="$router.push('/ICO/icoRecord')" />
            </template>
            </template> -->
        </fx-header>
        <div class="ico_list">
@@ -15,40 +15,51 @@
                    {{ i.name }}
                </div>
                <div class="item_2 flex justify-between">
                    <div class="mr-5">{{$t('申购时间')}}</div>
                    <div class="mr-5">{{ $t('申购时间') }}</div>
                    <div>{{ i.startDate }} ~ {{ i.endDate }}</div>
                </div>
                <div class="item_2 flex justify-between">
                    <div>{{$t('listingDate')}}</div>
                    <div>{{ i.marketDate }}</div>
                    <div>{{ $t('最低认购') }}</div>
                    <div>{{ i.minContribution }}</div>
                </div>
                <div class="item_2 flex justify-between">
                    <div>{{$t('每张金额')}}</div>
                    <div>{{ $t('币种数量') }}</div>
                    <div>{{ i.maxContribution }}</div>
                </div>
                <div class="item_2 flex justify-between">
                    <div>{{ $t('IssuePrice') }}</div>
                    <div>{{ i.unitAmount }}</div>
                </div>
                <div class="item_2 flex justify-between">
                    <div>{{$t('每张手续费')}}</div>
                    <div>{{ i.unitFee }}</div>
                    <div>{{ $t('listingDate') }}</div>
                    <div>{{ i.marketDate }}</div>
                </div>
                <div class="item_3 flex justify-center">
                <div class="item_2 flex justify-between align-center">
                    <div>{{ $t('进度') }}</div>
                    <div style="width: 70%;padding-top: 1rem;">
                        <van-progress :percentage="i.progressRate || 0" track-color="#ccc" />
                    </div>
                </div>
                <!-- <div class="item_3 flex justify-center">
                    <van-button type="default" round size="large" @click="openBuy(i)">{{$t('申购')}}</van-button>
                </div> -->
            </div>
        </div>
        <!-- 购买弹窗 -->
        <van-popup v-model:show="show" round>
            <div class="buy_popup">
                <div class="buy_title flex justify-center">{{ itemObj.symbol }}</div>
                <van-field v-model="sgNum" type="digit" :label="$t('申购数量')" />
                <div class="flex justify-center mt-5">
                    <van-button type="default" size="large" round @click="buy">{{ $t('confirm') }}</van-button>
                </div>
            </div>
        </div>
    <!-- 购买弹窗 -->
    <van-popup v-model:show="show" round >
        <div class="buy_popup">
            <div class="buy_title flex justify-center">{{ itemObj.symbol }}</div>
            <van-field v-model="sgNum" type="digit" :label="$t('申购数量')" />
            <div class="flex justify-center mt-5">
                <van-button type="default" size="large" round @click="buy">{{$t('confirm')}}</van-button>
            </div>
        </div>
    </van-popup>
        </van-popup>
    </div>
</template>
@@ -64,7 +75,7 @@
_icoList().then(res => {
    icoList.value = res.records
}).catch(err => {
    showToast(err.msg)
    // showToast(err.msg)
})
// 打开申购弹窗
@@ -79,9 +90,9 @@
// 申购
const buy = () => {
    let opt = {
        icoProjectId:itemObj.value.id,
        icoProjectId: itemObj.value.id,
        subscribeNums: sgNum.value,
        subscriptionType:1,
        subscriptionType: 1,
    }
    _icoSubscribe(opt).then(res => {
        showToast(t('submitSuccess'))
@@ -94,44 +105,50 @@
</script>
<style lang="scss" scoped>
.ico{
.ico {
    padding: 0rem 1.2rem 5rem 1.2rem;
    font-size: 1.5rem;
    .buy_popup{
    .buy_popup {
        width: 40rem;
        padding: 1rem;
        .buy_title{
        .buy_title {
            font-size: 2.5rem;
            font-weight: 700;
            border-bottom: #aaa solid 1px;
            padding: 1rem;
        }
    }
    .ico_list{
    .ico_list {
        padding: 1rem 0rem;
        .ico_item{
        .ico_item {
            background-color: #eee;
            padding:.5rem 1rem;
            padding: .5rem 1rem;
            border: #aaa solid 1px;
            border-radius: 1rem;
            .item_1{
            .item_1 {
                padding: 1rem .5rem;
                border-bottom: #ccc solid 1px;
                font-size: 2rem;
                font-weight: 700;
            }
            .item_2{
            .item_2 {
                padding: 1rem .5rem;
                border-bottom: #ccc solid 1px;
                font-size: 1.6rem;
                font-weight: 500;
                &>div:last-child{
                &>div:last-child {
                    color: #999;
                }
            }
            .item_3{
            .item_3 {
                padding: .5rem;
            }
        }
src/views/cryptos/AboutUs/index.vue
@@ -43,6 +43,8 @@
          return this.$t('反洗钱协议')
        case '26':
          return this.$t('金融服务牌照')
        case '27':
          return this.$t('帮助中心')
        default:
          return this.$t('关于我们')
      }
@@ -66,9 +68,9 @@
      }
      _getAboutUs({
        content_code: this.serviceTerm,
        // language: this.serviceTerm ? language : this.$i18n.locale,
        language: 'en', // 强制英文,后台暂时只设置了英文
        not_language: 1,
        language: this.serviceTerm ? language : this.$i18n.locale,
        // language: 'en', // 强制英文,后台暂时只设置了英文
        // not_language: 1,
      }).then((res) => {
        this.content = res.content
        this.title = res.title
src/views/cryptos/AccountChange/index.vue
@@ -12,14 +12,15 @@
                <!-- <img v-if="item.amount > 0" src="@/assets/image/assets-center/in.png" class="w-44 h-44 mr-20" />
                <img v-else src="@/assets/image/assets-center/out.png" class="w-44 h-44 mr-20" /> -->
                <div>
                  <div class="font-32 textColor">{{ category[item.category] }}</div>
                  <!-- <div class="font-32 textColor">{{ category[item.category] }}</div> -->
                  <div class="font-32 textColor">{{ orderTypes[item.content_type] }}</div>
                  <div class="text-grey font-26 mt-6">{{ item.createTime }}(UTC+2)</div>
                  <div class="text-grey font-26 mt-6">{{ orderTypes[item.content_type] }}</div>
                  <!-- <div class="text-grey font-26 mt-6">{{ orderTypes[item.content_type] }}</div> -->
                </div>
              </div>
              <div>
                <div class="font-32 text-right" :class="item.amount > 0 ? 'text-green' : 'text-red'">{{
                  item.amount }}&nbsp;{{ item.wallet_type.toUpperCase() }}</div>
                  item.amount }}&nbsp;{{ (item.wallet_type || '').toUpperCase() }}</div>
                <!-- <div class="text-grey font-28 mt-14">{{ item.createTimeStr }}</div> -->
                <div class="text-grey font-28 mt-6 text-right">{{ item.amountAfter }}</div>
              </div>
@@ -54,8 +55,8 @@
      title: this.$t('选择账户类型'),
      selectData: [
        { title: this.$t('全部'), type: '' },
        { title: this.$t('法币交易'), type: 'coin' },
        { title: this.$t('合约交易'), type: 'contract' },
        { title: this.$t('充值记录'), type: 'coin' },
        // { title: this.$t('合约交易'), type: 'contract' },
        { title: this.$t('币币交易'), type: 'exchange' },
      ],
      type: "",//选中类型
@@ -144,6 +145,8 @@
        this.symbolType = this.$route.query.type
      }
      _fundRecord(this.type, this.page, this.symbolType).then(data => {
        console.log("data", data);
        this.list = [...this.list, ...data]
        // console.log(logs)
        this.loading = false
src/views/cryptos/Exchange/exchangePage.vue
@@ -29,7 +29,7 @@
                  class="w-70 h-70 rounded-full" />
              </div>
              <div class="text-grey font-28 mt-20">{{ $t('从') }}</div>
              <div class="font-30 mt-30">{{ detail.volume }} {{ detail.symbol }}</div>
              <div class="font-30 mt-30">{{ detail.volume }} {{ detail.name }}</div>
            </div>
            <img src="../../../assets/image/exchange/icon_6.png" class="w-30 h-20" style="margin-top:-65px" />
@@ -60,8 +60,8 @@
                  </li> -->
            <li class="flex justify-between font-28 mt-25">
              <span class="text-grey">{{ $t('汇率') }}</span>
              <span class="textColor">1 {{ detail.symbol &&
                detail.symbol.toUpperCase() }}≈{{ (detail.rate * 1).toFixed(5) }} {{ detail.symbol_to &&
              <span class="textColor">1 {{ detail.name &&
                detail.name.toUpperCase() }}≈{{ (detail.rate * 1).toFixed(5) }} {{ detail.symbol_to &&
                  detail.symbol_to.toUpperCase() }}</span>
            </li>
          </ul>
src/views/cryptos/Recharge/rechargePage.vue
@@ -47,13 +47,13 @@
                                item.blockchain_name }}</div>
                    </div>
                </div>
                <div>
                <!-- <div>
                    <div class="font-28 textColor">{{ $t('付款凭证(上传支付详情截图)') }}</div>
                    <div class="img-box">
                        <van-uploader accept="image/*" v-model="fileList" multiple :max-count="1"
                            :before-read="beforeRead" :after-read="afterRead" />
                    </div>
                </div>
                </div> -->
            </div>
            <div class="hint-box">
                <div class="pl-30 pr-30">
@@ -242,7 +242,7 @@
                    amount: this.amount,
                    from: this.enterAddress,
                    blockchain_name: this.blockchain_name,
                    img: this.fileList[0].resURL,
                    // img: this.fileList[0].resURL,
                    coin: this.coin,
                    channel_address: this.address,
                    tx: "",
src/views/cryptos/Recharge/rechargeSubmit.vue
@@ -1,88 +1,96 @@
<template>
    <!-- 充值或提现申请提交页面 -->
    <div id="cryptos">
      <assets-head title="" :goHome="true" />
      <div class="pl-47 pr-47 page-box relative">
        <div class="content-box">
          <div class="flex flex-col items-center justify-center mt96">
            <img width="162" height="142" src="@/assets/image/assets-center/success.png" />
            <div class="font-45 font-700 success-title textColor">{{ title }} {{$t('申请已提交')}}</div>
          </div>
          <div class="mb87">
            <div class="font-35 textColor">{{ title }} {{ $t('申请已提交') }}</div>
            <div class="text-grey font-30 mt14">{{ time }}</div>
          </div>
          <div class="mb87">
            <div class="font-35 textColor">{{ title }} {{ $t('申请已提交') }}</div>
            <div class="flex mt14">
              <div class="text-grey font-30">{{ $t('如果') }} {{ title }} {{ $t('未到账') }}?</div>
              <div class="service-text font-30 text-blue" @click="tokefu">{{ $t('联系客服') }}</div>
            </div>
          </div>
          <!--         <div class="mb87">-->
          <!--           <div class="font-35">{{ title }} {{ $t('已成功') }}</div>-->
          <!--           <div class="text-grey font-30 mt14">{{ $t('您会收到邮箱提醒') }}</div>-->
          <!--         </div>-->
  <!-- 充值或提现申请提交页面 -->
  <div id="cryptos">
    <assets-head title="" :goHome="true" />
    <div class="pl-47 pr-47 page-box relative">
      <div class="content-box">
        <div class="flex flex-col items-center justify-center mt96">
          <img width="162" height="142" src="@/assets/image/assets-center/success.png" />
          <div class="font-45 font-700 success-title textColor">{{ title }} {{ $t('申请已提交') }}</div>
        </div>
        <div class="btn-wrap">
          <button class="btnMain text-white next-btn font-35" @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')">
            {{ $t('查看') }} {{ title }} {{ $t('历史') }}</button>
        <div class="mb87">
          <div class="font-35 textColor">{{ title }} {{ $t('申请已提交') }}</div>
          <div class="text-grey font-30 mt14">{{ time }}</div>
        </div>
        <div class="mb87">
          <div class="font-35 textColor">{{ title }} {{ $t('申请已提交') }}</div>
          <div class="flex mt14">
            <div class="text-grey font-30">{{ $t('如果') }} {{ title }} {{ $t('未到账') }}?</div>
            <div class="service-text font-30 text-blue" @click="tokefu">{{ $t('联系客服') }}</div>
          </div>
        </div>
        <!--         <div class="mb87">-->
        <!--           <div class="font-35">{{ title }} {{ $t('已成功') }}</div>-->
        <!--           <div class="text-grey font-30 mt14">{{ $t('您会收到邮箱提醒') }}</div>-->
        <!--         </div>-->
      </div>
      <div class="btn-wrap">
        <button class="btnMain text-white next-btn font-35"
          @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord')">
          {{ $t('查看') }} {{ title }} {{ $t('历史') }}</button>
      </div>
    </div>
  </template>
  <script>
  import { Image as VanImage } from 'vant';
  import assetsHead from "@/components/Transform/assets-head/index.vue";
  import { dataTimeEx } from '@/utils/utis'
  export default {
      name:'rechargeSubmit',
      components:{
          assetsHead,
          [VanImage.name]:VanImage
      },
      props:{
          title:{
              type:String,
              default:""
          }
      },
      data() {
          return {
            time:''
          }
      },
      created() {
        this.getTime()
      },
      methods:{
          onClickLeft() {
              this.$router.go(-1);
          },
          goRouter(params) {
              this.$router.push({
                  path:params,
                  query: {
                    back: 1
                  }
              });
          },
          getTime(){
            this.time = dataTimeEx(Date.parse(new Date()),true);
          },
        tokefu() {
          this.$router.push('/customerService')
  </div>
</template>
<script>
import { Image as VanImage } from 'vant';
import assetsHead from "@/components/Transform/assets-head/index.vue";
import { dataTimeEx } from '@/utils/utis'
import { customerServiceUrl } from "@/config";
export default {
  name: 'rechargeSubmit',
  components: {
    assetsHead,
    [VanImage.name]: VanImage
  },
  props: {
    title: {
      type: String,
      default: ""
    }
  },
  data() {
    return {
      time: ''
    }
  },
  created() {
    this.getTime()
  },
  methods: {
    onClickLeft() {
      this.$router.go(-1);
    },
    goRouter(params) {
      this.$router.push({
        path: params,
        query: {
          back: 1
        }
      });
    },
    getTime() {
      this.time = dataTimeEx(Date.parse(new Date()), true);
    },
    tokefu() {
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
  </script>
  <style lang="scss" scoped>
  @import "@/assets/init.scss";
  #cryptos{
    .page-box {
}
</script>
<style lang="scss" scoped>
@import "@/assets/init.scss";
#cryptos {
  .page-box {
    box-sizing: border-box;
  }
  .btn-wrap {
    position: fixed;
    left: 0;
@@ -91,34 +99,34 @@
    padding: 0 30px;
    box-sizing: border-box;
  }
  .mt96 {
      margin-top:114px;
    margin-top: 114px;
  }
  .success-title{
      margin-top:70px;
      margin-bottom:115px;
  .success-title {
    margin-top: 70px;
    margin-bottom: 115px;
  }
  .mt14{
      margin-top:14px;
  .mt14 {
    margin-top: 14px;
  }
  .mb87{
       margin-bottom:87px;
  .mb87 {
    margin-bottom: 87px;
  }
  .service-text{
      text-decoration:underline;
  .service-text {
    text-decoration: underline;
  }
  .next-btn{
    width:100%;
    height:96px;
    border:none;
    outline:none;
  .next-btn {
    width: 100%;
    height: 96px;
    border: none;
    outline: none;
    border-radius: 8px;
  }
  }
  </style>
}
</style>
src/views/cryptos/TrendDetails/index.vue
@@ -68,7 +68,7 @@
                    <p>{{ $t('买入') }}</p>
                    <p class="flex  justify-between  font-22">
                      <span style="margin-right: -10px;">{{ $t('价格') }}{{ queryType == 'cryptos' ? '(USDT)' : '(USD)'
                      }}</span>
                        }}</span>
                      <span class="buy-title">{{ $t('数量') }}({{ symbolData.toUpperCase() }})</span>
                    </p>
                  </li>
@@ -111,7 +111,7 @@
                  <span class="flex-1">{{ $t('方向') }}</span>
                  <span class="flex-1">{{ $t('价格') }}{{ queryType == 'cryptos' ? '(USDT)' : '(USD)' }}</span>
                  <span class="flex-1 flex justify-center buy-title">{{ $t('数量') }}({{ symbolData.toUpperCase()
                  }})</span>
                    }})</span>
                </li>
                <li v-for="(item, index) in deals" :key="item.ts + item.price + item.amount || index"
                  class="flex  justify-between mt-30">
@@ -228,6 +228,7 @@
import { mapGetters } from 'vuex';
import { fixDate } from "@/utils";
import { WS_URL } from '@/config';
import { strToArr } from "@/utils/utis";
import PopupDelivery from "@/components/Transform/popup-delivery/index.vue";
import PopupConfirmOrder from '@/components/Transform/popup-confirm-order/index.vue'
import deepChart from '@/components/Transform/deepChart/index.vue'
@@ -377,7 +378,7 @@
      _getHomeList(this.symbol).then(data => {
        // console.log(data[0])
        this.quote = data[0]
        this.symbolData = data[0].symbol_data
        this.symbolData = strToArr(data[0].name, '/')[0]
        this.$nextTick(() => {
          if (!this.sockets.quote && this.symbol) {
            this.startQuoteScoket()
src/views/cryptos/Withdraw/withdrawSumbit.vue
@@ -1,12 +1,12 @@
 <template>
   <!-- 提现申请提交页面 -->
   <div id="cryptos">
<template>
  <!-- 提现申请提交页面 -->
  <div id="cryptos">
    <assets-head title="" :goHome="true" />
    <div class="pl-47 pr-47 page-box relative font-28">
      <div class="content-box font-28">
        <div class="flex flex-col items-center justify-center mt96">
          <img src="@/assets/image/order/success.png"/>
          <div class="font-45 font-700 success-title textColor">{{ title }} {{$t('申请已提交')}}</div>
          <img src="@/assets/image/order/success.png" />
          <div class="font-45 font-700 success-title textColor">{{ title }} {{ $t('申请已提交') }}</div>
        </div>
        <div class="mb87 font-28">
          <div class="font-35 textColor">{{ title }} {{ $t('申请已提交') }}</div>
@@ -25,7 +25,8 @@
        <!--         </div>-->
      </div>
      <div class="btn-wrap">
        <button class="btnMain text-white next-btn font-35" @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord?back=1')">
        <button class="btnMain text-white next-btn font-35"
          @click="goRouter('/cryptos/assetsCenter/rechargeWithdrawRecord?back=1')">
          {{ $t('查看') }} {{ title }} {{ $t('历史') }}</button>
      </div>
    </div>
@@ -36,89 +37,96 @@
import { Image as VanImage } from 'vant';
import assetsHead from "@/components/Transform/assets-head/index.vue";
import { dataTimeEx } from '@/utils/utis'
import { customerServiceUrl } from "@/config";
export default {
    name:'rechargeSubmit',
    components:{
        assetsHead,
        [VanImage.name]:VanImage
  name: 'rechargeSubmit',
  components: {
    assetsHead,
    [VanImage.name]: VanImage
  },
  props: {
    title: {
      type: String,
      default: ""
    }
  },
  data() {
    return {
      time: ''
    }
  },
  created() {
    this.getTime()
  },
  methods: {
    onClickLeft() {
      this.$router.go(-1);
    },
    props:{
        title:{
            type:String,
            default:""
    goRouter(params) {
      this.$router.push({
        path: params,
        query: {
          back: 1
        }
      });
    },
    data() {
        return {
          time:''
        }
    getTime() {
      this.time = dataTimeEx(Date.parse(new Date()), true);
    },
    created() {
      this.getTime()
    },
    methods:{
        onClickLeft() {
            this.$router.go(-1);
        },
        goRouter(params) {
            this.$router.push({
                path:params,
                query: {
                    back: 1
                  }
            });
        },
        getTime(){
          this.time = dataTimeEx(Date.parse(new Date()),true);
        },
      tokefu() {
    tokefu() {
      if (customerServiceUrl) {
        window.location.href = customerServiceUrl;
      } else {
        this.$router.push('/customerService')
      }
    }
  }
}
</script>
<style lang="scss" scoped>
@import "@/assets/init.scss";
#cryptos{
#cryptos {
  .page-box {
  box-sizing: border-box;
}
.btn-wrap {
  position: fixed;
  left: 0;
  bottom: 86px;
  width: 100%;
  padding: 0 30px;
  box-sizing: border-box;
}
.mt96 {
    margin-top:114px;
}
.success-title{
    margin-top:70px;
    margin-bottom:115px;
}
    box-sizing: border-box;
  }
.mt14{
    margin-top:14px;
}
  .btn-wrap {
    position: fixed;
    left: 0;
    bottom: 86px;
    width: 100%;
    padding: 0 30px;
    box-sizing: border-box;
  }
.mb87{
     margin-bottom:87px;
}
  .mt96 {
    margin-top: 114px;
  }
.service-text{
    text-decoration:underline;
}
.next-btn{
  width:100%;
  height:96px;
  border:none;
  outline:none;
  border-radius: 8px;
}
}
  .success-title {
    margin-top: 70px;
    margin-bottom: 115px;
  }
  .mt14 {
    margin-top: 14px;
  }
  .mb87 {
    margin-bottom: 87px;
  }
  .service-text {
    text-decoration: underline;
  }
  .next-btn {
    width: 100%;
    height: 96px;
    border: none;
    outline: none;
    border-radius: 8px;
  }
}
</style>
src/views/homePage/index.vue
@@ -118,7 +118,7 @@
    { key: 7, name: t('提现'), icon: new URL('@/assets/imgs/home/home_6.png', import.meta.url), path: '/cryptos/Withdraw/withdrawPage' },
    // { key: 8, name: t('卡券中心'), icon: new URL('@/assets/imgs/home/home_7.png', import.meta.url) },
    // { key: 9, name: t('闪兑'), icon: new URL('@/assets/imgs/home/home_8.png', import.meta.url), path: '/cryptos/exchangePage' },
    { key: 9, name: t('划转'), icon: new URL('@/assets/imgs/home/home_8.png', import.meta.url), path: '/my/transfer' },
    // { key: 9, name: t('划转'), icon: new URL('@/assets/imgs/home/home_8.png', import.meta.url), path: '/my/transfer' },
    // { key: 10, name: t('更多'), icon: new URL('@/assets/imgs/home/home_9.png', import.meta.url) },
    { key: 11, name: "STO", icon: new URL('@/assets/imgs/home/home_1.png', import.meta.url), path: '/ICO/ico' },
src/views/login/index.vue
@@ -13,6 +13,15 @@
            </span>
        </div>
        <div class="flex re-tab">
            <div class="textColor1" :class="activeIndex == 1 ? 'active' : ''" @click="changeIndex(1)">
                {{ $t('email') }}
            </div>
            <div class="textColor1" :class="activeIndex == 2 ? 'active' : ''" @click="changeIndex(2)">
                {{ $t('phoneNum') }}
            </div>
        </div>
        <ExInput style="padding-bottom:16px !important;" :placeholderText="getRegType(activeIndex, false)"
            v-model="username" :dialCode="dialCode" @selectArea="onSelectArea" :area="isArea" :icon="icon"
            @pressEnter="verifyLogin" />
@@ -67,7 +76,7 @@
let username = ref('')
let password = ref('')
let activeIndex = ref(0)
let activeIndex = ref(1)
let isArea = ref(false)
let dialCode = ref(0)
let icon = ref('')
@@ -159,7 +168,8 @@
    _loginUser({
        userName: (activeIndex.value == 0 || activeIndex.value == 1) ? username.value : `${dialCode.value}${username.value}`,
        passWord: password.value,
        type: type.value
        // type: type.value
        type: '3' // 写死, 算所有的登录都是账户登录
    }).then((res) => {
        userStore[GET_USERINFO](res)
        store.commit('user/SET_USERINFO', res)
@@ -179,6 +189,26 @@
    background: $mainbgWhiteColor;
    min-height: 100vh;
    .re-tab {
        margin-bottom: 22px;
        div {
            padding: 0 18px;
            height: 34px;
            line-height: 34px;
            text-align: center;
            border-radius: 4px;
            margin-right: 10px;
        }
        .active {
            // background: $US_tabActice_background;
            background: $bg_yellow;
            // color: $color_main;
            color: $text_color4;
        }
    }
    :deep(.textColor) {
        color: $log-c;
    }
src/views/my/assets.vue
@@ -14,12 +14,16 @@
                </van-dropdown-item>
            </van-dropdown-menu>
        </div>
        <div class="assets_revenue mt-5">
            <span>{{ $t('ProfitDay') }}</span>
            {{ currency.currency_symbol }}{{ forexAssets?.money_contract_profit_today ?
                (forexAssets?.money_contract_profit_today * (currency.rate ?? 0)).toFixed(2) :
                '--' }}
        </div>
        <!-- <div class="assets_revenue mt-5">
            <span>{{ $t('当日') }}</span>
            {{ currency.currency_symbol }}
            <span
                :style="forexAssets?.money_contract_profit_today > 0 ? 'color:green' : forexAssets?.money_contract_profit_today < 0 ? 'color:red' : ''">
                {{ forexAssets?.money_contract_profit_today ?
                    (forexAssets?.money_contract_profit_today * (currency.rate ?? 0)).toFixed(2) :
                    '--' }}
            </span>
        </div> -->
        <div class="tabbers flex justify-between mt-20 pl-1 pr-1">
            <div class="item" v-for="item in tabList" :key="item.key" @click="toPage(item.path)">
@@ -43,12 +47,12 @@
                    <span class="mr-5">{{ assetObj.capital }}</span>
                    <van-icon name="arrow" />
                </div>
                <div class="assets_item flex justify-start items-center mt-14 font-bold">
                <!-- <div class="assets_item flex justify-start items-center mt-14 font-bold">
                    <div class="icon" style="background-color: #f7b600;"></div>
                    <span class="ml-5 flex-1">{{ $t('交易账户') }}</span>
                    <span class="mr-5">{{ assetObj.contract }}</span>
                    <van-icon name="arrow" />
                </div>
                </div> -->
            </van-collapse-item>
        </van-collapse>
src/views/my/index.vue
@@ -202,7 +202,8 @@
          // { icon: 'todo-list-o', title: t('账变记录'), path: '/cryptos/accountChange' },
          { icon: new URL('../../assets/image/assets-center/valuation.png', import.meta.url), title: t('计价方式'), path: '/cryptos/exchangeRate' },
          // { icon: new URL('../../assets/image/assets-center/AddPaymentMethod.png', import.meta.url), title: t('AddPaymentMethod'), path: '/payMentMethod/list' },
          { icon: new URL('../../assets/image/assets-center/help.png', import.meta.url), title: t('帮助中心'), path: '/helpCenter' },
          // { icon: new URL('../../assets/image/assets-center/help.png', import.meta.url), title: t('帮助中心'), path: '/helpCenter' }, // 原帮助中心页面
          { icon: new URL('../../assets/image/assets-center/help.png', import.meta.url), title: t('帮助中心'), path: '/aboutUs?serviceTerm=27' }, // 现跳转关于我们通过后台编辑获取的页面
        ]
      }
    ]
src/views/order/order-submit.vue
@@ -11,7 +11,7 @@
        <div class="order-top">
          <div class="title">{{ $t('orderGenerated') }}</div>
          <div class="text mt-2">{{ $t('pleaseAt') }} <span>{{ msgTitle }}</span> {{ $t('paymentSeller')
            }}{{ payInfo.direction == 'recharge' ? $t('买家') : $t('卖家') }}</div>
          }}{{ payInfo.direction == 'recharge' ? $t('买家') : $t('卖家') }}</div>
          <div class="customer mt-5" @click="onRoute">
            <div class="flex">
              <div class="flex flex-1 service">
@@ -29,7 +29,8 @@
            <div class="flex step mt-5">
              <img class="success mr-1" src="@/assets/image/order/success.png" alt="" />
              <!-- {{ $t('Payconfidence') }} -->
              {{ payInfo.direction == 'recharge' ? $t('买家') : $t('卖家') }} {{ payInfo.currency }} {{ $t('已存入交易所账户,请放心付款') }}
              {{ payInfo.direction == 'recharge' ? $t('买家') : $t('卖家') }} {{ payInfo.currency }} {{ $t('已存入交易所账户,请放心付款')
              }}
            </div>
            <div class="flex mt-5">
              <div class="flex step flex-1">
@@ -111,6 +112,7 @@
  showToast
} from 'vant';
import useClipboard from "vue-clipboard3";
import { customerServiceUrl } from '@/config'
import { useI18n } from "vue-i18n";
const { toClipboard } = useClipboard();
const { t } = useI18n()
@@ -119,8 +121,11 @@
const showPopup = ref(false)
const orderNo = ref(null)
const onRoute = () => {
  // router.push('/order/success')
  router.push('/customerService?order_no=' + orderNo.value)
  if (customerServiceUrl) {
    window.location.href = customerServiceUrl;
  } else {
    router.push('/customerService?order_no=' + orderNo.value)
  }
}
const onClickLeft = () => {
  // router.push('/exchange/channel-in')
src/views/register/index.vue
@@ -14,7 +14,7 @@
            </div>
            <div class="textColor1" :class="activeIndex == 2 ? 'active' : ''" @click="changeIndex(2)">{{
                $t('phoneNum')
            }}</div>
                }}</div>
        </div>
        <ExInput :label="getRegType(activeIndex, true)" :placeholderText="getRegType(activeIndex, false)"
            v-model="username" :area="isArea" :dialCode="dialCode" @selectArea="onSelectArea" :icon="icon" />
@@ -41,7 +41,10 @@
                <img v-show="agree" src="../../assets/image/login/prot2.png" alt="" />
                <img v-show="!agree" src="../../assets/image/login/prot1.png" alt="" />
            </i>
            {{ $t('readAgree') }}<span class="colorMain" @click="router.push('/TermsOfService')">{{
            <!-- {{ $t('readAgree') }}<span class="colorMain" @click="router.push('/TermsOfService')">{{
                $t('serviceConf')
                }}</span> -->
            {{ $t('readAgree') }}<span class="colorMain" @click="router.push('/aboutUs?serviceTerm=23')">{{
                $t('serviceConf')
            }}</span>
        </div>
src/views/resetVerify/index.vue
@@ -73,18 +73,18 @@
        name: t('resetFundsPassword'),
        type: 0
    },
    {
        name: t('resetPhone'),
        type: 1
    },
    {
        name: t('resetEmail'),
        type: 2
    },
    {
        name: t('resetGoogleVerify'),
        type: 3
    },
    // {
    //     name: t('resetPhone'),
    //     type: 1
    // },
    // {
    //     name: t('resetEmail'),
    //     type: 2
    // },
    // {
    //     name: t('resetGoogleVerify'),
    //     type: 3
    // },
])
const frontFile = ref([])
const reverseFile = ref([])
src/views/safety/index.vue
@@ -1,6 +1,6 @@
<template>
  <div class="safety">
    <fx-header >
    <fx-header>
    </fx-header>
    <div class="content">
      <div class="title textColor">{{ $t('safe') }}</div>
@@ -91,7 +91,11 @@
  {
    name: t('manualReset'),
    url: "/resetVerify?type=0"
  }
  },
  {
    name: `${t('resetPhone')}/${t('resetEmail')}`,
    url: "/resetPhoneEmail"
  },
])
onMounted(() => {
@@ -129,7 +133,7 @@
  // background-color: $mainBgColor;
}
:deep(.van-grid-item__content){
:deep(.van-grid-item__content) {
  // background:  $main2_background !important;
  color: $text_color;
}
src/views/safety/resetPhoneEmail.vue
New file
@@ -0,0 +1,401 @@
<template>
    <div class="register">
        <div class="top flex justify-between items-center">
            <img src="../../assets/image/icon-close.png" alt="" @click="router.go(-1)">
            <div @click="onRoute('/customerService')">{{ $t('onLineService') }}</div>
        </div>
        <div class="title textColor">{{ $t('重置') }}</div>
        <div class="flex re-tab">
            <!-- <div class="textColor1" :class="activeIndex == 0 ? 'active' : ''" @click="changeIndex(0)">{{
                $t('account')
            }}</div> -->
            <div class="textColor1" :class="activeIndex == 1 ? 'active' : ''" @click="changeIndex(1)">
                {{ $t('email') }}
            </div>
            <div class="textColor1" :class="activeIndex == 2 ? 'active' : ''" @click="changeIndex(2)">
                {{ $t('phoneNum') }}
            </div>
        </div>
        <ExInput :label="getRegType(activeIndex, true)" :placeholderText="getRegType(activeIndex, false)"
            v-model="username" :area="isArea" :dialCode="dialCode" @selectArea="onSelectArea" :icon="icon" />
        <ExInput :label="$t('repassword')" :placeholderText="$t('请输入')" v-model="password"
            typeText="password" />
        <!-- <ExInput :label="$t('repassword')" :placeholderText="$t('surePassword')" v-model="repassword"
            typeText="password" /> -->
        <ExInput :label="$t('fundsPassword')" :placeholderText="$t('请输入')" v-model="safeword" typeText="password"
            v-if="activeIndex === 1 || activeIndex === 2" />
        <div class="inputCom" v-if="activeIndex === 1 || activeIndex === 2">
            <p class="label  textColor">{{ $t('验证码') }}</p>
            <div class="iptbox inputBackground">
                <input class="inputBackground textColor" type="text" :placeholder="$t('entryVerifyCode')"
                    v-model="verifyCode">
                <span v-if="type !== 3" @click="senCode">{{ $t('sendVerifyCode') }}
                    <template v-if="time">({{ time }})s</template>
                </span>
            </div>
        </div>
        <!-- <ExInput :label="$t('金融机构代码')" :placeholderText="$t('请输入')" v-model="invitCode" :clearBtn="false" /> -->
        <div class="protocol textColor">
            <i @click="agreeProt">
                <img v-show="agree" src="../../assets/image/login/prot2.png" alt="" />
                <img v-show="!agree" src="../../assets/image/login/prot1.png" alt="" />
            </i>
            <!-- {{ $t('readAgree') }}<span class="colorMain" @click="router.push('/TermsOfService')">{{
                $t('serviceConf')
            }}</span> -->
            {{ $t('readAgree') }}<span class="colorMain" @click="router.push('/aboutUs?serviceTerm=23')">{{
                $t('serviceConf')
            }}</span>
        </div>
        <van-button class="w-full" style="margin-top:10px;" type="primary" @click="register">{{ $t('confirm') }}
        </van-button>
        <!-- <div class="noTips textColor">{{ $t('hasAccount') }}<span class="colorMain" @click="router.push('/login')">
                {{ $t('goLogin') }}</span>
        </div> -->
        <nationality-list ref='controlChildRef' :title="$t('selectArea')" @getName="getName"></nationality-list>
        <Vcode :imgs="[img1, img2]" :show="show" @success="onSuccess" :canvasHeight="200" @fail="onFail"
            @close="show = false;" sliderText='' :successText="$t('vertifyPass')" :failText="$t('vertifuFail')" />
        <div>{{ msg }}</div>
    </div>
</template>
<script setup>
import ExInput from "@/components/ex-input/index.vue";
import { _registerUser, _sendVerifyCode } from "@/service/login.api";
import { _bindEmailRegister, _registerEorP } from "@/service/user.api.js";
import { useUserStore } from '@/store/user';
import { GET_USERINFO } from '@/store/types.store'
import nationalityList from '../authentication/components/nationalityList.vue'
import Vcode from "vue3-puzzle-vcode";
import img1 from "@/assets/image/slider/1.png";
import img2 from "@/assets/image/slider/2.png";
import { getStorage } from '@/utils/index'
import { useI18n } from 'vue-i18n'
import { customerServiceUrl } from "@/config";
import { useRouter } from 'vue-router';
import { ref, onMounted, reactive, onUnmounted } from 'vue';
import { showToast } from "vant";
import store from '@/store/store'
const customer_service_url = ref(customerServiceUrl) // 客服链接,有值的话就会跳转到客服外链
const { t } = useI18n()
const router = useRouter()
const onRoute = (path) => {
    if (path == 'back') {
        router.go(-1)
    } else {
        if (path == '/customerService') {
            if (customer_service_url.value) {
                window.location.href = customer_service_url.value;
            } else {
                router.push(path)
            }
        } else {
            router.push(path)
        }
    }
}
const userStore = useUserStore();
let show = ref(false)
const msg = ref('')
const type = ref(1)
const time = ref(0)
let agree = ref(false)
const username = ref('')
const password = ref('')
const repassword = ref('')
const verifyCode = ref('')
const safeword = ref('')
const fundPassword = ref('')
const refundPassword = ref('')
const activeIndex = ref(1)
const typeText = ref('password')
let isArea = ref(false)
let dialCode = ref(0)
let icon = ref('')
const state = reactive({
    timer: null
})
let invitCode = ref('')
onMounted(() => {
    console.log(store)
    let usercode = getStorage('usercode')
    if (usercode) {
        invitCode = usercode;
    }
    clearInterval(state.timer)
    state.timer = null
})
onUnmounted(() => {
    clearInterval(state.timer)
    state.timer = null
})
const getRegType = (activeIndex, bFlag) => {
    switch (activeIndex) {
        case 0:
            return bFlag ? t('account') : t('entryAccount');
        case 1:
            return bFlag ? t('email') : t('entryEmail');
        case 2:
            return bFlag ? t('phoneNum') : t('entryPhone');
    }
}
const senCode = () => {
    if (time.value > 0) {
        return false
    }
    _sendVerifyCode({
        target: activeIndex.value === 1 ? username.value : dialCode.value + username.value,
    }).then((res) => {
        time.value = 30;
        state.timer = setInterval(() => {
            if (time.value > 0) {
                time.value = time.value - 1
            } else {
                time.value = 0;
                clearInterval(state.timer)
                state.timer = null
            }
        }, 1000);
    }).catch((error) => {
        showToast(t(error.msg));
    });
}
const onSuccess = () => {
    console.log('onSuccess')
    registerApi();
    show.value = false;
}
const onFail = () => {
    msg.value = ''
}
const onRefresh = () => {
    msg.value = ''
}
const controlChildRef = ref(null)
const onSelectArea = () => {
    controlChildRef.value.open();
}
const getName = (params) => {
    icon.value = params.code;
    dialCode.value = params.dialCode;
}
const agreeProt = () => {
    agree.value = !agree.value
}
const register = () => {
    console.log(activeIndex.value, 'activeIndex.value')
    if (activeIndex.value == 0) {
        if (username.value == '') {
            showToast(t('entryAccount'));
            return
        }
        if (username.value.length < 6 || username.value.length > 30) {
            showToast(t('accountLength'));
            return
        }
    } else if (activeIndex.value == 1) {
        let match = username.value.search(/@/);
        if (username.value == '' || match.value == -1) {
            showToast(t('entryCorrectEmail'));
            return
        }
        if (safeword.value == '') {
            showToast(t('safewordTips'));
            return
        }
        if (verifyCode.value.length < 6) {
            showToast(t('entryVerifyTips'));
            return
        }
    } else if (activeIndex.value == 2) {
        if (!(/(^[1-9]\d*$)/.test(username.value))) {
            showToast(t('entryPhone'));
            return
        }
        if (username.value == '') {
            showToast(t('entryPhone'));
            return
        }
    }
    if (password.value == '') {
        showToast(t('entryPassword'));
        return
    }
    if (password.value.length < 6) {
        showToast(t('passwordTips'));
        return
    }
    // if (repassword.value !== password.value) {
    //     showToast(t('noSamePassword'));
    //     return
    // }
    if (!agree.value) {
        showToast(t('agreeServiceCond'));
        return
    }
    show.value = true
}
const changeIndex = (index) => {
    activeIndex.value = index;
    if (index == 0 || index == 1) {
        isArea.value = false
    } else {
        isArea.value = true
    }
}
const registerApi = () => {
    switch (activeIndex.value) {
        case 0:
            {
                type.value = 3;
                break;
            }
        case 1:
            {
                type.value = 2;
                break;
            }
        case 2:
            {
                type.value = 1;
                break;
            }
    }
    _registerEorP({
        username: activeIndex.value === 1 ? username.value : dialCode.value + username.value,
        password: password.value,
        type: activeIndex.value === 1 ? '2' : '1',   // 2邮箱,1手机
        verifcode: verifyCode.value,
        safeword: safeword.value
    }).then((res) => {
        userStore[GET_USERINFO](res)
        store.state.user.userInfo = res
        // 其他操作??
        // router.push('/identity')
        router.push('/login')
    })
}
</script>
<style lang="scss" scoped>
.activeBKClick {
    &:active {
        background: $tab_background;
        opacity: 0.5;
    }
}
.activeClick {
    &:active {
        background: $mainbgWhiteColor;
        opacity: 0.5;
    }
}
.register {
    width: 100%;
    box-sizing: border-box;
    padding: 16px;
    font-size: 13px;
    background-color: $mainbgWhiteColor;
}
.top {
    padding-left: 9px;
    padding-top: 9px;
    img {
        width: 18px;
        height: 18px;
    }
}
.title {
    font-weight: 700;
    font-size: 26px;
    margin-top: 27px;
    margin-bottom: 33px;
}
.re-tab {
    margin-bottom: 22px;
    div {
        padding: 0 18px;
        height: 34px;
        line-height: 34px;
        text-align: center;
        border-radius: 4px;
        margin-right: 10px;
    }
    .active {
        // background: $US_tabActice_background;
        background: $bg_yellow;
        // color: $color_main;
        color: $text_color4;
    }
}
.forget {
    color: $color_main;
    font-size: 12px;
    line-height: 14px;
}
.noTips {
    margin-top: 24px;
}
.protocol {
    display: flex;
    align-items: center;
    height: 15px;
    i {
        width: 15px;
        height: 15px;
        margin-right: 9px;
        img {
            width: 100%;
            height: 100%;
        }
    }
}
.iptbox {
    height: 44px;
    margin-top: 8px;
    margin-bottom: 18px;
    padding: 0 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    border-radius: 6px;
    input {
        flex: 1;
        height: 100%;
        border: none;
    }
    span {
        color: $color_main;
    }
}
</style>