Compare commits
10 Commits
f9869da1ae
...
75b9fb289c
Author | SHA1 | Date |
---|---|---|
|
75b9fb289c | |
|
a326f62f81 | |
|
2e56d71b0c | |
|
13add51a20 | |
|
a3c6bf8e07 | |
|
21a331680e | |
|
3ee77547ff | |
|
4332df54e8 | |
|
368d0a8a10 | |
|
4d436c725e |
|
@ -5,7 +5,8 @@ VUE_APP_TITLE = m2pool
|
||||||
ENV = 'development'
|
ENV = 'development'
|
||||||
|
|
||||||
#开发环境
|
#开发环境
|
||||||
VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
|
# VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
|
||||||
|
VUE_APP_BASE_API = 'http://10.168.2.150:8101/'
|
||||||
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
|
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
|
||||||
# 路由懒加载
|
# 路由懒加载
|
||||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
||||||
|
|
Binary file not shown.
|
@ -290,13 +290,45 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helpers": {
|
"@babel/helpers": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
|
||||||
"integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
|
"integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/template": "^7.26.9",
|
"@babel/template": "^7.27.0",
|
||||||
"@babel/types": "^7.26.9"
|
"@babel/types": "^7.27.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": {
|
||||||
|
"version": "7.27.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
|
||||||
|
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/types": "^7.27.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@babel/template": {
|
||||||
|
"version": "7.27.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
|
||||||
|
"integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/code-frame": "^7.26.2",
|
||||||
|
"@babel/parser": "^7.27.0",
|
||||||
|
"@babel/types": "^7.27.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@babel/types": {
|
||||||
|
"version": "7.27.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
|
||||||
|
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/helper-string-parser": "^7.25.9",
|
||||||
|
"@babel/helper-validator-identifier": "^7.25.9"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/highlight": {
|
"@babel/highlight": {
|
||||||
|
@ -1104,9 +1136,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/runtime": {
|
"@babel/runtime": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
|
||||||
"integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
|
"integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"regenerator-runtime": "^0.14.0"
|
"regenerator-runtime": "^0.14.0"
|
||||||
|
@ -1718,6 +1750,11 @@
|
||||||
"integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
|
"integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@stomp/stompjs": {
|
||||||
|
"version": "7.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.1.1.tgz",
|
||||||
|
"integrity": "sha512-chcDs6YkAnKp1FqzwhGvh3i7v0+/ytzqWdKYw6XzINEKAzke/iD00dNgFPWSZEqktHOK+C1gSzXhLkLbARIaZw=="
|
||||||
|
},
|
||||||
"@trysound/sax": {
|
"@trysound/sax": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
|
||||||
|
@ -3032,9 +3069,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "1.7.9",
|
"version": "1.8.4",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
|
||||||
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
|
"integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.15.6",
|
"follow-redirects": "^1.15.6",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
|
|
|
@ -10,8 +10,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dreysolano/prerender-spa-plugin": "^1.0.3",
|
"@dreysolano/prerender-spa-plugin": "^1.0.3",
|
||||||
|
"@stomp/stompjs": "^7.1.1",
|
||||||
"amfe-flexible": "^2.2.1",
|
"amfe-flexible": "^2.2.1",
|
||||||
"axios": "^1.5.0",
|
"axios": "^1.8.4",
|
||||||
"core-js": "^3.8.3",
|
"core-js": "^3.8.3",
|
||||||
"echarts": "^5.5.1",
|
"echarts": "^5.5.1",
|
||||||
"element-ui": "^2.15.14",
|
"element-ui": "^2.15.14",
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||||
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4582735_irzdjxdsrq8.css">
|
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4582735_7i8wfzc0art.css">
|
||||||
<title>M2pool - Stable leading high-yield mining pool</title>
|
<title>M2pool - Stable leading high-yield mining pool</title>
|
||||||
<meta name="keywords" content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿">
|
<meta name="keywords" content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿">
|
||||||
<meta name="description" content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx">
|
<meta name="description" content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx">
|
||||||
|
|
|
@ -1,16 +1,19 @@
|
||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<router-view class="page" />
|
<router-view class="page" />
|
||||||
|
<ChatWidget v-if="!$route.path.includes('/customerService')" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script >
|
<script >
|
||||||
|
import ChatWidget from '../src/components/ChatWidget.vue';
|
||||||
import { Debounce, throttle } from '@/utils/publicMethods';
|
import { Debounce, throttle } from '@/utils/publicMethods';
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
ChatWidget
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
import request from '../utils/request'
|
||||||
|
|
||||||
|
//历史聊天记录查询 用户查询七天前的聊天信息
|
||||||
|
export function getHistory(data) {
|
||||||
|
return request({
|
||||||
|
url: `chat/message/find/history/message`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//历史聊天记录查询 查询七天内记录
|
||||||
|
export function getHistory7(data) {
|
||||||
|
return request({
|
||||||
|
url: `chat/message/find/recently/message`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//用户点击对话框默认已读
|
||||||
|
export function getReadMessage(data) {
|
||||||
|
return request({
|
||||||
|
url: `chat/message/read/message`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//聊天列表
|
||||||
|
export function getRoomList(data) {
|
||||||
|
return request({
|
||||||
|
url: `/chat/rooms/find/room/list`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//重要聊天标记
|
||||||
|
export function getUpdateRoom(data) {
|
||||||
|
return request({
|
||||||
|
url: `/chat/rooms/update/room`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//图片上传接口
|
||||||
|
// export function getFileUpdate(data) {
|
||||||
|
// return request({
|
||||||
|
// url: `file/update`,
|
||||||
|
// method: 'post',
|
||||||
|
// data
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
//图根据当前用户邮箱查询聊天室id
|
||||||
|
export function getUserid(data) {
|
||||||
|
return request({
|
||||||
|
url: `chat/rooms/find/room/by/userid`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//上传图片
|
||||||
|
export function getFileUpdate(data) {
|
||||||
|
return request({
|
||||||
|
url: `pool/ticket/uploadFile`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,32 @@
|
||||||
|
export const ChatWidget_zh = {
|
||||||
|
chat:{
|
||||||
|
|
||||||
|
title: '在线客服',
|
||||||
|
welcome: '欢迎使用在线客服,请问有什么可以帮您?',
|
||||||
|
placeholder: '请输入您的消息...',
|
||||||
|
send: '发送',
|
||||||
|
close: '关闭',
|
||||||
|
inputPlaceholder:"请输入您的问题...",
|
||||||
|
onlyImages:"只能上传图片文件!",
|
||||||
|
imageTooLarge:"图片大小不能超过5MB!",
|
||||||
|
imageReceived:"已收到您的图片,我们会尽快处理您的问题。",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ChatWidget_en = {
|
||||||
|
|
||||||
|
|
||||||
|
chat:{
|
||||||
|
title: 'Online Customer Service',
|
||||||
|
welcome: 'Welcome to the online customer service, what can I help you with?',
|
||||||
|
placeholder: 'Please enter your message...',
|
||||||
|
send: 'Send',
|
||||||
|
close: 'Close',
|
||||||
|
inputPlaceholder:"Please enter your question...",
|
||||||
|
onlyImages:"Only image files can be uploaded!",
|
||||||
|
imageTooLarge:"The image size cannot exceed 5MB!",
|
||||||
|
imageReceived:"We have received your image, and we will handle your question as soon as possible.",
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import {workOrder_zh,workOrder_en} from'./submitWorkOrder'
|
||||||
import {alerts_zh,alerts_en} from'./alerts'
|
import {alerts_zh,alerts_en} from'./alerts'
|
||||||
import {seo_zh,seo_en} from'./seo'
|
import {seo_zh,seo_en} from'./seo'
|
||||||
import {chooseUs_zh,chooseUs_en} from'./dataDisplay'
|
import {chooseUs_zh,chooseUs_en} from'./dataDisplay'
|
||||||
|
import {ChatWidget_zh,ChatWidget_en} from'./ChatWidget'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ export default {
|
||||||
...alerts_zh,
|
...alerts_zh,
|
||||||
...seo_zh,
|
...seo_zh,
|
||||||
...chooseUs_zh,
|
...chooseUs_zh,
|
||||||
|
...ChatWidget_zh,
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -50,7 +51,7 @@ export default {
|
||||||
...alerts_en,
|
...alerts_en,
|
||||||
...seo_en,
|
...seo_en,
|
||||||
...chooseUs_en,
|
...chooseUs_en,
|
||||||
|
...ChatWidget_en,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,9 @@ import './assets/icons/iconfont/iconfont.css'
|
||||||
import {$addStorageEvent} from '../src/utils/publicMethods'
|
import {$addStorageEvent} from '../src/utils/publicMethods'
|
||||||
import MetaInfo from 'vue-meta-info'
|
import MetaInfo from 'vue-meta-info'
|
||||||
import loadingStateMixin from './utils/loadingStateMixin';
|
import loadingStateMixin from './utils/loadingStateMixin';
|
||||||
|
import networkRecoveryMixin from './mixins/networkRecoveryMixin';
|
||||||
|
import './utils/loadingRecovery';
|
||||||
|
import errorNotificationManager from '../src/utils/errorNotificationManager';
|
||||||
|
|
||||||
Vue.use(MetaInfo)
|
Vue.use(MetaInfo)
|
||||||
Vue.prototype.$addStorageEvent = $addStorageEvent // 添加storage事件
|
Vue.prototype.$addStorageEvent = $addStorageEvent // 添加storage事件
|
||||||
|
@ -20,8 +23,10 @@ Vue.use(ElementUI, {
|
||||||
});
|
});
|
||||||
Vue.prototype.$axios = axios
|
Vue.prototype.$axios = axios
|
||||||
|
|
||||||
console.log = ()=>{} //全局关闭打印
|
// console.log = ()=>{} //全局关闭打印
|
||||||
|
// 全局注册混入
|
||||||
Vue.mixin(loadingStateMixin);
|
Vue.mixin(loadingStateMixin);
|
||||||
|
Vue.mixin(networkRecoveryMixin);
|
||||||
|
|
||||||
Vue.prototype.$baseApi = process.env.VUE_APP_BASE_URL //图片base路径
|
Vue.prototype.$baseApi = process.env.VUE_APP_BASE_URL //图片base路径
|
||||||
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
||||||
|
@ -45,6 +50,11 @@ router.beforeEach((to, from, next) => {
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 定期清理过期的错误记录
|
||||||
|
setInterval(() => {
|
||||||
|
errorNotificationManager.cleanup();
|
||||||
|
}, 60000); // 每分钟清理一次
|
||||||
|
|
||||||
window.vm = new Vue({
|
window.vm = new Vue({
|
||||||
router,
|
router,
|
||||||
store,
|
store,
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
//处理断网重连后数据刷新的混入
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 注册需要在网络恢复时调用的方法名
|
||||||
|
recoveryMethods: [],
|
||||||
|
// 上次调用这些方法时的参数
|
||||||
|
methodParams: {}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
/**
|
||||||
|
* 注册需要在网络恢复时自动重新调用的方法
|
||||||
|
* @param {String} methodName - 方法名
|
||||||
|
* @param {*} params - 调用方法时需要的参数
|
||||||
|
*/
|
||||||
|
registerRecoveryMethod(methodName, params) {
|
||||||
|
if (typeof this[methodName] === 'function' && !this.recoveryMethods.includes(methodName)) {
|
||||||
|
this.recoveryMethods.push(methodName);
|
||||||
|
this.methodParams[methodName] = params;
|
||||||
|
console.log(`[NetworkRecovery] 注册方法: ${methodName}`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新方法的参数
|
||||||
|
* @param {String} methodName - 方法名
|
||||||
|
* @param {*} params - 新的参数
|
||||||
|
*/
|
||||||
|
updateMethodParams(methodName, params) {
|
||||||
|
if (this.recoveryMethods.includes(methodName)) {
|
||||||
|
this.methodParams[methodName] = params;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网络恢复后调用所有注册的方法
|
||||||
|
*/
|
||||||
|
handleNetworkRecovery() {
|
||||||
|
console.log('[NetworkRecovery] 网络已恢复,正在刷新数据...');
|
||||||
|
this.recoveryMethods.forEach(methodName => {
|
||||||
|
if (typeof this[methodName] === 'function') {
|
||||||
|
const params = this.methodParams[methodName];
|
||||||
|
console.log(`[NetworkRecovery] 重新调用方法: ${methodName}`);
|
||||||
|
this[methodName](params);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
// 监听网络恢复事件
|
||||||
|
window.addEventListener('network-retry-complete', this.handleNetworkRecovery);
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
// 清理事件监听
|
||||||
|
window.removeEventListener('network-retry-complete', this.handleNetworkRecovery);
|
||||||
|
}
|
||||||
|
};
|
|
@ -118,6 +118,22 @@ const childrenRoutes = [
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{//在线客服
|
||||||
|
path: 'customerService',
|
||||||
|
name: 'CustomerService',
|
||||||
|
component: () => import('../views/customerService/index.vue'),
|
||||||
|
meta: {title: '在线客服',
|
||||||
|
description:i18n.t(`seo.apiFile`),
|
||||||
|
allAuthority:[`customer_service`],//客服权限
|
||||||
|
// keywords: 'M2Pool 矿池,API 文档,认证 token,接口调用,API file,authentication token,Interface call'
|
||||||
|
keywords:{
|
||||||
|
en: 'API file,authentication token,Interface call',
|
||||||
|
zh: 'M2Pool 矿池,API 文档,认证 token,接口调用'
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
{//接入矿池页面
|
{//接入矿池页面
|
||||||
path: '/:lang/AccessMiningPool',
|
path: '/:lang/AccessMiningPool',
|
||||||
name: 'AccessMiningPool',
|
name: 'AccessMiningPool',
|
||||||
|
@ -673,7 +689,10 @@ router.beforeEach((to, from, next) => {
|
||||||
message:i18n.t(`mining.jurisdiction`),
|
message:i18n.t(`mining.jurisdiction`),
|
||||||
type: 'error'
|
type: 'error'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
next({ path: `/${lang}` }) // 添加这行,重定向到首页
|
||||||
}
|
}
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
/**
|
||||||
|
* 错误提示管理器
|
||||||
|
* 用于控制错误提示的频率,避免短时间内重复显示相同类型的错误
|
||||||
|
*/
|
||||||
|
class ErrorNotificationManager {
|
||||||
|
constructor() {
|
||||||
|
// 记录最近显示的错误信息
|
||||||
|
this.recentErrors = new Map();
|
||||||
|
// 默认节流时间 (30秒)
|
||||||
|
this.throttleTime = 3000;
|
||||||
|
// 错误类型映射
|
||||||
|
this.errorTypes = {
|
||||||
|
'Network Error': 'network',
|
||||||
|
'timeout': 'timeout',
|
||||||
|
'Request failed with status code': 'statusCode',
|
||||||
|
// 添加网络状态类型
|
||||||
|
'networkReconnected': 'networkStatus',
|
||||||
|
'NetworkError': 'network'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取错误类型
|
||||||
|
* @param {String} message 错误信息
|
||||||
|
* @returns {String} 错误类型
|
||||||
|
*/
|
||||||
|
getErrorType(message) {
|
||||||
|
for (const [key, type] of Object.entries(this.errorTypes)) {
|
||||||
|
if (message.includes(key)) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 'unknown';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查是否可以显示错误
|
||||||
|
* @param {String} message 错误信息
|
||||||
|
* @returns {Boolean} 是否可以显示
|
||||||
|
*/
|
||||||
|
canShowError(message) {
|
||||||
|
const errorType = this.getErrorType(message);
|
||||||
|
const now = Date.now();
|
||||||
|
|
||||||
|
// 检查同类型的错误是否最近已经显示过
|
||||||
|
if (this.recentErrors.has(errorType)) {
|
||||||
|
const lastTime = this.recentErrors.get(errorType);
|
||||||
|
if (now - lastTime < this.throttleTime) {
|
||||||
|
console.log(`[错误提示] 已抑制重复错误: ${errorType}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新最后显示时间
|
||||||
|
this.recentErrors.set(errorType, now);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理过期的错误记录
|
||||||
|
*/
|
||||||
|
cleanup() {
|
||||||
|
const now = Date.now();
|
||||||
|
this.recentErrors.forEach((time, type) => {
|
||||||
|
if (now - time > this.throttleTime) {
|
||||||
|
this.recentErrors.delete(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建单例实例
|
||||||
|
const errorNotificationManager = new ErrorNotificationManager();
|
||||||
|
export default errorNotificationManager;
|
|
@ -0,0 +1,41 @@
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动恢复加载状态的指令
|
||||||
|
* 用法: v-loading-recovery="{ loading: 'loadingProp', recovery: ['method1', 'method2'] }"
|
||||||
|
*/
|
||||||
|
export const loadingRecoveryDirective = {
|
||||||
|
// 当绑定元素插入到 DOM 中时
|
||||||
|
inserted(el, binding, vnode) {
|
||||||
|
const component = vnode.context;
|
||||||
|
const { loading, recovery } = binding.value || {};
|
||||||
|
|
||||||
|
if (!loading || !recovery || !Array.isArray(recovery)) return;
|
||||||
|
|
||||||
|
// 为组件添加加载状态恢复的逻辑
|
||||||
|
const handleNetworkRecovery = () => {
|
||||||
|
// 当网络恢复时,自动设置loading为false
|
||||||
|
if (component[loading]) {
|
||||||
|
component[loading] = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 保存到元素上,以便后续清理
|
||||||
|
el._loadingRecovery = handleNetworkRecovery;
|
||||||
|
window.addEventListener('network-retry-complete', handleNetworkRecovery);
|
||||||
|
|
||||||
|
console.log(`[LoadingRecovery] 添加加载状态恢复: ${loading}`);
|
||||||
|
},
|
||||||
|
|
||||||
|
// 当指令与元素解绑时
|
||||||
|
unbind(el) {
|
||||||
|
// 清理事件监听
|
||||||
|
if (el._loadingRecovery) {
|
||||||
|
window.removeEventListener('network-retry-complete', el._loadingRecovery);
|
||||||
|
delete el._loadingRecovery;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 注册全局指令
|
||||||
|
Vue.directive('loading-recovery', loadingRecoveryDirective);
|
|
@ -2,6 +2,8 @@ import axios from 'axios'
|
||||||
import errorCode from './errorCode'
|
import errorCode from './errorCode'
|
||||||
import { Notification, MessageBox, Message } from 'element-ui'
|
import { Notification, MessageBox, Message } from 'element-ui'
|
||||||
import loadingManager from './loadingManager';
|
import loadingManager from './loadingManager';
|
||||||
|
import errorNotificationManager from './errorNotificationManager';
|
||||||
|
|
||||||
// 创建axios实例
|
// 创建axios实例
|
||||||
const service = axios.create({
|
const service = axios.create({
|
||||||
// axios中请求配置有baseURL选项,表示请求URL公共部分
|
// axios中请求配置有baseURL选项,表示请求URL公共部分
|
||||||
|
@ -19,10 +21,51 @@ let lastNetworkErrorTime = 0; // 上次网络错误提示时间
|
||||||
let pendingRequests = new Map();
|
let pendingRequests = new Map();
|
||||||
|
|
||||||
|
|
||||||
|
// 网络状态监听器
|
||||||
|
// 网络状态最后提示时间
|
||||||
|
let lastNetworkStatusTime = {
|
||||||
|
online: 0,
|
||||||
|
offline: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// 创建一个全局标志,确保每次网络恢复只显示一次提示
|
||||||
|
let networkRecoveryInProgress = false;
|
||||||
|
|
||||||
// 网络状态监听器
|
// 网络状态监听器
|
||||||
window.addEventListener('online', () => {
|
window.addEventListener('online', () => {
|
||||||
// 网络恢复时,重试所有待处理的请求
|
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
|
|
||||||
|
// 避免短时间内多次触发
|
||||||
|
if (networkRecoveryInProgress) {
|
||||||
|
console.log('[网络] 网络恢复处理已在进行中,忽略重复事件');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
networkRecoveryInProgress = true;
|
||||||
|
|
||||||
|
// 严格检查是否应该显示提示
|
||||||
|
if (now - lastNetworkStatusTime.online > 30000) { // 30秒内不重复提示
|
||||||
|
lastNetworkStatusTime.online = now;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (window.vm && window.vm.$message) {
|
||||||
|
// 确保消息只显示一次
|
||||||
|
window.vm.$message({
|
||||||
|
message: window.vm.$i18n.t('home.networkReconnected') || '网络已重新连接,正在恢复数据...',
|
||||||
|
type: 'success',
|
||||||
|
duration: 5000,
|
||||||
|
showClose: true,
|
||||||
|
});
|
||||||
|
console.log('[网络] 显示网络恢复提示, 时间:', new Date().toLocaleTimeString());
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error('[网络] 显示网络恢复提示失败:', e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('[网络] 抑制重复的网络恢复提示, 间隔过短:', now - lastNetworkStatusTime.online + 'ms');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 网络恢复时,重试所有待处理的请求
|
||||||
const pendingPromises = [];
|
const pendingPromises = [];
|
||||||
|
|
||||||
pendingRequests.forEach(async (request, key) => {
|
pendingRequests.forEach(async (request, key) => {
|
||||||
|
@ -71,34 +114,56 @@ window.addEventListener('online', () => {
|
||||||
// 等待所有请求完成
|
// 等待所有请求完成
|
||||||
Promise.allSettled(pendingPromises).then(() => {
|
Promise.allSettled(pendingPromises).then(() => {
|
||||||
// 重置所有 loading 状态
|
// 重置所有 loading 状态
|
||||||
|
if (loadingManager) {
|
||||||
loadingManager.resetAllLoadingStates();
|
loadingManager.resetAllLoadingStates();
|
||||||
// 触发网络重试完成事件
|
}
|
||||||
window.dispatchEvent(new CustomEvent('network-retry-complete'));
|
|
||||||
});
|
|
||||||
|
|
||||||
// 显示网络恢复提示
|
// 手动重置一些关键的 loading 状态
|
||||||
if (window.vm && window.vm.$message) {
|
if (window.vm) {
|
||||||
window.vm.$message({
|
// 常见的加载状态
|
||||||
message: window.vm.$i18n.t('home.networkReconnected') || '网络已重新连接,正在恢复数据...',
|
const commonLoadingProps = [
|
||||||
type: 'success',
|
'minerChartLoading', 'reportBlockLoading', 'apiPageLoading',
|
||||||
duration: 3000
|
'MiningLoading', 'miniLoading'
|
||||||
|
];
|
||||||
|
|
||||||
|
commonLoadingProps.forEach(prop => {
|
||||||
|
if (typeof window.vm[prop] !== 'undefined') {
|
||||||
|
window.vm[prop] = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 触发网络重试完成事件
|
||||||
|
window.dispatchEvent(new CustomEvent('network-retry-complete'));
|
||||||
|
|
||||||
|
// 重置网络恢复标志
|
||||||
|
setTimeout(() => {
|
||||||
|
networkRecoveryInProgress = false;
|
||||||
|
}, 5000); // 5秒后允许再次处理网络恢复
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 使用错误提示管理器控制网络断开提示
|
||||||
window.addEventListener('offline', () => {
|
window.addEventListener('offline', () => {
|
||||||
if (window.vm && window.vm.$message) {
|
if (window.vm && window.vm.$message && errorNotificationManager.canShowError('networkOffline')) {
|
||||||
window.vm.$message({
|
window.vm.$message({
|
||||||
message: window.vm.$i18n.t('home.networkOffline') || '网络连接已断开,系统将在恢复连接后自动重试',
|
message: window.vm.$i18n.t('home.networkOffline') || '网络连接已断开,系统将在恢复连接后自动重试',
|
||||||
type: 'warning',
|
type: 'error',
|
||||||
duration: 3000
|
duration: 5000,
|
||||||
|
showClose: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
service.defaults.retry = 2;// 重试次数
|
service.defaults.retry = 2;// 重试次数
|
||||||
service.defaults.retryDelay = 2000;
|
service.defaults.retryDelay = 2000;
|
||||||
service.defaults.shouldRetry = (error) => true
|
service.defaults.shouldRetry = (error) => {
|
||||||
|
// 只有网络错误或超时错误才进行重试
|
||||||
|
return error.message === "Network Error" || error.message.includes("timeout");
|
||||||
|
};
|
||||||
|
|
||||||
localStorage.setItem('superReportError', "")
|
localStorage.setItem('superReportError', "")
|
||||||
let superReportError = localStorage.getItem('superReportError')
|
let superReportError = localStorage.getItem('superReportError')
|
||||||
|
@ -224,7 +289,6 @@ service.interceptors.response.use(res => {
|
||||||
|
|
||||||
|
|
||||||
let { message } = error;
|
let { message } = error;
|
||||||
|
|
||||||
if (message == "Network Error" || message.includes("timeout")) {
|
if (message == "Network Error" || message.includes("timeout")) {
|
||||||
if (!navigator.onLine) {
|
if (!navigator.onLine) {
|
||||||
// 断网状态,添加到重试队列
|
// 断网状态,添加到重试队列
|
||||||
|
@ -262,30 +326,37 @@ service.interceptors.response.use(res => {
|
||||||
|
|
||||||
console.log('请求已加入断网重连队列:', error.config.url);
|
console.log('请求已加入断网重连队列:', error.config.url);
|
||||||
}
|
}
|
||||||
} else if ((error.config.retry > 0 && error.config)) {
|
} else {
|
||||||
// 保留现有的重试逻辑
|
// 网络已连接,但请求失败,尝试重试
|
||||||
error.config.retry--;
|
// 确保 config 中有 __retryCount 字段
|
||||||
|
error.config.__retryCount = error.config.__retryCount || 0;
|
||||||
|
|
||||||
|
// 判断是否可以重试
|
||||||
|
if (error.config.__retryCount < service.defaults.retry && service.defaults.shouldRetry(error)) {
|
||||||
|
// 增加重试计数
|
||||||
|
error.config.__retryCount += 1;
|
||||||
|
|
||||||
|
console.log(`[请求重试] ${error.config.url} - 第 ${error.config.__retryCount} 次重试`);
|
||||||
|
|
||||||
|
// 创建新的Promise等待一段时间后重试
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
resolve(service(error.config));
|
resolve(service(error.config));
|
||||||
}, 2000);
|
}, service.defaults.retryDelay);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 达到最大重试次数,不再重试
|
||||||
|
console.log(`[请求失败] ${error.config.url} - 已达到最大重试次数`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!superReportError) {
|
if (!superReportError) {
|
||||||
superReportError = "error"
|
superReportError = "error"
|
||||||
localStorage.setItem('superReportError', superReportError)
|
localStorage.setItem('superReportError', superReportError)
|
||||||
let { message } = error;
|
//使用错误提示管理器errorNotificationManager
|
||||||
|
if (errorNotificationManager.canShowError(message)) {
|
||||||
if (message == "Network Error") {
|
if (message == "Network Error") {
|
||||||
// message = "后端接口网络连接异常,请刷新重试";
|
|
||||||
const now = Date.now();
|
|
||||||
if (now - lastNetworkErrorTime > NETWORK_ERROR_THROTTLE_TIME) {
|
|
||||||
lastNetworkErrorTime = now; // 更新最后提示时间
|
|
||||||
Message({
|
Message({
|
||||||
message: window.vm.$i18n.t(`home.NetworkError`),
|
message: window.vm.$i18n.t(`home.NetworkError`),
|
||||||
type: 'error',
|
type: 'error',
|
||||||
|
@ -293,42 +364,38 @@ service.interceptors.response.use(res => {
|
||||||
showClose: true
|
showClose: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
else if (message.includes("timeout")) {
|
else if (message.includes("timeout")) {
|
||||||
// message = "系统接口请求超时,请刷新重试";
|
|
||||||
Message({
|
Message({
|
||||||
message: window.vm.$i18n.t(`home.requestTimeout`),
|
message: window.vm.$i18n.t(`home.requestTimeout`),
|
||||||
type: 'error',
|
type: 'error',
|
||||||
duration: 5 * 1000,
|
duration: 5 * 1000,
|
||||||
showClose: true
|
showClose: true
|
||||||
})
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (message.includes("Request failed with status code")) {
|
else if (message.includes("Request failed with status code")) {
|
||||||
// message = "系统接口" + message.substr(message.length - 3) + "异常";
|
|
||||||
Message({
|
Message({
|
||||||
message: "系统接口" + message.substr(message.length - 3) + "异常",
|
message: "系统接口" + message.substr(message.length - 3) + "异常",
|
||||||
type: 'error',
|
type: 'error',
|
||||||
duration: 5 * 1000,
|
duration: 5 * 1000,
|
||||||
showClose: true
|
showClose: true
|
||||||
})
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Message({
|
Message({
|
||||||
message: message,
|
message: message,
|
||||||
type: 'error',
|
type: 'error',
|
||||||
duration: 5 * 1000,
|
duration: 5 * 1000,
|
||||||
showClose: true
|
showClose: true
|
||||||
})
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 避免完全不提示,可以在控制台记录被抑制的错误
|
||||||
|
console.log('[错误提示] 已抑制重复错误:', message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return Promise.reject(error)
|
return Promise.reject(error)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
//自动记录请求参数,并支持断网重连,创建一个函数装饰器
|
||||||
|
/**
|
||||||
|
* 包装请求方法,自动注册断网重连恢复
|
||||||
|
* @param {Object} component - 组件实例
|
||||||
|
* @param {String} methodName - 方法名
|
||||||
|
* @param {Function} originalMethod - 原始方法
|
||||||
|
* @returns {Function} 包装后的方法
|
||||||
|
*/
|
||||||
|
export function wrapRequestMethod(component, methodName, originalMethod) {
|
||||||
|
return async function(...args) {
|
||||||
|
// 注册为恢复方法(仅当组件支持断网重连恢复)
|
||||||
|
if (component.registerRecoveryMethod) {
|
||||||
|
component.registerRecoveryMethod(methodName, args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用原始方法
|
||||||
|
return await originalMethod.apply(component, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动包装组件中的所有请求方法
|
||||||
|
* @param {Object} component - 组件实例
|
||||||
|
* @param {Array<String>} methodNames - 方法名列表
|
||||||
|
*/
|
||||||
|
export function wrapComponentMethods(component, methodNames) {
|
||||||
|
methodNames.forEach(methodName => {
|
||||||
|
if (typeof component[methodName] === 'function') {
|
||||||
|
const originalMethod = component[methodName];
|
||||||
|
component[methodName] = wrapRequestMethod(component, methodName, originalMethod);
|
||||||
|
console.log(`[RequestWrapper] 包装方法: ${methodName}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
|
@ -171,10 +171,13 @@ export default {
|
||||||
// this.stateList = JSON.parse(localStorage.getItem('stateList') )
|
// this.stateList = JSON.parse(localStorage.getItem('stateList') )
|
||||||
// this.typeList = JSON.parse(localStorage.getItem('typeList') )
|
// this.typeList = JSON.parse(localStorage.getItem('typeList') )
|
||||||
|
|
||||||
|
this.registerRecoveryMethod('fetchTicketDetails', { id: this.workOrderId });
|
||||||
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fetchBKendTicket(params){
|
async fetchBKendTicket(params){
|
||||||
this.totalDetailsLoading =true
|
// this.totalDetailsLoading =true
|
||||||
|
this.setLoading('totalDetailsLoading', true);
|
||||||
const data = await getBKendTicket(params)
|
const data = await getBKendTicket(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -185,11 +188,12 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.totalDetailsLoading =false
|
this.setLoading('totalDetailsLoading', false);
|
||||||
},
|
},
|
||||||
|
|
||||||
async fetchReply(params){
|
async fetchReply(params){
|
||||||
this.totalDetailsLoading = true
|
// this.totalDetailsLoading = true
|
||||||
|
this.setLoading('totalDetailsLoading', true);
|
||||||
const data = await getReply(params)
|
const data = await getReply(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -205,7 +209,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this.totalDetailsLoading = false
|
this.setLoading('totalDetailsLoading', false);
|
||||||
},
|
},
|
||||||
handelType2(label){
|
handelType2(label){
|
||||||
if (label) {
|
if (label) {
|
||||||
|
@ -231,14 +235,15 @@ export default {
|
||||||
},
|
},
|
||||||
//请求工单详情
|
//请求工单详情
|
||||||
async fetchTicketDetails(param) {
|
async fetchTicketDetails(param) {
|
||||||
this.totalDetailsLoading = true
|
// this.totalDetailsLoading = true
|
||||||
|
this.setLoading('totalDetailsLoading', true);
|
||||||
const { data } = await getDetails(param)
|
const { data } = await getDetails(param)
|
||||||
|
|
||||||
this.recordList = data.list
|
this.recordList = data.list
|
||||||
this.ticketDetails = data
|
this.ticketDetails = data
|
||||||
|
|
||||||
|
|
||||||
this.totalDetailsLoading = false
|
this.setLoading('totalDetailsLoading', false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ export default {
|
||||||
this.params.maId = this.receiveData.id
|
this.params.maId = this.receiveData.id
|
||||||
}
|
}
|
||||||
this.fetchList(this.listParams)
|
this.fetchList(this.listParams)
|
||||||
|
this.registerRecoveryMethod('fetchList', this.listParams);
|
||||||
|
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
|
@ -100,7 +100,8 @@ export default {
|
||||||
return getImageUrl(path);
|
return getImageUrl(path);
|
||||||
},
|
},
|
||||||
async fetchAddNoticeEmail(params){
|
async fetchAddNoticeEmail(params){
|
||||||
this.addMinerLoading = true
|
// this.addMinerLoading = true
|
||||||
|
this.setLoading('addMinerLoading', true);
|
||||||
const data = await getAddNoticeEmail(params)
|
const data = await getAddNoticeEmail(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -121,17 +122,18 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.addMinerLoading = false
|
this.setLoading('addMinerLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchList(params){
|
async fetchList(params){
|
||||||
this.alertsLoading=true
|
// this.alertsLoading=true
|
||||||
|
this.setLoading('alertsLoading', true);
|
||||||
const data = await getList(params)
|
const data = await getList(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.tableData = data.rows
|
this.tableData = data.rows
|
||||||
|
|
||||||
}
|
}
|
||||||
this.alertsLoading=false
|
this.setLoading('alertsLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchCode(params){
|
async fetchCode(params){
|
||||||
|
@ -147,7 +149,8 @@ export default {
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchUpdateInfo(params){
|
async fetchUpdateInfo(params){
|
||||||
this.addMinerLoading = true
|
// this.addMinerLoading = true
|
||||||
|
this.setLoading('addMinerLoading', true);
|
||||||
const data = await getUpdateInfo(params)
|
const data = await getUpdateInfo(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -159,11 +162,12 @@ export default {
|
||||||
this.fetchList(this.listParams)
|
this.fetchList(this.listParams)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addMinerLoading = false
|
this.setLoading('addMinerLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchDeleteEmail(params){
|
async fetchDeleteEmail(params){
|
||||||
this.deleteLoading = true
|
// this.deleteLoading = true
|
||||||
|
this.setLoading('deleteLoading', true);
|
||||||
const data = await deleteEmail(params)
|
const data = await deleteEmail(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -175,7 +179,7 @@ export default {
|
||||||
this.fetchList(this.listParams)
|
this.fetchList(this.listParams)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.deleteLoading = false
|
this.setLoading('deleteLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -442,7 +442,7 @@
|
||||||
<!-- 挖矿账号下矿工总览 -->
|
<!-- 挖矿账号下矿工总览 -->
|
||||||
<div class="Pool">
|
<div class="Pool">
|
||||||
<p class="hash">{{ $t(`apiFile.overviewOfMiners`) }}</p>
|
<p class="hash">{{ $t(`apiFile.overviewOfMiners`) }}</p>
|
||||||
<p class="Interface">Post /oapi/v1/account/miners_list</p>
|
<p class="Interface">Post /oapi/v1/account/watch</p>
|
||||||
<p class="hash">{{ $t(`apiFile.jurisdiction`) }} account</p>
|
<p class="hash">{{ $t(`apiFile.jurisdiction`) }} account</p>
|
||||||
<p class="hash">{{ $t(`apiFile.parameter`) }}</p>
|
<p class="hash">{{ $t(`apiFile.parameter`) }}</p>
|
||||||
<table border="1">
|
<table border="1">
|
||||||
|
@ -1371,7 +1371,7 @@
|
||||||
<!-- 挖矿账号下矿工总览 -->
|
<!-- 挖矿账号下矿工总览 -->
|
||||||
<div class="Pool">
|
<div class="Pool">
|
||||||
<p class="hash">{{ $t(`apiFile.overviewOfMiners`) }}</p>
|
<p class="hash">{{ $t(`apiFile.overviewOfMiners`) }}</p>
|
||||||
<p class="Interface">Post /oapi/v1/account/miners_list</p>
|
<p class="Interface">Post /oapi/v1/account/watch </p>
|
||||||
<p class="hash">{{ $t(`apiFile.jurisdiction`) }} account</p>
|
<p class="hash">{{ $t(`apiFile.jurisdiction`) }} account</p>
|
||||||
<p class="hash">{{ $t(`apiFile.parameter`) }}</p>
|
<p class="hash">{{ $t(`apiFile.parameter`) }}</p>
|
||||||
<table border="1">
|
<table border="1">
|
||||||
|
@ -1726,7 +1726,7 @@
|
||||||
<!-- 指定矿机历史24h平均算力 -->
|
<!-- 指定矿机历史24h平均算力 -->
|
||||||
<div class="Pool">
|
<div class="Pool">
|
||||||
<p class="hash">{{ $t(`apiFile.miningMachineHistory24h`) }}</p>
|
<p class="hash">{{ $t(`apiFile.miningMachineHistory24h`) }}</p>
|
||||||
<p class="Interface">Get /oapi/v1/miner/hashrate_history</p>
|
<p class="Interface">Post /oapi/v1/miner/hashrate_history</p>
|
||||||
<p class="hash">{{ $t(`apiFile.jurisdiction`) }} miner</p>
|
<p class="hash">{{ $t(`apiFile.jurisdiction`) }} miner</p>
|
||||||
<p class="hash">{{ $t(`apiFile.parameter`) }}</p>
|
<p class="hash">{{ $t(`apiFile.parameter`) }}</p>
|
||||||
<table border="1">
|
<table border="1">
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -76,11 +76,11 @@ export default {
|
||||||
nameTextStyle: {
|
nameTextStyle: {
|
||||||
|
|
||||||
padding: [0, 0, 0, -40],
|
padding: [0, 0, 0, -40],
|
||||||
}
|
},
|
||||||
// min: `dataMin`,
|
// min: `dataMin`,
|
||||||
// max: `dataMax`,
|
// max: `dataMax`,
|
||||||
// axisLabel: {
|
axisLabel: {
|
||||||
// formatter: function (value) {
|
formatter: function (value) {
|
||||||
// let data
|
// let data
|
||||||
// if (value > 10000000) {
|
// if (value > 10000000) {
|
||||||
// data = `${(value / 10000000)} KW`
|
// data = `${(value / 10000000)} KW`
|
||||||
|
@ -89,9 +89,9 @@ export default {
|
||||||
// } else if (value / 10000) {
|
// } else if (value / 10000) {
|
||||||
// data = `${(value / 10000)} W`
|
// data = `${(value / 10000)} W`
|
||||||
// }
|
// }
|
||||||
// return data
|
return value
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -506,7 +506,8 @@ export default {
|
||||||
show: true,
|
show: true,
|
||||||
amount: 1,
|
amount: 1,
|
||||||
|
|
||||||
}
|
},
|
||||||
|
|
||||||
// { //告知已删除此币种 Radiant
|
// { //告知已删除此币种 Radiant
|
||||||
// value: "dgb2_odo",
|
// value: "dgb2_odo",
|
||||||
// label: "dgb-odocrypt-pool2",
|
// label: "dgb-odocrypt-pool2",
|
||||||
|
@ -759,7 +760,7 @@ export default {
|
||||||
],
|
],
|
||||||
FeeShow: true,
|
FeeShow: true,
|
||||||
lang: 'en',
|
lang: 'en',
|
||||||
activeItemCoin:{
|
activeItemCoin: {
|
||||||
value: "nexa",
|
value: "nexa",
|
||||||
label: "nexa",
|
label: "nexa",
|
||||||
img: require("../../assets/img/currency-nexa.png"),
|
img: require("../../assets/img/currency-nexa.png"),
|
||||||
|
@ -825,13 +826,47 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}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';
|
||||||
|
// this.$nextTick(
|
||||||
|
// // 更新图表
|
||||||
|
// this.inCharts()
|
||||||
|
|
||||||
|
// )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.getBlockInfoData(this.BlockInfoParams)
|
this.getBlockInfoData(this.BlockInfoParams)
|
||||||
this.getCoinInfoData(this.params)
|
this.getCoinInfoData(this.params)
|
||||||
this.getPoolPowerData(this.PowerParams)
|
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))
|
this.$addStorageEvent(1, `currencyList`, JSON.stringify(this.currencyList))
|
||||||
if (this.$refs.select) {
|
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.$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;");
|
||||||
|
@ -844,8 +879,8 @@ export default {
|
||||||
// let activeItemCoin =localStorage.getItem(`activeItemCoin`)
|
// let activeItemCoin =localStorage.getItem(`activeItemCoin`)
|
||||||
// this.activeItemCoin=JSON.parse(activeItemCoin)
|
// this.activeItemCoin=JSON.parse(activeItemCoin)
|
||||||
window.addEventListener("setItem", () => {
|
window.addEventListener("setItem", () => {
|
||||||
let value =localStorage.getItem(`activeItemCoin`)
|
let value = localStorage.getItem(`activeItemCoin`)
|
||||||
this.activeItemCoin=JSON.parse(value)
|
this.activeItemCoin = JSON.parse(value)
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -973,61 +1008,7 @@ export default {
|
||||||
|
|
||||||
}, 200),
|
}, 200),
|
||||||
|
|
||||||
// async getPoolPowerData(params) {
|
|
||||||
// this.minerChartLoading = true
|
|
||||||
// const data = await getPoolPower(params)
|
|
||||||
// if (!data) {
|
|
||||||
// this.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()
|
|
||||||
// })
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// },
|
|
||||||
getPoolPowerData: Debounce(async function (params) {
|
getPoolPowerData: Debounce(async function (params) {
|
||||||
// this.minerChartLoading = true
|
// this.minerChartLoading = true
|
||||||
this.setLoading('minerChartLoading', true);
|
this.setLoading('minerChartLoading', true);
|
||||||
|
@ -1082,9 +1063,9 @@ export default {
|
||||||
this.inCharts()
|
this.inCharts()
|
||||||
})
|
})
|
||||||
|
|
||||||
}catch{
|
} catch {
|
||||||
console.error('获取数据失败:', error);
|
console.error('获取数据失败:', error);
|
||||||
}finally {
|
} finally {
|
||||||
// 确保无论成功失败都设置loading为false
|
// 确保无论成功失败都设置loading为false
|
||||||
this.setLoading('minerChartLoading', false);
|
this.setLoading('minerChartLoading', false);
|
||||||
}
|
}
|
||||||
|
@ -1221,36 +1202,10 @@ export default {
|
||||||
|
|
||||||
}, 200),
|
}, 200),
|
||||||
|
|
||||||
// async getBlockInfoData(params) {
|
|
||||||
// this.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
|
|
||||||
// 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.reportBlockLoading = false
|
|
||||||
// },
|
|
||||||
|
|
||||||
getBlockInfoData: Debounce(async function (params) {
|
getBlockInfoData: Debounce(async function (params) {
|
||||||
|
try {
|
||||||
// this.reportBlockLoading = true
|
// this.reportBlockLoading = true
|
||||||
this.setLoading('reportBlockLoading', true);
|
this.setLoading('reportBlockLoading', true);
|
||||||
const data = await getBlockInfo(params)
|
const data = await getBlockInfo(params)
|
||||||
|
@ -1259,7 +1214,8 @@ export default {
|
||||||
this.newBlockInfoData = []
|
this.newBlockInfoData = []
|
||||||
this.BlockInfoData = data.rows
|
this.BlockInfoData = data.rows
|
||||||
if (!this.BlockInfoData[0]) {
|
if (!this.BlockInfoData[0]) {
|
||||||
this.reportBlockLoading = false
|
// this.reportBlockLoading = false
|
||||||
|
this.setLoading('reportBlockLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1271,13 +1227,21 @@ export default {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.BlockShow = false
|
this.BlockShow = false
|
||||||
}
|
}
|
||||||
this.setLoading('reportBlockLoading', false);
|
this.setLoading('reportBlockLoading', false);
|
||||||
// this.reportBlockLoading = false
|
// this.reportBlockLoading = false
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取区块信息失败:', error);
|
||||||
|
this.BlockShow = false;
|
||||||
|
}finally {
|
||||||
|
// 确保在任何情况下都会重置 loading 状态
|
||||||
|
this.setLoading('reportBlockLoading', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1321,39 +1285,55 @@ export default {
|
||||||
|
|
||||||
switch (this.time) {
|
switch (this.time) {
|
||||||
case "day":
|
case "day":
|
||||||
// this.profit = result.toFixed(10)
|
this.profit = result.toFixed(8)
|
||||||
// this.profit = Math.floor(result * 1e10) / 1e10;
|
// this.profit = Math.floor(result * 1e10) / 1e10;
|
||||||
this.profit = this.toFixedNoRound(result, 10);
|
// this.profit = this.toFixedNoRound(result, 10);
|
||||||
break;
|
break;
|
||||||
case "week":
|
case "week":
|
||||||
// this.profit = (result * 7).toFixed(10)
|
this.profit = (result * 7).toFixed(8)
|
||||||
// this.profit = Math.floor(result * 7 * 1e10) / 1e10;
|
// this.profit = Math.floor(result * 7 * 1e10) / 1e10;
|
||||||
this.profit = this.toFixedNoRound(result * 7, 10);
|
// this.profit = this.toFixedNoRound(result * 7, 10);
|
||||||
break;
|
break;
|
||||||
case "month":
|
case "month":
|
||||||
// this.profit = (result * 30).toFixed(10)
|
this.profit = (result * 30).toFixed(8)
|
||||||
// this.profit = Math.floor(result * 30 * 1e10) / 1e10;
|
// this.profit = Math.floor(result * 30 * 1e10) / 1e10;
|
||||||
this.profit = this.toFixedNoRound(result * 30, 10);
|
// this.profit = this.toFixedNoRound(result * 30, 10);
|
||||||
break;
|
break;
|
||||||
case "year":
|
case "year":
|
||||||
// this.profit = (result * 365).toFixed(10)
|
this.profit = (result * 365).toFixed(8)
|
||||||
// this.profit = Math.floor(result * 365 * 1e10) / 1e10;
|
// this.profit = Math.floor(result * 365 * 1e10) / 1e10;
|
||||||
this.profit = this.toFixedNoRound(result * 365, 10);
|
// this.profit = this.toFixedNoRound(result * 365, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
const nexaFormatter = new Intl.NumberFormat("en-US", {
|
||||||
// 10000000000000000
|
minimumFractionDigits: 2, // 强制显示 2 位小数(不足补零)
|
||||||
|
maximumFractionDigits: 2, // 可选:限制最多 2 位小数(避免多余位数)
|
||||||
const formatter = new Intl.NumberFormat("en-US", {
|
useGrouping: true, // 不使用千位分隔符(如 1,000)
|
||||||
minimumFractionDigits: 10, // 强制显示足够多的小数位
|
});
|
||||||
|
if (this.value == "nexa") {
|
||||||
|
this.profit = nexaFormatter.format(this.profit);
|
||||||
|
} else {
|
||||||
|
const formatter = new Intl.NumberFormat("en-US", {
|
||||||
|
minimumFractionDigits: 8, // 强制显示足够多的小数位
|
||||||
useGrouping: true, // 不使用千位分隔符(如 1,000)
|
useGrouping: true, // 不使用千位分隔符(如 1,000)
|
||||||
});
|
});
|
||||||
this.profit = formatter.format(this.profit);
|
|
||||||
|
|
||||||
|
|
||||||
|
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位小数 不四舍五入
|
toFixedNoRound(value, decimals = 10) {//保留10位小数 不四舍五入
|
||||||
|
@ -1445,52 +1425,111 @@ export default {
|
||||||
handelCalculation() {
|
handelCalculation() {
|
||||||
this.calculateIncome()
|
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() {
|
scrollLeft() {
|
||||||
const allLength = this.currencyList.length * 120
|
const listEl = this.$refs.currencyList;
|
||||||
const boxLength = document.getElementById('list-box').clientWidth
|
const listBox = this.$refs.listBox;
|
||||||
if (allLength < boxLength) return
|
if (!listEl || !listBox) return;
|
||||||
const listEl = document.getElementById('list')
|
|
||||||
const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left))
|
const itemFullWidth = this.getItemFullWidth();
|
||||||
if (leftMove + boxLength - 360 < boxLength) {
|
const step = 2 * itemFullWidth; // 每次滑动2个币种
|
||||||
// 到最开始的时候
|
const allLength = this.currencyList.length * itemFullWidth;
|
||||||
listEl.style.left = '0PX'
|
const boxLength = listBox.clientWidth;
|
||||||
|
|
||||||
|
if (allLength <= boxLength) return;
|
||||||
|
|
||||||
|
let currentLeft = Math.abs(parseInt(listEl.style.transform.replace('translateX(', '').replace('px)', '')) || 0);
|
||||||
|
let newLeft = currentLeft - step;
|
||||||
|
|
||||||
|
listEl.classList.add('scrolling');
|
||||||
|
|
||||||
|
if (newLeft <= 0) {
|
||||||
|
listEl.style.transform = 'translateX(0)';
|
||||||
} else {
|
} else {
|
||||||
listEl.style.left = '-' + (leftMove - 360) + 'PX'
|
listEl.style.transform = `translateX(-${newLeft}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'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 增加动画时间到 500ms
|
||||||
|
setTimeout(() => {
|
||||||
|
listEl.classList.remove('scrolling');
|
||||||
|
}, 500);
|
||||||
},
|
},
|
||||||
|
|
||||||
// clickCurrency: throttle(function(item) {
|
// 右滑动逻辑
|
||||||
// this.currency = item.label
|
scrollRight() {
|
||||||
// this.currencyPath = item.imgUrl
|
const listEl = this.$refs.currencyList;
|
||||||
// this.params.coin = item.value
|
const listBox = this.$refs.listBox;
|
||||||
// this.BlockInfoParams.coin = item.value
|
if (!listEl || !listBox) return;
|
||||||
// this.itemActive = item.value
|
|
||||||
// this.PowerParams.coin = item.value
|
const itemFullWidth = this.getItemFullWidth();
|
||||||
// this.getCoinInfoData(this.params)
|
const step = 2 * itemFullWidth; // 每次滑动2个币种
|
||||||
// this.getBlockInfoData(this.BlockInfoParams)
|
const allLength = this.currencyList.length * itemFullWidth;
|
||||||
// // this.getPoolPowerData(this.PowerParams)
|
const boxLength = listBox.clientWidth;
|
||||||
// // this.getMinerCountData(this.params)
|
|
||||||
// if (this.powerActive) {
|
if (allLength <= boxLength) return;
|
||||||
// this.handelPower()
|
|
||||||
// } else if (!this.powerActive) {
|
let currentLeft = Math.abs(parseInt(listEl.style.transform.replace('translateX(', '').replace('px)', '')) || 0);
|
||||||
// this.handelMiner()
|
let newLeft = currentLeft + step;
|
||||||
|
const maxLeft = allLength - boxLength;
|
||||||
|
|
||||||
|
listEl.classList.add('scrolling');
|
||||||
|
|
||||||
|
if (newLeft >= maxLeft) {
|
||||||
|
listEl.style.transform = `translateX(-${maxLeft}px)`;
|
||||||
|
} else {
|
||||||
|
listEl.style.transform = `translateX(-${newLeft}px)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加动画时间到 500ms
|
||||||
|
setTimeout(() => {
|
||||||
|
listEl.classList.remove('scrolling');
|
||||||
|
}, 500);
|
||||||
|
},
|
||||||
|
// // 左滑动逻辑
|
||||||
|
// 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'
|
||||||
// }
|
// }
|
||||||
// }, 1000),
|
// },
|
||||||
|
// // 右滑动逻辑
|
||||||
|
// 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) {
|
handleActiveItemChange(item) {
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
|
@ -1499,7 +1538,7 @@ export default {
|
||||||
this.currencyPath = item.imgUrl;
|
this.currencyPath = item.imgUrl;
|
||||||
this.params.coin = item.value;
|
this.params.coin = item.value;
|
||||||
|
|
||||||
console.log( this.params.coin , "item");
|
console.log(this.params.coin, "item");
|
||||||
this.BlockInfoParams.coin = item.value;
|
this.BlockInfoParams.coin = item.value;
|
||||||
this.itemActive = item.value;
|
this.itemActive = item.value;
|
||||||
this.PowerParams.coin = item.value;
|
this.PowerParams.coin = item.value;
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<section v-if="$isMobile">
|
<section v-if="$isMobile">
|
||||||
|
|
||||||
<div class="imgTop">
|
<div class="imgTop">
|
||||||
<!-- <img src="../../assets/mobile/home/home.png" alt="mining" loading="lazy" /> -->
|
<img src="../../assets/mobile/home/home.png" alt="mining" loading="lazy" />
|
||||||
|
<!--
|
||||||
<img v-if="lang == 'zh'" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
<img v-if="lang == 'zh'" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
||||||
<img v-else src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/>
|
<img v-else src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/> -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -329,18 +329,40 @@
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
<div class="content" v-else v-loading="minerChartLoading">
|
<div class="content" v-else v-loading="minerChartLoading">
|
||||||
|
|
||||||
<div class="bgBox">
|
<div class="bgBox">
|
||||||
|
<!--
|
||||||
<img v-if="lang == 'zh'" class="bgBoxImg2Img" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
<img v-if="lang == 'zh'" class="bgBoxImg2Img" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
||||||
<img v-else class="bgBoxImg2Img" src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/>
|
<img v-else class="bgBoxImg2Img" src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/> -->
|
||||||
|
<img class="bgImg" src="../../assets/img/home.png" alt="mining" loading="lazy"/>
|
||||||
|
|
||||||
<!-- <img class="bgBoxImg" src="../../assets/img/enx推广.png" style="width: 100%;height: 100%;" alt="mining" loading="lazy"/> -->
|
|
||||||
</div>
|
</div>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
||||||
<el-card>
|
<el-card>
|
||||||
<div class="monitor-list">
|
<div class="monitor-list">
|
||||||
|
<div class="btn left" @click="scrollLeft">
|
||||||
|
<i class="iconfont icon-icon-prev" />
|
||||||
|
</div>
|
||||||
|
<div ref="listBox" class="list-box">
|
||||||
|
<div ref="currencyList" class="list">
|
||||||
|
<div
|
||||||
|
v-for="item in currencyList"
|
||||||
|
:key="item.value"
|
||||||
|
@click="clickCurrency(item)"
|
||||||
|
class="list-item"
|
||||||
|
>
|
||||||
|
<img :src="item.img" alt="coin" />
|
||||||
|
<span :class="{ active: itemActive === item.value }">
|
||||||
|
{{ item.label }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btn right" @click="scrollRight">
|
||||||
|
<i class="iconfont icon-zuoyoujiantou1" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="monitor-list">
|
||||||
<div class="btn left" @click="scrollLeft">
|
<div class="btn left" @click="scrollLeft">
|
||||||
<i class="iconfont icon-icon-prev" />
|
<i class="iconfont icon-icon-prev" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -362,7 +384,7 @@
|
||||||
<div class="btn right" @click="scrollRight">
|
<div class="btn right" @click="scrollRight">
|
||||||
<i class="iconfont icon-zuoyoujiantou1" />
|
<i class="iconfont icon-zuoyoujiantou1" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
@ -375,7 +397,7 @@
|
||||||
<div class="currencyDescription2">
|
<div class="currencyDescription2">
|
||||||
<section class="miningPoolBox">
|
<section class="miningPoolBox">
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
||||||
<div class="miningPoolLeft" v-loading="minerChartLoading">
|
<div class="miningPoolLeft" v-loading="minerChartLoading" v-loading-recovery="{ loading: 'minerChartLoading', recovery: ['getPoolPowerData', 'fetchNetPower'] }">
|
||||||
<div class="interval">
|
<div class="interval">
|
||||||
<div class="chartBth">
|
<div class="chartBth">
|
||||||
|
|
||||||
|
@ -407,7 +429,6 @@
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
id="chart"
|
id="chart"
|
||||||
v-if="powerActive"
|
v-if="powerActive"
|
||||||
|
@ -603,7 +624,7 @@
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
||||||
<div class="reportBlock">
|
<div class="reportBlock">
|
||||||
<div class="reportBlockBox" v-loading="reportBlockLoading">
|
<div class="reportBlockBox" v-loading="reportBlockLoading" v-loading-recovery="{ loading: 'reportBlockLoading', recovery: ['getBlockInfoData'] }">
|
||||||
<div class="belowTable">
|
<div class="belowTable">
|
||||||
<ul>
|
<ul>
|
||||||
<li class="table-title">
|
<li class="table-title">
|
||||||
|
@ -785,6 +806,7 @@ export default {
|
||||||
p{
|
p{
|
||||||
width: 100% ;
|
width: 100% ;
|
||||||
background: transparent ;
|
background: transparent ;
|
||||||
|
padding-left: 8px;
|
||||||
|
|
||||||
}
|
}
|
||||||
i{
|
i{
|
||||||
|
@ -1295,16 +1317,44 @@ export default {
|
||||||
@media screen and (min-width:800px) and (max-width: 1279px) {
|
@media screen and (min-width:800px) and (max-width: 1279px) {
|
||||||
.imgTop {
|
.imgTop {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
// padding-left: 10%;
|
padding-left: 20%;
|
||||||
text-align: center;
|
text-align: left;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width: 100%;
|
width: auto ;
|
||||||
|
height:300px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#chart {
|
#chart {
|
||||||
height: 400px !important;
|
height: 400px !important;
|
||||||
}
|
}
|
||||||
|
.describeBox2{
|
||||||
|
width: 100%;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
padding: 8px;
|
||||||
|
margin: 0 auto;
|
||||||
|
p{
|
||||||
|
width: 100% ;
|
||||||
|
background: transparent ;
|
||||||
|
padding-left: 8px;
|
||||||
|
|
||||||
|
}
|
||||||
|
i{
|
||||||
|
color: #5721e4;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.describeTitle{
|
||||||
|
color: #5721e4;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view{
|
||||||
|
color: #5721e4;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.moveCurrencyBox {
|
.moveCurrencyBox {
|
||||||
|
@ -2046,7 +2096,7 @@ export default {
|
||||||
.bgBox {
|
.bgBox {
|
||||||
// background: gold;
|
// background: gold;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
// height: 380px;
|
height: 300px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
// background-position: 50% 28%;
|
// background-position: 50% 28%;
|
||||||
// background-size: cover;
|
// background-size: cover;
|
||||||
|
@ -2059,12 +2109,20 @@ export default {
|
||||||
// background-position: 13.2vw 0 ;
|
// background-position: 13.2vw 0 ;
|
||||||
// background-repeat: no-repeat;
|
// background-repeat: no-repeat;
|
||||||
// margin-top: 50px;
|
// margin-top: 50px;
|
||||||
margin: 30px 0px;
|
// margin: 30px 0px;
|
||||||
|
|
||||||
text-align: center;
|
text-align: left;
|
||||||
|
.bgImg{
|
||||||
|
height: 100%;
|
||||||
|
width: auto ;
|
||||||
|
position: absolute;
|
||||||
|
left: 25vw;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.bgBoxImg {
|
.bgBoxImg {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
width: auto;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 23%;
|
left: 23%;
|
||||||
transition: all 0.3s linear;
|
transition: all 0.3s linear;
|
||||||
|
@ -3083,6 +3141,63 @@ export default {
|
||||||
transition: left 1s;
|
transition: left 1s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-box {//加的
|
||||||
|
width: calc(100% - 100px);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
display: flex;
|
||||||
|
will-change: transform;
|
||||||
|
padding-left: 2%;
|
||||||
|
|
||||||
|
&.scrolling {
|
||||||
|
// 增加动画时长到 0.5s,使用更平滑的缓动函数
|
||||||
|
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-item {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 120px;
|
||||||
|
height: 95%;
|
||||||
|
margin-left: 18px;
|
||||||
|
// 增加过渡时间,使悬停效果更平滑
|
||||||
|
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-3px);
|
||||||
|
box-shadow: 0 6px 16px rgba(110, 62, 219, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
// 增加按钮过渡时间
|
||||||
|
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #6e3edb;
|
||||||
|
color: #fff;
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------
|
// -----------------------
|
||||||
|
|
|
@ -1346,6 +1346,13 @@ export default {
|
||||||
this.getHistoryIncomeData(this.IncomeParams)
|
this.getHistoryIncomeData(this.IncomeParams)
|
||||||
this.getHistoryOutcomeData(this.OutcomeParams)
|
this.getHistoryOutcomeData(this.OutcomeParams)
|
||||||
|
|
||||||
|
|
||||||
|
this.registerRecoveryMethod('getMinerAccountInfoData', this.params);
|
||||||
|
this.registerRecoveryMethod('getMinerAccountPowerData', this.PowerParams);
|
||||||
|
this.registerRecoveryMethod('getAccountPowerDistributionData', this.PowerDistribution);
|
||||||
|
this.registerRecoveryMethod('getMinerListData', this.MinerListParams);
|
||||||
|
this.registerRecoveryMethod('getHistoryIncomeData', this.IncomeParams);
|
||||||
|
this.registerRecoveryMethod('getHistoryOutcomeData', this.OutcomeParams);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
|
@ -1400,11 +1407,12 @@ export default {
|
||||||
// console.log(data,"获取币种信息");
|
// console.log(data,"获取币种信息");
|
||||||
},
|
},
|
||||||
async getMinerAccountPowerData(params) {
|
async getMinerAccountPowerData(params) {
|
||||||
this.powerChartLoading = true
|
// this.powerChartLoading = true
|
||||||
|
this.setLoading('powerChartLoading', true);
|
||||||
const data = await getMinerAccountPower(params)
|
const data = await getMinerAccountPower(params)
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.powerChartLoading = false
|
this.setLoading('powerChartLoading', false);
|
||||||
if (this.myChart) {
|
if (this.myChart) {
|
||||||
this.myChart.dispose()//销毁图表实列
|
this.myChart.dispose()//销毁图表实列
|
||||||
}
|
}
|
||||||
|
@ -1437,13 +1445,13 @@ export default {
|
||||||
this.option.series[1].data = rejectRate
|
this.option.series[1].data = rejectRate
|
||||||
|
|
||||||
this.inCharts()
|
this.inCharts()
|
||||||
this.powerChartLoading = false
|
this.setLoading('powerChartLoading', false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
async getAccountPowerDistributionData(params) {
|
async getAccountPowerDistributionData(params) {
|
||||||
this.barChartLoading = true
|
this.setLoading('barChartLoading', true);
|
||||||
const data = await getAccountPowerDistribution(params)
|
const data = await getAccountPowerDistribution(params)
|
||||||
let barData = data.data
|
let barData = data.data
|
||||||
let xData = []
|
let xData = []
|
||||||
|
@ -1455,7 +1463,7 @@ export default {
|
||||||
this.barOption.xAxis[0].data = xData
|
this.barOption.xAxis[0].data = xData
|
||||||
this.barOption.series[0].data = barValueList
|
this.barOption.series[0].data = barValueList
|
||||||
this.barInCharts()
|
this.barInCharts()
|
||||||
this.barChartLoading = false
|
this.setLoading('barChartLoading', false);
|
||||||
},
|
},
|
||||||
formatNumber(num) {//保留两位小数并补0
|
formatNumber(num) {//保留两位小数并补0
|
||||||
const intPart = Math.floor(num);
|
const intPart = Math.floor(num);
|
||||||
|
@ -1463,7 +1471,7 @@ export default {
|
||||||
return `${intPart}.${String(decimalPart).padStart(2, '0')}`;
|
return `${intPart}.${String(decimalPart).padStart(2, '0')}`;
|
||||||
},
|
},
|
||||||
async getMinerListData(params) {
|
async getMinerListData(params) {
|
||||||
this.MinerListLoading = true
|
this.setLoading('MinerListLoading', true);
|
||||||
const data = await getMinerList(params)
|
const data = await getMinerList(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.MinerListData = data.data
|
this.MinerListData = data.data
|
||||||
|
@ -1503,7 +1511,7 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.MinerListLoading = false
|
this.setLoading('MinerListLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1562,11 +1570,11 @@ export default {
|
||||||
// this.miniLoading=false
|
// this.miniLoading=false
|
||||||
// },
|
// },
|
||||||
getMinerPowerData:Debounce(async function(params){
|
getMinerPowerData:Debounce(async function(params){
|
||||||
this.miniLoading=true
|
this.setLoading('miniLoading', true);
|
||||||
const data = await getMinerPower(params)
|
const data = await getMinerPower(params)
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let miniData = data.data
|
let miniData = data.data
|
||||||
|
@ -1618,62 +1626,18 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
},200),
|
},200),
|
||||||
//小图
|
|
||||||
// async getMinerPowerOnLine(params) {
|
|
||||||
// this.miniLoading=true
|
|
||||||
// const data = await getMinerPower(params)
|
|
||||||
|
|
||||||
// if (!data) {
|
|
||||||
// this.miniLoading=false
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// let miniData = data.data
|
|
||||||
// let xData = []
|
|
||||||
// let pv = []
|
|
||||||
// let rejectRate = []
|
|
||||||
|
|
||||||
// miniData.forEach(item => {
|
|
||||||
// if (item.date.includes(`T`)) {
|
|
||||||
// xData.push(`${item.date.split("T")[0]} ${item.date.split("T")[1].split(".")[0]}` )
|
|
||||||
|
|
||||||
// } else {
|
|
||||||
// xData.push(item.date)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// pv.push(item.pv.toFixed(2))
|
|
||||||
// rejectRate.push((item.rejectRate * 100).toFixed(4))
|
|
||||||
// })
|
|
||||||
|
|
||||||
|
|
||||||
// this.onLineOption.xAxis.data = xData
|
|
||||||
// this.onLineOption.series[0].data = pv
|
|
||||||
// this.onLineOption.series[1].data = rejectRate
|
|
||||||
// this.onLineOption.series[0].name= this.$t(`home.finallyPower`)
|
|
||||||
// this.onLineOption.series[1].name= this.$t(`home.rejectionRate`)
|
|
||||||
|
|
||||||
// this.ids = `Small${this.miniId}`
|
|
||||||
// this.miniChartOnLine = echarts.init(document.getElementById(this.ids))
|
|
||||||
|
|
||||||
// this.$nextTick(() => {
|
|
||||||
// this.miniChartOnLine.setOption(this.onLineOption,true);
|
|
||||||
// window.addEventListener("resize", () => {
|
|
||||||
// if (this.miniChartOnLine) this.miniChartOnLine.resize();
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// this.miniLoading=false
|
// this.miniLoading=false
|
||||||
// },
|
// },
|
||||||
getMinerPowerOnLine:Debounce(async function(params){
|
getMinerPowerOnLine:Debounce(async function(params){
|
||||||
|
|
||||||
this.miniLoading=true
|
this.setLoading('miniLoading', true);
|
||||||
const data = await getMinerPower(params)
|
const data = await getMinerPower(params)
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let miniData = data.data
|
let miniData = data.data
|
||||||
|
@ -1716,7 +1680,7 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
|
|
||||||
|
|
||||||
},200),
|
},200),
|
||||||
|
@ -1768,10 +1732,10 @@ export default {
|
||||||
// this.miniLoading=false
|
// this.miniLoading=false
|
||||||
// },
|
// },
|
||||||
getMinerPowerOffLine:Debounce(async function(params){
|
getMinerPowerOffLine:Debounce(async function(params){
|
||||||
this.miniLoading=true
|
this.setLoading('miniLoading', true);
|
||||||
const data = await getMinerPower(params)
|
const data = await getMinerPower(params)
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let miniData = data.data
|
let miniData = data.data
|
||||||
|
@ -1815,7 +1779,7 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
|
|
||||||
|
|
||||||
},200),
|
},200),
|
||||||
|
|
|
@ -96,17 +96,20 @@ export default {
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetchApiList(this.listParams)
|
this.fetchApiList(this.listParams)
|
||||||
|
this.registerRecoveryMethod('fetchApiList', this.listParams);
|
||||||
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fetchApiKey(params) {
|
async fetchApiKey(params) {
|
||||||
this.ApiKeyLoading = true
|
this.ApiKeyLoading = true
|
||||||
|
this.setLoading('ApiKeyLoading', true);
|
||||||
const data = await getApiKey(params)
|
const data = await getApiKey(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.fetchApiList(this.listParams)
|
this.fetchApiList(this.listParams)
|
||||||
this.dialogVisible = false
|
this.dialogVisible = false
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ApiKeyLoading = false
|
this.setLoading('ApiKeyLoading', false);
|
||||||
},
|
},
|
||||||
async fetchApiList(params) {
|
async fetchApiList(params) {
|
||||||
this.apiPageLoading = true
|
this.apiPageLoading = true
|
||||||
|
@ -115,7 +118,7 @@ export default {
|
||||||
this.apiList = data.rows
|
this.apiList = data.rows
|
||||||
}
|
}
|
||||||
|
|
||||||
this.apiPageLoading = false
|
this.setLoading('apiPageLoading', false);
|
||||||
},
|
},
|
||||||
async fetchApiInfo(params) {
|
async fetchApiInfo(params) {
|
||||||
this.apiPageLoading = true
|
this.apiPageLoading = true
|
||||||
|
@ -127,7 +130,7 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.apiPageLoading = false
|
this.setLoading('apiPageLoading', false);
|
||||||
},
|
},
|
||||||
async fetchUpdateAPI(params) {
|
async fetchUpdateAPI(params) {
|
||||||
this.apiPageLoading = true
|
this.apiPageLoading = true
|
||||||
|
@ -137,7 +140,7 @@ export default {
|
||||||
this.modifyDialogVisible =false
|
this.modifyDialogVisible =false
|
||||||
}
|
}
|
||||||
|
|
||||||
this.apiPageLoading = false
|
this.setLoading('apiPageLoading', false);
|
||||||
},
|
},
|
||||||
async fetchDelApi(params) {
|
async fetchDelApi(params) {
|
||||||
this.apiPageLoading = true
|
this.apiPageLoading = true
|
||||||
|
@ -149,7 +152,7 @@ export default {
|
||||||
this.fetchApiList(this.listParams)
|
this.fetchApiList(this.listParams)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.apiPageLoading = false
|
this.setLoading('apiPageLoading', false);
|
||||||
},
|
},
|
||||||
RequestApiKey() {
|
RequestApiKey() {
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
|
|
|
@ -270,6 +270,9 @@ export default {
|
||||||
|
|
||||||
this.fetchAccountList()
|
this.fetchAccountList()
|
||||||
|
|
||||||
|
this.registerRecoveryMethod('fetchIfBind', "");
|
||||||
|
this.registerRecoveryMethod('fetchAccountList', "");
|
||||||
|
|
||||||
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
||||||
window.addEventListener("setItem", () => {
|
window.addEventListener("setItem", () => {
|
||||||
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
||||||
|
@ -284,7 +287,8 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fetchIfBind(params){
|
async fetchIfBind(params){
|
||||||
this.securityLoading = true
|
// this.securityLoading = true
|
||||||
|
this.setLoading('securityLoading', true);
|
||||||
const data = await getIfBind(params)
|
const data = await getIfBind(params)
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
if (data.data) {
|
if (data.data) {
|
||||||
|
@ -302,13 +306,14 @@ export default {
|
||||||
this.dialogVerification=true
|
this.dialogVerification=true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.securityLoading = false
|
this.setLoading('securityLoading', false);
|
||||||
},
|
},
|
||||||
async fetchCheck(params){
|
async fetchCheck(params){
|
||||||
this.addMinerLoading =true
|
// this.addMinerLoading =true
|
||||||
|
this.setLoading('addMinerLoading', true);
|
||||||
const data = await getCheck(params)
|
const data = await getCheck(params)
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.addMinerLoading =false
|
this.setLoading('addMinerLoading', false);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
|
@ -320,20 +325,21 @@ export default {
|
||||||
type: "error",
|
type: "error",
|
||||||
showClose: true
|
showClose: true
|
||||||
});
|
});
|
||||||
this.addMinerLoading =false
|
this.setLoading('addMinerLoading', false);
|
||||||
}else if(data.code === 802){//钱包不可用
|
}else if(data.code === 802){//钱包不可用
|
||||||
this.$message({
|
this.$message({
|
||||||
message: this.$t(`personal.invalidAddress`),
|
message: this.$t(`personal.invalidAddress`),
|
||||||
type: "error",
|
type: "error",
|
||||||
showClose: true
|
showClose: true
|
||||||
});
|
});
|
||||||
this.addMinerLoading =false
|
this.setLoading('addMinerLoading', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
async fetchCheckBalance(params){
|
async fetchCheckBalance(params){
|
||||||
this.confirmBindingLoading =true
|
// this.confirmBindingLoading =true
|
||||||
|
this.setLoading('confirmBindingLoading', true);
|
||||||
const data = await getCheckBalance(params)
|
const data = await getCheckBalance(params)
|
||||||
if (data && data.data) {
|
if (data && data.data) {
|
||||||
this.fetchWalletAddress(this.WalletAddressParams)
|
this.fetchWalletAddress(this.WalletAddressParams)
|
||||||
|
@ -344,7 +350,7 @@ export default {
|
||||||
type: 'error'
|
type: 'error'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.confirmBindingLoading =false
|
this.setLoading('confirmBindingLoading', false);
|
||||||
},
|
},
|
||||||
async fetchAccountGradeList(){
|
async fetchAccountGradeList(){
|
||||||
const data = await getAccountGradeList()
|
const data = await getAccountGradeList()
|
||||||
|
@ -369,7 +375,8 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async fetchMinerAccountBalance(params) {
|
async fetchMinerAccountBalance(params) {
|
||||||
this.MiningLoading = true
|
// this.MiningLoading = true
|
||||||
|
this.setLoading('MiningLoading', true);
|
||||||
const data = await getMinerAccountBalance(params)
|
const data = await getMinerAccountBalance(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.walletDialogVisible = true
|
this.walletDialogVisible = true
|
||||||
|
@ -386,10 +393,11 @@ export default {
|
||||||
this.paymentSettingsData.active = this.paymentSettingsData.active==`1` ? this.$t(`personal.no`) :this.$t(`personal.yes`)
|
this.paymentSettingsData.active = this.paymentSettingsData.active==`1` ? this.$t(`personal.no`) :this.$t(`personal.yes`)
|
||||||
|
|
||||||
this.paymentSettingsData.amount = this.paymentSettingsData.amount ? this.paymentSettingsData.amount : `0`
|
this.paymentSettingsData.amount = this.paymentSettingsData.amount ? this.paymentSettingsData.amount : `0`
|
||||||
this.MiningLoading = false
|
this.setLoading('MiningLoading', false);
|
||||||
},
|
},
|
||||||
async fetchDelMinerAccount(params) {
|
async fetchDelMinerAccount(params) {
|
||||||
this.MiningLoading = true
|
// this.MiningLoading = true
|
||||||
|
this.setLoading('MiningLoading', true);
|
||||||
const data = await getDelMinerAccount(params)
|
const data = await getDelMinerAccount(params)
|
||||||
|
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
|
@ -400,17 +408,18 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
this.MiningLoading = false
|
this.setLoading('MiningLoading', false);
|
||||||
},
|
},
|
||||||
async fetchAccountList(params) {
|
async fetchAccountList(params) {
|
||||||
this.MiningLoading = true
|
// this.MiningLoading = true
|
||||||
|
this.setLoading('MiningLoading', true);
|
||||||
const data = await getAccountList(params)
|
const data = await getAccountList(params)
|
||||||
this.accountList = data.data
|
this.accountList = data.data
|
||||||
console.log("请求成功,",data);
|
console.log("请求成功,",data);
|
||||||
this.newAccountList = this.accountList
|
this.newAccountList = this.accountList
|
||||||
this.$addStorageEvent(1, `accountList`, JSON.stringify(this.accountList))
|
this.$addStorageEvent(1, `accountList`, JSON.stringify(this.accountList))
|
||||||
|
|
||||||
this.MiningLoading = false
|
this.setLoading('MiningLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -431,7 +440,8 @@ export default {
|
||||||
},
|
},
|
||||||
//添加挖矿账户
|
//添加挖矿账户
|
||||||
async fetchAddMinerAccount(params) {
|
async fetchAddMinerAccount(params) {
|
||||||
this.addMinerLoading =true
|
// this.addMinerLoading =true
|
||||||
|
this.setLoading('addMinerLoading', true);
|
||||||
const data = await getAddMinerAccount(params)
|
const data = await getAddMinerAccount(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -451,7 +461,7 @@ export default {
|
||||||
this.fetchAccountList()
|
this.fetchAccountList()
|
||||||
this.fetchAccountGradeList()
|
this.fetchAccountGradeList()
|
||||||
|
|
||||||
this.addMinerLoading =false
|
this.setLoading('addMinerLoading', false);
|
||||||
},
|
},
|
||||||
handleCheckAllChange(val) {
|
handleCheckAllChange(val) {
|
||||||
|
|
||||||
|
|
|
@ -197,14 +197,16 @@ export default {
|
||||||
}))
|
}))
|
||||||
}));
|
}));
|
||||||
|
|
||||||
console.log( this.newMiningAccountList,"isrjiojfeo");
|
|
||||||
|
|
||||||
|
|
||||||
this.fetchUrlList(this.UrlListParams)
|
this.fetchUrlList(this.UrlListParams)
|
||||||
|
this.registerRecoveryMethod('fetchUrlList', this.UrlListParams);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fetchHtmlUrl(params){
|
async fetchHtmlUrl(params){
|
||||||
this.establishLoading = true
|
// this.establishLoading = true
|
||||||
|
this.setLoading('establishLoading', true);
|
||||||
const data = await getHtmlUrl(params)
|
const data = await getHtmlUrl(params)
|
||||||
|
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
|
@ -212,10 +214,11 @@ export default {
|
||||||
this.dialogVisible=false
|
this.dialogVisible=false
|
||||||
}
|
}
|
||||||
|
|
||||||
this.establishLoading = false
|
this.setLoading('establishLoading', false);
|
||||||
},
|
},
|
||||||
async fetchUrlList(params){
|
async fetchUrlList(params){
|
||||||
this.UrlListLoading = true
|
// this.UrlListLoading = true
|
||||||
|
this.setLoading('UrlListLoading', true);
|
||||||
const data = await getUrlList(params)
|
const data = await getUrlList(params)
|
||||||
console.log(data,666 );
|
console.log(data,666 );
|
||||||
|
|
||||||
|
@ -223,7 +226,7 @@ export default {
|
||||||
|
|
||||||
this.TotalSize = data.total
|
this.TotalSize = data.total
|
||||||
|
|
||||||
this.UrlListLoading = false
|
this.setLoading('UrlListLoading', false);
|
||||||
},
|
},
|
||||||
async fetchUrlInfo(params){
|
async fetchUrlInfo(params){
|
||||||
const data = await getUrlInfo(params)
|
const data = await getUrlInfo(params)
|
||||||
|
@ -239,7 +242,8 @@ export default {
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchChangeUrlInfo(params){
|
async fetchChangeUrlInfo(params){
|
||||||
this.modifyLoading=true
|
// this.modifyLoading=true
|
||||||
|
this.setLoading('modifyLoading', true);
|
||||||
const data = await getChangeUrlInfo(params)
|
const data = await getChangeUrlInfo(params)
|
||||||
console.log(data);
|
console.log(data);
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
|
@ -248,7 +252,7 @@ export default {
|
||||||
console.log("修改成功");
|
console.log("修改成功");
|
||||||
|
|
||||||
}
|
}
|
||||||
this.modifyLoading=false
|
this.setLoading('modifyLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchDelete(params){
|
async fetchDelete(params){
|
||||||
|
|
|
@ -155,13 +155,14 @@ export default {
|
||||||
|
|
||||||
this.lang = this.$i18n.locale; // 初始化语言值
|
this.lang = this.$i18n.locale; // 初始化语言值
|
||||||
this.fetchIfBind()
|
this.fetchIfBind()
|
||||||
|
this.registerRecoveryMethod('fetchIfBind', "");
|
||||||
if (this.$route.params.active) {
|
if (this.$route.params.active) {
|
||||||
this.handelVerification()
|
this.handelVerification()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fetchIfBind(params) {
|
async fetchIfBind(params) {
|
||||||
this.securityLoading = true
|
this.setLoading('securityLoading', true);
|
||||||
const data = await getIfBind(params)
|
const data = await getIfBind(params)
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
if (data.data) {
|
if (data.data) {
|
||||||
|
@ -170,10 +171,10 @@ export default {
|
||||||
this.isItBound = false
|
this.isItBound = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.securityLoading = false
|
this.setLoading('securityLoading', false);
|
||||||
},
|
},
|
||||||
async fetchBindInfo(params) {
|
async fetchBindInfo(params) {
|
||||||
this.BindInfoLoading = true
|
this.setLoading('BindInfoLoading', true);
|
||||||
const data = await getBindInfo(params)
|
const data = await getBindInfo(params)
|
||||||
console.log(data, "绑定信息");
|
console.log(data, "绑定信息");
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
|
@ -182,10 +183,10 @@ export default {
|
||||||
this.dialogVisible = false
|
this.dialogVisible = false
|
||||||
}
|
}
|
||||||
|
|
||||||
this.BindInfoLoading = false
|
this.setLoading('BindInfoLoading', false);
|
||||||
},
|
},
|
||||||
async fetchBindGoogle(params) {
|
async fetchBindGoogle(params) {
|
||||||
this.BindInfoLoading = true
|
this.setLoading('BindInfoLoading', true);
|
||||||
const data = await getBindGoogle(params)
|
const data = await getBindGoogle(params)
|
||||||
console.log(data, "绑定");
|
console.log(data, "绑定");
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
|
@ -203,7 +204,7 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
this.BindInfoLoading = false
|
this.setLoading('BindInfoLoading', false);
|
||||||
},
|
},
|
||||||
async fetchBindCode(params) {
|
async fetchBindCode(params) {
|
||||||
const data = await getBindCode(params)
|
const data = await getBindCode(params)
|
||||||
|
@ -216,7 +217,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async fetchResetPwd(params) {
|
async fetchResetPwd(params) {
|
||||||
this.ResetPwdLoading = true
|
this.setLoading('ResetPwdLoading', true);
|
||||||
const data = await getUpdatePwd(params)
|
const data = await getUpdatePwd(params)
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -230,7 +231,7 @@ export default {
|
||||||
localStorage.removeItem("token")
|
localStorage.removeItem("token")
|
||||||
this.$router.push(`/${lang}/login`);
|
this.$router.push(`/${lang}/login`);
|
||||||
}
|
}
|
||||||
this.ResetPwdLoading = false
|
this.setLoading('ResetPwdLoading', false);
|
||||||
},
|
},
|
||||||
async fetchResetPwdCode(params) {
|
async fetchResetPwdCode(params) {
|
||||||
const data = await getUpdatePwdCode(params)
|
const data = await getUpdatePwdCode(params)
|
||||||
|
@ -244,7 +245,7 @@ export default {
|
||||||
|
|
||||||
},
|
},
|
||||||
async fetchCloseStepTwo(params) {
|
async fetchCloseStepTwo(params) {
|
||||||
this.closeLoading = true
|
this.setLoading('closeLoading', true);
|
||||||
const data = await getCloseStepTwo(params)
|
const data = await getCloseStepTwo(params)
|
||||||
if (data && data.code === 200) {
|
if (data && data.code === 200) {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -260,7 +261,7 @@ export default {
|
||||||
this.closeParams[key] = ""
|
this.closeParams[key] = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.closeLoading = false
|
this.setLoading('closeLoading', false);
|
||||||
},
|
},
|
||||||
async fetchCloseCode(params) {
|
async fetchCloseCode(params) {
|
||||||
const data = await getCloseCode(params)
|
const data = await getCloseCode(params)
|
||||||
|
|
|
@ -69,7 +69,7 @@ export default {
|
||||||
value:"enx",
|
value:"enx",
|
||||||
label:"Entropyx(Enx)",
|
label:"Entropyx(Enx)",
|
||||||
img:`${this.$baseApi}img/enx.svg`,
|
img:`${this.$baseApi}img/enx.svg`,
|
||||||
rate:"0",
|
rate:"1%",
|
||||||
address:"",
|
address:"",
|
||||||
mode:"PPLNS+PROPDIF",
|
mode:"PPLNS+PROPDIF",
|
||||||
quota:"5000",
|
quota:"5000",
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
<template slot="title">
|
<template slot="title">
|
||||||
<div class="collapseTitle">
|
<div class="collapseTitle">
|
||||||
<span ><img :src="item.img" alt="coin" loading="lazy"> {{item.label}}</span>
|
<span ><img :src="item.img" alt="coin" loading="lazy"> {{item.label}}</span>
|
||||||
<span v-if="item.value === 'enx'"> {{ $t(`course.timeLimited`) }} 0%</span>
|
<!-- <span v-if="item.value === 'enx'"> {{ $t(`course.timeLimited`) }} 0%</span> -->
|
||||||
<span v-else>{{item.rate}}</span>
|
<span >{{item.rate}}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<section class="contentBox2">
|
<section class="contentBox2">
|
||||||
|
@ -76,8 +76,8 @@
|
||||||
<li v-for="item in rateList" :key="item.value">
|
<li v-for="item in rateList" :key="item.value">
|
||||||
<span class="coin"><img :src="item.img" alt="coin" loading="lazy"> {{item.label}}</span>
|
<span class="coin"><img :src="item.img" alt="coin" loading="lazy"> {{item.label}}</span>
|
||||||
<span>{{item.address}}</span>
|
<span>{{item.address}}</span>
|
||||||
<span v-if="item.value === 'enx'"> {{ $t(`course.timeLimited`) }} 0%</span>
|
<!-- <span v-if="item.value === 'enx'"> {{ $t(`course.timeLimited`) }} 0%</span> -->
|
||||||
<span v-else>{{item.rate}}</span>
|
<span >{{item.rate}}</span>
|
||||||
<span>{{item.mode}}</span>
|
<span>{{item.mode}}</span>
|
||||||
<span>{{item.quota}}</span>
|
<span>{{item.quota}}</span>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -1228,6 +1228,8 @@ export default {
|
||||||
this.getMinerAccountPowerData(this.PowerParams)
|
this.getMinerAccountPowerData(this.PowerParams)
|
||||||
this.getAccountPowerDistributionData(this.PowerDistribution)
|
this.getAccountPowerDistributionData(this.PowerDistribution)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
"$i18n.locale":(val)=>{
|
"$i18n.locale":(val)=>{
|
||||||
location.reload();//刷新页面 刷新echarts
|
location.reload();//刷新页面 刷新echarts
|
||||||
|
@ -1271,6 +1273,12 @@ export default {
|
||||||
this.getAccountPowerDistributionData(this.PowerDistribution)
|
this.getAccountPowerDistributionData(this.PowerDistribution)
|
||||||
|
|
||||||
|
|
||||||
|
this.registerRecoveryMethod('getMinerListData', this.MinerListParams);
|
||||||
|
this.registerRecoveryMethod('getMinerAccountPowerData', this.PowerParams);
|
||||||
|
this.registerRecoveryMethod('getAccountPowerDistributionData', this.PowerDistribution);
|
||||||
|
this.registerRecoveryMethod('fetchPageInfo', {key:this.params.key});
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
|
@ -1320,7 +1328,7 @@ export default {
|
||||||
},
|
},
|
||||||
//返回权限 1矿工 2收益 3支付
|
//返回权限 1矿工 2收益 3支付
|
||||||
async fetchPageInfo(params){
|
async fetchPageInfo(params){
|
||||||
this.jurisdictionLoading = true
|
this.setLoading('jurisdictionLoading', true);
|
||||||
const data = await getPageInfo(params)
|
const data = await getPageInfo(params)
|
||||||
console.log(data);
|
console.log(data);
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
|
@ -1354,7 +1362,7 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.jurisdictionLoading = false
|
this.setLoading('jurisdictionLoading', false);
|
||||||
},
|
},
|
||||||
//获取当前挖矿账号信息(包含收益、余额)
|
//获取当前挖矿账号信息(包含收益、余额)
|
||||||
async getMinerAccountInfoData(params) {
|
async getMinerAccountInfoData(params) {
|
||||||
|
@ -1362,11 +1370,11 @@ export default {
|
||||||
this.MinerAccountData = data.data
|
this.MinerAccountData = data.data
|
||||||
},
|
},
|
||||||
async getMinerAccountPowerData(params) {
|
async getMinerAccountPowerData(params) {
|
||||||
this.powerChartLoading = true
|
this.setLoading('powerChartLoading', true);
|
||||||
const data = await getMinerAccountPower(params)
|
const data = await getMinerAccountPower(params)
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.powerChartLoading = false
|
this.setLoading('powerChartLoading', false);
|
||||||
if (this.myChart) {
|
if (this.myChart) {
|
||||||
this.myChart.dispose()//销毁图表实列
|
this.myChart.dispose()//销毁图表实列
|
||||||
}
|
}
|
||||||
|
@ -1399,13 +1407,13 @@ export default {
|
||||||
this.option.series[1].data = rejectRate
|
this.option.series[1].data = rejectRate
|
||||||
|
|
||||||
this.inCharts()
|
this.inCharts()
|
||||||
this.powerChartLoading = false
|
this.setLoading('powerChartLoading', false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
async getAccountPowerDistributionData(params) {
|
async getAccountPowerDistributionData(params) {
|
||||||
this.barChartLoading = true
|
this.setLoading('barChartLoading', true);
|
||||||
const data = await getAccountPowerDistribution(params)
|
const data = await getAccountPowerDistribution(params)
|
||||||
let barData = data.data
|
let barData = data.data
|
||||||
let xData = []
|
let xData = []
|
||||||
|
@ -1417,7 +1425,7 @@ export default {
|
||||||
this.barOption.xAxis[0].data = xData
|
this.barOption.xAxis[0].data = xData
|
||||||
this.barOption.series[0].data = barValueList
|
this.barOption.series[0].data = barValueList
|
||||||
this.barInCharts()
|
this.barInCharts()
|
||||||
this.barChartLoading = false
|
this.setLoading('barChartLoading', false);
|
||||||
},
|
},
|
||||||
formatNumber(num) {//保留两位小数并补0
|
formatNumber(num) {//保留两位小数并补0
|
||||||
const intPart = Math.floor(num);
|
const intPart = Math.floor(num);
|
||||||
|
@ -1425,7 +1433,7 @@ export default {
|
||||||
return `${intPart}.${String(decimalPart).padStart(2, '0')}`;
|
return `${intPart}.${String(decimalPart).padStart(2, '0')}`;
|
||||||
},
|
},
|
||||||
async getMinerListData(params) {
|
async getMinerListData(params) {
|
||||||
this.MinerListLoading = true
|
this.setLoading('MinerListLoading', true);
|
||||||
const data = await getMinerList(params)
|
const data = await getMinerList(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.MinerListData = data.data
|
this.MinerListData = data.data
|
||||||
|
@ -1451,17 +1459,17 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.MinerListLoading = false
|
this.setLoading('MinerListLoading', false);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
//小图
|
//小图
|
||||||
async getMinerPowerData(params) {
|
async getMinerPowerData(params) {
|
||||||
this.miniLoading=true
|
this.setLoading('miniLoading', true);
|
||||||
const data = await getMinerPower(params)
|
const data = await getMinerPower(params)
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let miniData = data.data
|
let miniData = data.data
|
||||||
|
@ -1507,15 +1515,15 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
},
|
},
|
||||||
//小图
|
//小图
|
||||||
async getMinerPowerOnLine(params) {
|
async getMinerPowerOnLine(params) {
|
||||||
this.miniLoading=true
|
this.setLoading('miniLoading', true);
|
||||||
const data = await getMinerPower(params)
|
const data = await getMinerPower(params)
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let miniData = data.data
|
let miniData = data.data
|
||||||
|
@ -1556,14 +1564,14 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
},
|
},
|
||||||
//小图
|
//小图
|
||||||
async getMinerPowerOffLine(params) {
|
async getMinerPowerOffLine(params) {
|
||||||
this.miniLoading=true
|
this.setLoading('miniLoading', true);
|
||||||
const data = await getMinerPower(params)
|
const data = await getMinerPower(params)
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let miniData = data.data
|
let miniData = data.data
|
||||||
|
@ -1605,7 +1613,7 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.miniLoading=false
|
this.setLoading('miniLoading', false);
|
||||||
},
|
},
|
||||||
async getHistoryIncomeData(params) {
|
async getHistoryIncomeData(params) {
|
||||||
const data = await getHistoryIncome(params)
|
const data = await getHistoryIncome(params)
|
||||||
|
|
|
@ -235,6 +235,10 @@ export default {
|
||||||
|
|
||||||
this.getLuckData(this.params)
|
this.getLuckData(this.params)
|
||||||
this.getBlockInfoData(this.BlockInfoParams)
|
this.getBlockInfoData(this.BlockInfoParams)
|
||||||
|
|
||||||
|
this.registerRecoveryMethod('getLuckData', this.params);
|
||||||
|
this.registerRecoveryMethod('getBlockInfoData', this.BlockInfoParams);
|
||||||
|
|
||||||
let value = localStorage.getItem("activeItemCoin")
|
let value = localStorage.getItem("activeItemCoin")
|
||||||
this.activeItemCoin = JSON.parse(value)
|
this.activeItemCoin = JSON.parse(value)
|
||||||
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
||||||
|
@ -260,14 +264,14 @@ export default {
|
||||||
// },
|
// },
|
||||||
|
|
||||||
getLuckData: Debounce(async function (params) {
|
getLuckData: Debounce(async function (params) {
|
||||||
this.LuckDataLoading = true
|
this.setLoading('LuckDataLoading', true);
|
||||||
const data = await getLuck(params)
|
const data = await getLuck(params)
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
this.luckData = data.data
|
this.luckData = data.data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this.LuckDataLoading = false
|
this.setLoading('LuckDataLoading', false);
|
||||||
}, 200),
|
}, 200),
|
||||||
// async getBlockInfoData(params) {
|
// async getBlockInfoData(params) {
|
||||||
// this.reportBlockLoading=true
|
// this.reportBlockLoading=true
|
||||||
|
@ -286,10 +290,10 @@ export default {
|
||||||
// },
|
// },
|
||||||
getBlockInfoData: Debounce(async function (params) {
|
getBlockInfoData: Debounce(async function (params) {
|
||||||
|
|
||||||
this.reportBlockLoading = true
|
this.setLoading('reportBlockLoading', true);
|
||||||
const data = await getBlockInfo(params)
|
const data = await getBlockInfo(params)
|
||||||
if (!data) {
|
if (!data) {
|
||||||
this.reportBlockLoading = false
|
this.setLoading('reportBlockLoading', false);
|
||||||
}
|
}
|
||||||
this.totalSize = data.total
|
this.totalSize = data.total
|
||||||
this.BlockInfoData = data.rows
|
this.BlockInfoData = data.rows
|
||||||
|
@ -298,7 +302,7 @@ export default {
|
||||||
})
|
})
|
||||||
// this.currentPage = 1
|
// this.currentPage = 1
|
||||||
// console.log(data,"获取币种信息");
|
// console.log(data,"获取币种信息");
|
||||||
this.reportBlockLoading = false
|
this.setLoading('reportBlockLoading', false);
|
||||||
|
|
||||||
}, 200),
|
}, 200),
|
||||||
handleActiveItemChange(item) {
|
handleActiveItemChange(item) {
|
||||||
|
@ -314,6 +318,9 @@ export default {
|
||||||
clickCurrency(item) {
|
clickCurrency(item) {
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
// 设置标记,防止触发 watch
|
// 设置标记,防止触发 watch
|
||||||
|
|
||||||
|
this.luckData={}
|
||||||
|
|
||||||
this.isInternalChange = true;
|
this.isInternalChange = true;
|
||||||
this.activeItemCoin = item;
|
this.activeItemCoin = item;
|
||||||
this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(item))
|
this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(item))
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
</el-menu>
|
</el-menu>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="luckyBox" >
|
<div class="luckyBox" v-show="this.activeItemCoin.value != 'enx' && this.activeItemCoin.value != 'alph'">
|
||||||
|
|
||||||
<div class="luckyItem">
|
<div class="luckyItem">
|
||||||
<span class="title">{{$t(`home.lucky3`)}}</span>
|
<span class="title">{{$t(`home.lucky3`)}}</span>
|
||||||
|
@ -125,7 +125,8 @@
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- v-loading = "LuckDataLoading" -->
|
<!-- v-loading = "LuckDataLoading" -->
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
||||||
<div class="luckyBox" >
|
|
||||||
|
<div class="luckyBox" v-show="this.activeItemCoin.value != 'enx' && this.activeItemCoin.value != 'alph'" >
|
||||||
|
|
||||||
<div class="luckyItem">
|
<div class="luckyItem">
|
||||||
<span class="title">{{$t(`home.lucky3`)}}</span>
|
<span class="title">{{$t(`home.lucky3`)}}</span>
|
||||||
|
|
|
@ -1,153 +1,397 @@
|
||||||
<template>
|
<template>
|
||||||
<div style="width: 1300px; height: 600px">
|
<div>
|
||||||
<div id="chart" style="width: 100%; height: 100%; min-width: 500px"></div>
|
<h1>{{ msg }}</h1>
|
||||||
|
|
||||||
|
<!-- 用户ID输入部分 -->
|
||||||
|
<div class="user-input-container">
|
||||||
|
<div class="input-group" :class="{ 'disabled': isConnected }">
|
||||||
|
<input
|
||||||
|
v-model="email"
|
||||||
|
placeholder="请输入您的用户邮箱"
|
||||||
|
:disabled="isConnected"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
v-model="targetEmail"
|
||||||
|
placeholder="请输入目标用户邮箱"
|
||||||
|
:disabled="isConnected"
|
||||||
|
@keyup.enter="!isConnected && !isConnecting && connectWebSocket()"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="button-group">
|
||||||
|
<button
|
||||||
|
@click="connectWebSocket"
|
||||||
|
:disabled="isConnected || isConnecting || !email || !targetEmail"
|
||||||
|
:class="{ 'disabled': isConnected || isConnecting || !email || !targetEmail }"
|
||||||
|
>
|
||||||
|
{{ isConnecting ? '连接中...' : '连接' }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-if="isConnected"
|
||||||
|
@click="disconnectWebSocket"
|
||||||
|
class="disconnect-btn"
|
||||||
|
>
|
||||||
|
断开连接
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="connectionError" class="error-message">
|
||||||
|
{{ connectionError }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="isConnected">
|
||||||
|
<!-- WebSocket 聊天部分 -->
|
||||||
|
<div class="chat-container">
|
||||||
|
<div class="message-list" ref="messageList">
|
||||||
|
<div v-for="(msg, index) in receivedMessages" :key="index" class="message"
|
||||||
|
:class="{ 'error-message': msg.error }">
|
||||||
|
<div v-if="typeof msg === 'string'">{{ msg }}</div>
|
||||||
|
<div v-else>
|
||||||
|
<div class="message-header">
|
||||||
|
<span class="message-sender">{{ msg.sender || 'Unknown' }}</span>
|
||||||
|
<span class="message-time">{{ formatTime(msg.timestamp) }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="message-content">{{ msg.content }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="input-container">
|
||||||
|
<textarea
|
||||||
|
v-model="message"
|
||||||
|
@keyup.enter="sendMessage"
|
||||||
|
placeholder="输入消息..."
|
||||||
|
rows="3"
|
||||||
|
></textarea>
|
||||||
|
<button @click="sendMessage" :disabled="!message.trim()">
|
||||||
|
发送
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import * as echarts from "echarts";
|
import { ref, onMounted, onUnmounted, nextTick, watch } from 'vue'
|
||||||
export default {
|
import { Stomp } from '@stomp/stompjs'
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
countDownTime: 60,
|
|
||||||
timer: null,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
const props = defineProps({
|
||||||
let base = +new Date(1968, 9, 3);
|
msg: {
|
||||||
let oneDay = 24 * 3600 * 1000;
|
type: String,
|
||||||
let date = [];
|
required: true
|
||||||
let data = [Math.random() * 300];
|
}
|
||||||
for (let i = 1; i < 20000; i++) {
|
})
|
||||||
var now = new Date((base += oneDay));
|
|
||||||
date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/"));
|
const message = ref('')
|
||||||
data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
|
const receivedMessages = ref([])
|
||||||
|
const email = ref('')
|
||||||
|
const targetEmail = ref('')
|
||||||
|
const isConnected = ref(false)
|
||||||
|
const isConnecting = ref(false)
|
||||||
|
const connectionError = ref('')
|
||||||
|
const messageList = ref(null)
|
||||||
|
|
||||||
|
// 创建一个响应式的 stompClient
|
||||||
|
const stompClient = ref(null)
|
||||||
|
|
||||||
|
// 添加连接时间变量
|
||||||
|
const connectTime = ref(null)
|
||||||
|
|
||||||
|
// 自动滚动到底部
|
||||||
|
const scrollToBottom = async () => {
|
||||||
|
await nextTick()
|
||||||
|
if (messageList.value) {
|
||||||
|
messageList.value.scrollTop = messageList.value.scrollHeight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 监听消息列表变化,自动滚动
|
||||||
|
watch(receivedMessages, () => {
|
||||||
|
scrollToBottom()
|
||||||
|
})
|
||||||
|
|
||||||
|
// 格式化时间
|
||||||
|
const formatTime = (timestamp) => {
|
||||||
|
if (!timestamp) return ''
|
||||||
|
try {
|
||||||
|
const date = new Date(timestamp)
|
||||||
|
return date.toLocaleTimeString()
|
||||||
|
} catch (e) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 连接WebSocket
|
||||||
|
const connectWebSocket = () => {
|
||||||
|
if (!email.value || !targetEmail.value) {
|
||||||
|
connectionError.value = '请输入用户邮箱和目标用户邮箱'
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加 10 个空数据在前后
|
connectionError.value = ''
|
||||||
for (let i = 0; i < 100; i++) {
|
isConnecting.value = true
|
||||||
date.unshift(null);
|
connectTime.value = new Date() // 记录连接时间
|
||||||
data.unshift(null);
|
|
||||||
}
|
try {
|
||||||
for (let i = 0; i < 100; i++) {
|
stompClient.value = Stomp.client('ws://localhost:8101/chat/ws')
|
||||||
date.push(null);
|
stompClient.value.heartbeat.outgoing = 20000
|
||||||
data.push(null);
|
stompClient.value.heartbeat.incoming = 0
|
||||||
|
|
||||||
|
const connectHeaders = {
|
||||||
|
'email': email.value,
|
||||||
|
'type': 2 //0 游客 1 登录用户 2 客服
|
||||||
}
|
}
|
||||||
|
|
||||||
var option = {
|
stompClient.value.connect(
|
||||||
tooltip: {
|
connectHeaders,
|
||||||
trigger: "axis",
|
function(frame) {
|
||||||
position: function (pt) {
|
console.log('连接成功: ' + frame)
|
||||||
return [pt[0], "10%"];
|
console.log('连接时间:', connectTime.value?.toLocaleString())
|
||||||
},
|
isConnected.value = true
|
||||||
},
|
isConnecting.value = false
|
||||||
title: {
|
|
||||||
left: "center",
|
// 添加系统消息
|
||||||
text: "Large Area Chart",
|
receivedMessages.value.push({
|
||||||
},
|
sender: 'System',
|
||||||
toolbox: {
|
content: '已连接到聊天服务器',
|
||||||
feature: {
|
timestamp: new Date().toISOString(),
|
||||||
dataZoom: {
|
system: true
|
||||||
yAxisIndex: "none",
|
})
|
||||||
},
|
|
||||||
restore: {},
|
// 订阅自己管道的消息
|
||||||
saveAsImage: {},
|
stompClient.value.subscribe(`/user/queue/${email.value}`, function(message) {
|
||||||
},
|
console.log('收到消息:', message.body)
|
||||||
},
|
try {
|
||||||
xAxis: {
|
const parsedMessage = JSON.parse(message.body)
|
||||||
type: "category",
|
receivedMessages.value.push(parsedMessage)
|
||||||
// boundaryGap: [0.5, 0.5],
|
} catch (error) {
|
||||||
data: date,
|
console.error('消息解析失败:', error)
|
||||||
},
|
receivedMessages.value.push({
|
||||||
yAxis: [
|
sender: 'System',
|
||||||
{
|
content: `消息格式错误: ${message.body}`,
|
||||||
type: "value",
|
timestamp: new Date().toISOString(),
|
||||||
boundaryGap: [0, "100%"],
|
error: true
|
||||||
axisLine: {
|
})
|
||||||
show: true, // 显示 Y 轴线条
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
position: "right",
|
|
||||||
type: "value",
|
|
||||||
boundaryGap: [0, "100%"],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
dataZoom: [
|
|
||||||
{
|
|
||||||
type: "inside",
|
|
||||||
start: 0,
|
|
||||||
end: 10,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
start: 0,
|
|
||||||
end: 10,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "Fake Data",
|
|
||||||
type: "line",
|
|
||||||
symbol: "none",
|
|
||||||
sampling: "lttb",
|
|
||||||
itemStyle: {
|
|
||||||
color: "rgb(255, 70, 131)",
|
|
||||||
},
|
|
||||||
data: data,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
this.myChart = echarts.init(document.getElementById("chart"));
|
|
||||||
this.myChart.setOption(option);
|
|
||||||
window.addEventListener(
|
|
||||||
"resize", () => {
|
|
||||||
if (this.myChart) this.myChart.resize();
|
|
||||||
}
|
}
|
||||||
);
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
function(error) {
|
||||||
//初始化图表
|
console.error('连接失败:', error)
|
||||||
inCharts() {
|
isConnected.value = false
|
||||||
if (this.myChart == null) {
|
isConnecting.value = false
|
||||||
this.myChart = echarts.init(document.getElementById("chart"));
|
connectionError.value = `连接失败: ${error.headers?.message || error.message || '未知错误'}`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
console.error('初始化WebSocket客户端失败:', error)
|
||||||
|
isConnected.value = false
|
||||||
|
isConnecting.value = false
|
||||||
|
connectionError.value = `初始化失败: ${error.message || '未知错误'}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加断开连接方法
|
||||||
|
const disconnectWebSocket = () => {
|
||||||
|
if (stompClient.value?.connected) {
|
||||||
|
stompClient.value.disconnect(() => {
|
||||||
|
const disconnectTime = new Date()
|
||||||
|
const duration = connectTime.value ?
|
||||||
|
Math.floor((disconnectTime.getTime() - connectTime.value.getTime()) / 1000) : 0
|
||||||
|
|
||||||
|
console.log('断开连接时间:', disconnectTime.toLocaleString())
|
||||||
|
console.log(`连接持续时间: ${Math.floor(duration / 60)}分${duration % 60}秒`)
|
||||||
|
|
||||||
|
isConnected.value = false
|
||||||
|
receivedMessages.value = []
|
||||||
|
connectTime.value = null
|
||||||
|
|
||||||
|
// 添加提示
|
||||||
|
connectionError.value = '已断开连接'
|
||||||
|
setTimeout(() => {
|
||||||
|
connectionError.value = ''
|
||||||
|
}, 3000)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送消息方法
|
||||||
|
const sendMessage = () => {
|
||||||
|
if (!message.value.trim()) return
|
||||||
|
|
||||||
|
if (stompClient.value?.connected) {
|
||||||
|
try {
|
||||||
|
const messageObj = {
|
||||||
|
email: targetEmail.value,
|
||||||
|
content: message.value.trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
this.option.series[0].name = this.$t(`home.computingPower`);
|
stompClient.value.send(
|
||||||
this.option.series[1].name = this.$t(`home.currencyPrice`);
|
`/point/send/message`,
|
||||||
|
{},
|
||||||
|
JSON.stringify(messageObj)
|
||||||
|
)
|
||||||
|
|
||||||
this.myChart.setOption(this.option);
|
// 添加自己发送的消息到显示列表
|
||||||
// 回调函数,在渲染完成后执行
|
receivedMessages.value.push({
|
||||||
this.myChart.on("finished", () => {
|
sender: email.value,
|
||||||
// 在这里执行显示给用户的操作
|
content: message.value.trim(),
|
||||||
// console.log('图表渲染完成,显示给用户');
|
timestamp: new Date().toISOString(),
|
||||||
this.minerChartLoading = false;
|
isSelf: true
|
||||||
});
|
})
|
||||||
// window.addEventListener("resize", () => {
|
|
||||||
// if (this.myChart) this.myChart.resize();
|
|
||||||
// });
|
|
||||||
|
|
||||||
window.addEventListener(
|
message.value = ''
|
||||||
"resize",
|
} catch (error) {
|
||||||
throttle(() => {
|
console.error('发送消息失败:', error)
|
||||||
if (this.myChart) this.myChart.resize();
|
|
||||||
}, 200)
|
receivedMessages.value.push({
|
||||||
);
|
sender: 'System',
|
||||||
},
|
content: `发送失败: ${error.message || '未知错误'}`,
|
||||||
startCountDown() {
|
timestamp: new Date().toISOString(),
|
||||||
this.timer = setInterval(() => {
|
error: true
|
||||||
if (this.countDownTime <= 0) {
|
})
|
||||||
//当监测到countDownTime为0时,清除计数器并且移除sessionStorage,然后执行提交试卷逻辑
|
|
||||||
clearInterval(this.timer);
|
|
||||||
sessionStorage.removeItem("exam_time");
|
|
||||||
alert("提交试卷");
|
|
||||||
} else if (this.countDownTime > 0) {
|
|
||||||
//每秒让countDownTime -1秒,并设置到sessionStorage中
|
|
||||||
this.countDownTime--;
|
|
||||||
window.sessionStorage.setItem("exam_time", this.countDownTime);
|
|
||||||
}
|
}
|
||||||
}, 1000);
|
} else {
|
||||||
},
|
connectionError.value = '连接已断开,请重新连接'
|
||||||
},
|
isConnected.value = false
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 组件卸载时断开连接
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (stompClient.value?.connected) {
|
||||||
|
stompClient.value.disconnect()
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.read-the-docs {
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-input-container {
|
||||||
|
max-width: 400px;
|
||||||
|
margin: 20px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-container {
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 20px auto;
|
||||||
|
padding: 20px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 6px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list {
|
||||||
|
height: 300px;
|
||||||
|
overflow-y: auto;
|
||||||
|
border: 1px solid #eee;
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message {
|
||||||
|
margin: 8px 0;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-radius: 8px;
|
||||||
|
max-width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 0.8em;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-sender {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-time {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-content {
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message[class*="isSelf"] {
|
||||||
|
background-color: #dcf8c6;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-message {
|
||||||
|
background-color: #ffebee;
|
||||||
|
color: #d32f2f;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin: 10px 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-container {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input, textarea {
|
||||||
|
flex: 1;
|
||||||
|
padding: 10px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-family: inherit;
|
||||||
|
resize: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 8px 16px;
|
||||||
|
background-color: #4CAF50;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover:not(:disabled) {
|
||||||
|
background-color: #45a049;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-group {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disconnect-btn {
|
||||||
|
background-color: #dc3545;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disconnect-btn:hover {
|
||||||
|
background-color: #c82333;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:disabled, textarea:disabled {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -105,9 +105,9 @@ export default {
|
||||||
console.log(res,"文件返回");
|
console.log(res,"文件返回");
|
||||||
|
|
||||||
this.ruleForm.files = res.data.data.id
|
this.ruleForm.files = res.data.data.id
|
||||||
if (this.ruleForm.files) {//成功拿到返回ID
|
// if (this.ruleForm.files) {//成功拿到返回ID
|
||||||
this.fetchSubmitWork(this.ruleForm)
|
// this.fetchSubmitWork(this.ruleForm)
|
||||||
}
|
// }
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
|
@ -167,6 +167,7 @@ export default {
|
||||||
this.workOrderId = localStorage.getItem("workOrderId")
|
this.workOrderId = localStorage.getItem("workOrderId")
|
||||||
if (this.workOrderId) {
|
if (this.workOrderId) {
|
||||||
this.fetchTicketDetails({ id: this.workOrderId })
|
this.fetchTicketDetails({ id: this.workOrderId })
|
||||||
|
this.registerRecoveryMethod('fetchTicketDetails', { id: this.workOrderId });
|
||||||
}
|
}
|
||||||
|
|
||||||
// this.faultList = JSON.parse(localStorage.getItem('faultList') )
|
// this.faultList = JSON.parse(localStorage.getItem('faultList') )
|
||||||
|
|
|
@ -198,18 +198,22 @@ export default {
|
||||||
case `all`:
|
case `all`:
|
||||||
this.params.status = 0
|
this.params.status = 0
|
||||||
this.fetchRechargeRecord0(this.params)
|
this.fetchRechargeRecord0(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchRechargeRecord0', this.params);
|
||||||
break;
|
break;
|
||||||
case `pending`:
|
case `pending`:
|
||||||
this.params.status = 2
|
this.params.status = 2
|
||||||
this.fetchRechargeRecord2(this.params)
|
this.fetchRechargeRecord2(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchRechargeRecord2', this.params);
|
||||||
break;
|
break;
|
||||||
case `Finished`:
|
case `Finished`:
|
||||||
this.params.status = 10
|
this.params.status = 10
|
||||||
this.fetchRechargeRecord10(this.params)
|
this.fetchRechargeRecord10(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchRechargeRecord10', this.params);
|
||||||
break;
|
break;
|
||||||
case `pendingProcessing`:
|
case `pendingProcessing`:
|
||||||
this.params.status = 1
|
this.params.status = 1
|
||||||
this.fetchRechargeRecord1(this.params)
|
this.fetchRechargeRecord1(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchRechargeRecord1', this.params);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -95,14 +95,17 @@ export default {
|
||||||
case "pending":
|
case "pending":
|
||||||
this.params.status = 1
|
this.params.status = 1
|
||||||
this.fetchPrivateConsume1(this.params)
|
this.fetchPrivateConsume1(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchPrivateConsume1', this.params);
|
||||||
break;
|
break;
|
||||||
case "success"://已完成工单
|
case "success"://已完成工单
|
||||||
this.params.status = 2
|
this.params.status = 2
|
||||||
this.fetchPrivateConsume2(this.params)
|
this.fetchPrivateConsume2(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchPrivateConsume2', this.params);
|
||||||
break;
|
break;
|
||||||
case "reply"://全部工单
|
case "reply"://全部工单
|
||||||
this.params.status = 0
|
this.params.status = 0
|
||||||
this.fetchPrivateConsume0(this.params)
|
this.fetchPrivateConsume0(this.params)
|
||||||
|
this.registerRecoveryMethod('fetchPrivateConsume0', this.params);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 716 KiB |
Binary file not shown.
After Width: | Height: | Size: 124 KiB |
|
@ -1 +1 @@
|
||||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_irzdjxdsrq8.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><meta name=format-detection content="telephone=no"><meta name=apple-mobile-web-app-capable content=yes><script defer src=/js/chunk-vendors-945ce2fe.d4a64849.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.454dc86a.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/app-42f9d7e6.b52260c2.js></script><script defer src=/js/app-6f02571b.3a5059dd.js></script><script defer src=/js/app-01dc9ae1.188fe4f5.js></script><script defer src=/js/app-b4c4f6ec.d94757ae.js></script><script defer src=/js/app-72600b29.4950ef3f.js></script><script defer src=/js/app-f035d474.f2154b52.js></script><script defer src=/js/app-113c6c50.8a204225.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.afc6aa48.css rel=stylesheet><link href=/css/app-01dc9ae1.825b7ca3.css rel=stylesheet><link href=/css/app-b4c4f6ec.a41cc6d7.css rel=stylesheet><link href=/css/app-72600b29.adc64aa5.css rel=stylesheet><link href=/css/app-f035d474.1006091b.css rel=stylesheet><link href=/css/app-113c6c50.0c83a15a.css rel=stylesheet></head><body><div id=app></div></body></html>
|
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_irzdjxdsrq8.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><meta name=format-detection content="telephone=no"><meta name=apple-mobile-web-app-capable content=yes><script defer src=/js/chunk-vendors-945ce2fe.648a91a9.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer src=/js/chunk-vendors-377fed06.159de137.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/app-42f9d7e6.17cb0808.js></script><script defer src=/js/app-5c551db8.2b99b68c.js></script><script defer src=/js/app-01dc9ae1.188fe4f5.js></script><script defer src=/js/app-b4c4f6ec.bf0536f4.js></script><script defer src=/js/app-72600b29.6b68c3d1.js></script><script defer src=/js/app-f035d474.30e8939b.js></script><script defer src=/js/app-113c6c50.28d27f0c.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.23095695.css rel=stylesheet><link href=/css/app-01dc9ae1.825b7ca3.css rel=stylesheet><link href=/css/app-b4c4f6ec.c96edfc1.css rel=stylesheet><link href=/css/app-72600b29.83c22f01.css rel=stylesheet><link href=/css/app-f035d474.0e6b8898.css rel=stylesheet><link href=/css/app-113c6c50.af06316f.css rel=stylesheet></head><body><div id=app></div></body></html>
|
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -3,7 +3,10 @@ Allow: / #允许爬取根目录下的所有内
|
||||||
Disallow: /admin
|
Disallow: /admin
|
||||||
Disallow: /oapi #禁止爬取oapi和api开头的接口内容
|
Disallow: /oapi #禁止爬取oapi和api开头的接口内容
|
||||||
Disallow: /api
|
Disallow: /api
|
||||||
Disallow: /*/AccessMiningPool/enx
|
# 明确禁止访问不存在的路径 $精确匹配
|
||||||
|
Disallow: /*/AccessMiningPool/enx$
|
||||||
|
Disallow: /en/AccessMiningPool/enx$
|
||||||
|
Disallow: /zh/AccessMiningPool/enx$
|
||||||
|
|
||||||
|
|
||||||
# 站点地图配置
|
# 站点地图配置
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/en</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-09T07:15:58.590Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/en</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
Binary file not shown.
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/zh</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-09T07:15:58.582Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/zh</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
Binary file not shown.
Loading…
Reference in New Issue