import { watch } from "vue"; import { getCoinInfo, getPoolPower, getMinerCount, getLuck, getBlockInfo, getNetPower, getParam } from "../../api/home" import { line } from "../../utils/echarts"; import * as echarts from "echarts"; import { Debounce, throttle } from "../../utils/publicMethods"; export default { data() { return { activeName: "second", option: { tooltip: { trigger: "axis", //解决tooltip显示不全问题1 confine: true, formatter: function (params) { var res res = params[0].axisValueLabel; for (let i = 0; i <= params.length - 1; i++) { if (params[i].seriesName == "Currency Price" || params[i].seriesName == "币价") { res += `
${params[i].marker} ${params[i].seriesName}      ${params[i].value} USD` } else { res += `
${params[i].marker} ${params[i].seriesName}      ${params[i].value}` } } return res; }, }, legend: { right: "30", }, // grid: {//解决Y轴显示不全 // left: "10%",//10% // containLabel: true // }, grid: { left: "10%", right: "15%", top: "20%", bottom: "12%", }, xAxis: { // type: "time", boundaryGap: false, // axisTick: { // //去除刻度 // show: false, // }, // axisLine: { // //去除轴线 // show: false, // }, data: [] }, yAxis: [ { // position: "left", type: "value", name: "GH/s", nameTextStyle: { padding: [0, 0, 0, -40], }, // min: `dataMin`, // max: `dataMax`, axisLabel: { formatter: function (value) { // let data // if (value > 10000000) { // data = `${(value / 10000000)} KW` // } else if (value > 1000000) { // data = `${(value / 1000000)} M` // } else if (value / 10000) { // data = `${(value / 10000)} W` // } return value } } }, { position: "right", // type: "log", // splitNumber: "5", show: true, // min: 0, // max: this.maxValue, splitLine: {//不显示右侧Y轴横线 show: false }, name: "USD", nameTextStyle: { padding: [0, 0, 0, 40], } }, ], dataZoom: [ { type: "inside", start: 0, end: 100, maxSpan: 100, minSpan: 2, animation: false, }, { type: "inside",//slider start: 0, end: 100, // showDetail: false, }, ], series: [ { name: "Computational power", type: "line", smooth: false, //线条是否圆滑 symbol: "circle", symbolSize: 5, showSymbol: false, itemStyle: { color: "#5721E4", borderColor: "rgba(221,220,107,0.1)", borderWidth: 12, }, lineStyle: { //线条样式 color: "#5721E4", width: "2", }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgb(210,195,234)' }, { offset: 1, color: 'rgb(255, 255, 255)' } ]) }, zlevel: 1, z: 1, data: [], }, { name: "Refusal rate", type: "line", smooth: false, //线条是否圆滑 symbol: "circle", symbolSize: 5, showSymbol: false, itemStyle: { color: "#FE2E74", borderColor: "rgba(221,220,107,0.1)", borderWidth: 12, }, lineStyle: { //线条样式 color: "#FE2E74", width: "2", }, areaStyle: { origin: 'start',//颜色始终显示在线条下 color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgb(252,220,233)' }, { offset: 1, color: 'rgb(255, 255, 255)' } ]) }, data: [], yAxisIndex: 1, zlevel: 2, z: 2, }, ], }, minerOption: { legend: { right: "50", formatter: function (name) { return name; }, }, tooltip: { trigger: "axis", textStyle: { align: "left", }, animation: false, confine: true, formatter: function (params) { var res = params[0].axisValueLabel; for (let i = 0; i <= params.length - 1; i++) { if (params[i].seriesName == "Currency Price" || params[i].seriesName == "币价") { res += `
${params[i].marker} ${params[i].seriesName}      ${params[i].value} USD` } else { res += `
${params[i].marker} ${params[i].seriesName}      ${params[i].value}` } } return res; }, // axisPointer: { // animation: false, // snap: true, // label: { // precision: 2, //坐标轴保留的位数 // }, // type: "cross", //cross shadow // crossStyle: { // //十字轴横线 // // opacity: "0", // width: 0.5, // }, // lineStyle: { // // opacity: 0, // }, // }, }, grid: { left: "10%", right: "15%", top: "20%", bottom: "12%", }, xAxis: { // type: "time", boundaryGap: false, axisTick: { //去除刻度 show: false, }, axisLine: { //去除轴线 show: false, }, data: [] }, yAxis: [ { position: "left", type: "value", // min: `dataMin`, // max: `dataMax`, name: "GH/s", nameTextStyle: { padding: [0, 0, 0, -40], }, axisLabel: { formatter: function (value) { // let data // if (value > 10000000) { // data = `${(value / 10000000)} KW` // } else if (value > 1000000) { // data = `${(value / 1000000)} M` // } else if (value / 10000) { // data = `${(value / 10000)} W` // } return value } } }, { position: "right", // type: "log", // splitNumber: "5", show: true, // min: 0, // max: this.maxValue, splitLine: {//不显示右侧Y轴横线 show: false }, name: "USD", nameTextStyle: { padding: [0, 0, 0, 40], } }, ], dataZoom: [ { type: "inside", start: 0, end: 100, maxSpan: 100, minSpan: 2, animation: false, }, { type: "inside",//slider start: 0, end: 100, // showDetail: false, }, ], series: [ { name: "全网算力", type: "line", smooth: false, //线条是否圆滑 symbol: "circle", symbolSize: 5, showSymbol: false, itemStyle: { color: "#5721E4", borderColor: "rgba(221,220,107,0.1)", borderWidth: 12, }, lineStyle: { //线条样式 color: "#5721E4", width: "2", }, areaStyle: { origin: 'start', color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgb(210,195,234)' }, { offset: 1, color: 'rgb(255, 255, 255)' } ]) }, data: [], }, { name: "币价", type: "line", smooth: false, //线条是否圆滑 symbol: "circle", symbolSize: 5, showSymbol: false, itemStyle: { color: "#FE2E74", borderColor: "rgba(221,220,107,0.1)", borderWidth: 12, }, lineStyle: { //线条样式 color: "#FE2E74", width: "2", }, // rgb(253,64,128) areaStyle: { origin: 'start',//颜色始终显示在线条下 color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgb(252,220,233)' }, { offset: 1, color: 'rgb(255, 255, 255)' } ]) }, data: [], yAxisIndex: 1, zlevel: 2, z: 2, }, ], }, CountOption: { ...line }, powerDialogVisible: false, minerDialogVisible: false, currentPage: 1, currency: "nexa", currencyPath: `${this.$baseApi}img/nexa.png`, currencyList: [ { path: "nexaAccess", value: "nexa", label: "nexa", img: require("../../assets/img/currency-nexa.png"), imgUrl: `${this.$baseApi}img/nexa.png`, name: "course.NEXAcourse", show: true, amount: 10000, }, { path: "grsAccess", value: "grs", label: "grs", img: require("../../assets/img/currency/grs.svg"), imgUrl: `${this.$baseApi}img/grs.svg`, name: "course.GRScourse", show: true, amount: 1, }, { path: "monaAccess", value: "mona", label: "mona", img: require("../../assets/img/currency/mona.svg"), imgUrl: `${this.$baseApi}img/mona.svg`, name: "course.MONAcourse", show: true, amount: 1, }, { path: "dgbsAccess", value: "dgbs", // label: "dgb-skein-pool1", label: "dgb(skein)", img: require("../../assets/img/currency/DGB.svg"), imgUrl: `${this.$baseApi}img/dgb.svg`, name: "course.dgbsCourse", show: true, amount: 1, }, { path: "dgbqAccess", value: "dgbq", // label: "dgb(qubit-pool1)", label: "dgb(qubit)", img: require("../../assets/img/currency/DGB.svg"), imgUrl: `${this.$baseApi}img/dgb.svg`, name: "course.dgbqCourse", show: true, amount: 1, }, { path: "dgboAccess", value: "dgbo", // label: "dgb-odocrypt-pool1", label: "dgb(odocrypt)", img: require("../../assets/img/currency/DGB.svg"), imgUrl: `${this.$baseApi}img/dgb.svg`, name: "course.dgboCourse", show: true, amount: 1, }, { path: "rxdAccess", value: "rxd", label: "radiant(rxd)", img: require("../../assets/img/currency/rxd.png"), imgUrl: `${this.$baseApi}img/rxd.png`, name: "course.RXDcourse", show: true, amount: 100, }, { path: "enxAccess", value: "enx", label: "Entropyx(enx)", img: require("../../assets/img/currency/enx.svg"), imgUrl: `${this.$baseApi}img/enx.svg`, name: "course.ENXcourse", show: true, amount: 5000, }, { path: "alphminingPool", value: "alph", label: "alephium", img: require("../../assets/img/currency/alph.svg"), imgUrl: `${this.$baseApi}img/alph.svg`, name: "course.alphCourse", show: true, amount: 1, }, // { //告知已删除此币种 Radiant // value: "dgb2_odo", // label: "dgb-odocrypt-pool2", // img: require("../../assets/img/currency/DGB.svg"), // imgUrl: "https://s2.coinmarketcap.com/static/img/coins/64x64/109.png", // }, // { // value: "dgb_qubit_a10", // label: "dgb-qubit-pool2", // img: require("../../assets/img/currency/DGB.svg"), // imgUrl: "https://s2.coinmarketcap.com/static/img/coins/64x64/109.png", // }, // { // value: "dgb_skein_a10", // label: "dgb-skein-pool2", // img: require("../../assets/img/currency/DGB.svg"), // imgUrl: "https://s2.coinmarketcap.com/static/img/coins/64x64/109.png", // }, // { // value: "dgb_odo_b20", // label: "dgb-odoscrypt-pool3", // img: require("../../assets/img/currency/DGB.svg"), // imgUrl: "https://s2.coinmarketcap.com/static/img/coins/64x64/109.png", // }, ], params: { coin: "nexa", interval: "rt", }, PowerParams: { coin: "nexa", interval: "rt", }, BlockInfoParams: { coin: "nexa", limit: 10, page: 1, }, CoinData: { algorithm: "", height: "", totalDifficulty: "", totalPower: "", price: "", poolPower: "", poolMc: "", }, luckData: { luck3d: "96.26 %", luck7d: "96.26 %", luck30d: "96.26 %", luck90d: "96.26 %", }, BlockInfoData: [ // { // height: "847545", // date: "2024-06-12 09:11:57", // hash: "00000…9392577", // reward: "3.12500000", // fees: "0.40962024", // }, // { // height: "847545", // date: "2024-06-12 09:11:57", // hash: "00000…9942577", // reward: "3.12500000", // fees: "0.40962024", // }, { // height: "847545", // date: "2024-06-12 09:11:57", // hash: "00000…9925757", // reward: "3.12500000", // fees: "0.40962024", // }, { // height: "847545", // date: "2024-06-12 09:11:57", // hash: "00000…9925677", // reward: "3.12500000", // fees: "0.40962024", // }, { // height: "847545", // date: "2024-06-12 09:11:57", // hash: "00000…9925877", // reward: "3.12500000", // fees: "0.40962024", // }, { // height: "847545", // date: "2024-06-12 09:11:57", // hash: "00000…9928577", // reward: "3.12500000", // fees: "0.40962024", // }, ], intervalList: [ // { // value: "1h", // label: "home.hour", // }, { value: "rt", label: "home.realTime", }, { value: "1d", label: "home.day", }, ], offset: 0, itemWidth: 30, // 每个小容器(包含图片)的宽度 listWidth: 1000, // 整个图片列表的宽度(10 个小容器的宽度总和) itemActive: "nexa", timeActive: "rt", powerActive: true, minerChartLoading: false, newBlockInfoData: [ // { // height:"556", // date:"", // hash:"SDJFIOSJISJIODJIFJ", // reward:"545", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, // { // height:"5556", // date:"", // hash:"SDJFIOSJISJ66IODJIFJ", // reward:"5465", // fees:"56", // }, ], reportBlockLoading: false, BlockShow: true, showCalculator: false, value: "nexa", input3: "", select: "GH/s", selectTime: [ { value: "day", label: "home.everyDay", }, { value: "week", label: "home.weekly", }, { value: "month", label: "home.monthly", }, { value: "year", label: "home.annually", }, ], time: "day", input: "", inputPower: 1, profit: "", factor: "", CalculatorData: { hpb: "10", reward: "20", price: "30", costTime: "600", poolFee: "0.15", }, transactionFeeList: [//没有交易费 { label: "grs", coin: "grs", feeShow: false, }, { label: "mona", coin: "mona", feeShow: false, }, { label: "radiant", coin: "rxd", feeShow: false, }, // { // label:"dgb(skein)", // coin: "dgbs", // feeShow: false, // }, // { // coin: "dgbq", // label:"dgb(qubit)", // feeShow: false, // }, // { // coin: "dgbo", // label: "dgb(odocrypt)", // feeShow: false, // }, ], FeeShow: true, lang: 'en', activeItemCoin: { value: "nexa", label: "nexa", img: require("../../assets/img/currency-nexa.png"), imgUrl: `${this.$baseApi}img/nexa.png`, }, isInternalChange: false, }; }, watch: { "$i18n.locale": (val) => { location.reload();//刷新页面 刷新echarts }, activeItemCoin: { handler(newVal) { // 防止无限循环 if (this.isInternalChange) { return; } this.handleActiveItemChange(newVal); }, deep: true } }, mounted() { this.lang = this.$i18n.locale; // 初始化语言值 this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(this.currencyList[0])) this.minerChartLoading = true if (this.$isMobile) { this.option.yAxis[1].show = false this.option.grid.left = "16%" this.option.grid.right = "5%" this.option.grid.top = "10%" this.option.grid.bottom = "45%" this.option.legend.bottom = 5 this.option.legend.right = "30%" this.option.xAxis.axisLabel = { interval: 8, rotate: 70 } this.minerOption.yAxis[1].show = false this.minerOption.grid.left = "16%" this.minerOption.grid.right = "5%" this.minerOption.grid.top = "10%" this.minerOption.grid.bottom = "45%" this.minerOption.legend.bottom = 5 this.minerOption.legend.right = "30%" this.minerOption.xAxis.axisLabel = { interval: 8, rotate: 70 } }else{ //动态计算图表的grid.left 让左侧的Y轴标签显示完全 const yAxis = this.option.yAxis[0]; // 第一个 Y 轴 const maxValue = Math.max(...this.option.series[0].data); // 获取数据最大值 const formatter = yAxis.axisLabel.formatter; const formattedValue = formatter(maxValue); // 格式化最大值 // 创建一个临时 DOM 元素计算宽度 const tempDiv = document.createElement('div'); tempDiv.style.position = 'absolute'; tempDiv.style.visibility = 'hidden'; tempDiv.style.fontSize = '12px'; // 与 axisLabel.fontSize 一致 tempDiv.innerText = formattedValue; document.body.appendChild(tempDiv); const labelWidth = tempDiv.offsetWidth; document.body.removeChild(tempDiv); // 动态设置 grid.left,加上安全边距 const safeMargin = 20; this.option.grid.left = labelWidth + safeMargin + 'px'; // ------------全网算力图--------------- // const yAxis2 = this.minerOption.yAxis[0]; // 第一个 Y 轴 const maxValue2 = Math.max(...this.minerOption.series[0].data); // 获取数据最大值 const formatter2 = yAxis2.axisLabel.formatter; const formattedValue2 = formatter2(maxValue2); // 格式化最大值 // 创建一个临时 DOM 元素计算宽度 const tempDiv2 = document.createElement('div'); tempDiv2.style.position = 'absolute'; tempDiv2.style.visibility = 'hidden'; tempDiv2.style.fontSize = '12px'; // 与 axisLabel.fontSize 一致 tempDiv2.innerText = formattedValue2; document.body.appendChild(tempDiv2); const labelWidth2 = tempDiv2.offsetWidth; document.body.removeChild(tempDiv2); // 动态设置 grid.left,加上安全边距 const safeMargin2 = 20; this.minerOption.grid.left = labelWidth2 + safeMargin2 + 'px'; } this.getBlockInfoData(this.BlockInfoParams) this.getCoinInfoData(this.params) this.getPoolPowerData(this.PowerParams) // 注册需要在网络恢复后自动重新调用的方法 this.registerRecoveryMethod('getCoinInfoData', this.params); this.registerRecoveryMethod('getPoolPowerData', this.PowerParams); this.registerRecoveryMethod('getBlockInfoData', this.BlockInfoParams); this.$addStorageEvent(1, `currencyList`, JSON.stringify(this.currencyList)) if (this.$refs.select) { this.$refs.select.$el.children[0].children[0].setAttribute('style', "background:url(https://test.m2pool.com/img/nexa.png) no-repeat 10PX;background-size: 20PX 20PX;color:#333;padding-left: 30PX;"); } this.fetchParam({ coin: this.params.coin }) this.minerChartLoading = false // let activeItemCoin =localStorage.getItem(`activeItemCoin`) // this.activeItemCoin=JSON.parse(activeItemCoin) window.addEventListener("setItem", () => { let value = localStorage.getItem(`activeItemCoin`) this.activeItemCoin = JSON.parse(value) }); }, methods: { handelOptionYAxis(option){ const yAxis = option.yAxis[0]; // 第一个 Y 轴 const maxValue = Math.max(...option.series[0].data); // 获取数据最大值 const formatter = yAxis.axisLabel.formatter; const formattedValue = formatter(maxValue); // 格式化最大值 // 创建一个临时 DOM 元素计算宽度 const tempDiv = document.createElement('div'); tempDiv.style.position = 'absolute'; tempDiv.style.visibility = 'hidden'; tempDiv.style.fontSize = '12px'; // 与 axisLabel.fontSize 一致 tempDiv.innerText = formattedValue; document.body.appendChild(tempDiv); const labelWidth = tempDiv.offsetWidth; document.body.removeChild(tempDiv); // 动态设置 grid.left,加上安全边距 const safeMargin = 20; option.grid.left = labelWidth + safeMargin + 'px'; return option }, slideLeft() { const allLength = this.currencyList.length * 120 const boxLength = document.getElementById('list-box').clientWidth if (allLength < boxLength) return const listEl = document.getElementById('list') const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left)) if (leftMove + boxLength - 360 < boxLength) { // 到最开始的时候 listEl.style.left = '0PX' } else { listEl.style.left = '-' + (leftMove - 360) + 'PX' } }, //初始化图表 inCharts() { if (this.myChart == null) { this.myChart = echarts.init(document.getElementById("chart")); } // this.maxValue = Math.round(this.maxValue * 3) // if (this.maxValue > 0) { // this.option.yAxis[1].max = this.maxValue // } // this.option.legend.show = false this.option.series[0].name = this.$t(`home.computingPower`) this.option.series[1].name = this.$t(`home.currencyPrice`) this.myChart.setOption(this.option); // 回调函数,在渲染完成后执行 this.myChart.on('finished', () => { // 在这里执行显示给用户的操作 // console.log('图表渲染完成,显示给用户'); this.minerChartLoading = false }); // window.addEventListener("resize", () => { // if (this.myChart) this.myChart.resize(); // }); window.addEventListener('resize', throttle(() => { if (this.myChart) this.myChart.resize(); }, 200)); }, inChartsMiner() { if (this.MinerChart == null) { this.MinerChart = echarts.init(document.getElementById("minerChart")); } this.minerOption= this.handelOptionYAxis(this.minerOption) // Y轴文字显示动态调整grid.left this.minerOption.series[0].name = this.$t(`home.networkPower`) this.minerOption.series[1].name = this.$t(`home.currencyPrice`) this.MinerChart.setOption(this.minerOption); // 回调函数,在渲染完成后执行 this.MinerChart.on('finished', () => { // console.log('图表渲染完成,显示给用户'); this.minerChartLoading = false }); window.addEventListener('resize', throttle(() => { if (this.MinerChart) this.MinerChart.resize(); }, 200)); }, countInCharts() { this.countChart = echarts.init(document.getElementById("minerChart")); this.countChart.setOption(this.CountOption); // window.addEventListener("resize", () => { // if (this.myChart) this.myChart.resize(); // }); }, async fetchParam(params) { try { const data = await getParam(params) if (data && data.code == 200) { this.CalculatorData = data.data } else { for (const key in this.CalculatorData) { this.CalculatorData[key] = 0 } } this.calculateIncome(this.CalculatorData) } catch (error) { console.log(error, 'error') } }, //获取币种信息 // async getCoinInfoData(params) { // const data = await getCoinInfo(params) // if (data && data.code == 200) { // this.CoinData = data.data // // this.CoinData.poolPower =Number(this.CoinData.poolPower) .toFixed(2)//算力保留两位小数 // // this.CoinData.price =this.CoinData.price.toFixed(8) // } // }, getCoinInfoData: Debounce(async function (params) { const data = await getCoinInfo(params) if (data && data.code == 200) { this.CoinData = data.data // this.CoinData.poolPower =Number(this.CoinData.poolPower) .toFixed(2)//算力保留两位小数 // this.CoinData.price =this.CoinData.price.toFixed(8) } else { this.CoinData = {} } }, 200), getPoolPowerData: Debounce(async function (params) { // this.minerChartLoading = true this.setLoading('minerChartLoading', true); try { const data = await getPoolPower(params) if (!data) { // this.minerChartLoading = false this.setLoading('minerChartLoading', false); if (this.myChart) { this.myChart.dispose()//销毁图表实列 } return } let chartData = data.data let xData = [] let pvData = [] let rejectRate = [] let price = [] chartData.forEach(item => { if (item.date.includes(`T`) && params.interval == `rt`) { item.date = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}` } else if (item.date.includes(`T`) && params.interval == `1d`) { item.date = item.date.split("T")[0] } xData.push(item.date) pvData.push(Number(item.pv).toFixed(2)) // rejectRate.push((item.rejectRate * 100).toFixed(2)) if (item.price == 0) { price.push(item.price) } else if (item.price < 1) { price.push(Number(item.price).toFixed(8)) } else { price.push(Number(item.price).toFixed(2)) } }); // this.maxValue = Math.max(...rejectRate); // let leftYMaxData = Math.max(...pvData); // this.option.yAxis[0].max =leftYMaxData*2 this.option.xAxis.data = xData this.option.series[0].data = pvData // this.option.series[1].data = rejectRate this.option.series[1].data = price this.$nextTick(() => { this.inCharts() }) } catch { console.error('获取数据失败:', error); } finally { // 确保无论成功失败都设置loading为false this.setLoading('minerChartLoading', false); } }, 200), async fetchNetPower(params) { // this.minerChartLoading = true this.setLoading('minerChartLoading', true); const data = await getNetPower(params) if (!data) { this.minerChartLoading = false if (this.MinerChart) { this.MinerChart.dispose() } return } let MinerCount = data.data let xData = [] let pvData = [] let price = [] MinerCount.forEach(item => { if (item.date.includes(`T`) && params.interval == `rt`) { item.date = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}` } else if (item.date.includes(`T`) && params.interval == `1d`) { item.date = item.date.split("T")[0] } xData.push(item.date) pvData.push(Number(item.pv).toFixed(2)) if (item.price == 0) { price.push(item.price) } else if (item.price < 1) { price.push(Number(item.price).toFixed(8)) } else { price.push(Number(item.price).toFixed(2)) } }); this.minerOption.xAxis.data = xData this.minerOption.series[0].data = pvData this.minerOption.series[1].data = price this.$nextTick(() => { this.inChartsMiner() }) // this.minerChartLoading = false this.setLoading('minerChartLoading', false); }, // async getMinerCountData(params) { // this.minerChartLoading = true // const data = await getMinerCount(params) // if (!data) { // this.minerChartLoading = false // if (this.MinerChart) { // this.MinerChart.dispose() // } // return // } // let MinerCount = data.data // let xData = [] // let Count = [] // MinerCount.forEach((item) => { // if (item.date.includes(`T`)) { // // item.date= `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}` // xData.push(`${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}`) // } else { // xData.push(item.date) // } // Count.push(item.value) // }) // this.minerOption.xAxis.data = xData // this.minerOption.series[0].data = Count // this.$nextTick(() => { // this.inChartsMiner() // }) // this.minerChartLoading = false // }, getMinerCountData: Debounce(async function (params) { // this.minerChartLoading = true this.setLoading('minerChartLoading', true); const data = await getMinerCount(params) if (!data) { this.minerChartLoading = false if (this.MinerChart) { this.MinerChart.dispose() } return } let MinerCount = data.data let xData = [] let Count = [] MinerCount.forEach((item) => { if (item.date.includes(`T`)) { // item.date= `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}` xData.push(`${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}`) } else { xData.push(item.date) } Count.push(item.value) }) this.minerOption.xAxis.data = xData this.minerOption.series[0].data = Count this.$nextTick(() => { this.inChartsMiner() }) this.setLoading('minerChartLoading', false); // this.minerChartLoading = false }, 200), getBlockInfoData: Debounce(async function (params) { try { // this.reportBlockLoading = true this.setLoading('reportBlockLoading', true); const data = await getBlockInfo(params) if (data && data.code == 200) { this.BlockShow = true this.newBlockInfoData = [] this.BlockInfoData = data.rows if (!this.BlockInfoData[0]) { // this.reportBlockLoading = false this.setLoading('reportBlockLoading', false); return } this.BlockInfoData.forEach((item, index) => { item.date = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}` if (index < 8) { this.newBlockInfoData.push(item) } }) } else { this.BlockShow = false } this.setLoading('reportBlockLoading', false); // this.reportBlockLoading = false } catch (error) { console.error('获取区块信息失败:', error); this.BlockShow = false; }finally { // 确保在任何情况下都会重置 loading 状态 this.setLoading('reportBlockLoading', false); } }, 200), calculateIncome(data) { for (const key in this.CalculatorData) { if (!this.CalculatorData[key]) { this.profit = 0 // var myDiv = document.getElementById('myDiv'); // this.disableElement(myDiv); return } } // 收益计算器实现算法: // 每日币收益 = (目标算力 / 全网算力)* 全网每日出块 * 单个块奖励 * (1 - 矿池手续费率) // 每日美元收益 = 每日币收益 * 币价(美元计) let target_hashrate switch (this.select) { case `GH/s`://GH/S(吉哈希每秒):1 GH/S 就是 1×10^9 哈希每秒。 target_hashrate = this.inputPower * Math.pow(10, 9) break; case `MH/s`://MH/S(兆哈希每秒):1 MH/S 是 1×10^6 哈希每秒 target_hashrate = this.inputPower * Math.pow(10, 6) break; case `TH/s`:// TH/S(太哈希每秒):1 TH/S 是 1×10^12 哈希每秒 target_hashrate = this.inputPower * Math.pow(10, 12) break; default: break; } // 这里从response中解析出全网算力、矿池算力、区块奖励 const net_hashrate = this.CalculatorData.netHashrate // 全网算力,这里的数据是模拟的,实际数据从response中解析 const reward = this.CalculatorData.reward// 区块奖励, 同上 // 计算 const target_hashrate_ratio = target_hashrate / net_hashrate // 用户算力全网占比 const per_day_reward = (reward * (1 - this.CalculatorData.poolFee)) * this.CalculatorData.count // 全网每日奖励 const result = target_hashrate_ratio * per_day_reward switch (this.time) { case "day": this.profit = result.toFixed(8) // this.profit = Math.floor(result * 1e10) / 1e10; // this.profit = this.toFixedNoRound(result, 10); break; case "week": this.profit = (result * 7).toFixed(8) // this.profit = Math.floor(result * 7 * 1e10) / 1e10; // this.profit = this.toFixedNoRound(result * 7, 10); break; case "month": this.profit = (result * 30).toFixed(8) // this.profit = Math.floor(result * 30 * 1e10) / 1e10; // this.profit = this.toFixedNoRound(result * 30, 10); break; case "year": this.profit = (result * 365).toFixed(8) // this.profit = Math.floor(result * 365 * 1e10) / 1e10; // this.profit = this.toFixedNoRound(result * 365, 10); break; default: break; } const nexaFormatter = new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, // 强制显示 2 位小数(不足补零) maximumFractionDigits: 2, // 可选:限制最多 2 位小数(避免多余位数) useGrouping: true, // 不使用千位分隔符(如 1,000) }); if (this.value == "nexa") { this.profit = nexaFormatter.format(this.profit); } else { const formatter = new Intl.NumberFormat("en-US", { minimumFractionDigits: 8, // 强制显示足够多的小数位 useGrouping: true, // 不使用千位分隔符(如 1,000) }); this.profit = formatter.format(this.profit); } // const formatter = new Intl.NumberFormat("en-US", { // minimumFractionDigits: 8, // 强制显示足够多的小数位 // useGrouping: false, // 不使用千位分隔符(如 1,000) // }); // this.profit = formatter.format(this.profit); }, toFixedNoRound(value, decimals = 10) {//保留10位小数 不四舍五入 const factor = 10 ** decimals; return (value < 0 ? Math.ceil(value * factor) : Math.floor(value * factor)) / factor; }, ProfitCalculator(target_hashrate, fee) { // 收益计算器实现算法: // 每日币收益 = (目标算力 / 全网算力)* 全网每日出块 * 单个块奖励 * (1 - 矿池手续费率) // 每日美元收益 = 每日币收益 * 币价(美元计) // 这里从response中解析出全网算力、矿池算力、区块奖励 const net_hashrate = 5646.62 // 全网算力,这里的数据是模拟的,实际数据从response中解析 const reward = 10000000 // 区块奖励, 同上 // 计算 const target_hashrate_ratio = target_hashrate / net_hashrate // 用户算力全网占比 const per_day_reward = (reward * (1 - fee)) * 720 // 全网每日奖励 const result = target_hashrate_ratio * per_day_reward return result }, //禁用 disableElement(element) { element.setAttribute('data-disabled', true); element.style.pointerEvents = 'none'; // 阻止鼠标事件 element.style.opacity = '0.5'; // 设置半透明度 // 其他CSS样式可以根据需要添加 }, handelProfitCalculation() { for (const key in this.CalculatorData) { if (!this.CalculatorData[key]) { // this.$message({ // message: this.$t(`home.acquisitionFailed`), // type: "error", // }); this.profit = 0 // var myDiv = document.getElementById('myDiv'); // this.disableElement(myDiv); this.fetchParam({ coin: this.params.coin }) return } } this.showCalculator = true }, handelClose() { this.showCalculator = false }, changeSelection(scope) { let brand = scope for (let index in this.currencyList) { let aa = this.currencyList[index]; let value = aa.value; if (brand === value) { this.$refs.select.$el.children[0].children[0].setAttribute('style', "background:url(" + aa.imgUrl + ") no-repeat 10PX;background-size: 20PX 20PX;color:#333;padding-left: 35PX;"); } } this.fetchParam({ coin: this.value }) }, handelJump(url) { if (url === '/AccessMiningPool') { const coin = this.currencyList.find(item => item.value === this.params.coin); if (!coin) return; let jumpName = coin.path.charAt(0).toUpperCase() + coin.path.slice(1) //name跳转 首字母大写 // 使用 name 进行导航,避免重复的路由参数 this.$router.push({ name: jumpName, params: { lang: this.lang, coin: this.params.coin, imgUrl: this.currencyPath }, replace: false // 保留历史记录,允许回退 }); } else { // 移除开头的斜杠,统一处理路径格式 const cleanPath = url.startsWith('/') ? url.slice(1) : url; this.$router.push(`/${this.lang}/${cleanPath}`); } }, handelCalculation() { this.calculateIncome() }, // 获取单个币种项目的完整宽度(包含margin) getItemFullWidth() { const listEl = this.$refs.currencyList; if (!listEl) return 120; const firstItem = listEl.querySelector('.list-item'); if (!firstItem) return 120; const style = window.getComputedStyle(firstItem); const width = firstItem.offsetWidth; const marginLeft = parseInt(style.marginLeft) || 0; const marginRight = parseInt(style.marginRight) || 0; return width + marginLeft + marginRight; }, // 左滑动逻辑 scrollLeft() { const allLength = this.currencyList.length * 120 const boxLength = document.getElementById('list-box').clientWidth if (allLength < boxLength) return const listEl = document.getElementById('list') const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left)) if (leftMove + boxLength - 360 < boxLength) { // 到最开始的时候 listEl.style.left = '0PX' } else { listEl.style.left = '-' + (leftMove - 360) + 'PX' } }, // 右滑动逻辑 scrollRight() { const allLength = this.currencyList.length * 120 const boxLength = document.getElementById('list-box').clientWidth if (allLength < boxLength) return const listEl = document.getElementById('list') const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left)) if (leftMove + boxLength + 360 > allLength) { listEl.style.left = '-' + (allLength - boxLength) + 'PX' } else { listEl.style.left = '-' + (leftMove + 360) + 'PX' } }, // // 左滑动逻辑 // scrollLeft() { // const allLength = this.currencyList.length * 120 // const boxLength = document.getElementById('list-box').clientWidth // if (allLength < boxLength) return // const listEl = document.getElementById('list') // const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left)) // if (leftMove + boxLength - 360 < boxLength) { // // 到最开始的时候 // listEl.style.left = '0PX' // } else { // listEl.style.left = '-' + (leftMove - 360) + 'PX' // } // }, // // 右滑动逻辑 // scrollRight() { // const allLength = this.currencyList.length * 120 // const boxLength = document.getElementById('list-box').clientWidth // if (allLength < boxLength) return // const listEl = document.getElementById('list') // const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left)) // if (leftMove + boxLength + 360 > allLength) { // listEl.style.left = '-' + (allLength - boxLength) + 'PX' // } else { // listEl.style.left = '-' + (leftMove + 360) + 'PX' // } // }, handleActiveItemChange(item) { if (!item) return; this.currency = item.label; this.currencyPath = item.imgUrl; this.params.coin = item.value; console.log(this.params.coin, "item"); this.BlockInfoParams.coin = item.value; this.itemActive = item.value; this.PowerParams.coin = item.value; // 调用相关数据更新方法 this.getCoinInfoData(this.params); this.getBlockInfoData(this.BlockInfoParams); if (this.powerActive) { this.handelPower(); } else { this.handelMiner(); } this.handelCoinLabel(item.value); }, clickCurrency(item) { if (!item) return; // 设置标记,防止触发 watch this.isInternalChange = true; this.activeItemCoin = item; this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(item)) // this.currency = item.label // this.currencyPath = item.imgUrl // this.params.coin = item.value // this.BlockInfoParams.coin = item.value // this.itemActive = item.value // this.PowerParams.coin = item.value // this.getCoinInfoData(this.params) // this.getBlockInfoData(this.BlockInfoParams) // 在下一个事件循环中重置标记 this.$nextTick(() => { this.isInternalChange = false; }); // 直接调用处理方法 this.handleActiveItemChange(item); }, clickReportBlock() { this.$router.push({ path: `/${this.lang}/reportBlock`, query: { coin: this.params.coin, imgUrl: this.currencyPath } }); }, handleClick(tab, event) { }, handelPower() { // this.powerDialogVisible = true; if (this.MinerChart) { this.MinerChart.dispose(); this.MinerChart = null; } // 初始化相关数据 this.option.xAxis.data = []; this.option.series[0].data = []; this.option.series[1].data = []; this.powerActive = true this.PowerParams.coin = this.params.coin this.getPoolPowerData(this.PowerParams) }, intervalChange(value) { this.PowerParams.interval = value this.params.interval = value this.timeActive = value if (this.powerActive) { this.getPoolPowerData(this.PowerParams) } else if (!this.powerActive) { this.fetchNetPower(this.params) } }, handelMiner() { // this.minerDialogVisible = true; // 先销毁可能存在的上一个图表实例 if (this.myChart) { this.myChart.dispose(); this.myChart = null; } // 初始化相关数据 this.minerOption.xAxis.data = []; this.minerOption.series[0].data = []; this.powerActive = false // this.getMinerCountData(this.params) this.fetchNetPower(this.params) }, handelLabel(coin) { let obj = this.currencyList.find(item => item.value == coin) if (obj) { return obj.label } else { return "" } }, handelLabel2(coin) { if (coin.includes("dgb")) { return "dgb" } else { return coin } }, handelCoinLabel(coin) { let obj = { coin: "", } if (coin) { obj = this.transactionFeeList.find(item => item.coin == coin) this.FeeShow = false } if (!obj) { this.FeeShow = true } }, }, }