1.m2pool断网重连 60秒内重连机制 所有页面添加

2.优化响应错误提示 3秒内同一种错误只提示一次
This commit is contained in:
yaoqin 2025-04-18 14:45:39 +08:00
parent 00e6f9010a
commit 4d436c725e
48 changed files with 652 additions and 297 deletions

View File

@ -11,6 +11,9 @@ import './assets/icons/iconfont/iconfont.css'
import {$addStorageEvent} from '../src/utils/publicMethods'
import MetaInfo from 'vue-meta-info'
import loadingStateMixin from './utils/loadingStateMixin';
import networkRecoveryMixin from './mixins/networkRecoveryMixin';
import './utils/loadingRecovery';
import errorNotificationManager from '../src/utils/errorNotificationManager';
Vue.use(MetaInfo)
Vue.prototype.$addStorageEvent = $addStorageEvent // 添加storage事件
@ -21,7 +24,9 @@ Vue.use(ElementUI, {
Vue.prototype.$axios = axios
console.log = ()=>{} //全局关闭打印
// 全局注册混入
Vue.mixin(loadingStateMixin);
Vue.mixin(networkRecoveryMixin);
Vue.prototype.$baseApi = process.env.VUE_APP_BASE_URL //图片base路径
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
@ -45,6 +50,11 @@ router.beforeEach((to, from, next) => {
next();
});
// 定期清理过期的错误记录
setInterval(() => {
errorNotificationManager.cleanup();
}, 60000); // 每分钟清理一次
window.vm = new Vue({
router,
store,

View File

@ -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);
}
};

View File

@ -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;

View File

@ -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);

View File

@ -2,6 +2,8 @@ import axios from 'axios'
import errorCode from './errorCode'
import { Notification, MessageBox, Message } from 'element-ui'
import loadingManager from './loadingManager';
import errorNotificationManager from './errorNotificationManager';
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
@ -19,10 +21,51 @@ let lastNetworkErrorTime = 0; // 上次网络错误提示时间
let pendingRequests = new Map();
// 网络状态监听器
// 网络状态最后提示时间
let lastNetworkStatusTime = {
online: 0,
offline: 0
};
// 创建一个全局标志,确保每次网络恢复只显示一次提示
let networkRecoveryInProgress = false;
// 网络状态监听器
window.addEventListener('online', () => {
// 网络恢复时,重试所有待处理的请求
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 = [];
pendingRequests.forEach(async (request, key) => {
@ -71,27 +114,46 @@ window.addEventListener('online', () => {
// 等待所有请求完成
Promise.allSettled(pendingPromises).then(() => {
// 重置所有 loading 状态
loadingManager.resetAllLoadingStates();
if (loadingManager) {
loadingManager.resetAllLoadingStates();
}
// 手动重置一些关键的 loading 状态
if (window.vm) {
// 常见的加载状态
const commonLoadingProps = [
'minerChartLoading', 'reportBlockLoading', 'apiPageLoading',
'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秒后允许再次处理网络恢复
});
// 显示网络恢复提示
if (window.vm && window.vm.$message) {
window.vm.$message({
message: window.vm.$i18n.t('home.networkReconnected') || '网络已重新连接,正在恢复数据...',
type: 'success',
duration: 3000
});
}
});
// 使用错误提示管理器控制网络断开提示
window.addEventListener('offline', () => {
if (window.vm && window.vm.$message) {
if (window.vm && window.vm.$message && errorNotificationManager.canShowError('networkOffline')) {
window.vm.$message({
message: window.vm.$i18n.t('home.networkOffline') || '网络连接已断开,系统将在恢复连接后自动重试',
type: 'warning',
duration: 3000
type: 'error',
duration: 5000,
showClose: true,
});
}
});
@ -273,19 +335,12 @@ service.interceptors.response.use(res => {
}
}
if (!superReportError) {
superReportError = "error"
localStorage.setItem('superReportError', superReportError)
let { message } = error;
if (message == "Network Error") {
// message = "后端接口网络连接异常,请刷新重试";
const now = Date.now();
if (now - lastNetworkErrorTime > NETWORK_ERROR_THROTTLE_TIME) {
lastNetworkErrorTime = now; // 更新最后提示时间
//使用错误提示管理器errorNotificationManager
if (errorNotificationManager.canShowError(message)) {
if (message == "Network Error") {
Message({
message: window.vm.$i18n.t(`home.NetworkError`),
type: 'error',
@ -293,36 +348,84 @@ service.interceptors.response.use(res => {
showClose: true
});
}
}
else if (message.includes("timeout")) {
// message = "系统接口请求超时,请刷新重试";
Message({
message: window.vm.$i18n.t(`home.requestTimeout`),
type: 'error',
duration: 5 * 1000,
showClose: true
})
}
else if (message.includes("Request failed with status code")) {
// message = "系统接口" + message.substr(message.length - 3) + "异常";
Message({
message: "系统接口" + message.substr(message.length - 3) + "异常",
type: 'error',
duration: 5 * 1000,
showClose: true
})
else if (message.includes("timeout")) {
Message({
message: window.vm.$i18n.t(`home.requestTimeout`),
type: 'error',
duration: 5 * 1000,
showClose: true
});
}
else if (message.includes("Request failed with status code")) {
Message({
message: "系统接口" + message.substr(message.length - 3) + "异常",
type: 'error',
duration: 5 * 1000,
showClose: true
});
} else {
Message({
message: message,
type: 'error',
duration: 5 * 1000,
showClose: true
});
}
} else {
Message({
message: message,
type: 'error',
duration: 5 * 1000,
showClose: true
})
// 避免完全不提示,可以在控制台记录被抑制的错误
console.log('[错误提示] 已抑制重复错误:', message);
}
// let { message } = error;
// if (message == "Network Error") {
// // message = "后端接口网络连接异常,请刷新重试";
// const now = Date.now();
// if (now - lastNetworkErrorTime > NETWORK_ERROR_THROTTLE_TIME) {
// lastNetworkErrorTime = now; // 更新最后提示时间
// Message({
// message: window.vm.$i18n.t(`home.NetworkError`),
// type: 'error',
// duration: 4 * 1000,
// showClose: true
// });
// }
// }
// else if (message.includes("timeout")) {
// // message = "系统接口请求超时,请刷新重试";
// Message({
// message: window.vm.$i18n.t(`home.requestTimeout`),
// type: 'error',
// duration: 5 * 1000,
// showClose: true
// })
// }
// else if (message.includes("Request failed with status code")) {
// // message = "系统接口" + message.substr(message.length - 3) + "异常";
// Message({
// message: "系统接口" + message.substr(message.length - 3) + "异常",
// type: 'error',
// duration: 5 * 1000,
// showClose: true
// })
// } else {
// Message({
// message: message,
// type: 'error',
// duration: 5 * 1000,
// showClose: true
// })
// }
}

View File

@ -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}`);
}
});
}

View File

@ -171,10 +171,13 @@ export default {
// this.stateList = JSON.parse(localStorage.getItem('stateList') )
// this.typeList = JSON.parse(localStorage.getItem('typeList') )
this.registerRecoveryMethod('fetchTicketDetails', { id: this.workOrderId });
},
methods: {
async fetchBKendTicket(params){
this.totalDetailsLoading =true
// this.totalDetailsLoading =true
this.setLoading('totalDetailsLoading', true);
const data = await getBKendTicket(params)
if (data && data.code == 200) {
this.$message({
@ -185,11 +188,12 @@ export default {
}
this.totalDetailsLoading =false
this.setLoading('totalDetailsLoading', false);
},
async fetchReply(params){
this.totalDetailsLoading = true
// this.totalDetailsLoading = true
this.setLoading('totalDetailsLoading', true);
const data = await getReply(params)
if (data && data.code == 200) {
this.$message({
@ -205,7 +209,7 @@ export default {
}
this.totalDetailsLoading = false
this.setLoading('totalDetailsLoading', false);
},
handelType2(label){
if (label) {
@ -231,14 +235,15 @@ export default {
},
//请求工单详情
async fetchTicketDetails(param) {
this.totalDetailsLoading = true
// this.totalDetailsLoading = true
this.setLoading('totalDetailsLoading', true);
const { data } = await getDetails(param)
this.recordList = data.list
this.ticketDetails = data
this.totalDetailsLoading = false
this.setLoading('totalDetailsLoading', false);
},

View File

@ -92,7 +92,7 @@ export default {
this.params.maId = this.receiveData.id
}
this.fetchList(this.listParams)
this.registerRecoveryMethod('fetchList', this.listParams);
},
methods:{
@ -100,7 +100,8 @@ export default {
return getImageUrl(path);
},
async fetchAddNoticeEmail(params){
this.addMinerLoading = true
// this.addMinerLoading = true
this.setLoading('addMinerLoading', true);
const data = await getAddNoticeEmail(params)
if (data && data.code == 200) {
this.$message({
@ -121,17 +122,18 @@ export default {
}
}
this.addMinerLoading = false
this.setLoading('addMinerLoading', false);
},
async fetchList(params){
this.alertsLoading=true
// this.alertsLoading=true
this.setLoading('alertsLoading', true);
const data = await getList(params)
if (data && data.code == 200) {
this.tableData = data.rows
}
this.alertsLoading=false
this.setLoading('alertsLoading', false);
},
async fetchCode(params){
@ -147,7 +149,8 @@ export default {
},
async fetchUpdateInfo(params){
this.addMinerLoading = true
// this.addMinerLoading = true
this.setLoading('addMinerLoading', true);
const data = await getUpdateInfo(params)
if (data && data.code == 200) {
this.$message({
@ -159,11 +162,12 @@ export default {
this.fetchList(this.listParams)
}
this.addMinerLoading = false
this.setLoading('addMinerLoading', false);
},
async fetchDeleteEmail(params){
this.deleteLoading = true
// this.deleteLoading = true
this.setLoading('deleteLoading', true);
const data = await deleteEmail(params)
if (data && data.code == 200) {
this.$message({
@ -175,8 +179,8 @@ export default {
this.fetchList(this.listParams)
}
this.deleteLoading = false
this.setLoading('deleteLoading', false);
},
add(){

View File

@ -442,7 +442,7 @@
<!-- 挖矿账号下矿工总览 -->
<div class="Pool">
<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.parameter`) }}</p>
<table border="1">
@ -797,7 +797,7 @@
<!-- 指定矿机历史24h平均算力 -->
<div class="Pool">
<p class="hash">{{ $t(`apiFile.miningMachineHistory24h`) }}</p>
<p class="Interface">Post /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.parameter`) }}</p>
<table border="1">
@ -1371,7 +1371,7 @@
<!-- 挖矿账号下矿工总览 -->
<div class="Pool">
<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.parameter`) }}</p>
<table border="1">
@ -1726,7 +1726,7 @@
<!-- 指定矿机历史24h平均算力 -->
<div class="Pool">
<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.parameter`) }}</p>
<table border="1">

View File

@ -6,7 +6,7 @@ import * as echarts from "echarts";
import { Debounce, throttle } from "../../utils/publicMethods";
export default {
data() {
return {
activeName: "second",
@ -759,7 +759,7 @@ export default {
],
FeeShow: true,
lang: 'en',
activeItemCoin:{
activeItemCoin: {
value: "nexa",
label: "nexa",
img: require("../../assets/img/currency-nexa.png"),
@ -781,19 +781,19 @@ export default {
},
activeItemCoin: {
handler(newVal) {
// 防止无限循环
if (this.isInternalChange) {
return;
}
this.handleActiveItemChange(newVal);
// 防止无限循环
if (this.isInternalChange) {
return;
}
this.handleActiveItemChange(newVal);
},
deep: true
}
}
},
mounted() {
this.lang = this.$i18n.locale; // 初始化语言值
this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(this.currencyList[0]))
this.minerChartLoading = true
@ -832,6 +832,11 @@ export default {
this.getCoinInfoData(this.params)
this.getPoolPowerData(this.PowerParams)
// 注册需要在网络恢复后自动重新调用的方法
this.registerRecoveryMethod('getCoinInfoData', this.params);
this.registerRecoveryMethod('getPoolPowerData', this.PowerParams);
this.registerRecoveryMethod('getBlockInfoData', this.BlockInfoParams);
this.$addStorageEvent(1, `currencyList`, JSON.stringify(this.currencyList))
if (this.$refs.select) {
this.$refs.select.$el.children[0].children[0].setAttribute('style', "background:url(https://test.m2pool.com/img/nexa.png) no-repeat 10PX;background-size: 20PX 20PX;color:#333;padding-left: 30PX;");
@ -844,9 +849,9 @@ export default {
// let activeItemCoin =localStorage.getItem(`activeItemCoin`)
// this.activeItemCoin=JSON.parse(activeItemCoin)
window.addEventListener("setItem", () => {
let value =localStorage.getItem(`activeItemCoin`)
this.activeItemCoin=JSON.parse(value)
let value = localStorage.getItem(`activeItemCoin`)
this.activeItemCoin = JSON.parse(value)
});
},
@ -866,7 +871,7 @@ export default {
listEl.style.left = '-' + (leftMove - 360) + 'PX'
}
},
//初始化图表
inCharts() {
@ -1047,15 +1052,15 @@ export default {
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))
@ -1063,13 +1068,13 @@ export default {
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);
@ -1082,13 +1087,13 @@ export default {
this.inCharts()
})
}catch{
} catch {
console.error('获取数据失败:', error);
}finally {
} finally {
// 确保无论成功失败都设置loading为false
this.setLoading('minerChartLoading', false);
}
}
@ -1221,37 +1226,11 @@ export default {
}, 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) {
// this.reportBlockLoading = true
try {
// this.reportBlockLoading = true
this.setLoading('reportBlockLoading', true);
const data = await getBlockInfo(params)
if (data && data.code == 200) {
@ -1259,7 +1238,8 @@ export default {
this.newBlockInfoData = []
this.BlockInfoData = data.rows
if (!this.BlockInfoData[0]) {
this.reportBlockLoading = false
// this.reportBlockLoading = false
this.setLoading('reportBlockLoading', false);
return
}
@ -1271,13 +1251,21 @@ export default {
}
})
} else {
this.BlockShow = false
}
this.setLoading('reportBlockLoading', false);
// this.reportBlockLoading = false
} catch (error) {
console.error('获取区块信息失败:', error);
this.BlockShow = false;
}finally {
// 确保在任何情况下都会重置 loading 状态
this.setLoading('reportBlockLoading', false);
}
@ -1321,38 +1309,54 @@ export default {
switch (this.time) {
case "day":
// this.profit = result.toFixed(10)
this.profit = result.toFixed(8)
// this.profit = Math.floor(result * 1e10) / 1e10;
this.profit = this.toFixedNoRound(result, 10);
// this.profit = this.toFixedNoRound(result, 10);
break;
case "week":
// this.profit = (result * 7).toFixed(10)
this.profit = (result * 7).toFixed(8)
// this.profit = Math.floor(result * 7 * 1e10) / 1e10;
this.profit = this.toFixedNoRound(result * 7, 10);
// this.profit = this.toFixedNoRound(result * 7, 10);
break;
case "month":
// this.profit = (result * 30).toFixed(10)
this.profit = (result * 30).toFixed(8)
// this.profit = Math.floor(result * 30 * 1e10) / 1e10;
this.profit = this.toFixedNoRound(result * 30, 10);
// this.profit = this.toFixedNoRound(result * 30, 10);
break;
case "year":
// this.profit = (result * 365).toFixed(10)
this.profit = (result * 365).toFixed(8)
// this.profit = Math.floor(result * 365 * 1e10) / 1e10;
this.profit = this.toFixedNoRound(result * 365, 10);
// this.profit = this.toFixedNoRound(result * 365, 10);
break;
default:
break;
}
// 10000000000000000
const formatter = new Intl.NumberFormat("en-US", {
minimumFractionDigits: 10, // 强制显示足够多的小数位
const nexaFormatter = new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2, // 强制显示 2 位小数(不足补零)
maximumFractionDigits: 2, // 可选:限制最多 2 位小数(避免多余位数)
useGrouping: true, // 不使用千位分隔符(如 1,000
});
this.profit = formatter.format(this.profit);
if (this.value == "nexa") {
this.profit = nexaFormatter.format(this.profit);
} else {
const formatter = new Intl.NumberFormat("en-US", {
minimumFractionDigits: 8, // 强制显示足够多的小数位
useGrouping: true, // 不使用千位分隔符(如 1,000
});
this.profit = formatter.format(this.profit);
}
// const formatter = new Intl.NumberFormat("en-US", {
// minimumFractionDigits: 8, // 强制显示足够多的小数位
// useGrouping: false, // 不使用千位分隔符(如 1,000
// });
// this.profit = formatter.format(this.profit);
},
@ -1417,7 +1421,7 @@ export default {
this.fetchParam({ coin: this.value })
},
handelJump(url) {
handelJump(url) {
if (url === '/AccessMiningPool') {
const coin = this.currencyList.find(item => item.value === this.params.coin);
@ -1425,16 +1429,16 @@ export default {
let jumpName = coin.path.charAt(0).toUpperCase() + coin.path.slice(1) //name跳转 首字母大写
// 使用 name 进行导航,避免重复的路由参数
this.$router.push({
name: jumpName,
params: {
lang: this.lang,
coin: this.params.coin,
imgUrl: this.currencyPath
name: jumpName,
params: {
lang: this.lang,
coin: this.params.coin,
imgUrl: this.currencyPath
},
replace: false // 保留历史记录,允许回退
},
replace: false // 保留历史记录,允许回退
});
} else {
// 移除开头的斜杠,统一处理路径格式
const cleanPath = url.startsWith('/') ? url.slice(1) : url;
@ -1493,29 +1497,29 @@ export default {
// }, 1000),
handleActiveItemChange(item) {
if (!item) return;
this.currency = item.label;
this.currencyPath = item.imgUrl;
this.params.coin = item.value;
console.log( this.params.coin , "item");
console.log(this.params.coin, "item");
this.BlockInfoParams.coin = item.value;
this.itemActive = item.value;
this.PowerParams.coin = item.value;
// 调用相关数据更新方法
this.getCoinInfoData(this.params);
this.getBlockInfoData(this.BlockInfoParams);
if (this.powerActive) {
this.handelPower();
this.handelPower();
} else {
this.handelMiner();
this.handelMiner();
}
this.handelCoinLabel(item.value);
},
},
clickCurrency(item) {
if (!item) return;
@ -1531,16 +1535,16 @@ export default {
// this.PowerParams.coin = item.value
// this.getCoinInfoData(this.params)
// this.getBlockInfoData(this.BlockInfoParams)
// 在下一个事件循环中重置标记
this.$nextTick(() => {
this.isInternalChange = false;
});
// 直接调用处理方法
this.handleActiveItemChange(item);
// 直接调用处理方法
this.handleActiveItemChange(item);
},
clickReportBlock() {
this.$router.push({

View File

@ -375,7 +375,7 @@
<div class="currencyDescription2">
<section class="miningPoolBox">
<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="chartBth">
@ -603,7 +603,7 @@
<el-row>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<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">
<ul>
<li class="table-title">

View File

@ -1345,7 +1345,14 @@ export default {
this.getMinerListData(this.MinerListParams)
this.getHistoryIncomeData(this.IncomeParams)
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: {
@ -1400,11 +1407,12 @@ export default {
// console.log(data,"获取币种信息");
},
async getMinerAccountPowerData(params) {
this.powerChartLoading = true
// this.powerChartLoading = true
this.setLoading('powerChartLoading', true);
const data = await getMinerAccountPower(params)
if (!data) {
this.powerChartLoading = false
this.setLoading('powerChartLoading', false);
if (this.myChart) {
this.myChart.dispose()//销毁图表实列
}
@ -1437,13 +1445,13 @@ export default {
this.option.series[1].data = rejectRate
this.inCharts()
this.powerChartLoading = false
this.setLoading('powerChartLoading', false);
},
async getAccountPowerDistributionData(params) {
this.barChartLoading = true
this.setLoading('barChartLoading', true);
const data = await getAccountPowerDistribution(params)
let barData = data.data
let xData = []
@ -1455,7 +1463,7 @@ export default {
this.barOption.xAxis[0].data = xData
this.barOption.series[0].data = barValueList
this.barInCharts()
this.barChartLoading = false
this.setLoading('barChartLoading', false);
},
formatNumber(num) {//保留两位小数并补0
const intPart = Math.floor(num);
@ -1463,7 +1471,7 @@ export default {
return `${intPart}.${String(decimalPart).padStart(2, '0')}`;
},
async getMinerListData(params) {
this.MinerListLoading = true
this.setLoading('MinerListLoading', true);
const data = await getMinerList(params)
if (data && data.code == 200) {
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
// },
getMinerPowerData:Debounce(async function(params){
this.miniLoading=true
this.setLoading('miniLoading', true);
const data = await getMinerPower(params)
if (!data) {
this.miniLoading=false
this.setLoading('miniLoading', false);
return
}
let miniData = data.data
@ -1618,62 +1626,18 @@ export default {
this.miniLoading=false
this.setLoading('miniLoading', false);
},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
// },
getMinerPowerOnLine:Debounce(async function(params){
this.miniLoading=true
this.setLoading('miniLoading', true);
const data = await getMinerPower(params)
if (!data) {
this.miniLoading=false
this.setLoading('miniLoading', false);
return
}
let miniData = data.data
@ -1716,7 +1680,7 @@ export default {
this.miniLoading=false
this.setLoading('miniLoading', false);
},200),
@ -1768,10 +1732,10 @@ export default {
// this.miniLoading=false
// },
getMinerPowerOffLine:Debounce(async function(params){
this.miniLoading=true
this.setLoading('miniLoading', true);
const data = await getMinerPower(params)
if (!data) {
this.miniLoading=false
this.setLoading('miniLoading', false);
return
}
let miniData = data.data
@ -1815,7 +1779,7 @@ export default {
this.miniLoading=false
this.setLoading('miniLoading', false);
},200),

View File

@ -96,17 +96,20 @@ export default {
},
mounted() {
this.fetchApiList(this.listParams)
this.registerRecoveryMethod('fetchApiList', this.listParams);
},
methods: {
async fetchApiKey(params) {
this.ApiKeyLoading = true
this.setLoading('ApiKeyLoading', true);
const data = await getApiKey(params)
if (data && data.code == 200) {
this.fetchApiList(this.listParams)
this.dialogVisible = false
}
this.ApiKeyLoading = false
this.setLoading('ApiKeyLoading', false);
},
async fetchApiList(params) {
this.apiPageLoading = true
@ -115,7 +118,7 @@ export default {
this.apiList = data.rows
}
this.apiPageLoading = false
this.setLoading('apiPageLoading', false);
},
async fetchApiInfo(params) {
this.apiPageLoading = true
@ -127,7 +130,7 @@ export default {
}
}
this.apiPageLoading = false
this.setLoading('apiPageLoading', false);
},
async fetchUpdateAPI(params) {
this.apiPageLoading = true
@ -137,7 +140,7 @@ export default {
this.modifyDialogVisible =false
}
this.apiPageLoading = false
this.setLoading('apiPageLoading', false);
},
async fetchDelApi(params) {
this.apiPageLoading = true
@ -149,7 +152,7 @@ export default {
this.fetchApiList(this.listParams)
}
this.apiPageLoading = false
this.setLoading('apiPageLoading', false);
},
RequestApiKey() {
this.dialogVisible = true

View File

@ -270,6 +270,9 @@ export default {
this.fetchAccountList()
this.registerRecoveryMethod('fetchIfBind', "");
this.registerRecoveryMethod('fetchAccountList', "");
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
window.addEventListener("setItem", () => {
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
@ -284,7 +287,8 @@ export default {
},
methods: {
async fetchIfBind(params){
this.securityLoading = true
// this.securityLoading = true
this.setLoading('securityLoading', true);
const data = await getIfBind(params)
if (data && data.code === 200) {
if (data.data) {
@ -302,13 +306,14 @@ export default {
this.dialogVerification=true
}
}
this.securityLoading = false
this.setLoading('securityLoading', false);
},
async fetchCheck(params){
this.addMinerLoading =true
// this.addMinerLoading =true
this.setLoading('addMinerLoading', true);
const data = await getCheck(params)
if (!data) {
this.addMinerLoading =false
this.setLoading('addMinerLoading', false);
}
if (data && data.code === 200) {
@ -320,20 +325,21 @@ export default {
type: "error",
showClose: true
});
this.addMinerLoading =false
this.setLoading('addMinerLoading', false);
}else if(data.code === 802){//钱包不可用
this.$message({
message: this.$t(`personal.invalidAddress`),
type: "error",
showClose: true
});
this.addMinerLoading =false
this.setLoading('addMinerLoading', false);
}
},
async fetchCheckBalance(params){
this.confirmBindingLoading =true
// this.confirmBindingLoading =true
this.setLoading('confirmBindingLoading', true);
const data = await getCheckBalance(params)
if (data && data.data) {
this.fetchWalletAddress(this.WalletAddressParams)
@ -344,7 +350,7 @@ export default {
type: 'error'
});
}
this.confirmBindingLoading =false
this.setLoading('confirmBindingLoading', false);
},
async fetchAccountGradeList(){
const data = await getAccountGradeList()
@ -369,7 +375,8 @@ export default {
}
},
async fetchMinerAccountBalance(params) {
this.MiningLoading = true
// this.MiningLoading = true
this.setLoading('MiningLoading', true);
const data = await getMinerAccountBalance(params)
if (data && data.code == 200) {
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.amount = this.paymentSettingsData.amount ? this.paymentSettingsData.amount : `0`
this.MiningLoading = false
this.setLoading('MiningLoading', false);
},
async fetchDelMinerAccount(params) {
this.MiningLoading = true
// this.MiningLoading = true
this.setLoading('MiningLoading', true);
const data = await getDelMinerAccount(params)
if (data && data.code == 200) {
@ -400,17 +408,18 @@ export default {
}
this.MiningLoading = false
this.setLoading('MiningLoading', false);
},
async fetchAccountList(params) {
this.MiningLoading = true
// this.MiningLoading = true
this.setLoading('MiningLoading', true);
const data = await getAccountList(params)
this.accountList = data.data
console.log("请求成功,",data);
this.newAccountList = 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) {
this.addMinerLoading =true
// this.addMinerLoading =true
this.setLoading('addMinerLoading', true);
const data = await getAddMinerAccount(params)
if (data && data.code == 200) {
this.$message({
@ -451,7 +461,7 @@ export default {
this.fetchAccountList()
this.fetchAccountGradeList()
this.addMinerLoading =false
this.setLoading('addMinerLoading', false);
},
handleCheckAllChange(val) {

View File

@ -197,14 +197,16 @@ export default {
}))
}));
console.log( this.newMiningAccountList,"isrjiojfeo");
this.fetchUrlList(this.UrlListParams)
this.registerRecoveryMethod('fetchUrlList', this.UrlListParams);
},
methods: {
async fetchHtmlUrl(params){
this.establishLoading = true
// this.establishLoading = true
this.setLoading('establishLoading', true);
const data = await getHtmlUrl(params)
if (data && data.code == 200) {
@ -212,10 +214,11 @@ export default {
this.dialogVisible=false
}
this.establishLoading = false
this.setLoading('establishLoading', false);
},
async fetchUrlList(params){
this.UrlListLoading = true
// this.UrlListLoading = true
this.setLoading('UrlListLoading', true);
const data = await getUrlList(params)
console.log(data,666 );
@ -223,7 +226,7 @@ export default {
this.TotalSize = data.total
this.UrlListLoading = false
this.setLoading('UrlListLoading', false);
},
async fetchUrlInfo(params){
const data = await getUrlInfo(params)
@ -239,7 +242,8 @@ export default {
},
async fetchChangeUrlInfo(params){
this.modifyLoading=true
// this.modifyLoading=true
this.setLoading('modifyLoading', true);
const data = await getChangeUrlInfo(params)
console.log(data);
if (data && data.code == 200) {
@ -248,7 +252,7 @@ export default {
console.log("修改成功");
}
this.modifyLoading=false
this.setLoading('modifyLoading', false);
},
async fetchDelete(params){

View File

@ -155,13 +155,14 @@ export default {
this.lang = this.$i18n.locale; // 初始化语言值
this.fetchIfBind()
this.registerRecoveryMethod('fetchIfBind', "");
if (this.$route.params.active) {
this.handelVerification()
}
},
methods: {
async fetchIfBind(params) {
this.securityLoading = true
this.setLoading('securityLoading', true);
const data = await getIfBind(params)
if (data && data.code === 200) {
if (data.data) {
@ -170,10 +171,10 @@ export default {
this.isItBound = false
}
}
this.securityLoading = false
this.setLoading('securityLoading', false);
},
async fetchBindInfo(params) {
this.BindInfoLoading = true
this.setLoading('BindInfoLoading', true);
const data = await getBindInfo(params)
console.log(data, "绑定信息");
if (data && data.code === 200) {
@ -182,10 +183,10 @@ export default {
this.dialogVisible = false
}
this.BindInfoLoading = false
this.setLoading('BindInfoLoading', false);
},
async fetchBindGoogle(params) {
this.BindInfoLoading = true
this.setLoading('BindInfoLoading', true);
const data = await getBindGoogle(params)
console.log(data, "绑定");
if (data && data.code === 200) {
@ -203,7 +204,7 @@ export default {
}
this.BindInfoLoading = false
this.setLoading('BindInfoLoading', false);
},
async fetchBindCode(params) {
const data = await getBindCode(params)
@ -216,7 +217,7 @@ export default {
}
},
async fetchResetPwd(params) {
this.ResetPwdLoading = true
this.setLoading('ResetPwdLoading', true);
const data = await getUpdatePwd(params)
if (data && data.code === 200) {
this.$message({
@ -230,7 +231,7 @@ export default {
localStorage.removeItem("token")
this.$router.push(`/${lang}/login`);
}
this.ResetPwdLoading = false
this.setLoading('ResetPwdLoading', false);
},
async fetchResetPwdCode(params) {
const data = await getUpdatePwdCode(params)
@ -244,7 +245,7 @@ export default {
},
async fetchCloseStepTwo(params) {
this.closeLoading = true
this.setLoading('closeLoading', true);
const data = await getCloseStepTwo(params)
if (data && data.code === 200) {
this.$message({
@ -260,7 +261,7 @@ export default {
this.closeParams[key] = ""
}
}
this.closeLoading = false
this.setLoading('closeLoading', false);
},
async fetchCloseCode(params) {
const data = await getCloseCode(params)

View File

@ -1228,6 +1228,8 @@ export default {
this.getMinerAccountPowerData(this.PowerParams)
this.getAccountPowerDistributionData(this.PowerDistribution)
},
"$i18n.locale":(val)=>{
location.reload();//刷新页面 刷新echarts
@ -1269,6 +1271,12 @@ export default {
this.getMinerListData(this.MinerListParams)
this.getMinerAccountPowerData(this.PowerParams)
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});
},
@ -1320,7 +1328,7 @@ export default {
},
//返回权限 1矿工 2收益 3支付
async fetchPageInfo(params){
this.jurisdictionLoading = true
this.setLoading('jurisdictionLoading', true);
const data = await getPageInfo(params)
console.log(data);
if (data && data.code == 200) {
@ -1354,7 +1362,7 @@ export default {
}
this.jurisdictionLoading = false
this.setLoading('jurisdictionLoading', false);
},
//获取当前挖矿账号信息(包含收益、余额)
async getMinerAccountInfoData(params) {
@ -1362,11 +1370,11 @@ export default {
this.MinerAccountData = data.data
},
async getMinerAccountPowerData(params) {
this.powerChartLoading = true
this.setLoading('powerChartLoading', true);
const data = await getMinerAccountPower(params)
if (!data) {
this.powerChartLoading = false
this.setLoading('powerChartLoading', false);
if (this.myChart) {
this.myChart.dispose()//销毁图表实列
}
@ -1399,13 +1407,13 @@ export default {
this.option.series[1].data = rejectRate
this.inCharts()
this.powerChartLoading = false
this.setLoading('powerChartLoading', false);
},
async getAccountPowerDistributionData(params) {
this.barChartLoading = true
this.setLoading('barChartLoading', true);
const data = await getAccountPowerDistribution(params)
let barData = data.data
let xData = []
@ -1417,7 +1425,7 @@ export default {
this.barOption.xAxis[0].data = xData
this.barOption.series[0].data = barValueList
this.barInCharts()
this.barChartLoading = false
this.setLoading('barChartLoading', false);
},
formatNumber(num) {//保留两位小数并补0
const intPart = Math.floor(num);
@ -1425,7 +1433,7 @@ export default {
return `${intPart}.${String(decimalPart).padStart(2, '0')}`;
},
async getMinerListData(params) {
this.MinerListLoading = true
this.setLoading('MinerListLoading', true);
const data = await getMinerList(params)
if (data && data.code == 200) {
this.MinerListData = data.data
@ -1451,17 +1459,17 @@ export default {
}
this.MinerListLoading = false
this.setLoading('MinerListLoading', false);
},
//小图
async getMinerPowerData(params) {
this.miniLoading=true
this.setLoading('miniLoading', true);
const data = await getMinerPower(params)
if (!data) {
this.miniLoading=false
this.setLoading('miniLoading', false);
return
}
let miniData = data.data
@ -1507,15 +1515,15 @@ export default {
this.miniLoading=false
this.setLoading('miniLoading', false);
},
//小图
async getMinerPowerOnLine(params) {
this.miniLoading=true
this.setLoading('miniLoading', true);
const data = await getMinerPower(params)
if (!data) {
this.miniLoading=false
this.setLoading('miniLoading', false);
return
}
let miniData = data.data
@ -1556,14 +1564,14 @@ export default {
this.miniLoading=false
this.setLoading('miniLoading', false);
},
//小图
async getMinerPowerOffLine(params) {
this.miniLoading=true
this.setLoading('miniLoading', true);
const data = await getMinerPower(params)
if (!data) {
this.miniLoading=false
this.setLoading('miniLoading', false);
return
}
let miniData = data.data
@ -1605,7 +1613,7 @@ export default {
this.miniLoading=false
this.setLoading('miniLoading', false);
},
async getHistoryIncomeData(params) {
const data = await getHistoryIncome(params)

View File

@ -235,6 +235,10 @@ export default {
this.getLuckData(this.params)
this.getBlockInfoData(this.BlockInfoParams)
this.registerRecoveryMethod('getLuckData', this.params);
this.registerRecoveryMethod('getBlockInfoData', this.BlockInfoParams);
let value = localStorage.getItem("activeItemCoin")
this.activeItemCoin = JSON.parse(value)
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
@ -260,14 +264,14 @@ export default {
// },
getLuckData: Debounce(async function (params) {
this.LuckDataLoading = true
this.setLoading('LuckDataLoading', true);
const data = await getLuck(params)
if (data && data.code == 200) {
this.luckData = data.data
}
this.LuckDataLoading = false
this.setLoading('LuckDataLoading', false);
}, 200),
// async getBlockInfoData(params) {
// this.reportBlockLoading=true
@ -286,10 +290,10 @@ export default {
// },
getBlockInfoData: Debounce(async function (params) {
this.reportBlockLoading = true
this.setLoading('reportBlockLoading', true);
const data = await getBlockInfo(params)
if (!data) {
this.reportBlockLoading = false
this.setLoading('reportBlockLoading', false);
}
this.totalSize = data.total
this.BlockInfoData = data.rows
@ -298,7 +302,7 @@ export default {
})
// this.currentPage = 1
// console.log(data,"获取币种信息");
this.reportBlockLoading = false
this.setLoading('reportBlockLoading', false);
}, 200),
handleActiveItemChange(item) {
@ -314,6 +318,9 @@ export default {
clickCurrency(item) {
if (!item) return;
// 设置标记,防止触发 watch
this.luckData={}
this.isInternalChange = true;
this.activeItemCoin = item;
this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(item))

View File

@ -27,7 +27,7 @@
</el-menu>
</div>
<div class="luckyBox" >
<div class="luckyBox" v-show="this.activeItemCoin.value != 'enx' && this.activeItemCoin.value != 'alph'">
<div class="luckyItem">
<span class="title">{{$t(`home.lucky3`)}}</span>
@ -125,7 +125,8 @@
</el-col>
<!-- v-loading = "LuckDataLoading" -->
<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">
<span class="title">{{$t(`home.lucky3`)}}</span>

View File

@ -167,6 +167,7 @@ export default {
this.workOrderId = localStorage.getItem("workOrderId")
if (this.workOrderId) {
this.fetchTicketDetails({ id: this.workOrderId })
this.registerRecoveryMethod('fetchTicketDetails', { id: this.workOrderId });
}
// this.faultList = JSON.parse(localStorage.getItem('faultList') )

View File

@ -198,18 +198,22 @@ export default {
case `all`:
this.params.status = 0
this.fetchRechargeRecord0(this.params)
this.registerRecoveryMethod('fetchRechargeRecord0', this.params);
break;
case `pending`:
this.params.status = 2
this.fetchRechargeRecord2(this.params)
this.registerRecoveryMethod('fetchRechargeRecord2', this.params);
break;
case `Finished`:
this.params.status = 10
this.fetchRechargeRecord10(this.params)
this.registerRecoveryMethod('fetchRechargeRecord10', this.params);
break;
case `pendingProcessing`:
this.params.status = 1
this.fetchRechargeRecord1(this.params)
this.registerRecoveryMethod('fetchRechargeRecord1', this.params);
break;
default:

View File

@ -95,14 +95,17 @@ export default {
case "pending":
this.params.status = 1
this.fetchPrivateConsume1(this.params)
this.registerRecoveryMethod('fetchPrivateConsume1', this.params);
break;
case "success"://已完成工单
this.params.status = 2
this.fetchPrivateConsume2(this.params)
this.registerRecoveryMethod('fetchPrivateConsume2', this.params);
break;
case "reply"://全部工单
this.params.status = 0
this.fetchPrivateConsume0(this.params)
this.registerRecoveryMethod('fetchPrivateConsume0', this.params);
break;
default:

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.

View File

@ -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.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.b12571df.js></script><script defer src=/js/app-5c551db8.4db2eb93.js></script><script defer src=/js/app-01dc9ae1.188fe4f5.js></script><script defer src=/js/app-b4c4f6ec.025712d3.js></script><script defer src=/js/app-72600b29.5a5f9303.js></script><script defer src=/js/app-f035d474.30e8939b.js></script><script defer src=/js/app-113c6c50.96c3bebd.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.fbcc1022.css rel=stylesheet><link href=/css/app-72600b29.4fd214e9.css rel=stylesheet><link href=/css/app-f035d474.0e6b8898.css rel=stylesheet><link href=/css/app-113c6c50.6cbc2492.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.

View File

@ -3,7 +3,10 @@ Allow: / #允许爬取根目录下的所有内
Disallow: /admin
Disallow: /oapi #禁止爬取oapi和api开头的接口内容
Disallow: /api
Disallow: /*/AccessMiningPool/enx
# 明确禁止访问不存在的路径 $精确匹配
Disallow: /*/AccessMiningPool/enx$
Disallow: /en/AccessMiningPool/enx$
Disallow: /zh/AccessMiningPool/enx$
# 站点地图配置

View File

@ -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-18T06:25:55.062Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-18T06:25:55.062Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>

Binary file not shown.

View File

@ -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-18T06:25:55.043Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-18T06:25:55.052Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-18T06:25:55.053Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-18T06:25:55.053Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-18T06:25:55.053Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>

Binary file not shown.