1.游客功能添加、删除列表离线游客 目前游客断开没有返回关闭信息

2.游客收不到客服消息 已处理
3.中英文翻译 已完成
4.将本地时间修改为UTC时间 完成
5.发送图片有问题 又重新改回url上传
6.游客用户增加提示和跳转登录的功能
7.客服消息换行及显示已处理
8.客服端限制输入400个字符 用户端限制输入300个字符 完成
This commit is contained in:
yaoqin 2025-05-30 16:39:09 +08:00
parent 99b471bb86
commit e0a7fb8ee2
24 changed files with 289 additions and 163 deletions

View File

@ -137,6 +137,8 @@
<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 }}
@ -153,7 +155,7 @@
</div>
<div class="message-footer">
<span class="message-time">{{ formatTime(msg.time) }}</span>
<!-- <span class="message-time">{{ formatTime(msg.time) }}</span> -->
<!-- 添加已读状态显示 -->
<span
v-if="msg.type === 'user'"
@ -191,14 +193,18 @@
:disabled="connectionStatus !== 'connected'"
/>
</div>
<div class="chat-input-wrapper" style="display: flex;align-items: center;">
<input
type="text"
class="chat-input"
v-model="inputMessage"
@keyup.enter="sendMessage"
:maxlength="maxMessageLength"
@input="handleInputMessage"
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
:disabled="connectionStatus !== 'connected'"
/>
<!-- <span class="input-counter">{{ maxMessageLength - inputMessage.length }}</span> -->
</div>
<button
class="chat-send"
@click="sendMessage"
@ -282,6 +288,8 @@ export default {
connectionError: null, //
showRefreshButton: false, //
heartbeatCheckInterval: 30000, // 30
maxMessageLength: 300,
};
},
@ -601,10 +609,19 @@ export default {
handleBeforeUnload() {
this.disconnectWebSocket();
},
//300
handleInputMessage() {
if (this.inputMessage.length > this.maxMessageLength) {
this.inputMessage = this.inputMessage.slice(0, this.maxMessageLength);
}
},
//
sendMessage() {
if (!this.inputMessage.trim()) return;
if (this.inputMessage.length > this.maxMessageLength) {
this.$message.warning(`消息不能超过${this.maxMessageLength}个字符`);
return;
}
// WebSocket
if (!this.stompClient || !this.stompClient.connected) {
@ -1126,15 +1143,23 @@ export default {
this.isChatOpen = !this.isChatOpen;
// 1.
// this.determineUserType();
const userInfo = JSON.parse(
localStorage.getItem("jurisdiction") || "{}"
);
// 2.
if (this.userType === 2) {
if (userInfo.roleKey === "customer_service") {
//
this.userType = 2;
const lang = this.$i18n.locale;
this.$router.push(`/${lang}/customerService`);
return;
// this.userEmail = "";
}
if (this.isChatOpen) {
try {
//
@ -2151,4 +2176,43 @@ export default {
}
}
}
.message-content {
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

@ -634,87 +634,87 @@ 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);
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

@ -11,11 +11,13 @@
connectionStatus === 'error' ? 'el-icon-warning' : 'el-icon-loading'
"
></i>
<span>{{
<span
>{{
connectionStatus === "error"
? $t("chat.Disconnected") || "连接已断开"
: $t("chat.reconnecting") || "正在连接..."
}} </span>
}}
</span>
</div>
<!-- 聊天窗口主体 -->
<div class="cs-chat-wrapper">
@ -58,7 +60,6 @@
<div class="cs-contact-info">
<div class="cs-contact-name">
{{ contact.name }}
</div>
<div class="cs-contact-msg">
<span v-if="contact.important" class="important-tag"
@ -200,9 +201,11 @@
</div>
<div class="cs-bubble">
<div class="cs-sender">{{ message.sender }}</div>
<div v-if="!message.isImage" class="cs-text">
{{ message.content }}
</div>
<div
v-if="!message.isImage"
class="cs-text"
v-html="formatMessageContent(message.content)"
></div>
<div v-else class="cs-image">
<img
:src="message.content"
@ -235,7 +238,7 @@
<!-- <i class="el-icon-s-opportunity" title="发送表情"></i> -->
<!-- <i class="el-icon-scissors" title="截图"></i> -->
</div>
<!-- @keydown.enter.prevent="sendMessage" -->
<!-- @keydown.enter.native="handleKeyDown" -->
<div class="cs-input-area">
<el-input
type="textarea"
@ -246,12 +249,13 @@
$t(`chat.inputMessage`) ||
`请输入消息按Enter键发送按Ctrl+Enter键换行`
"
@keydown.enter.native="handleKeyDown"
@keydown.native="handleKeyDown"
@input="handleInputLimit"
></el-input>
</div>
<div class="cs-send-area">
<span class="cs-counter">{{ inputMessage.length }}/500</span>
<span class="cs-counter">{{ inputMessage.length }}/400</span>
<el-button
type="primary"
:disabled="!currentContact || !inputMessage.trim() || sending"
@ -387,6 +391,12 @@ 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);
});
// WebSocket
this.initWebSocket();
} catch (error) {
@ -443,14 +453,26 @@ export default {
},
methods: {
handleKeyDown(e) {
// Ctrl
if (e.key === "Enter") {
if (e.ctrlKey) {
return;
}
//
//
const textarea = e.target;
const value = textarea.value;
const start = textarea.selectionStart;
const end = textarea.selectionEnd;
// \n
textarea.value =
value.substring(0, start) + "\n" + value.substring(end);
//
textarea.selectionStart = textarea.selectionEnd = start + 1;
//
e.preventDefault();
} else {
//
e.preventDefault();
//
this.sendMessage();
}
}
},
// WebSocket
@ -467,7 +489,7 @@ export default {
this.stompClient.maxWebSocketMessageSize = 16 * 1024 * 1024; // 16MB
this.stompClient.webSocketFactory = () => {
const ws = new WebSocket(wsUrl);
ws.binaryType = 'arraybuffer'; // arraybuffer
ws.binaryType = "arraybuffer"; // arraybuffer
return ws;
};
@ -553,18 +575,18 @@ export default {
// "\"guest_1748242041830_jmz4c9qx5\""
const normalize = (str) => {
if (!str) return '';
if (typeof str === 'object' && 'value' in str) str = str.value;
if (!str) return "";
if (typeof str === "object" && "value" in str) str = str.value;
str = String(str).trim().toLowerCase();
//
str = str.replace(/^['"]+|['"]+$/g, '');
str = str.replace(/^['"]+|['"]+$/g, "");
return str;
};
const targetEmail = normalize(closedUserEmail);
//
const contactIndex = this.contacts.findIndex(contact => {
const contactIndex = this.contacts.findIndex((contact) => {
const contactEmail = normalize(contact.name);
return contactEmail === targetEmail;
});
@ -688,6 +710,13 @@ export default {
const now = new Date();
return new Date(now.getTime() + now.getTimezoneOffset() * 60000);
},
//400
handleInputLimit(val) {
if (val.length > 400) {
this.inputMessage = val.slice(0, 400);
}
},
//
async sendMessage() {
if (!this.inputMessage.trim() || !this.currentContact || this.sending)
@ -698,23 +727,29 @@ export default {
this.sending = true;
try {
//
if (this.currentContact.sendUserType !== undefined) {
this.receiveUserType = this.currentContact.sendUserType;
} else {
this.receiveUserType = 1;
//
if (!this.isWebSocketConnected) {
this.$message.warning(
this.$t("chat.reconnecting") || "正在重新连接..."
);
await this.initWebSocket(); //
}
//
const receiveUserType =
this.currentContact.sendUserType !== undefined
? this.currentContact.sendUserType
: 1; //
const message = {
content: messageContent,
type: 1, // 1
email: this.currentContact.name,
receiveUserType: this.receiveUserType,
receiveUserType: receiveUserType,
roomId: this.currentContactId,
// sendTime: this.convertToUTC(new Date()).toISOString() // UTC
};
//
// //
this.stompClient.send(
"/point/send/message/to/user",
{},
@ -725,7 +760,7 @@ export default {
this.addMessageToChat({
sender: this.$t("chat.my") || "我",
content: messageContent,
time: new Date().toISOString() , // 使 UTC
time: new Date().toISOString(), // 使 UTC
isSelf: true,
isImage: false,
roomId: this.currentContactId,
@ -739,17 +774,26 @@ export default {
if (contact) {
contact.unread = 0;
}
} catch (error) {
console.error("发送消息失败:", error);
this.$message({
message: this.$t("chat.sendFailed") || "发送消息失败,请重试",
type: "error",
duration: 3000,
showClose: true,
});
} finally {
this.sending = false;
} catch (error) {
console.error("发送消息失败飞机飞机覅附件:", error);
this.sending = false;
//
if (error.message.includes("connection")) {
this.$message.error(this.$t("chat.connectionFailed") || "连接失败,请检查网络");
}else{
this.$message.error(this.$t("chat.sendFailed") || "发送消息失败");
}
}
},
//
formatMessageContent(content) {
if (!content) return "";
// XSS
return content.replace(/\n/g, "<br>");
},
//
@ -803,7 +847,7 @@ export default {
lastTime: messageData.time, // 使 createTime
unread: 1,
important: false,
isGuest: messageData.sendUserType === 0,
isGuest: msg.sendUserType === 0,
sendUserType: messageData.sendUserType,
isManualCreated: true,
};
@ -951,7 +995,7 @@ export default {
this.contacts = [...this.contacts, ...uniqueNewContacts];
this.sortContacts();
}
}else{
} else {
this.$message({
message: this.$t("chat.contactFailed") || "加载更多联系人失败",
type: "error",
@ -961,7 +1005,6 @@ export default {
}
} catch (error) {
console.error("5858", error);
} finally {
this.isLoadingMoreContacts = false;
}
@ -1181,7 +1224,9 @@ export default {
//
const latestMessage = this.messages[room.id]?.[0] || null;
const lastTime = latestMessage ? latestMessage.time : room.lastUserSendTime || room.createTime;
const lastTime = latestMessage
? latestMessage.time
: room.lastUserSendTime || room.createTime;
return {
roomId: room.id,
@ -1503,16 +1548,16 @@ export default {
this.$message({ message: "正在上传图片...", type: "info" });
// FormData
const formData = new FormData();
formData.append('file', file);
formData.append("file", file);
//
const response = await this.$axios({
method: 'post',
method: "post",
url: `${process.env.VUE_APP_BASE_API}pool/ticket/uploadFile`,
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
"Content-Type": "multipart/form-data",
},
});
if (response.data.code === 200) {
@ -1537,7 +1582,8 @@ export default {
//
this.$nextTick(() => {
const img = this.$refs.messageContainer.querySelector('.cs-image img');
const img =
this.$refs.messageContainer.querySelector(".cs-image img");
if (img) {
// Promise
const imgLoadPromise = new Promise((resolve) => {
@ -1578,7 +1624,7 @@ export default {
showClose: true,
});
} else {
throw new Error(response.data.msg || '上传失败');
throw new Error(response.data.msg || "上传失败");
}
} catch (error) {
console.error("上传图片异常:", error);
@ -1611,7 +1657,6 @@ export default {
receiveUserType: this.currentContact.sendUserType || 1,
roomId: this.currentContactId,
content: imageUrl, // 使url
};
this.stompClient.send(
@ -1709,17 +1754,26 @@ export default {
//
sortContacts() {
console.log("排序前的联系人列表", this.contacts);
this.contacts.sort((a, b) => {
//
if (a.important && !b.important) return -1;
if (!a.important && b.important) return 1;
//
const aTime = a.lastTime || '';
const bTime = b.lastTime || '';
// const aTime = a.lastTime || "";
// const bTime = b.lastTime || "";
// console.log("aTime", aTime);
// console.log("bTime", bTime);
// 2.
const aTime = a.lastTime ? new Date(a.lastTime).getTime() : 0;
const bTime = b.lastTime ? new Date(b.lastTime).getTime() : 0;
return bTime - aTime;
// "YYYY-MM-DDTHH:mm:ss"
return bTime.localeCompare(aTime);
});
},
@ -1772,19 +1826,21 @@ export default {
//
formatTime(date) {
if (!date) return "";
const str = typeof date === 'string' ? date : date.toISOString();
const [d, t] = str.split('T');
const str = typeof date === "string" ? date : date.toISOString();
const [d, t] = str.split("T");
if (!t) return str;
const [hour, minute] = t.split(':');
const [hour, minute] = t.split(":");
// UTC
const now = new Date();
const nowUTC = now.toISOString().split('T')[0];
const nowUTC = now.toISOString().split("T")[0];
const msgUTC = d;
if (nowUTC === msgUTC) {
return `UTC ${this.$t("chat.today")} ${hour}:${minute}`;
}
//
const yesterdayUTC = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().split('T')[0];
const yesterdayUTC = new Date(Date.now() - 24 * 60 * 60 * 1000)
.toISOString()
.split("T")[0];
if (yesterdayUTC === msgUTC) {
return `UTC ${this.$t("chat.yesterday")} ${hour}:${minute}`;
}
@ -1795,12 +1851,12 @@ export default {
formatLastTime(date) {
if (!date) return "";
//
const str = typeof date === 'string' ? date : date.toISOString();
const str = typeof date === "string" ? date : date.toISOString();
//
const timePart = str.split('T')[1];
const timePart = str.split("T")[1];
if (!timePart) return str;
//
const [hours, minutes] = timePart.split(':');
const [hours, minutes] = timePart.split(":");
return `${hours}:${minutes} UTC`;
},
@ -1944,11 +2000,10 @@ export default {
// ZUTC
fixToUTC(str) {
if (typeof str !== 'string') return str;
if (str.endsWith('Z') || /[+-]\d{2}:?\d{2}$/.test(str)) return str;
return str + 'Z';
if (typeof str !== "string") return str;
if (str.endsWith("Z") || /[+-]\d{2}:?\d{2}$/.test(str)) return str;
return str + "Z";
},
},
beforeDestroy() {

View File

@ -269,7 +269,7 @@
<span class="title">{{ $t(`personal.verificationCode`) }}</span>
<div class="verificationCode">
<el-input
type="email"
type="text"
v-model="closeParams.eCode"
autocomplete="off"
:placeholder="$t(`user.verificationCode`)"

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_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.3954a229.js></script><script defer src=/js/app-5c551db8.bded73eb.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.bf90e4c7.js></script><script defer src=/js/app-72600b29.eb14747d.js></script><script defer src=/js/app-f035d474.30e8939b.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.07a828f2.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.efdd1b24.css rel=stylesheet><link href=/css/app-72600b29.9a75824f.css rel=stylesheet><link href=/css/app-f035d474.0e6b8898.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.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>

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

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-28T06:40:57.243Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-28T06:40:57.243Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-28T06:40:57.243Z</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-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>

Binary file not shown.