更新服务条款页面内容

This commit is contained in:
yaoqin 2025-06-06 15:31:04 +08:00
parent e0a7fb8ee2
commit ac85206085
27 changed files with 464 additions and 243 deletions

Binary file not shown.

View File

@ -1,7 +1,7 @@
<template>
<div id="app">
<router-view class="page" />
<ChatWidget v-if="!$route.path.includes('/customerService')" />
<!-- <ChatWidget v-if="!$route.path.includes('/customerService') && !$isMobile" /> -->
</div>
</template>
<script >

View File

@ -112,9 +112,22 @@
</div>
<!-- 消息项 -->
<div v-for="(msg, index) in displayMessages" :key="msg.id || index">
<!-- 时间分割条 -->
<div v-if="msg.isTimeDivider" class="chat-time-divider">
{{ formatTimeDivider(msg.time) }}
</div>
<!-- 系统提示消息如加载中无更多消息等 -->
<div
v-for="(msg, index) in messages"
:key="index"
v-else-if="msg.isLoading || msg.isSystemHint"
class="system-hint"
>
<i v-if="msg.isLoading" class="el-icon-loading"></i>
<span>{{ msg.text }}</span>
</div>
<!-- 普通消息 -->
<div
v-else
class="chat-message"
:class="{
'chat-message-user': msg.type === 'user',
@ -124,27 +137,16 @@
'chat-message-history': msg.isHistory,
}"
>
<!-- 系统提示消息如加载中无更多消息等 -->
<div v-if="msg.isLoading || msg.isSystemHint" class="system-hint">
<i v-if="msg.isLoading" class="el-icon-loading"></i>
<span>{{ msg.text }}</span>
</div>
<!-- 普通消息 -->
<template v-else>
<div class="message-avatar">
<i v-if="msg.type === 'system'" class="el-icon-service"></i>
<i v-else class="el-icon-user"></i>
</div>
<div class="message-content">
<!-- 时间显示在右上角 -->
<!-- 时间显示在右上角可选建议注释掉 -->
<!-- <span class="message-time">{{ formatTime(msg.time) }}</span> -->
<!-- 文本消息 -->
<div v-if="!msg.isImage" class="message-text">
{{ msg.text }}
</div>
<!-- 图片消息 -->
<div v-else class="message-image">
<img
:src="msg.imageUrl"
@ -153,10 +155,7 @@
@load="handleImageLoad"
/>
</div>
<div class="message-footer">
<!-- <span class="message-time">{{ formatTime(msg.time) }}</span> -->
<!-- 添加已读状态显示 -->
<span
v-if="msg.type === 'user'"
class="message-read-status"
@ -169,7 +168,7 @@
</span>
</div>
</div>
</template>
</div>
</div>
</template>
</div>
@ -193,7 +192,10 @@
:disabled="connectionStatus !== 'connected'"
/>
</div>
<div class="chat-input-wrapper" style="display: flex;align-items: center;">
<div
class="chat-input-wrapper"
style="display: flex; align-items: center"
>
<input
type="text"
class="chat-input"
@ -292,6 +294,33 @@ export default {
maxMessageLength: 300,
};
},
computed: {
/**
* 生成带有时间分割条的消息列表
* @returns {Array} 消息和分割条混合数组
*/
displayMessages() {
const result = [];
const interval = 5 * 60 * 1000; // 5
let lastTime = null;
this.messages.forEach((msg, idx) => {
if (!msg.isSystemHint && !msg.isLoading) {
const msgTime = new Date(msg.time); // new
if (!lastTime || msgTime - lastTime > interval) {
result.push({
isTimeDivider: true,
time: msg.time, //
id: `divider-${msg.time}-${idx}`,
});
lastTime = msgTime;
}
}
result.push(msg);
});
return result;
}
},
async created() {
this.determineUserType();
@ -321,6 +350,9 @@ export default {
document.addEventListener("mousemove", this.updateLastActivityTime);
document.addEventListener("keydown", this.updateLastActivityTime);
document.addEventListener("click", this.updateLastActivityTime);
// 退
this.$bus.$on("user-logged-out", this.handleLogout);
},
methods: {
//
@ -447,7 +479,9 @@ export default {
this.connectionError = null;
try {
const wsUrl = `${process.env.VUE_APP_BASE_API}chat/ws`;
// https wss
const baseUrl = process.env.VUE_APP_BASE_API.replace("https", "wss");
const wsUrl = `${baseUrl}chat/ws`;
this.stompClient = Stomp.client(wsUrl);
this.stompClient.splitLargeFrames = true;
const headers = {
@ -479,11 +513,12 @@ export default {
(error) => {
console.error("WebSocket Error:", error);
if (error.message.includes("503")) {
this.connectionError = this.$t("chat.server500");//
this.connectionError = this.$t("chat.server500"); //
} else if (error.message.includes("handshake")) {
this.connectionError = this.$t("chat.CheckNetwork");//""
this.connectionError = this.$t("chat.CheckNetwork"); //""
} else {
this.connectionError = error.message || this.$t("chat.connectionFailed"); // "";
this.connectionError =
error.message || this.$t("chat.connectionFailed"); // "";
}
this.isReconnecting = false;
this.handleDisconnect();
@ -496,7 +531,7 @@ export default {
});
} catch (error) {
console.error("初始化 WebSocket 失败:", error);
this.connectionError = this.$t("chat.initializationFailed");//"";
this.connectionError = this.$t("chat.initializationFailed"); //"";
this.isReconnecting = false;
this.handleDisconnect();
return Promise.reject(error);
@ -515,12 +550,12 @@ export default {
clearTimeout(this.reconnectTimer);
}
// === ===
// === ===
if (
this.handleConnectionError({
code: this.connectionError?.code,
error: this.connectionError?.error,
message: this.connectionError
message: this.connectionError,
})
) {
return;
@ -537,20 +572,19 @@ export default {
//
let retryMessage = "";
if (this.connectionError && this.connectionError.includes("503")) {
retryMessage =this.$t(`chat.server500`);//
retryMessage = this.$t(`chat.server500`); //
} else if (
this.connectionError &&
this.connectionError.includes("handshake")
) {
retryMessage =this.$t(`chat.connectionFailed`);//
retryMessage = this.$t(`chat.connectionFailed`); //
} else {
//
retryMessage = `${this.$t("chat.break")},${
this.reconnectInterval / 1000
}${this.$t("chat.retry")}...`;
}
this.$message.warning(retryMessage);
this.$message({
message: retryMessage,
type: "warning",
@ -584,7 +618,7 @@ export default {
}
} else {
//
this.$message.warning(this.$t("chat.CheckNetwork"));//
this.$message.warning(this.$t("chat.CheckNetwork")); //
}
},
//
@ -626,7 +660,7 @@ export default {
// WebSocket
if (!this.stompClient || !this.stompClient.connected) {
console.log("发送消息时连接已断开,尝试重连...");
this.$message.warning(this.$t("chat.attemptToReconnect"));//...
this.$message.warning(this.$t("chat.attemptToReconnect")); //...
this.handleDisconnect();
return;
}
@ -681,7 +715,7 @@ export default {
});
} catch (error) {
console.error("发送消息失败:", error);
this.$message.error(this.$t("chat.sendFailed"));//
this.$message.error(this.$t("chat.sendFailed")); //
}
},
@ -830,7 +864,9 @@ export default {
text: msg.content,
isImage: msg.type === 2,
imageUrl: msg.type === 2 ? msg.content : null,
time: new Date(msg.createTime),
time: typeof msg.createTime === 'string'
? msg.createTime
: new Date(msg.createTime).toISOString(),
id: msg.id,
roomId: msg.roomId,
sender: msg.sendEmail,
@ -857,7 +893,7 @@ export default {
this.messages = [
{
type: "system",
text: this.$t("chat.noHistory")||"暂无历史消息",
text: this.$t("chat.noHistory") || "暂无历史消息",
isSystemHint: true,
time: new Date(),
},
@ -865,11 +901,12 @@ export default {
}
} catch (error) {
console.error("加载历史消息失败:", error);
this.$message.error(this.$t("chat.historicalFailure"));//
this.$message.error(this.$t("chat.historicalFailure")); //
this.messages = [
{
type: "system",
text: this.$t("chat.historicalFailure")||"加载历史消息失败,请重试",
text:
this.$t("chat.historicalFailure") || "加载历史消息失败,请重试",
isSystemHint: true,
time: new Date().toISOString(),
isError: true,
@ -900,7 +937,7 @@ export default {
//
this.messages.unshift({
type: "system",
text: this.$t("chat.noMoreHistory")||"没有更多历史消息了",
text: this.$t("chat.noMoreHistory") || "没有更多历史消息了",
isSystemHint: true,
time: new Date(),
});
@ -910,7 +947,7 @@ export default {
//
const loadingMsg = {
type: "system",
text: this.$t("chat.loadingHistory")||"正在加载更多历史消息...",
text: this.$t("chat.loadingHistory") || "正在加载更多历史消息...",
isLoading: true,
time: new Date(),
};
@ -945,7 +982,7 @@ export default {
if (historyMessages.length === 0) {
this.messages.unshift({
type: "system",
text: this.$t("chat.noMoreHistory")||"没有更多历史消息了",
text: this.$t("chat.noMoreHistory") || "没有更多历史消息了",
isSystemHint: true,
time: new Date(),
});
@ -964,7 +1001,7 @@ export default {
console.error("加载更多历史消息失败:", error);
this.messages.unshift({
type: "system",
text: this.$t("chat.historicalFailure")||"加载更多历史消息失败",
text: this.$t("chat.historicalFailure") || "加载更多历史消息失败",
isError: true,
time: new Date(),
});
@ -986,7 +1023,9 @@ export default {
text: msg.content || "",
isImage: msg.type === 2,
imageUrl: msg.type === 2 ? msg.content : null, // 使contentimageUrl
time: new Date(msg.createTime),
time: typeof msg.createTime === 'string'
? msg.createTime
: new Date(msg.createTime).toISOString(),
id: msg.id,
roomId: msg.roomId,
sender: msg.sendEmail,
@ -1056,7 +1095,9 @@ export default {
text: data.content,
isImage: data.type === 2,
imageUrl: data.type === 2 ? data.content : null, // 使contentimageUrl
time: new Date(data.sendTime).toISOString(),
time: typeof data.sendTime === 'string'
? data.sendTime
: new Date(data.sendTime).toISOString(),
id: data.id,
roomId: data.roomId,
sender: data.sendEmail,
@ -1111,7 +1152,9 @@ export default {
//
createNotification(message) {
const notification = new Notification("新消息", {
body: message.isImage ? `[ ${this.$t("chat.pictureMessage")}]`|| "[图片消息]" : message.text,
body: message.isImage
? `[ ${this.$t("chat.pictureMessage")}]` || "[图片消息]"
: message.text,
icon: "/path/to/notification-icon.png", //
});
@ -1143,9 +1186,7 @@ export default {
this.isChatOpen = !this.isChatOpen;
// 1.
const userInfo = JSON.parse(
localStorage.getItem("jurisdiction") || "{}"
);
const userInfo = JSON.parse(localStorage.getItem("jurisdiction") || "{}");
if (userInfo.roleKey === "customer_service") {
//
@ -1156,10 +1197,6 @@ export default {
// this.userEmail = "";
}
if (this.isChatOpen) {
try {
//
@ -1190,7 +1227,9 @@ export default {
});
} catch (error) {
console.error("初始化聊天失败:", error);
this.$message.error(this.$t("chat.initializationFailed")||"初始化聊天失败,请重试");
this.$message.error(
this.$t("chat.initializationFailed") || "初始化聊天失败,请重试"
);
}
}
},
@ -1225,7 +1264,8 @@ export default {
handleAutoResponse(message) {
setTimeout(() => {
let response =
this.$t("chat.beSorry")||"抱歉,我暂时无法回答这个问题。请排队等待人工客服或提交工单。";
this.$t("chat.beSorry") ||
"抱歉,我暂时无法回答这个问题。请排队等待人工客服或提交工单。";
//
for (const [keyword, reply] of Object.entries(this.autoResponses)) {
@ -1330,9 +1370,9 @@ export default {
//
if (messageDate.getTime() === today.getTime()) {
return `${this.$t("chat.today")} ${timeString}`;//
return `${this.$t("chat.today")} ${timeString}`; //
} else if (messageDate.getTime() === yesterday.getTime()) {
return `${this.$t("chat.yesterday")} ${timeString}`;//
return `${this.$t("chat.yesterday")} ${timeString}`; //
} else {
//
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
@ -1342,6 +1382,42 @@ export default {
}
},
//
/**
* 聊天分割条时间格式化
* @param {string|Date} date
* @returns {string}
*/
formatTimeDivider(date) {
if (!date) return '';
let d = typeof date === 'string' ? new Date(date) : date;
if (!(d instanceof Date) || isNaN(d.getTime())) return '';
// UTC
const now = new Date();
const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
const yesterday = new Date(today);
yesterday.setUTCDate(today.getUTCDate() - 1);
const msgDate = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
// UTC
const hour = String(d.getUTCHours()).padStart(2, '0');
const min = String(d.getUTCMinutes()).padStart(2, '0');
if (msgDate.getTime() === today.getTime()) {
return `${this.$t("chat.today")} ${hour}:${min}`|| `今天 ${hour}:${min}`;
} else if (msgDate.getTime() === yesterday.getTime()) {
return `${this.$t("chat.yesterday")} ${hour}:${min}`|| `昨天 ${hour}:${min}`;
} else {
const y = d.getUTCFullYear();
const m = String(d.getUTCMonth() + 1).padStart(2, '0');
const day = String(d.getUTCDate()).padStart(2, '0');
return `${y}-${m}-${day} ${hour}:${min}`;
}
},
handleClickOutside(event) {
if (this.isChatOpen) {
const chatElement = this.$el.querySelector(".chat-dialog");
@ -1387,7 +1463,10 @@ export default {
return;
}
try {
this.$message({ message: this.$t("chat.uploading")||"正在上传图片...", type: "info" });
this.$message({
message: this.$t("chat.uploading") || "正在上传图片...",
type: "info",
});
// FormData
const formData = new FormData();
formData.append("file", file);
@ -1427,11 +1506,17 @@ export default {
};
reader.readAsDataURL(file);
} else {
throw new Error(response.data.msg || this.$t("chat.pictureFailed")||"发送图片失败,请重试");
throw new Error(
response.data.msg ||
this.$t("chat.pictureFailed") ||
"发送图片失败,请重试"
);
}
} catch (error) {
console.error("图片处理失败:", error);
this.$message.error(this.$t("chat.processingFailed")||"图片处理失败,请重试");
this.$message.error(
this.$t("chat.processingFailed") || "图片处理失败,请重试"
);
} finally {
this.$refs.imageUpload.value = "";
}
@ -1441,7 +1526,9 @@ export default {
sendImageMessage(imageUrl) {
if (!this.stompClient || !this.stompClient.connected) {
console.log("发送消息时连接已断开,尝试重连...");
this.$message.warning(this.$t("chat.attemptToReconnect")||"连接已断开,正在尝试重连...");
this.$message.warning(
this.$t("chat.attemptToReconnect") || "连接已断开,正在尝试重连..."
);
this.handleDisconnect();
return;
}
@ -1462,7 +1549,9 @@ export default {
);
} catch (error) {
console.error("发送图片消息失败:", error);
this.$message.error(this.$t("chat.pictureFailed")||"发送图片失败,请重试");
this.$message.error(
this.$t("chat.pictureFailed") || "发送图片失败,请重试"
);
}
},
@ -1522,9 +1611,14 @@ export default {
console.error("重试连接失败:", error);
this.connectionStatus = "error";
this.isReconnecting = false;
this.connectionError = error.message || this.$t("chat.retryFailed")||"重试连接失败,请刷新页面";
this.connectionError =
error.message ||
this.$t("chat.retryFailed") ||
"重试连接失败,请刷新页面";
this.showRefreshButton = true;
this.$message.error(this.$t("chat.retryFailed")||"重试连接失败,请刷新页面重试");
this.$message.error(
this.$t("chat.retryFailed") || "重试连接失败,请刷新页面重试"
);
}
},
@ -1581,26 +1675,88 @@ export default {
*/
handleConnectionError(errorObj) {
if (!errorObj) return false;
// 1. error/code
if (errorObj.error === 'MAX_CONNECTIONS' || errorObj.code === 429) {
this.connectionError = this.$t('chat.maxConnectionsError') || '连接数已达上限,请刷新页面重试';
//
const errorCode = errorObj.code;
const errorMessage = errorObj.message || "";
//
switch (errorCode) {
case 1020: // IP_LIMIT_CONNECT
this.connectionError =
this.$t("chat.ipLimitError") ||
"本机连接数已达上限,请刷新页面重试";
this.isReconnecting = false;
this.showRefreshButton = true;
this.$message.error(this.connectionError);
return true;
}
// 2. message /
const msg = errorObj.message || '';
if (msg.includes('连接数已达上限') || msg.toLowerCase().includes('maximum connections')) {
this.connectionError = this.$t('chat.maxConnectionsError') || '连接数已达上限,请刷新页面重试';
case 1021: // MAX_LIMIT_CONNECT
this.connectionError =
this.$t("chat.serverLimitError") ||
"服务器连接数已达上限,请稍后刷新重试";
this.isReconnecting = false;
this.showRefreshButton = true;
this.$message.error(this.connectionError);
return true;
case 1022: // SET_PRINCIPAL_FAIL
this.connectionError =
this.$t("chat.identityError") || "用户身份设置失败,请刷新页面重试";
this.isReconnecting = false;
this.showRefreshButton = true;
this.$message.error(this.connectionError);
return true;
case 1023: // GET_PRINCIPAL_FAIL
this.connectionError =
this.$t("chat.emailError") || "用户信息获取失败,请刷新页面重试";
this.isReconnecting = false;
this.showRefreshButton = true;
this.$message.error(this.connectionError);
return true;
default:
//
if (
errorMessage.includes("连接数已达上限") ||
errorMessage.toLowerCase().includes("maximum connections")
) {
this.connectionError =
this.$t("chat.maxConnectionsError") ||
"连接数已达上限,请刷新页面重试";
this.isReconnecting = false;
this.showRefreshButton = true;
return true;
}
return false;
}
},
// 退
handleLogout() {
// WebSocket
this.disconnectWebSocket();
//
this.isChatOpen = false;
this.isMinimized = true;
this.messages = [];
this.unreadMessages = 0;
this.connectionStatus = "disconnected";
this.isWebSocketConnected = false;
this.userType = 0;
this.userEmail = "";
this.roomId = "";
},
},
beforeDestroy() {
// 退
this.$bus.$off("user-logged-out", this.handleLogout);
// 退
this.handleLogout();
//
if (this.$refs.chatBody) {
this.$refs.chatBody.removeEventListener("scroll", this.handleChatScroll);
@ -1837,9 +1993,24 @@ export default {
}
.message-content {
position: relative;
max-width: 70%;
padding: 10px 15px;
padding: 18px 15px 10px 15px; //
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
.message-time {
position: absolute;
top: 6px;
right: 15px;
font-size: 11px;
color: #bbb;
pointer-events: none;
user-select: none;
}
//
.chat-message-user & .message-time {
color: rgba(255, 255, 255, 0.7);
}
}
.message-text {
@ -2185,34 +2356,18 @@ export default {
.message-content {
.chat-time-divider {
text-align: center;
margin: 16px 0;
font-size: 12px;
color: #fff;
background: rgba(180, 180, 180, 0.6);
display: inline-block;
padding: 2px 12px;
border-radius: 10px;
box-shadow: 0 1px 2px rgba(0,0,0,0.04);
left: 50%;
transform: translateX(-50%);
position: relative;
max-width: 70%;
padding: 18px 15px 10px 15px; //
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
.message-time {
position: absolute;
top: 6px;
right: 15px;
font-size: 11px;
color: #bbb;
pointer-events: none;
user-select: none;
}
//
.chat-message-user & .message-time {
color: rgba(255,255,255,0.7);
}
}
</style>

View File

@ -382,10 +382,15 @@ export default {
document.addEventListener("click", function () {
const dropdown = document.querySelector(".dropdown");
const arrow = document.querySelector(".arrow");
try {
if (dropdown.classList.contains("show")) {
dropdown.classList.remove("show");
arrow.classList.remove("up");
}
} catch (error) {
console.log(error)
}
});
@ -445,6 +450,8 @@ export default {
async fetchSignOut() {
const data = await getLogout();
if (data && data.code == 200) {
// Vuex logout action
await this.$store.dispatch('logout')
const lang = this.$i18n.locale;
this.$router.push(`/${lang}`);
}

View File

@ -85,6 +85,10 @@ export const ChatWidget_zh = {
attemptToReconnect:"连接已断开,正在尝试重连...",
retryFailed:"重试连接失败,请刷新页面",
maxConnectionsError:"连接数已达上限,请刷新页面重试",
ipLimitError:"本机连接数已达上限,请刷新页面重试",
serverLimitError:"服务器连接数已达上限,请稍后刷新重试",
identityError:"用户身份设置失败,请刷新页面重试",
emailError:"用户信息获取失败,请刷新页面重试",
},
@ -178,7 +182,10 @@ export const ChatWidget_en = {
attemptToReconnect:"Connection lost, attempting to reconnect...",
retryFailed:"Retry connection failed, please refresh page",
maxConnectionsError:"Connection limit reached, please refresh page",
ipLimitError:"Connection limit reached, please refresh page",
serverLimitError:"Connection limit reached, please try again later",
identityError:"Failed to set user identity, please refresh page",
emailError:"Failed to get user information, please refresh page",
}

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,9 @@ import networkRecoveryMixin from './mixins/networkRecoveryMixin';
import './utils/loadingRecovery';
import errorNotificationManager from '../src/utils/errorNotificationManager';
// 创建事件总线 用于组件通信
Vue.prototype.$bus = new Vue();
Vue.use(MetaInfo)
Vue.prototype.$addStorageEvent = $addStorageEvent // 添加storage事件
Vue.config.productionTip = false

View File

@ -32,7 +32,7 @@ const childrenRoutes = [
component: () => import('../views/miningAccount/index.vue'),
meta: {title: '挖矿账户页面',
description:i18n.t(`seo.miningAccount`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控'
keywords:{
en: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控',
@ -63,7 +63,7 @@ const childrenRoutes = [
component: () => import('../views/reportBlock/index.vue'),
meta: {title: '报块页面',
description:i18n.t(`seo.reportBlock`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,报块页面,幸运值,区块高度,Block page,Lucky Value,block height,Mining Pool'
keywords:{
en: 'Block page,Lucky Value,block height,Mining Pool',
@ -308,7 +308,7 @@ const childrenRoutes = [
component: () => import('../views/submitWorkOrder/index.vue'),
meta: {title: '提交工单页面',
description:i18n.t(`seo.submitWorkOrder`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,提交工单,技术支持,问题处理,Mining Pool,Work Order Submission, Technical Support, Troubleshooting'
keywords:{
en: 'Mining Pool,Work Order Submission, Technical Support, Troubleshooting',
@ -322,7 +322,7 @@ const childrenRoutes = [
component: () => import('../views/workOrderRecords/index.vue'),
meta: {title: '工单记录页面(用户)',
description:i18n.t(`seo.workOrderRecords`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,用户工单记录,处理状态,问题进度,User Work Order Records, Processing Status, Issue Progress'
keywords:{
en: 'User Work Order Records, Processing Status, Issue Progress',
@ -336,7 +336,7 @@ const childrenRoutes = [
component: () => import('../views/userWorkDetails/index.vue'),
meta: {title: '工单详情页面(用户)',
description:i18n.t(`seo.userWorkDetails`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,用户工单详情,问题描述,补充提交,User Work Order Details, Problem Description, Additional Submissions'
keywords:{
en: 'User Work Order Details, Problem Description, Additional Submissions',
@ -408,7 +408,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/index.vue'),
meta: {title: '个人中心页面',
description:i18n.t(`seo.personalCenter`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,个人中心,挖矿账户,只读页面设置安全设置API密钥生成,Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation'
keywords:{
en: 'Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation',
@ -422,7 +422,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/personalMining/index.vue'),
meta: {title: '挖矿账户设置页面',
description:i18n.t(`seo.personalMining`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,个人中心,挖矿账户设置,币种账户,Personal Center,Mining Account Settings,Coin Accounts'
keywords:{
en: 'Personal Center,Mining Account Settings,Coin Accounts',
@ -436,7 +436,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/readOnly/index.vue'),
meta: {title: '只读页面设置',
description:i18n.t(`seo.readOnly`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,个人中心,只读页面设置,矿池分享,Personal Center,Read-Only Page Setting,Mining Pool Sharing'
keywords:{
en: 'Personal Center,Read-Only Page Setting,Mining Pool Sharing',
@ -450,7 +450,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/securitySetting/index.vue'),
meta: {title: '安全设置页面',
description:i18n.t(`seo.securitySetting`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,安全设置,密码修改,Security settings, password change'
keywords:{
en: 'Security settings, password change',
@ -464,7 +464,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/personal/index.vue'),
meta: {title: '个人信息页面',
description:i18n.t(`seo.personal`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,个人信息,登录历史,Personal Information, Login History'
keywords:{
en: 'Personal Information, Login History',
@ -478,7 +478,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/miningReport/index.vue'),
meta: {title: '挖矿报告页面',
description:i18n.t(`seo.miningReport`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,个人中心,挖矿报告,订阅服务,Mining Report, Subscription Service'
keywords:{
en: 'Mining Report, Subscription Service',
@ -493,7 +493,7 @@ const childrenRoutes = [
component: () => import('../views/personalCenter/personalAPI/index.vue'),
meta: {title: 'API页面',
description:i18n.t(`seo.personalAPI`),
allAuthority:[`admin`,`registered`],
allAuthority:[`admin`,`registered`,`customer_service`],
// keywords: 'M2Pool 矿池,个人中心,API 页面,API密钥生成,API Page,API Key Generation'
keywords:{
en: 'API Page,API Key Generation',
@ -634,87 +634,88 @@ const router = new VueRouter({
// router.beforeEach((to, from, next) => {
// // 检查语言参数
// const lang = to.params.lang;
// const supportedLanguages = ['zh', 'en'];
router.beforeEach((to, from, next) => {
// 检查语言参数
const lang = to.params.lang;
const supportedLanguages = ['zh', 'en'];
// // 如果路径以斜杠结尾且不是根路径,则重定向
// if (to.path.endsWith('/') && to.path.length > 1) {
// const path = to.path.slice(0, -1);
// return next({
// path,
// query: to.query,
// hash: to.hash,
// params: to.params
// });
// }
// 如果路径以斜杠结尾且不是根路径,则重定向
if (to.path.endsWith('/') && to.path.length > 1) {
const path = to.path.slice(0, -1);
return next({
path,
query: to.query,
hash: to.hash,
params: to.params
});
}
// if (!lang && to.path !== '/') {
// const defaultLang = localStorage.getItem('lang') || 'en';
// return next(`/${defaultLang}${to.path}`);
// }
if (!lang && to.path !== '/') {
const defaultLang = localStorage.getItem('lang') || 'en';
return next(`/${defaultLang}${to.path}`);
}
// let data = localStorage.getItem("jurisdiction");
// let jurisdiction =JSON.parse(data);
let data = localStorage.getItem("jurisdiction");
let jurisdiction =JSON.parse(data);
console.log(jurisdiction,"权限");
// localStorage.setItem('superReportError',"")
// let element = document.getElementsByClassName('el-main')[0];
// if(element){
// element.scrollTop = 0
// }
localStorage.setItem('superReportError',"")
let element = document.getElementsByClassName('el-main')[0];
if(element){
element.scrollTop = 0
}
// let token
// try{
// token =JSON.parse(localStorage.getItem('token'))
// }catch(e){
// console.log(e);
// }
let token
try{
token =JSON.parse(localStorage.getItem('token'))
}catch(e){
console.log(e);
}
// if (token) {
if (token) {
// if (to.path === `/${lang}/login`|| to.path === `/${lang}/register`) {
// next({ path: `/${lang}` })
// }else if(to.meta.allAuthority && to.meta.allAuthority[0] ==`all`){
// next()
// }else if(jurisdiction.roleKey && to.meta.allAuthority&&to.meta.allAuthority.some(item=>item == jurisdiction.roleKey )){
// next()
// }else{
// console.log(to.meta.allAuthority,to.path,"权限");
if (to.path === `/${lang}/login`|| to.path === `/${lang}/register`) {
next({ path: `/${lang}` })
}else if(to.meta.allAuthority && to.meta.allAuthority[0] ==`all`){
next()
}else if(jurisdiction.roleKey && to.meta.allAuthority&&to.meta.allAuthority.some(item=>item == jurisdiction.roleKey )){
next()
}else{
console.log(to.meta.allAuthority,to.path,"权限");
// Message({//权限不足
// showClose: true,
// message:i18n.t(`mining.jurisdiction`),
// type: 'error'
// });
Message({//权限不足
showClose: true,
message:i18n.t(`mining.jurisdiction`),
type: 'error'
});
// next({ path: `/${lang}` }) // 添加这行,重定向到首页
// }
next({ path: `/${lang}` }) // 添加这行,重定向到首页
}
// }else{
}else{
// let paths = [`/${lang}/miningAccount`,`/${lang}/workOrderRecords`,`/${lang}/userWorkDetails`,`/${lang}/submitWorkOrder`,`/${lang}/workOrderBackend`,`/${lang}/BKWorkDetails`]
// if (paths.includes(to.path) || to.path.includes(`personalCenter`) ) {
let paths = [`/${lang}/miningAccount`,`/${lang}/workOrderRecords`,`/${lang}/userWorkDetails`,`/${lang}/submitWorkOrder`,`/${lang}/workOrderBackend`,`/${lang}/BKWorkDetails`]
if (paths.includes(to.path) || to.path.includes(`personalCenter`) ) {
// Message({//权限不足
// showClose: true,
// message:i18n.t(`mining.logInFirst`),
// type: 'error'
// });
Message({//权限不足
showClose: true,
message:i18n.t(`mining.logInFirst`),
type: 'error'
});
// next({ path: `/${lang}/login` })
// } else {
next({ path: `/${lang}/login` })
} else {
// next()
// }
// }
next()
}
}
// })
})

View File

@ -5,12 +5,48 @@ Vue.use(Vuex)
export default new Vuex.Store({
state: {
isLoggedIn: false,
userInfo: null
},
getters: {
isLoggedIn: state => state.isLoggedIn,
userInfo: state => state.userInfo
},
mutations: {
SET_LOGIN_STATE(state, isLoggedIn) {
state.isLoggedIn = isLoggedIn
},
SET_USER_INFO(state, userInfo) {
state.userInfo = userInfo
},
CLEAR_USER_DATA(state) {
state.isLoggedIn = false
state.userInfo = null
}
},
actions: {
// 退出登录
async logout({ commit }) {
try {
// 清除本地存储
localStorage.removeItem('token')
localStorage.removeItem('userEmail')
localStorage.removeItem('jurisdiction')
// 清除 Vuex 状态
commit('CLEAR_USER_DATA')
// 触发全局事件,通知其他组件用户已退出
if (Vue.prototype.$bus) {
Vue.prototype.$bus.$emit('user-logged-out')
}
return true
} catch (error) {
console.error('退出登录失败:', error)
return false
}
}
},
modules: {
}

View File

@ -18,7 +18,8 @@
<div class="textBox">
<p>{{ $t(`ServiceTerms.clauseService1`) }}</p>
<p>{{ $t(`ServiceTerms.clauseService2`) }}</p>
<p><span style="font-weight: 600;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
<p style="text-align: justify;"><span style="font-weight: 600 ;text-align: justify;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
</div>
</section>
@ -117,7 +118,8 @@
<div class="textBox">
<p>{{ $t(`ServiceTerms.clauseService1`) }}</p>
<p>{{ $t(`ServiceTerms.clauseService2`) }}</p>
<p><span style="font-weight: 600;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
<p style="text-align: justify;"><span style="font-weight: 600;text-align: justify;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
</div>
</section>

View File

@ -320,7 +320,7 @@ export default {
loadingRooms: true,
stompClient: null,
wsConnected: false,
userEmail: "497681109@qq.com", //
userEmail: "", //
userType: 1, // 01
loadingHistory: false, //
@ -331,7 +331,7 @@ export default {
id: "", //id
roomId: "", //id
userType: 2, //
email: "497681109@qq.com", //
email: "", //
},
historyAllParams: {
//7
@ -380,8 +380,12 @@ export default {
async created() {
try {
//
// this.determineUserType();
let userEmail = localStorage.getItem("userEmail");
this.userEmail = JSON.parse(userEmail);
window.addEventListener("setItem", () => {
let userEmail = localStorage.getItem("userEmail");
this.userEmail = JSON.parse(userEmail);
});
//
await this.fetchRoomList();
@ -391,12 +395,8 @@ export default {
}
//
this.loadManualCreatedRooms();
let userEmail = localStorage.getItem("userEmail");
this.userEmail = JSON.parse(userEmail);
window.addEventListener("setItem", () => {
let userEmail = localStorage.getItem("userEmail");
this.userEmail = JSON.parse(userEmail);
});
console.log(this.userEmail,"初始化的时候")
// WebSocket
this.initWebSocket();
} catch (error) {
@ -418,6 +418,8 @@ export default {
let userEmail = localStorage.getItem("userEmail");
this.userEmail = JSON.parse(userEmail);
});
console.log(this.userEmail,"mounted")
//
this.$nextTick(() => {
this.scrollToBottom();
@ -480,7 +482,8 @@ export default {
if (this.isWebSocketConnected) return;
try {
const wsUrl = `${process.env.VUE_APP_BASE_API}chat/ws`;
const baseUrl = process.env.VUE_APP_BASE_API.replace('https', 'wss');
const wsUrl = `${baseUrl}chat/ws`;
this.stompClient = Stomp.client(wsUrl);
// STOMP
@ -1272,13 +1275,12 @@ export default {
const currentMsgs = this.messages[this.currentContactId] || [];
// id
const lastMsg =
currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
this.history7Params.id = lastMsg ? lastMsg.id : "";
// const lastMsg =
// currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
this.history7Params.id = currentMsgs[0].id ||"",
// this.history7Params.pageNum += 1; //
this.history7Params.roomId = this.currentContactId;
this.history7Params.email = this.userEmail;
try {
this.messagesLoading = true;
const response = await getHistory7(this.history7Params);
@ -1375,6 +1377,7 @@ export default {
if (!roomId) return;
try {
console.log(this.userEmail,"加载聊天消息")
this.history7Params.email = this.userEmail;
this.history7Params.roomId = roomId;
const response = await getHistory7(this.history7Params);
@ -1903,7 +1906,6 @@ export default {
async loadHistory() {
this.loadingHistory = true;
this.userViewHistory = true; //
console.log("哇哈哈哈哈哈哈", this.currentContactId);
if (!this.currentContactId) return;
try {
@ -1912,13 +1914,14 @@ export default {
const currentMsgs = this.messages[this.currentContactId] || [];
// id
const lastMsg =
currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
this.history7Params.id = lastMsg ? lastMsg.id : "";
// const lastMsg =
// currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
this.history7Params.id =currentMsgs[0].id ||"";
// this.history7Params.pageNum += 1; //
this.history7Params.roomId = this.currentContactId;
this.history7Params.email = this.userEmail;
const response = await getHistory7(this.history7Params);
console.log(response,"respons及附加覅封建时代反间谍法附件覅发e");
if (response && response.code === 200 && response.data) {
let historyMessages = response.data

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_7i8wfzc0art.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.4b5b04f4.js></script><script defer src=/js/app-5c551db8.2530417a.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.bb9b6a2c.js></script><script defer src=/js/app-72600b29.eb14747d.js></script><script defer src=/js/app-f035d474.4fade95e.js></script><script defer src=/js/app-113c6c50.c73554a4.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.582537b2.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.896a6438.css rel=stylesheet><link href=/css/app-72600b29.9a75824f.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-113c6c50.729eb983.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_7i8wfzc0art.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.8aa0cd9f.js></script><script defer src=/js/app-5c551db8.6973b329.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.fc698aa0.js></script><script defer src=/js/app-72600b29.eb14747d.js></script><script defer src=/js/app-f035d474.4fade95e.js></script><script defer src=/js/app-113c6c50.c73554a4.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.48b4c830.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.4f99dab4.css rel=stylesheet><link href=/css/app-72600b29.9a75824f.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-113c6c50.729eb983.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.

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-05-30T07:00:26.014Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-30T07:00:26.014Z</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-06-06T06:37:26.048Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-06-06T06:37:26.048Z</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-05-30T07:00:26.007Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-30T07:00:26.007Z</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-06-06T06:37:26.039Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>

Binary file not shown.