| | |
| | | <template> |
| | | <div class="pb-108 no_touch trade"> |
| | | <!-- <div class="px-30 pt-20"> |
| | | <div class="flex h-88 w-full box-border border-solid-grey rounded-lg"> |
| | | <div @click="$router.push('/exchange/exchangePage')" |
| | | class="font-bold font-32 flex justify-center items-center flex-1"> |
| | | <span class="h-60 lh-60 font-16 px-40 borderColor rounded-lg textColor">{{ $t('闪兑') }}</span> |
| | | </div> |
| | | <div class="font-bold flex font-32 justify-center items-center flex-1"> |
| | | <span class="h-60 lh-60 btnMain px-40 rounded-lg text-white font-16">{{ $t('现货') }}</span> |
| | | </div> |
| | | <div @click="$router.push({ path: '/wantBuy', query: { frompath: `/trade/${symbol}` } })" |
| | | class="font-bold font-32 flex justify-center items-center flex-1"> |
| | | <span class="h-60 lh-60 font-16 px-40 borderColor rounded-lg textColor">c2c</span> |
| | | </div> |
| | | </div> |
| | | </div> --> |
| | | <!-- :key="symbol"--> |
| | | <!-- 头部区 --> |
| | | <trade-head |
| | | :backFunc="() => $router.push('/')" |
| | | :symbol="symbol" |
| | | :price="price" |
| | | :range="range" |
| | | :isTrade="true" |
| | | @update-coin="onUpdate" |
| | | @data="quote = $event" |
| | | /> |
| | | <div class="pb-108 no_touch trade"> |
| | | <div class="typebox" style="display: flex;"> |
| | | <div :class="typeindex==index?'typebox_box':'typebox_boxa'" @click="typeclick(index)" |
| | | v-for="(item,index) in typelist" :key="index">{{item}}</div> |
| | | </div> |
| | | <div v-if="typeindex==0"> |
| | | <trade-head :backFunc="() => $router.push('/')" :symbol="symbol" :newname="newname" :price="price" :range="range" |
| | | :isTrade="true" @update-coin="onUpdate" @data="quote = $event" /> |
| | | |
| | | <div class="trade-buy-sell flex justify-between px-30 py-30"> |
| | | <keep-alive> |
| | | <trade-deep-data |
| | | :selectValue="selectValue" |
| | | @getList="getList" |
| | | :showType="showType" |
| | | :symbol="symbol" |
| | | v-if="symbol" |
| | | :price="price" |
| | | class="w-290 mr-30" |
| | | /> |
| | | </keep-alive> |
| | | <trade-order-area |
| | | :symbol="symbol" |
| | | :init-open="initOpen" |
| | | :init-close="initClose" |
| | | :price="price" |
| | | @ordered="onOrdered" |
| | | /> |
| | | </div> |
| | | <div class="trade-buy-sell flex justify-between px-30 py-30"> |
| | | <keep-alive> |
| | | <trade-deep-data :selectValue="selectValue" @getList="getList" :showType="showType" :symbol="symbol" |
| | | v-if="symbol" :price="price" class="w-290 mr-30" /> |
| | | </keep-alive> |
| | | <trade-order-area :symbol="symbol" :init-open="initOpena" :newname="newname" :init-close="initClose" :price="price" |
| | | @ordered="onOrdereda" /> |
| | | </div> |
| | | |
| | | <!-- 2222 --> |
| | | <!-- <div class="flex k-select-box"> |
| | | <div class="mt-20 mb-22 select-box" style="position: relative"> |
| | | <div |
| | | class="flex justify-between items-center w-full h-70" |
| | | @click="selectBtn" |
| | | > |
| | | <div class="pl-16 textColor" style="width: 80%">{{ title }}</div> |
| | | <img |
| | | src="@/assets/image/public/grey-select.png" |
| | | alt="select-icon" |
| | | class="w-22 h-11 pr-20" |
| | | /> |
| | | </div> |
| | | <div class="option-box" v-show="isShow"> |
| | | <div |
| | | class="font-30" |
| | | v-for="(item, index) in sortList" |
| | | :key="index" |
| | | @click="selectItem(item)" |
| | | > |
| | | {{ item.name }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div @click="isSelectShow = true"> |
| | | <img |
| | | src="@/assets/image/selectIcon.png" |
| | | alt="warn-icon" |
| | | class="w-36 h-30" |
| | | /> |
| | | </div> |
| | | </div> --> |
| | | <!-- <div class="h-16 diviLine"></div> --> |
| | | <div class="list-data"> |
| | | <div> |
| | | <div class="flex justify-between pb-20 items-center pt-10"> |
| | | <div class="flex pl-30"> |
| | | <template> |
| | | <div |
| | | class="px-10 py-10 flex items-center text-grey" |
| | | @click="tabClick('1')" |
| | | :class="tabType == '1' ? 'active-line' : ''" |
| | | > |
| | | {{ $t("当前委托") |
| | | <div class="list-data"> |
| | | <div> |
| | | <div class="flex justify-between pb-20 items-center pt-10"> |
| | | <div class="flex pl-30 mar-23"> |
| | | <template> |
| | | <div class="px-10 py-10 flex items-center text-grey" @click="tabClick('1')" |
| | | :class="tabType == '1' ? 'active-line' : ''"> |
| | | {{ $t("当前委托") |
| | | }}<span v-if="tabType == '1'">({{ entrustList.length }})</span> |
| | | </div> |
| | | <div |
| | | class="px-10 ml-50 py-10 flex items-center text-grey" |
| | | @click="tabClick('3')" |
| | | :class="tabType == '3' ? 'active-line' : ''" |
| | | > |
| | | {{ $t("历史委托") }} |
| | | </div> |
| | | <div |
| | | class="px-10 py-10 flex items-center ml-50 text-grey" |
| | | @click="tabClick('2')" |
| | | :class="tabType == '2' ? 'active-line' : ''" |
| | | > |
| | | {{ $t("资产") }} |
| | | </div> |
| | | </template> |
| | | </div> |
| | | <img |
| | | src="../../assets/image/public/record.png" |
| | | alt="record-img" |
| | | class="w-32 h-35 pr-30" |
| | | @click="goHistory" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div class="pl-32 pr-32 pb-100" v-if="tabType == '1'"> |
| | | <entrust-item |
| | | v-for="item in entrustList" |
| | | :key="item.order_no" |
| | | :entrust="item" |
| | | state="submitted" |
| | | @cancelOrder="cancelOrder" |
| | | /> |
| | | </div> |
| | | <div class="pl-32 pr-32 pb-100" v-else-if="tabType == '3'"> |
| | | <history-item |
| | | v-for="item in entrustList" |
| | | :key="item.order_no" |
| | | :coinPrice="coinPrice" |
| | | :entrust="item" |
| | | :state="item.state" |
| | | @cancelOrder="cancelOrder" |
| | | /> |
| | | </div> |
| | | <div class="pl-32 pr-32" v-else> |
| | | <div class="mb-20 border-b"> |
| | | <p class="font-28 text-grey mt-24 mb-42">{{ $t("当前币对资产") }}</p> |
| | | <ul> |
| | | <li |
| | | v-for="item in pairsList" |
| | | :key="item.symbol" |
| | | class="flex justify-between py-10" |
| | | > |
| | | <div class="flex items-center"> |
| | | <img |
| | | :src=" |
| | | </div> |
| | | <div class="px-10 ml-50 py-10 flex items-center text-grey" @click="tabClick('3')" |
| | | :class="tabType == '3' ? 'active-line' : ''"> |
| | | {{ $t("历史委托") }} |
| | | </div> |
| | | <div class="px-10 py-10 flex items-center ml-50 text-grey" @click="tabClick('2')" |
| | | :class="tabType == '2' ? 'active-line' : ''"> |
| | | {{ $t("资产") }} |
| | | </div> |
| | | </template> |
| | | </div> |
| | | <span @click="goHistory"> |
| | | <img src="@/assets/3x/names8.png" alt="record-img" class="w-32 h-35 pr-30" /> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | <div class="pl-32 pr-32 pb-100" v-if="tabType == '1'"> |
| | | <entrust-item v-for="item in entrustList" :key="item.order_no" :entrust="item" state="submitted" |
| | | @cancelOrder="cancelOrder" /> |
| | | </div> |
| | | <div class="pl-32 pr-32 pb-100" v-else-if="tabType == '3'"> |
| | | <history-item v-for="item in entrustList" :key="item.order_no" :coinPrice="coinPrice" |
| | | :entrust="item" :state="item.state" @cancelOrder="cancelOrder" /> |
| | | </div> |
| | | <div class="pl-32 pr-32" v-else> |
| | | <div class="mb-20 border-b"> |
| | | <p class="font-28 text-grey mt-24 mb-42">{{ $t("当前币对资产") }}</p> |
| | | <ul> |
| | | <li v-for="item in pairsList" :key="item.symbol" class="flex justify-between py-10"> |
| | | <div class="flex items-center"> |
| | | <img :src=" |
| | | item.symbol |
| | | ? `${HOST_URL}/wap/symbol/${item.symbol}.png` |
| | | : require('@/assets/loading-default.png') |
| | | " |
| | | class="w-52 h-52 rounded-full mr-16" |
| | | /> |
| | | <p class="flex flex-col"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | " class="w-52 h-52 rounded-full mr-16" /> |
| | | <p class="flex flex-col"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | item.symbol.toUpperCase() |
| | | }}</strong> |
| | | <span class="font-20 text-grey">{{ item.full_name }}</span> |
| | | </p> |
| | | </div> |
| | | <div class="flex flex-col items-end text-grey"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | <span class="font-20 text-grey">{{ item.full_name }}</span> |
| | | </p> |
| | | </div> |
| | | <div class="flex flex-col items-end text-grey"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | item.volume |
| | | }}</strong> |
| | | <span class="font-20 text-grey"> |
| | | {{ currency.currency_symbol }} |
| | | {{ |
| | | <span class="font-20 text-grey"> |
| | | {{ currency.currency_symbol }} |
| | | {{ |
| | | item.usdt ? (item.usdt * currency.rate).toFixed(2) : "0.0" |
| | | }} |
| | | </span> |
| | | </div> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | <div class="mb-60 border-b"> |
| | | <p class="font-28 text-grey mt-24 mb-42">{{ $t("其他非0资产") }}</p> |
| | | <ul> |
| | | <li |
| | | v-for="item in no_zeroList" |
| | | :key="item.symbol" |
| | | class="flex justify-between py-10" |
| | | > |
| | | <div class="flex items-center"> |
| | | <img |
| | | :src=" |
| | | </span> |
| | | </div> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | <div class="mb-60 border-b"> |
| | | <p class="font-28 text-grey mt-24 mb-42">{{ $t("其他非0资产") }}</p> |
| | | <ul> |
| | | <li v-for="item in no_zeroList" :key="item.symbol" class="flex justify-between py-10"> |
| | | <div class="flex items-center"> |
| | | <img :src=" |
| | | item.symbol |
| | | ? `${HOST_URL}/wap/symbol/${item.symbol}.png` |
| | | : require('@/assets/loading-default.png') |
| | | " |
| | | class="w-52 h-52 rounded-full mr-16" |
| | | /> |
| | | <p class="flex flex-col"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | " class="w-52 h-52 rounded-full mr-16" /> |
| | | <p class="flex flex-col"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | item.symbol.toUpperCase() |
| | | }}</strong> |
| | | <span class="font-20 text-grey">{{ item.full_name }}</span> |
| | | </p> |
| | | </div> |
| | | <div class="flex flex-col items-end"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | <span class="font-20 text-grey">{{ item.full_name }}</span> |
| | | </p> |
| | | </div> |
| | | <div class="flex flex-col items-end"> |
| | | <strong class="font-28 textColor mb-6">{{ |
| | | item.volume |
| | | }}</strong> |
| | | <span class="font-20 text-grey"> |
| | | {{ currency.currency_symbol }} |
| | | {{ |
| | | <span class="font-20 text-grey"> |
| | | {{ currency.currency_symbol }} |
| | | {{ |
| | | item.usdt ? (item.usdt * currency.rate).toFixed(2) : "0.0" |
| | | }} |
| | | </span> |
| | | </div> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | <div |
| | | v-if="tabType == '1' && !entrustList.length" |
| | | class="flex flex-col justify-center items-center pt-155 pb-100" |
| | | > |
| | | <img |
| | | src="@/assets/image/assets-center/no-data.png" |
| | | alt="no-date" |
| | | class="w-180 h-180" |
| | | /> |
| | | <p class="textColor">{{ $t("暂无数据") }}</p> |
| | | </div> |
| | | </div> |
| | | <div class="fixed w-full shadow z-10 tabBackground1"> |
| | | <div class="flex justify-between px-30 py-10"> |
| | | <span class="font-24 textColor2" |
| | | >{{ symbol.toUpperCase() }}/USDT {{ $t("k线图表") }}</span |
| | | > |
| | | <van-icon |
| | | class="textColor" |
| | | @click.stop="showCharts = !showCharts" |
| | | :name="showCharts ? 'arrow-down' : 'arrow-up'" |
| | | ></van-icon> |
| | | </div> |
| | | <k-line-charts |
| | | :update-key="updateKey" |
| | | :update-data="quote" |
| | | :symbol="symbol" |
| | | v-if="symbol && showCharts" |
| | | :showBottom="false" |
| | | /> |
| | | </div> |
| | | <van-action-sheet |
| | | v-model="isSelectShow" |
| | | @select="onSelect" |
| | | :actions="actions" |
| | | :cancel-text="$t('取消')" |
| | | close-on-click-action |
| | | @cancel="onCancel" |
| | | /> |
| | | </div> |
| | | </span> |
| | | </div> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | <div v-if="tabType == '1' && !entrustList.length" |
| | | class="flex flex-col justify-center items-center pt-155 pb-100"> |
| | | <img src="@/assets/image/assets-center/no-data.png" alt="no-date" class="w-180 h-180" /> |
| | | <p class="textColor">{{ $t("暂无数据") }}</p> |
| | | </div> |
| | | </div> |
| | | <div class="fixed w-full shadow z-10 tabBackground1"> |
| | | <div class="flex justify-between px-30 py-10"> |
| | | <span class="font-24 textColor2"> |
| | | {{ newname }} {{ $t("k线图表") }} |
| | | </span> |
| | | <van-icon class="textColor" @click.stop="showCharts = !showCharts" |
| | | :name="showCharts ? 'arrow-down' : 'arrow-up'"></van-icon> |
| | | </div> |
| | | <k-line-charts :update-key="updateKey" :update-data="quote" :symbol="symbol" v-if="symbol && showCharts" |
| | | :showBottom="false" /> |
| | | </div> |
| | | <van-action-sheet v-model="isSelectShow" @select="onSelect" :actions="actions" :cancel-text="$t('取消')" |
| | | close-on-click-action @cancel="onCancel" /> |
| | | </div> |
| | | <div v-if="typeindex==1"> |
| | | <aaa></aaa> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import TradeHead from "@/components/trade-head/index.vue"; |
| | | import TradeOrderArea from "@/components/trade-order-area/index.vue"; |
| | | import TradeDeepData from "@/components/trade-deep-data/index.vue"; |
| | | import EntrustItem from "@/components/entrust-item"; |
| | | import KLineCharts from "@/components/kline-charts"; |
| | | import historyItem from "@/components/history-item"; |
| | | import ContractHeader from "@/components/contract-header/index.vue"; |
| | | import PerpetualOpen from "@/components/perpetual-open/index.vue"; |
| | | import PerpetualOrder from "@/components/perpetual-order/index.vue"; |
| | | |
| | | import { |
| | | _getBalance, |
| | | _getDeepData, |
| | | _initOpen, |
| | | _initClose, |
| | | _orderListCur, |
| | | _orderListHold, |
| | | _futrueOrderInit, |
| | | _futrueOrderList, |
| | | } from "@/API/trade.api"; |
| | | var showLength = 7; |
| | | |
| | | |
| | | import TradeHead from "@/components/trade-head/index.vue"; |
| | | import TradeOrderArea from "@/components/trade-order-area/index.vue"; |
| | | import TradeDeepData from "@/components/trade-deep-data/index.vue"; |
| | | import EntrustItem from "@/components/entrust-item"; |
| | | import KLineCharts from "@/components/kline-charts"; |
| | | import historyItem from "@/components/history-item"; |
| | | import aaa from "../../page/perpetualContract/index.vue" |
| | | import Axios from "@/API/trading"; |
| | | import { |
| | | _getHomeList |
| | | } from "@/API/home.api"; |
| | | import { |
| | | Popup, |
| | | Swipe, |
| | | SwipeItem, |
| | | Circle, |
| | | Icon, |
| | | ActionSheet |
| | | } from "vant"; |
| | | import { |
| | | mapActions, |
| | | mapGetters |
| | | } from "vuex"; |
| | | import { |
| | | SET_COIN_LIST |
| | | } from "@/store/const.store"; |
| | | import { |
| | | WS_URL, |
| | | HOST_URL |
| | | } from "@/config"; |
| | | import TradeApi from "@/API/trading.js"; |
| | | import { |
| | | getStorage |
| | | } from "@/utils/utis"; |
| | | |
| | | import Axios from "@/API/trading"; |
| | | import { _getHomeList } from "@/API/home.api"; |
| | | import { Popup, Swipe, SwipeItem, Circle, Icon, ActionSheet } from "vant"; |
| | | import { mapActions, mapGetters } from "vuex"; |
| | | import { SET_COIN_LIST } from "@/store/const.store"; |
| | | import { WS_URL, HOST_URL } from "@/config"; |
| | | import TradeApi from "@/API/trading.js"; |
| | | import { getStorage } from "@/utils/utis"; |
| | | |
| | | export default { |
| | | name: "TradePage", |
| | | components: { |
| | | TradeHead, |
| | | TradeOrderArea, |
| | | TradeDeepData, |
| | | [Popup.name]: Popup, |
| | | [Swipe.name]: Swipe, |
| | | [SwipeItem.name]: SwipeItem, |
| | | [Circle.name]: Circle, |
| | | [Icon.name]: Icon, |
| | | [ActionSheet.name]: ActionSheet, |
| | | EntrustItem, |
| | | KLineCharts, |
| | | historyItem, |
| | | }, |
| | | computed: { |
| | | ...mapGetters("user", ["userInfo"]), |
| | | ...mapGetters({ |
| | | coinList: "home/coinList", |
| | | currency: "home/currency", |
| | | }), |
| | | }, |
| | | data() { |
| | | const initArr = []; |
| | | for (let i = 0; i < 8; i++) { |
| | | initArr.push({ |
| | | volume: "--", |
| | | price: "--", |
| | | }); |
| | | } |
| | | return { |
| | | HOST_URL, |
| | | quote: {}, |
| | | showCharts: false, |
| | | updateKey: 1, |
| | | initTimer: null, |
| | | keyIndex: 0, |
| | | timeout: null, |
| | | timer: null, // 底部持仓等的公用定时器 |
| | | timer2: null, // 交割合约底部持仓等的公用定时器 |
| | | symbol: "", |
| | | price: "", |
| | | range: "", |
| | | initOpen: {}, |
| | | initClose: {}, |
| | | asks: initArr, // 卖单 |
| | | bids: initArr, // 买单 |
| | | orderCur: [], // 当前委托 |
| | | orderHold: [], // 持有仓位 |
| | | futrueHold: [], // 交割持仓 |
| | | futrueHistroy: [], // 交割历史 |
| | | socket: null, // 行情 |
| | | sockets: { |
| | | quotes: null, // 行情 |
| | | deep: null, /// 深度 |
| | | }, |
| | | curTab: "", // 当前委托还是持有仓位 |
| | | selectIndex: 1, // 当前tab |
| | | initFutrue: {}, /// 交割合约 |
| | | show: false, // popup |
| | | entrustList: [], //当前委托订单 |
| | | tabType: 1, |
| | | no_zeroList: [], //其他非0资产数组 |
| | | pairsList: {}, //当前资产 |
| | | // curRequest: [], // |
| | | isShow: false, |
| | | title: 1, |
| | | isSelectShow: false, |
| | | actions: [ |
| | | { name: this.$t("默认"), value: 0, className: "actions-active" }, |
| | | { name: this.$t("展示买单"), value: 1, className: "" }, |
| | | { name: this.$t("展示卖单"), value: 2, className: "" }, |
| | | ], |
| | | showType: 0, |
| | | sortList: [], |
| | | selectValue: 0, |
| | | coinPrice: 0, |
| | | }; |
| | | }, |
| | | async created() { |
| | | if (!this.coinList.length) { |
| | | await this.SET_COIN_LIST(); |
| | | } |
| | | }, |
| | | methods: { |
| | | ...mapActions("home", [SET_COIN_LIST]), |
| | | onUpdate(symbol) { |
| | | // 更新 |
| | | this.symbol = symbol; |
| | | this.closeSocket(); |
| | | this.init(symbol); |
| | | }, |
| | | getCoinPrce(val) { |
| | | _getHomeList(val).then((res) => { |
| | | this.coinPrice = res[0].close; |
| | | }); |
| | | }, |
| | | tabClick(type) { |
| | | this.tabType = type; |
| | | if (type == 2 && !this.userInfo.token) { |
| | | this.$router.push("/login"); |
| | | return; |
| | | } |
| | | this.entrustList = []; |
| | | this.getOrderList(); |
| | | }, |
| | | onOrdered(evt) { |
| | | // 下单过后的回调 |
| | | this.clearTimer(); |
| | | // this.clearTimeout() |
| | | this.initParam(this.symbol, evt); // 重新初始化 |
| | | //console.log('下单后更新数据') |
| | | }, |
| | | onTab(evt) { |
| | | // 点击tab后的回调 |
| | | console.log("evt", evt); |
| | | this.clearTimer(); |
| | | // this.clearTimeout() |
| | | this.curTab = evt; |
| | | this[evt](this.symbol); |
| | | }, |
| | | handleQoutes(data) { |
| | | if (data && data.length) { |
| | | const cur = data[0]; |
| | | this.price = cur.close; |
| | | this.range = cur.change_ratio + ""; |
| | | this.quote = cur; |
| | | this.updateKey++; |
| | | } |
| | | }, |
| | | startQuoteSocket() { |
| | | // 行情socket |
| | | console.log("symbol", this.symbol); |
| | | if (!this.symbol) { |
| | | return; |
| | | } |
| | | this.socket = new WebSocket(`${WS_URL}/1/${this.symbol}`); |
| | | this.socket.onmessage = (evt) => { |
| | | const { data } = evt; |
| | | const { code, data: _data } = JSON.parse(data); |
| | | if (code / 1 === 0) { |
| | | this.handleQoutes(_data); |
| | | } |
| | | }; |
| | | }, |
| | | initParam(symbol, type) { |
| | | // 初始化参数 |
| | | if (type === "open" || !type) { |
| | | //console.log('开仓数据') |
| | | Axios.tradeBuyToken({}).then((res) => { |
| | | this.initOpen = res.data; |
| | | console.log(this.initOpen.volume, res.data.volume, type); |
| | | }); |
| | | } |
| | | if (type === "close" || !type) { |
| | | Axios.tradeSellToken({ |
| | | symbol, |
| | | }).then((res) => { |
| | | this.initClose = res.data; |
| | | }); |
| | | } |
| | | this.getWallet(); |
| | | if (this.userInfo.token) { |
| | | this.getOrderList(); |
| | | } |
| | | }, |
| | | init(symbol) { |
| | | // 初始化页面 |
| | | this.symbol = symbol.toLowerCase(); |
| | | if (!this.socket) { |
| | | this.startQuoteSocket(); |
| | | } |
| | | this.initParam(symbol); // 'open' |
| | | this.clearTimer(); |
| | | this.getCoinPrce(symbol); |
| | | }, |
| | | closeSocket() { |
| | | this.socket && this.socket.close(); |
| | | this.socket = null; |
| | | }, |
| | | clearTimer() { |
| | | clearInterval(this.timer); |
| | | this.timer = null; |
| | | }, |
| | | tradeBuy() { |
| | | Axios.tradeBuy({ |
| | | volume: 1, |
| | | session_token: "", |
| | | symbol: "", |
| | | price: 1, |
| | | order_price_type: "", //limit限价 opponent市价 |
| | | }) |
| | | .then((res) => { |
| | | console.log(res); |
| | | }) |
| | | .catch((error) => { |
| | | if (error.code === "ECONNABORTED") { |
| | | this.$toast(this.$t("网络超时!")); |
| | | } else if (error.msg !== undefined) { |
| | | this.$toast(this.$t(error.msg)); |
| | | } |
| | | }); |
| | | }, |
| | | getOrderList() { |
| | | TradeApi.tradeRecord({ |
| | | page_no: 1, |
| | | symbol: this.$route.params.symbol, |
| | | type: this.tabType == 1 ? "orders" : "hisorders", |
| | | }) |
| | | .then((res) => { |
| | | console.log(res.data); |
| | | this.entrustList = res.data; |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | cancelOrder(order) { |
| | | TradeApi.tradeCancel({ |
| | | order_no: order, |
| | | }) |
| | | .then((res) => { |
| | | this.initParam(this.symbol); |
| | | this.$toast(this.$t("成功")); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | getWallet() { |
| | | TradeApi.getPairs({ |
| | | pairs: `${this.symbol}/usdt`, |
| | | }).then((res) => { |
| | | this.pairsList = res.data.pairs; |
| | | this.no_zeroList = res.data.no_zero; |
| | | }); |
| | | }, |
| | | goHistory() { |
| | | this.$router.push(`/tradeRecord/${this.symbol}`); |
| | | }, |
| | | //价格类型下拉框切换 |
| | | selectBtn() { |
| | | this.isShow = !this.isShow; |
| | | }, |
| | | //选择价格类型 |
| | | selectItem(item) { |
| | | this.title = item.name; |
| | | this.isShow = false; |
| | | this.selectValue = item.value; |
| | | }, |
| | | onSelect(item) { |
| | | this.showType = item.value; |
| | | this.actions.map((item) => { |
| | | item.className = ""; |
| | | }); |
| | | item.className = "actions-active"; |
| | | }, |
| | | onCancel() { |
| | | this.isSelectShow = false; |
| | | }, |
| | | getList(val) { |
| | | if (val.numberLength <= 2) { |
| | | this.title = val.arry[0].name; |
| | | } else { |
| | | this.title = val.arry[val.arry.length - 1].name; |
| | | } |
| | | this.sortList = val.arry; |
| | | }, |
| | | }, |
| | | beforeRouteEnter(to, from, next) { |
| | | let { |
| | | params: { symbol }, |
| | | } = to; |
| | | console.log("to", to); |
| | | let catchTradeSymbol = getStorage("tradeSymbol"); |
| | | if (catchTradeSymbol) { |
| | | symbol = catchTradeSymbol; |
| | | } |
| | | console.log(catchTradeSymbol); |
| | | if (symbol) { |
| | | next((vm) => { |
| | | vm.symbol = symbol; |
| | | vm.init(symbol); |
| | | }); |
| | | } else { |
| | | next(); |
| | | } |
| | | }, |
| | | activated() { |
| | | // if (!this.socket) { |
| | | // this.startQuoteSocket() |
| | | // } |
| | | }, |
| | | deactivated() { |
| | | this.closeSocket(); |
| | | this.clearTimer(); |
| | | }, |
| | | beforeDestroy() { |
| | | this.closeSocket(); |
| | | // this.clearTimeout(true) |
| | | this.clearTimer(); |
| | | }, |
| | | }; |
| | | export default { |
| | | name: "TradePage", |
| | | components: { |
| | | ContractHeader, |
| | | PerpetualOpen, |
| | | PerpetualOrder, |
| | | [Popup.name]: Popup, |
| | | [Swipe.name]: Swipe, |
| | | [SwipeItem.name]: SwipeItem, |
| | | KLineCharts, |
| | | TradeHead, |
| | | TradeOrderArea, |
| | | TradeDeepData, |
| | | [Popup.name]: Popup, |
| | | [Swipe.name]: Swipe, |
| | | [SwipeItem.name]: SwipeItem, |
| | | [Circle.name]: Circle, |
| | | [Icon.name]: Icon, |
| | | [ActionSheet.name]: ActionSheet, |
| | | EntrustItem, |
| | | KLineCharts, |
| | | historyItem, |
| | | aaa |
| | | }, |
| | | computed: { |
| | | ...mapGetters("user", ["userInfo"]), |
| | | ...mapGetters({ |
| | | coinList: "home/coinList", |
| | | currency: "home/currency", |
| | | }), |
| | | }, |
| | | watch: { |
| | | selectIndex(val) { |
| | | showLength = 7; |
| | | }, |
| | | }, |
| | | data() { |
| | | const initArr = []; |
| | | for (let i = 0; i < showLength; i++) { |
| | | initArr.push({ |
| | | amount: "--", |
| | | price: "--", |
| | | }); |
| | | } |
| | | // const initArr = []; |
| | | // for (let i = 0; i < 8; i++) { |
| | | // initArr.push({ |
| | | // volume: "--", |
| | | // price: "--", |
| | | // }); |
| | | // } |
| | | return { |
| | | quote: {}, |
| | | initTimer: null, |
| | | keyIndex: 0, |
| | | timeout: null, |
| | | timer: null, // 底部持仓等的公用定时器 |
| | | timer1: null, // tab切换动画 |
| | | timer2: null, // 交割合约底部持仓等的公用定时器 |
| | | balance: 0, |
| | | symbol: "", |
| | | price: "", |
| | | range: "", |
| | | stop_price_profit: "", |
| | | stop_price_loss: "", |
| | | initClose: {}, |
| | | asks: initArr, // 卖单 |
| | | bids: initArr, // 买单 |
| | | orderCur: [], // 当前委托 |
| | | orderHold: [], // 持有仓位 |
| | | futrueHold: [], // 交割持仓 |
| | | futrueHistroy: [], // 交割历史 |
| | | sockets: { |
| | | quotes: null, // 行情 |
| | | deep: null, /// 深度 |
| | | }, |
| | | curTab: "", // 当前委托还是持有仓位 |
| | | selectIndex: 1, // 当前tab |
| | | initFutrue: {}, /// 交割合约 |
| | | show: false, // popup |
| | | animated1: false, |
| | | animated2: false, |
| | | newname:'', |
| | | currentType: "", |
| | | showCharts: false, |
| | | // curRequest: [], // |
| | | |
| | | HOST_URL, |
| | | quote: {}, |
| | | typelist: [this.$t("交易"), this.$t("合约")], |
| | | typeindex: 0, |
| | | showCharts: false, |
| | | updateKey: 1, |
| | | initTimer: null, |
| | | keyIndex: 0, |
| | | timeout: null, |
| | | timer: null, // 底部持仓等的公用定时器 |
| | | timer2: null, // 交割合约底部持仓等的公用定时器 |
| | | symbol: "", |
| | | price: "", |
| | | range: "", |
| | | initOpena: {}, |
| | | initOpen: {}, |
| | | initClose: {}, |
| | | asks: initArr, // 卖单 |
| | | bids: initArr, // 买单 |
| | | orderCur: [], // 当前委托 |
| | | orderHold: [], // 持有仓位 |
| | | name:'', |
| | | futrueHold: [], // 交割持仓 |
| | | futrueHistroy: [], // 交割历史 |
| | | socket: null, // 行情 |
| | | sockets: { |
| | | quotes: null, // 行情 |
| | | deep: null, /// 深度 |
| | | }, |
| | | curTab: "", // 当前委托还是持有仓位 |
| | | selectIndex: 1, // 当前tab |
| | | initFutrue: {}, /// 交割合约 |
| | | show: false, // popup |
| | | entrustList: [], //当前委托订单 |
| | | tabType: 1, |
| | | no_zeroList: [], //其他非0资产数组 |
| | | pairsList: {}, //当前资产 |
| | | // curRequest: [], // |
| | | isShow: false, |
| | | title: 1, |
| | | isSelectShow: false, |
| | | actions: [{ |
| | | name: this.$t("默认"), |
| | | value: 0, |
| | | className: "actions-active" |
| | | }, |
| | | { |
| | | name: this.$t("展示买单"), |
| | | value: 1, |
| | | className: "" |
| | | }, |
| | | { |
| | | name: this.$t("展示卖单"), |
| | | value: 2, |
| | | className: "" |
| | | }, |
| | | ], |
| | | showType: 0, |
| | | sortList: [], |
| | | selectValue: 0, |
| | | coinPrice: 0, |
| | | }; |
| | | }, |
| | | async created() { |
| | | if (!this.coinList.length) { |
| | | await this.SET_COIN_LIST(); |
| | | } |
| | | _getBalance().then((data) => { |
| | | // 获取用户余额 |
| | | this.$store.commit("user/SET_USERINFO", { balance: data.money }); |
| | | // const { money } = data |
| | | // this.balance = money |
| | | }); |
| | | }, |
| | | mounted() { |
| | | this.GET_UERS_KYC(); |
| | | let symbol = this.$route.params.symbol; |
| | | let type = this.$route.params.aa; |
| | | let catchSymbol = getStorage("symbol"); |
| | | if (!symbol && catchSymbol) { |
| | | symbol = catchSymbol; |
| | | } |
| | | if (this.selectIndex / 1 === 2) { |
| | | this.curTab = "fetchFutrueHoldList"; |
| | | } else { |
| | | this.curTab = "fetchOrderListHold"; |
| | | } |
| | | this.symbol = symbol; |
| | | if(this.typeindex==0){ |
| | | this.inita(symbol); |
| | | }else{ |
| | | this.init(symbol); |
| | | } |
| | | }, |
| | | methods: { |
| | | ...mapActions("home", [SET_COIN_LIST]), |
| | | ...mapActions("user", ["GET_UERS_KYC"]), |
| | | typeclick(e) { |
| | | this.typeindex = e |
| | | if(e==0){ |
| | | this.initParama(this.symbol) |
| | | }else{ |
| | | this.symbol = 'wld' |
| | | this.initParam(this.symbol) |
| | | } |
| | | this.$forceUpdate() |
| | | }, |
| | | onUpdate(symbol,name) { |
| | | // 更新 |
| | | this.symbol = symbol; |
| | | this.newname = name |
| | | this.closeSocket(); |
| | | if(this.typeindex==0){ |
| | | this.closeSocketa(); |
| | | }else{ |
| | | this.closeSocket(); |
| | | } |
| | | if(this.typeindex==0){ |
| | | this.inita(symbol); |
| | | }else{ |
| | | this.init(symbol); |
| | | } |
| | | }, |
| | | onRecall() { |
| | | // 撤单or 平仓 evt |
| | | this.clearTimer(); |
| | | _orderListHold(this.symbol).then((data) => { |
| | | this.orderHold = data; |
| | | }); |
| | | this[this.curTab](this.symbol); |
| | | _initOpen(this.symbol).then((data) => { |
| | | this.initOpen = data; |
| | | }); |
| | | }, |
| | | onTopTab(evt) { |
| | | // 当前tab 永续/交割 |
| | | this.keyIndex += 1; |
| | | this.selectIndex = evt; |
| | | this.clearTimer(); |
| | | if (this.selectIndex / 1 === 1) { |
| | | //this.curTab = 'fetchOrderListCur' |
| | | this.curTab = "fetchOrderListHold"; |
| | | // this.animated1 = true |
| | | // this.timer = setTimeout(() => { |
| | | // this.animated1 = false |
| | | // clearTimeout(this.timer) |
| | | // }, 200) |
| | | this.animated2 = true; |
| | | this.timer1 = setTimeout(() => { |
| | | this.animated2 = false; |
| | | clearTimeout(this.timer1); |
| | | }, 200); |
| | | } else { |
| | | // this.animated2 = true |
| | | // this.timer = setTimeout(() => { |
| | | // this.animated2 = false |
| | | // clearTimeout(this.timer) |
| | | // }, 200) |
| | | this.animated1 = true; |
| | | this.timer1 = setTimeout(() => { |
| | | this.animated1 = false; |
| | | clearTimeout(this.timer1); |
| | | }, 200); |
| | | } |
| | | console.log(this.curTab); |
| | | this[this.curTab](this.symbol); |
| | | }, |
| | | getCoinPrce(val) { |
| | | _getHomeList(val).then((res) => { |
| | | this.coinPrice = res[0].close; |
| | | }); |
| | | }, |
| | | tabClick(type) { |
| | | this.tabType = type; |
| | | if (type == 2 && !this.userInfo.token) { |
| | | this.$router.push("/login"); |
| | | return; |
| | | } |
| | | this.entrustList = []; |
| | | this.getOrderList(); |
| | | }, |
| | | changeCurrentType(type) { |
| | | this.currentType = type; |
| | | }, |
| | | fetchOrderListHold(symbol) { |
| | | // 当前持仓 |
| | | if (!symbol) { |
| | | return; |
| | | } |
| | | if (this.userInfo.token) { |
| | | _orderListHold(symbol).then((data) => { |
| | | // this.orderHold = data |
| | | this.orderHold = data.sort(this.sortData); |
| | | }); |
| | | this.timer = setInterval(() => { |
| | | _orderListHold(symbol).then((data) => { |
| | | // if (typeof this.timer === 'string') { |
| | | // this.timer = null |
| | | // return |
| | | // } |
| | | // this.orderHold = data |
| | | this.orderHold = data.sort(this.sortData); |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | this.orderHold = []; |
| | | } |
| | | }, |
| | | fetchFutrueHoldList(symbol) { |
| | | if (!symbol) { |
| | | return; |
| | | } |
| | | // 交割持仓 |
| | | if (this.userInfo.token) { |
| | | let length = 0; |
| | | _futrueOrderList(symbol).then((data) => { |
| | | // this.futrueHold = data |
| | | this.futrueHold = data.sort(this.sortData); |
| | | length = data.length; |
| | | }); |
| | | this.timer = setInterval(() => { |
| | | _futrueOrderList(symbol).then((data) => { |
| | | // if (typeof this.timer === 'string') { |
| | | // this.timer = null |
| | | // return |
| | | // } |
| | | |
| | | this.futrueHold = data.sort(this.sortData); |
| | | if (length != data.length) { |
| | | length = data.length; |
| | | _futrueOrderInit(symbol).then((dataList) => { |
| | | this.initFutrue = dataList; |
| | | }); |
| | | } |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | this.futrueHold = []; |
| | | } |
| | | }, |
| | | fetchFutrueHistory(symbol) { |
| | | // 交割历史持仓 |
| | | _futrueOrderList(symbol, "hisorders").then((data) => { |
| | | this.futrueHistroy = data; |
| | | // this.clearTimeout() |
| | | }); |
| | | }, |
| | | onOrdereda(evt) { |
| | | // 下单过后的回调 |
| | | this.clearTimer(); |
| | | // this.clearTimeout() |
| | | if(this.typeindex==0){ |
| | | this.initParama(this.symbol, evt); // 重新初始化 |
| | | }else{ |
| | | this.initParam(this.symbol, evt); // 重新初始化 |
| | | } |
| | | //console.log('下单后更新数据') |
| | | }, |
| | | onOrdered(evt) { |
| | | // 下单过后的回调 |
| | | this.clearTimer(); |
| | | // this.clearTimeout() |
| | | if(this.typeindex==0){ |
| | | this.initParama(this.symbol, evt); // 重新初始化 |
| | | }else{ |
| | | this.initParam(this.symbol, evt); // 重新初始化 |
| | | } |
| | | // TODO: 这里要做判断 |
| | | if (this.selectIndex / 1 === 1) { |
| | | this[this.curTab](this.symbol); // 重新调取记录 |
| | | console.log("this.curTab", this.curTab); |
| | | } else { |
| | | // 交割合约 |
| | | this[this.curTab](this.symbol); |
| | | // this.show = true |
| | | console.log("curTab", evt, this.curTab); |
| | | } |
| | | //console.log('下单后更新数据') |
| | | }, |
| | | changeValueBack(val) { |
| | | if (val == 0) { |
| | | showLength = 7; |
| | | } else { |
| | | showLength = 13; |
| | | } |
| | | }, |
| | | onTab(evt) { |
| | | // 点击tab后的回调 |
| | | console.log("evt", evt); |
| | | this.clearTimer(); |
| | | // this.clearTimeout() |
| | | this.curTab = evt; |
| | | this[evt](this.symbol); |
| | | }, |
| | | fetchQoutes(symbol) { |
| | | // 获取当前行情 |
| | | // symbol.order = "desc" |
| | | _getHomeList(symbol).then((data) => { |
| | | // 获取行情 |
| | | this.handleQoutes(data); |
| | | this.startQuoteSocket(); // socket |
| | | if(this.typeindex==0){ |
| | | this.startQuoteSocketa(); // socket |
| | | }else{ |
| | | this.startQuoteSocket(); // socket |
| | | } |
| | | }); |
| | | }, |
| | | handleQoutes(data) { |
| | | if (data && data.length) { |
| | | const cur = data[0]; |
| | | this.price = cur.close; |
| | | this.newname = cur.name; |
| | | this.range = cur.change_ratio + ""; |
| | | this.quote = cur; |
| | | this.updateKey++; |
| | | } |
| | | }, |
| | | fetchDeepData(symbol) { |
| | | console.log("sd"); |
| | | _getDeepData(symbol).then((data) => { |
| | | // 获取深度 |
| | | console.log(data); |
| | | this.handleDeep(data); |
| | | this.startDeepSocket(); // socket |
| | | }); |
| | | }, |
| | | handleDeep(data) { |
| | | if (this.symbol !== data.symbol) { |
| | | return; |
| | | } |
| | | this.deepData = data; |
| | | const { asks, bids } = data; |
| | | this.asks = asks.sort((a, b) => a.price - b.price).slice(0, showLength); |
| | | this.bids = bids.sort((a, b) => a.price - b.price).slice(-showLength); |
| | | }, |
| | | fetchOrderListCur(symbol) { |
| | | // 当前委托 |
| | | //console.log('当前委托') |
| | | if (this.userInfo.token) { |
| | | _orderListCur(symbol).then((data) => { |
| | | this.orderCur = data; |
| | | }); |
| | | this.clearTimer(); |
| | | this.timer = setInterval(() => { |
| | | _orderListCur(symbol).then((data) => { |
| | | // if (typeof this.timer === 'string') { |
| | | // this.timer = null |
| | | // return |
| | | // } |
| | | this.orderCur = data; |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | this.orderCur = []; |
| | | } |
| | | }, |
| | | startDeepSocket() { |
| | | // 开启socket链接 |
| | | if(this.typeindex==0){ |
| | | this.closeSocketa(); |
| | | }else{ |
| | | this.closeSocket(); |
| | | } |
| | | |
| | | this.socket = new WebSocket(`${WS_URL}/3/${this.symbol}`); |
| | | |
| | | this.socket.onopen = () => { |
| | | console.log("WebSocket connection established"); |
| | | }; |
| | | |
| | | this.socket.onmessage = (evt) => { |
| | | const { data } = evt; |
| | | const { code, data: _data } = JSON.parse(data); |
| | | if (code / 1 === 0) { |
| | | this.handleDeep(_data); |
| | | } |
| | | }; |
| | | |
| | | this.socket.onerror = (error) => { |
| | | console.error("WebSocket error:", error); |
| | | setTimeout(this.startDeepSocket, 5000); // 5秒后尝试重新连接 |
| | | }; |
| | | |
| | | this.socket.onclose = (event) => { |
| | | console.log("WebSocket connection closed:", event); |
| | | // 重新连接,可以根据需求添加重连的逻辑,这里只是简单的示例 |
| | | }; |
| | | }, |
| | | startQuoteSocketa() { |
| | | // 行情socket |
| | | console.log("symbol", this.symbol); |
| | | if (!this.symbol) { |
| | | return; |
| | | } |
| | | this.socket = new WebSocket(`${WS_URL}/1/${this.symbol}`); |
| | | this.socket.onmessage = (evt) => { |
| | | const { |
| | | data |
| | | } = evt; |
| | | const { |
| | | code, |
| | | data: _data |
| | | } = JSON.parse(data); |
| | | // console.log(_data); |
| | | if (code / 1 === 0) { |
| | | this.handleQoutes(_data); |
| | | } |
| | | }; |
| | | }, |
| | | initParama(symbol, type) { |
| | | // 初始化参数 |
| | | if (type === "open" || !type) { |
| | | //console.log('开仓数据') |
| | | Axios.tradeBuyToken({}).then((res) => { |
| | | this.initOpena = res.data; |
| | | console.log(this.initOpen.volume, res.data.volume, type); |
| | | }); |
| | | } |
| | | if (type === "close" || !type) { |
| | | Axios.tradeSellToken({ |
| | | symbol, |
| | | }).then((res) => { |
| | | this.initClose = res.data; |
| | | }); |
| | | } |
| | | this.getWallet(); |
| | | if (this.userInfo.token) { |
| | | this.getOrderList(); |
| | | } |
| | | }, |
| | | initParam(symbol, type) { |
| | | // 初始化参数 |
| | | if (type === "open" || type === "long" || type === "short" || !type) { |
| | | let initFunTimer = null; |
| | | let initFun = () => { |
| | | _initOpen(symbol) |
| | | .then((data) => { |
| | | this.initOpen = data; |
| | | clearTimeout(initFunTimer); |
| | | initFunTimer = null; |
| | | }) |
| | | .catch((err) => { |
| | | initFunTimer = setTimeout(() => { |
| | | initFun(); |
| | | }, 3000); |
| | | }); |
| | | }; |
| | | initFun(); |
| | | } |
| | | if (type === "close" || !type) { |
| | | let initFunTimer = null; |
| | | let initFun = () => { |
| | | _initClose(symbol) |
| | | .then((data) => { |
| | | this.initClose = data; |
| | | console.log(this.initClose); |
| | | clearTimeout(initFunTimer); |
| | | initFunTimer = null; |
| | | }) |
| | | .catch((err) => { |
| | | initFunTimer = setTimeout(() => { |
| | | initFun(); |
| | | }, 3000); |
| | | }); |
| | | }; |
| | | initFunTimer = setTimeout(() => { |
| | | initFun(); |
| | | }, 600); |
| | | } |
| | | if (type === "futrue" || !type) { |
| | | _futrueOrderInit(symbol).then((data) => { |
| | | this.initFutrue = data; |
| | | }); |
| | | } |
| | | }, |
| | | init(symbol) { |
| | | // 初始化页面 |
| | | this.symbol = symbol.toLowerCase(); |
| | | this.fetchQoutes(symbol); |
| | | this.fetchDeepData(symbol); |
| | | this.initParam(symbol); // 'open' |
| | | this.clearTimer(); |
| | | //if (this.curTab === 'fetchOrderListCur') { |
| | | if (this.curTab === "fetchOrderListHold") { |
| | | //this.fetchOrderListCur(symbol) |
| | | this.fetchOrderListHold(symbol); |
| | | } else { |
| | | this.fetchFutrueHoldList(symbol); |
| | | } |
| | | }, |
| | | inita(symbol) { |
| | | // 初始化页面 |
| | | this.symbol = symbol.toLowerCase(); |
| | | if (!this.socket) { |
| | | if(this.typeindex==0){ |
| | | this.startQuoteSocketa(); // socket |
| | | }else{ |
| | | this.startQuoteSocket(); // socket |
| | | } |
| | | } |
| | | // this.initParam(symbol); // 'open' |
| | | if(this.typeindex==0){ |
| | | this.initParama(symbol); // 'open' |
| | | }else{ |
| | | this.initParam(symbol); // 'open' |
| | | } |
| | | this.clearTimer(); |
| | | this.getCoinPrce(symbol); |
| | | }, |
| | | closeSocketa() { |
| | | this.socket && this.socket.close(); |
| | | this.socket = null; |
| | | }, |
| | | closeSocket() { |
| | | this.sockets.quotes && this.sockets.quotes.close(); |
| | | this.sockets.deep && this.sockets.deep.close(); |
| | | this.sockets.quotes = null; |
| | | this.sockets.deep = null; |
| | | }, |
| | | clearTimer() { |
| | | clearInterval(this.timer); |
| | | this.timer = null; |
| | | }, |
| | | tradeBuy() { |
| | | Axios.tradeBuy({ |
| | | volume: 1, |
| | | session_token: "", |
| | | symbol: "", |
| | | price: 1, |
| | | order_price_type: "", //limit限价 opponent市价 |
| | | }) |
| | | .then((res) => { |
| | | console.log(res); |
| | | }) |
| | | .catch((error) => { |
| | | if (error.code === "ECONNABORTED") { |
| | | this.$toast(this.$t("网络超时!")); |
| | | } else if (error.msg !== undefined) { |
| | | this.$toast(this.$t(error.msg)); |
| | | } |
| | | }); |
| | | }, |
| | | getOrderList() { |
| | | TradeApi.tradeRecord({ |
| | | page_no: 1, |
| | | symbol: this.$route.params.symbol, |
| | | type: this.tabType == 1 ? "orders" : "hisorders", |
| | | }) |
| | | .then((res) => { |
| | | console.log(res.data); |
| | | this.entrustList = res.data; |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | cancelOrder(order) { |
| | | TradeApi.tradeCancel({ |
| | | order_no: order, |
| | | }) |
| | | .then((res) => { |
| | | if(this.typeindex==0){ |
| | | this.initParama(this.symbol); |
| | | }else{ |
| | | this.initParam(this.symbol); |
| | | } |
| | | this.$toast(this.$t("成功")); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | getWallet() { |
| | | TradeApi.getPairs({ |
| | | pairs: `${this.symbol}/usdt`, |
| | | }).then((res) => { |
| | | this.pairsList = res.data.pairs; |
| | | this.no_zeroList = res.data.no_zero; |
| | | }); |
| | | }, |
| | | goHistory() { |
| | | this.$router.push(`/tradeRecord/${this.symbol}`); |
| | | }, |
| | | //价格类型下拉框切换 |
| | | selectBtn() { |
| | | this.isShow = !this.isShow; |
| | | }, |
| | | //选择价格类型 |
| | | selectItem(item) { |
| | | this.title = item.name; |
| | | this.isShow = false; |
| | | this.selectValue = item.value; |
| | | }, |
| | | onSelect(item) { |
| | | this.showType = item.value; |
| | | this.actions.map((item) => { |
| | | item.className = ""; |
| | | }); |
| | | item.className = "actions-active"; |
| | | }, |
| | | onCancel() { |
| | | this.isSelectShow = false; |
| | | }, |
| | | getList(val) { |
| | | if (val.numberLength <= 2) { |
| | | this.title = val.arry[0].name; |
| | | } else { |
| | | this.title = val.arry[val.arry.length - 1].name; |
| | | } |
| | | this.sortList = val.arry; |
| | | }, |
| | | }, |
| | | startQuoteSocket() { |
| | | // 行情socket |
| | | this.sockets.quotes = new WebSocket(`${WS_URL}/1/${this.symbol}`); |
| | | // socket.onopen = () => { |
| | | // console.log('open') |
| | | // socket.send('hello') |
| | | // } |
| | | this.sockets.quotes.onmessage = (evt) => { |
| | | const { data } = evt; |
| | | const { code, data: _data } = JSON.parse(data); |
| | | if (code / 1 === 0) { |
| | | this.handleQoutes(_data); |
| | | } |
| | | }; |
| | | }, |
| | | |
| | | beforeRouteEnter(to, from, next) { |
| | | var that = this |
| | | let { |
| | | params: { |
| | | symbol |
| | | }, |
| | | } = to; |
| | | let catchTradeSymbol = getStorage("tradeSymbol"); |
| | | if (catchTradeSymbol) { |
| | | symbol = catchTradeSymbol; |
| | | } |
| | | if (symbol) { |
| | | // debugger |
| | | // if(that.typeindex==0){ |
| | | // next((vm) => { |
| | | // vm.symbol = symbol; |
| | | // vm.inita(symbol); |
| | | // }); |
| | | // }else{ |
| | | next((vm) => { |
| | | vm.symbol = symbol; |
| | | vm.init(symbol); |
| | | }); |
| | | // } |
| | | |
| | | } else { |
| | | next(); |
| | | } |
| | | }, |
| | | activated() { |
| | | let symbol = this.$route.params.symbol; |
| | | let catchSymbol = getStorage("symbol"); |
| | | if (!symbol && catchSymbol) { |
| | | symbol = catchSymbol; |
| | | } |
| | | if (this.selectIndex / 1 === 2) { |
| | | this.curTab = "fetchFutrueHoldList"; |
| | | } else { |
| | | this.curTab = "fetchOrderListHold"; |
| | | } |
| | | this.symbol = symbol; |
| | | if(this.typeindex==0){ |
| | | this.inita(symbol); |
| | | }else{ |
| | | this.init(symbol); |
| | | } |
| | | }, |
| | | activated() { |
| | | this.currentType = this.$route.query.currentType |
| | | ? this.$route.query.currentType |
| | | : "long"; |
| | | }, |
| | | deactivated() { |
| | | if(this.typeindex==0){ |
| | | this.closeSocketa(); |
| | | }else{ |
| | | this.closeSocket(); |
| | | } |
| | | this.clearTimer(); |
| | | }, |
| | | |
| | | |
| | | beforeDestroy() { |
| | | if(this.typeindex==0){ |
| | | this.closeSocketa(); |
| | | }else{ |
| | | this.closeSocket(); |
| | | } |
| | | // this.clearTimeout(true) |
| | | this.clearTimer(); |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | //.list-enter-active, .list-leave-active { |
| | | // transition: all .5s; |
| | | // transform: translateY(30px) |
| | | //} |
| | | //.list-enter, .list-leave-to |
| | | // /* .list-leave-active for below version 2.1.8 */ { |
| | | // transform: translateY(0) |
| | | //} |
| | | //.list-enter-active, .list-leave-active { |
| | | // transition: all .5s; |
| | | // transform: translateY(30px) |
| | | //} |
| | | //.list-enter, .list-leave-to |
| | | // /* .list-leave-active for below version 2.1.8 */ { |
| | | // transform: translateY(0) |
| | | //} |
| | | .typebox_box { |
| | | width: 50%; |
| | | background-color: #9691fa; |
| | | color: #fff; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | |
| | | .no_touch { |
| | | -webkit-user-select: none; |
| | | user-select: none; |
| | | -ms-user-select: none; |
| | | -moz-user-select: none; |
| | | .typebox_boxa { |
| | | width: 50%; |
| | | background-color: #fff; |
| | | color: #9691fa; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | |
| | | @include themify() { |
| | | background: themed("main_background"); |
| | | } |
| | | .no_touch { |
| | | -webkit-user-select: none; |
| | | user-select: none; |
| | | -ms-user-select: none; |
| | | -moz-user-select: none; |
| | | |
| | | min-height: 100vh; |
| | | } |
| | | @include themify() { |
| | | background: themed("main_background"); |
| | | } |
| | | |
| | | .list-enter-active, |
| | | .list-leave-active { |
| | | will-change: transform; |
| | | transition: all 250ms; |
| | | } |
| | | min-height: 100vh; |
| | | } |
| | | |
| | | .list-enter { |
| | | opacity: 0; |
| | | transform: translate3d(-100%, 0, 0); |
| | | } |
| | | .typebox { |
| | | width: 100%; |
| | | height: 100px; |
| | | |
| | | .list-leave { |
| | | opacity: 0; |
| | | transform: translate3d(100%, 0, 0); |
| | | } |
| | | } |
| | | |
| | | .rounded-view { |
| | | border-top-left-radius: 20px; |
| | | border-top-right-radius: 20px; |
| | | padding: 0 30px; |
| | | box-sizing: border-box; |
| | | } |
| | | .list-enter-active, |
| | | .list-leave-active { |
| | | will-change: transform; |
| | | transition: all 250ms; |
| | | } |
| | | |
| | | .my-swipe { |
| | | width: 100%; |
| | | } |
| | | .list-enter { |
| | | opacity: 0; |
| | | transform: translate3d(-100%, 0, 0); |
| | | } |
| | | |
| | | .active-line { |
| | | position: relative; |
| | | // padding: 15px 0; |
| | | color: #9691fa; |
| | | font-weight: 600; |
| | | .list-leave { |
| | | opacity: 0; |
| | | transform: translate3d(100%, 0, 0); |
| | | } |
| | | |
| | | @include themify() { |
| | | // background-color: themed("color_main"); |
| | | } |
| | | } |
| | | .rounded-view { |
| | | border-top-left-radius: 20px; |
| | | border-top-right-radius: 20px; |
| | | padding: 0 30px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | // .active-line::after { |
| | | // content: ''; |
| | | // position: absolute; |
| | | // left: 50%; |
| | | // transform: translateX(-50%); |
| | | // bottom: 0; |
| | | // right: 0; |
| | | // width: 280px; |
| | | // height: 8px; |
| | | // @include themify() { |
| | | // background-color: themed("color_main"); |
| | | // } |
| | | // } |
| | | .my-swipe { |
| | | width: 100%; |
| | | } |
| | | |
| | | .shadow { |
| | | bottom: 108px; |
| | | box-sizing: border-box; |
| | | } |
| | | .active-line { |
| | | position: relative; |
| | | // padding: 15px 0; |
| | | color: #9691fa; |
| | | font-weight: 600; |
| | | |
| | | // .textColor { |
| | | // color: #DAD5DC; |
| | | // } |
| | | @include themify() { |
| | | // background-color: themed("color_main"); |
| | | } |
| | | } |
| | | |
| | | .borderColor, |
| | | .border-solid-grey { |
| | | @include themify() { |
| | | border: 1px solid themed("border_color"); |
| | | } |
| | | } |
| | | // .active-line::after { |
| | | // content: ''; |
| | | // position: absolute; |
| | | // left: 50%; |
| | | // transform: translateX(-50%); |
| | | // bottom: 0; |
| | | // right: 0; |
| | | // width: 280px; |
| | | // height: 8px; |
| | | // @include themify() { |
| | | // background-color: themed("color_main"); |
| | | // } |
| | | // } |
| | | |
| | | .tabBackground1 { |
| | | @include themify() { |
| | | border: 1px solid themed("border_color1"); |
| | | } |
| | | } |
| | | .shadow { |
| | | bottom: 108px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | // 下拉 |
| | | .option-box { |
| | | position: absolute; |
| | | left: 0; |
| | | right: 0; |
| | | top: 90px; |
| | | width: 100%; |
| | | // .textColor { |
| | | // color: #DAD5DC; |
| | | // } |
| | | |
| | | @include themify() { |
| | | background: themed("grey_bg"); |
| | | } |
| | | .borderColor, |
| | | .border-solid-grey { |
| | | @include themify() { |
| | | border: 1px solid themed("border_color"); |
| | | } |
| | | } |
| | | |
| | | text-align: center; |
| | | border-radius: 4px; |
| | | .tabBackground1 { |
| | | @include themify() { |
| | | border: 1px solid themed("border_color1"); |
| | | } |
| | | } |
| | | |
| | | @include themify() { |
| | | color: themed("text_color3"); |
| | | } |
| | | // 下拉 |
| | | .option-box { |
| | | position: absolute; |
| | | left: 0; |
| | | right: 0; |
| | | top: 90px; |
| | | width: 100%; |
| | | |
| | | z-index: 10; |
| | | } |
| | | @include themify() { |
| | | background: themed("grey_bg"); |
| | | } |
| | | |
| | | .option-box > div { |
| | | padding: 30px 0; |
| | | } |
| | | text-align: center; |
| | | border-radius: 4px; |
| | | |
| | | .option-box > div:hover { |
| | | // background-color: #F5F5F5; |
| | | } |
| | | @include themify() { |
| | | color: themed("text_color3"); |
| | | } |
| | | |
| | | .k-select-box { |
| | | position: relative; |
| | | top: -130px; |
| | | // justify-content: flex-end; |
| | | padding: 0 30px; |
| | | align-items: center; |
| | | z-index: 10; |
| | | } |
| | | |
| | | .select-box { |
| | | width: 220px; |
| | | .option-box>div { |
| | | padding: 30px 0; |
| | | } |
| | | |
| | | @include themify() { |
| | | background: themed("input_background"); |
| | | } |
| | | .option-box>div:hover { |
| | | // background-color: #F5F5F5; |
| | | } |
| | | |
| | | margin-right: 20px; |
| | | } |
| | | } |
| | | .k-select-box { |
| | | position: relative; |
| | | top: -130px; |
| | | // justify-content: flex-end; |
| | | padding: 0 30px; |
| | | align-items: center; |
| | | |
| | | .van-popup { |
| | | @include themify() { |
| | | background: themed("color_main"); |
| | | } |
| | | } |
| | | .select-box { |
| | | width: 220px; |
| | | |
| | | .actions-active { |
| | | @include themify() { |
| | | background: themed("color_main") !important; |
| | | } |
| | | } |
| | | @include themify() { |
| | | background: themed("input_background"); |
| | | } |
| | | |
| | | .trade { |
| | | ::v-deep .van-action-sheet__item, |
| | | ::v-deep .van-action-sheet__cancel { |
| | | @include themify() { |
| | | background: themed("input_background1"); |
| | | } |
| | | margin-right: 20px; |
| | | } |
| | | } |
| | | |
| | | @include themify() { |
| | | color: themed("text_color"); |
| | | } |
| | | } |
| | | .van-popup { |
| | | @include themify() { |
| | | background: themed("color_main"); |
| | | } |
| | | } |
| | | |
| | | ::v-deep .van-action-sheet__gap { |
| | | @include themify() { |
| | | background: themed("cont_background"); |
| | | } |
| | | } |
| | | } |
| | | .actions-active { |
| | | @include themify() { |
| | | background: themed("color_main") !important; |
| | | } |
| | | } |
| | | |
| | | .list-data { |
| | | margin: 30px; |
| | | min-height: 550px; |
| | | box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.05); |
| | | // |
| | | } |
| | | </style> |
| | | .trade { |
| | | |
| | | ::v-deep .van-action-sheet__item, |
| | | ::v-deep .van-action-sheet__cancel { |
| | | @include themify() { |
| | | background: themed("input_background1"); |
| | | } |
| | | |
| | | @include themify() { |
| | | color: themed("text_color"); |
| | | } |
| | | } |
| | | |
| | | ::v-deep .van-action-sheet__gap { |
| | | @include themify() { |
| | | background: themed("cont_background"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .list-data { |
| | | margin: 30px; |
| | | min-height: 550px; |
| | | box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.05); |
| | | // |
| | | } |
| | | |
| | | //.list-enter-active, .list-leave-active { |
| | | // transition: all .5s; |
| | | // transform: translateY(30px) |
| | | //} |
| | | //.list-enter, .list-leave-to |
| | | // /* .list-leave-active for below version 2.1.8 */ { |
| | | // transform: translateY(0) |
| | | //} |
| | | .no_touch { |
| | | -webkit-user-select: none; |
| | | user-select: none; |
| | | -ms-user-select: none; |
| | | -moz-user-select: none; |
| | | padding-bottom: 150px !important; |
| | | } |
| | | |
| | | .list-enter-active, |
| | | .list-leave-active { |
| | | will-change: transform; |
| | | transition: all 250ms; |
| | | } |
| | | |
| | | .list-enter { |
| | | opacity: 0; |
| | | transform: translate3d(-100%, 0, 0); |
| | | } |
| | | |
| | | .list-leave { |
| | | opacity: 0; |
| | | transform: translate3d(100%, 0, 0); |
| | | } |
| | | |
| | | .rounded-view { |
| | | border-top-left-radius: 20px; |
| | | border-top-right-radius: 20px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .my-swipe { |
| | | width: 100%; |
| | | } |
| | | |
| | | .my-swipe .van-swipe-item { |
| | | } |
| | | |
| | | .line { |
| | | height: 13px; |
| | | |
| | | @include themify() { |
| | | background: themed("tab_background"); |
| | | } |
| | | } |
| | | |
| | | @keyframes animate1 { |
| | | 0% { |
| | | opacity: 1; |
| | | transform: translate3d(100%, 0, 0); |
| | | } |
| | | |
| | | // 40% { |
| | | // opacity: 1; |
| | | // transform: translate3d(50%, 0, 0); |
| | | // } |
| | | 100% { |
| | | opacity: 1; |
| | | transform: translate3d(0%, 0, 0); |
| | | } |
| | | } |
| | | |
| | | @keyframes animate2 { |
| | | 0% { |
| | | opacity: 1; |
| | | transform: translate3d(-100%, 0, 0); |
| | | } |
| | | |
| | | // 40% { |
| | | // opacity: 1; |
| | | // transform: translate3d(50%, 0, 0); |
| | | // } |
| | | 100% { |
| | | opacity: 1; |
| | | transform: translate3d(0%, 0, 0); |
| | | } |
| | | } |
| | | |
| | | .slide1 { |
| | | animation: animate1 200ms linear; |
| | | } |
| | | |
| | | .slide2 { |
| | | animation: animate2 200ms linear; |
| | | } |
| | | |
| | | .line { |
| | | @include themify() { |
| | | background: themed("divi_line"); |
| | | } |
| | | } |
| | | |
| | | ::v-deep .contract-header { |
| | | @include themify() { |
| | | background: themed("main_background"); |
| | | } |
| | | } |
| | | |
| | | .tabBackground1 { |
| | | @include themify() { |
| | | border: 1px solid themed("border_color1"); |
| | | } |
| | | } |
| | | |
| | | .shadow { |
| | | bottom: 108px; |
| | | box-sizing: border-box; |
| | | } |
| | | </style> |