Compare commits

...

2 Commits

50 changed files with 1165 additions and 656 deletions

View File

@ -5,8 +5,8 @@ VUE_APP_TITLE = m2pool
ENV = 'development'
#开发环境
# VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
VUE_APP_BASE_API = 'http://10.168.2.150:8101/'
VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
# VUE_APP_BASE_API = 'http://10.168.2.150:8101/'
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

Binary file not shown.

View File

@ -1,11 +1,16 @@
<template>
<div class="chat-widget">
<!-- 添加网络状态提示 -->
<div v-if="networkStatus === 'offline'" class="network-status">
<i class="el-icon-warning"></i>
<span>{{ $t("chat.networkError") || "网络连接已断开" }}</span>
</div>
<!-- 聊天图标 -->
<div
class="chat-icon"
@click="toggleChat"
:class="{ active: isChatOpen }"
aria-label="打开客服聊天"
:aria-label="$t('chat.openCustomerService') || '打开客服聊天'"
tabindex="0"
@keydown.enter="toggleChat"
@keydown.space="toggleChat"
@ -33,16 +38,16 @@
class="chat-status connecting"
>
<i class="el-icon-loading"></i>
<p>正在连接客服系统...</p>
<p>{{ $t("chat.connectToCustomerService") || "正在连接客服系统..." }}</p>
</div>
<div
v-else-if="connectionStatus === 'error'"
class="chat-status error"
>
<i class="el-icon-warning"></i>
<p>连接失败请稍后重试</p>
<p>{{ $t("chat.connectionFailed") || "连接失败,请稍后重试" }}</p>
<button @click="connectWebSocket" class="retry-button">
重试连接
{{ $t("chat.tryConnectingAgain") || "重试连接" }}
</button>
</div>
@ -56,7 +61,7 @@
>
<i class="el-icon-arrow-up"></i>
<span>{{
isLoadingHistory ? "加载中..." : "加载更多历史消息"
isLoadingHistory ? $t("chat.loading") || "加载中..." : $t("chat.loadMore") || "加载更多历史消息"
}}</span>
</div>
@ -103,7 +108,7 @@
<img
:src="msg.imageUrl"
@click="previewImage(msg.imageUrl)"
alt="聊天图片"
:alt="$t('chat.picture') || '聊天图片'"
/>
</div>
@ -114,7 +119,7 @@
v-if="msg.type === 'user'"
class="message-read-status"
>
{{ msg.isRead ? "已读" : "未读" }}
{{ msg.isRead ? $t("chat.read") || "已读" : $t("chat.unread") || "未读" }}
</span>
</div>
</div>
@ -225,6 +230,11 @@ export default {
maxReconnectAttempts: 5,
reconnectInterval: 5000, // 5
isReconnecting: false,
lastActivityTime: Date.now(),
activityCheckInterval: null,
networkStatus: "online",
reconnectTimer: null,
};
},
@ -247,6 +257,17 @@ export default {
//
document.addEventListener("visibilitychange", this.handleVisibilityChange);
//
window.addEventListener("online", this.handleNetworkChange);
window.addEventListener("offline", this.handleNetworkChange);
//
this.startActivityCheck();
//
document.addEventListener("mousemove", this.updateLastActivityTime);
document.addEventListener("keydown", this.updateLastActivityTime);
document.addEventListener("click", this.updateLastActivityTime);
},
methods: {
//
@ -305,7 +326,6 @@ export default {
this.userType = 1;
this.userEmail = email;
}
} catch (parseError) {
console.error("解析用户信息失败:", parseError);
//
@ -332,7 +352,7 @@ export default {
//
this.stompClient.subscribe(
`/sub/queue/user/${this.userEmail}`,
this.onMessageReceived,
this.onMessageReceived
// {
// id: `chat_${this.userEmail}`,
// }
@ -341,7 +361,10 @@ export default {
console.log("成功订阅消息频道:", `/sub/queue/user/${this.userEmail}`);
} catch (error) {
console.error("订阅消息失败:", error);
this.$message.error("消息订阅失败,可能无法接收新消息");
this.message({
message:this.$t("chat.subscriptionFailed")|| "消息订阅失败,可能无法接收新消息",
type:"error"
})
}
},
@ -400,7 +423,7 @@ export default {
this.subscribeToPersonalMessages();
//
this.$message.success("连接成功");
// this.$message.success("");
},
(error) => {
console.error("WebSocket Error:", error);
@ -418,22 +441,31 @@ export default {
},
// 5
handleDisconnect() {
if (this.isReconnecting) return;
this.isWebSocketConnected = false;
this.connectionStatus = "error";
this.isReconnecting = false;
this.isReconnecting = true;
//
//
if (this.reconnectTimer) {
clearTimeout(this.reconnectTimer);
}
// 使
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
console.log(
`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`
);
//${this.reconnectInterval / 1000}...
this.$message.warning(
`连接断开,${this.reconnectInterval / 1000}秒后重试...`
`${this.$t("chat.break")},${this.reconnectInterval / 1000}${this.$t("chat.retry")}...`
);
setTimeout(() => {
this.reconnectTimer = setTimeout(() => {
if (!this.isWebSocketConnected) {
this.connectWebSocket();
}
@ -441,10 +473,42 @@ export default {
} else {
console.log("达到最大重连次数,停止重连");
this.$message.error("连接失败,请刷新页面重试");
this.isReconnecting = false;
}
},
//
handleNetworkChange() {
this.networkStatus = navigator.onLine ? "online" : "offline";
//
if (navigator.onLine) {
//
if (!this.isWebSocketConnected) {
this.handleDisconnect();
}
} else {
//
this.$message.warning("网络连接已断开,正在等待重连...");
}
},
//
startActivityCheck() {
this.activityCheckInterval = setInterval(() => {
const now = Date.now();
const inactiveTime = now - this.lastActivityTime;
// 5
if (inactiveTime > 5 * 60 * 1000 && !this.isWebSocketConnected) {
this.handleDisconnect();
}
}, 60000); //
},
//
updateLastActivityTime() {
this.lastActivityTime = Date.now();
},
//
handleBeforeUnload() {
this.disconnectWebSocket();
},
@ -453,13 +517,13 @@ export default {
sendMessage() {
if (!this.inputMessage.trim()) return;
// WebSocket
if (!this.stompClient || !this.stompClient.connected) {
console.log('发送消息时连接已断开,尝试重连...');
this.$message.warning('连接已断开,正在重新连接...');
this.handleDisconnect();
return;
}
// WebSocket
if (!this.stompClient || !this.stompClient.connected) {
console.log("发送消息时连接已断开,尝试重连...");
this.$message.warning("连接已断开,正在重新连接...");
this.handleDisconnect();
return;
}
const messageText = this.inputMessage.trim();
@ -539,11 +603,22 @@ export default {
}
},
//
//
handleVisibilityChange() {
//
if (!document.hidden && this.isChatOpen && this.roomId) {
this.markMessagesAsRead();
}
//
if (!document.hidden) {
//
if (!this.isWebSocketConnected) {
this.handleDisconnect();
}
//
this.updateLastActivityTime();
}
},
//
@ -552,6 +627,7 @@ export default {
const data = {
roomId: this.roomId,
userType: this.userType,
email: this.userEmail,
};
const response = await getReadMessage(data);
@ -576,149 +652,151 @@ export default {
//
async loadHistoryMessages() {
if (this.isLoadingHistory || !this.roomId) return;
if (this.isLoadingHistory || !this.roomId) return;
this.isLoadingHistory = true;
try {
const response = await getHistory7({
roomId: this.roomId,
userType: this.userType,
email: this.userEmail,
});
console.log("历史消息数据:", response);
this.isLoadingHistory = true;
try {
const response = await getHistory7({
roomId: this.roomId,
userType: this.userType,
email: this.userEmail,
});
console.log("历史消息数据:", response);
if (response?.code === 200 && Array.isArray(response.data)) {
//
const historyMessages = response.data.map((msg) => ({
type: msg.isSelf === 1 ? "user" : "system",
text: msg.content,
isImage: msg.type === 2,
imageUrl: msg.type === 2 ? msg.content : null,
time: new Date(msg.createTime),
id: msg.id,
roomId: msg.roomId,
sender: msg.sendEmail,
isHistory: true,
isRead: true,
}));
if (response?.code === 200 && Array.isArray(response.data)) {
//
const historyMessages = response.data.map((msg) => ({
type: msg.isSelf === 1 ? "user" : "system",
text: msg.content,
isImage: msg.type === 2,
imageUrl: msg.type === 2 ? msg.content : null,
time: new Date(msg.createTime),
id: msg.id,
roomId: msg.roomId,
sender: msg.sendEmail,
isHistory: true,
isRead: true,
}));
//
this.messages = historyMessages.sort(
(a, b) => new Date(a.time) - new Date(b.time)
);
//
this.messages = historyMessages.sort(
(a, b) => new Date(a.time) - new Date(b.time)
);
// DOM
await this.$nextTick();
//
setTimeout(() => {
this.scrollToBottom(true); // true
}, 100);
} else {
this.messages = [
{
type: "system",
text: "暂无历史消息",
isSystemHint: true,
time: new Date(),
},
];
}
} catch (error) {
console.error("加载历史消息失败:", error);
this.$message.error("加载历史消息失败");
this.messages = [
{
type: "system",
text: "加载历史消息失败,请重试",
isSystemHint: true,
time: new Date(),
isError: true,
},
];
} finally {
this.isLoadingHistory = false;
}
},
// DOM
await this.$nextTick();
//
setTimeout(() => {
this.scrollToBottom(true); // true
}, 100);
} else {
this.messages = [
{
type: "system",
text: "暂无历史消息",
isSystemHint: true,
time: new Date(),
},
];
}
} catch (error) {
console.error("加载历史消息失败:", error);
this.$message.error("加载历史消息失败");
this.messages = [
{
type: "system",
text: "加载历史消息失败,请重试",
isSystemHint: true,
time: new Date(),
isError: true,
},
];
} finally {
this.isLoadingHistory = false;
}
},
// 7
async loadMoreHistory() {
if (this.isLoadingHistory || !this.roomId) return;
if (this.isLoadingHistory || !this.roomId) return;
this.isLoadingHistory = true;
this.isLoadingHistory = true;
try {
// ID
const oldestMessage = this.messages.find(msg => !msg.isSystemHint && !msg.isLoading);
if (!oldestMessage || !oldestMessage.id) {
console.warn('没有找到有效的消息ID');
this.hasMoreHistory = false;
return;
}
try {
// ID
const oldestMessage = this.messages.find(
(msg) => !msg.isSystemHint && !msg.isLoading
);
if (!oldestMessage || !oldestMessage.id) {
console.warn("没有找到有效的消息ID");
this.hasMoreHistory = false;
return;
}
//
const loadingMsg = {
type: "system",
text: "正在加载更多历史消息...",
isLoading: true,
time: new Date(),
};
this.messages.unshift(loadingMsg);
//
const loadingMsg = {
type: "system",
text: "正在加载更多历史消息...",
isLoading: true,
time: new Date(),
};
this.messages.unshift(loadingMsg);
// id
const response = await getHistory7({
roomId: this.roomId,
userType: this.userType,
email: this.userEmail,
id: oldestMessage.id // ID
});
// id
const response = await getHistory7({
roomId: this.roomId,
userType: this.userType,
email: this.userEmail,
id: oldestMessage.id, // ID
});
//
this.messages = this.messages.filter((msg) => !msg.isLoading);
//
this.messages = this.messages.filter((msg) => !msg.isLoading);
if (
response &&
response.code === 200 &&
response.data &&
response.data.length > 0
) {
//
const historyMessages = this.formatHistoryMessages(response.data);
if (
response &&
response.code === 200 &&
response.data &&
response.data.length > 0
) {
//
const historyMessages = this.formatHistoryMessages(response.data);
//
this.messages = [...historyMessages, ...this.messages];
//
this.messages = [...historyMessages, ...this.messages];
//
this.hasMoreHistory = historyMessages.length > 0;
//
this.hasMoreHistory = historyMessages.length > 0;
if (historyMessages.length === 0) {
if (historyMessages.length === 0) {
this.messages.unshift({
type: "system",
text: "没有更多历史消息了",
isSystemHint: true,
time: new Date(),
});
}
} else {
this.hasMoreHistory = false;
this.messages.unshift({
type: "system",
text: "没有更多历史消息了",
isSystemHint: true,
time: new Date(),
});
}
} catch (error) {
console.error("加载更多历史消息失败:", error);
this.messages.unshift({
type: "system",
text: "没有更多历史消息了",
isSystemHint: true,
text: "加载更多历史消息失败",
isError: true,
time: new Date(),
});
} finally {
this.isLoadingHistory = false;
}
} else {
this.hasMoreHistory = false;
this.messages.unshift({
type: "system",
text: "没有更多历史消息了",
isSystemHint: true,
time: new Date(),
});
}
} catch (error) {
console.error("加载更多历史消息失败:", error);
this.messages.unshift({
type: "system",
text: "加载更多历史消息失败",
isError: true,
time: new Date(),
});
} finally {
this.isLoadingHistory = false;
}
},
},
//
formatHistoryMessages(messagesData) {
@ -796,7 +874,7 @@ export default {
//
const messageObj = {
type: data.sendUserType === this.userType ? "user" : "system", //
type: data.sendEmail === this.userEmail ? "user" : "system",
text: data.content,
isImage: data.type === 2,
imageUrl: data.type === 2 ? data.content : null,
@ -884,47 +962,50 @@ export default {
//
async toggleChat() {
this.isChatOpen = !this.isChatOpen;
this.isChatOpen = !this.isChatOpen;
// 1.
this.determineUserType();
// 2.
if (this.userType === 2) {
const lang = this.$i18n.locale;
this.$router.push(`/${lang}/customerService`);
return;
}
if (this.isChatOpen) {
try {
//
// 1.
this.determineUserType();
// WebSocket
if (!this.isWebSocketConnected || this.connectionStatus === "disconnected") {
await this.connectWebSocket();
// 2.
if (this.userType === 2) {
const lang = this.$i18n.locale;
this.$router.push(`/${lang}/customerService`);
return;
}
//
if (this.messages.length === 0) {
await this.loadHistoryMessages();
} else {
//
await this.$nextTick();
setTimeout(() => {
this.scrollToBottom(true);
}, 100);
}
if (this.isChatOpen) {
try {
//
this.determineUserType();
//
await this.markMessagesAsRead();
} catch (error) {
console.error("初始化聊天失败:", error);
this.$message.error("初始化聊天失败,请重试");
}
}
},
// WebSocket
if (
!this.isWebSocketConnected ||
this.connectionStatus === "disconnected"
) {
await this.connectWebSocket();
}
//
if (this.messages.length === 0) {
await this.loadHistoryMessages();
} else {
//
await this.$nextTick();
setTimeout(() => {
this.scrollToBottom(true);
}, 100);
}
//
await this.markMessagesAsRead();
} catch (error) {
console.error("初始化聊天失败:", error);
this.$message.error("初始化聊天失败,请重试");
}
}
},
minimizeChat() {
this.isChatOpen = false;
@ -996,20 +1077,20 @@ export default {
},
//
scrollToBottom(force = false) {
if (!this.$refs.chatBody) return;
if (!this.$refs.chatBody) return;
const scrollOptions = {
top: this.$refs.chatBody.scrollHeight,
behavior: force ? 'auto' : 'smooth' // 使 'auto'
};
const scrollOptions = {
top: this.$refs.chatBody.scrollHeight,
behavior: force ? "auto" : "smooth", // 使 'auto'
};
try {
this.$refs.chatBody.scrollTo(scrollOptions);
} catch (error) {
//
this.$refs.chatBody.scrollTop = this.$refs.chatBody.scrollHeight;
}
},
try {
this.$refs.chatBody.scrollTo(scrollOptions);
} catch (error) {
//
this.$refs.chatBody.scrollTop = this.$refs.chatBody.scrollHeight;
}
},
formatTime(date) {
if (!date || !(date instanceof Date) || isNaN(date.getTime())) {
@ -1170,19 +1251,6 @@ export default {
}
},
// URL
formatImageUrl(url) {
if (!url) return "";
// URL
if (url.startsWith("http://") || url.startsWith("https://")) {
return url;
}
//
return process.env.VUE_APP_BASE_URL + url;
},
//
previewImage(imageUrl) {
this.previewImageUrl = imageUrl;
@ -1197,8 +1265,6 @@ export default {
},
beforeDestroy() {
//
if (this.$refs.chatBody) {
this.$refs.chatBody.removeEventListener("scroll", this.handleChatScroll);
@ -1209,12 +1275,29 @@ export default {
this.handleVisibilityChange
);
//
if (this.stompClient) {
this.stompClient.disconnect();
this.stompClient = null;
}
if (this.stompClient) {
this.stompClient.disconnect();
this.stompClient = null;
}
// WebSocket
this.disconnectWebSocket();
//
if (this.activityCheckInterval) {
clearInterval(this.activityCheckInterval);
}
//
if (this.reconnectTimer) {
clearTimeout(this.reconnectTimer);
}
//
window.removeEventListener("online", this.handleNetworkChange);
window.removeEventListener("offline", this.handleNetworkChange);
document.removeEventListener("mousemove", this.updateLastActivityTime);
document.removeEventListener("keydown", this.updateLastActivityTime);
document.removeEventListener("click", this.updateLastActivityTime);
},
};
</script>
@ -1664,4 +1747,19 @@ export default {
.chat-message-user .message-read-status {
color: rgba(255, 255, 255, 0.7);
}
.network-status {
position: fixed;
top: 20px;
right: 20px;
padding: 8px 16px;
border-radius: 4px;
display: flex;
align-items: center;
gap: 8px;
z-index: 1000;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
background-color: #fef0f0;
color: #f56c6c;
}
</style>

View File

@ -10,6 +10,70 @@ export const ChatWidget_zh = {
onlyImages:"只能上传图片文件!",
imageTooLarge:"图片大小不能超过5MB!",
imageReceived:"已收到您的图片,我们会尽快处理您的问题。",
networkError:"网络连接已断开,请刷新页面重试",
openCustomerService:"打开客服聊天",
connectToCustomerService:"正在连接客服系统...",
connectionFailed:"连接失败,请刷新页面重试",
tryConnectingAgain:"重试连接",
loading:"加载中...",
loadMore:"加载更多历史消息",
welcomeToUse:"欢迎使用在线客服,请问有什么可以帮您?",
picture:"聊天图片",
read:"已读",
unread:"未读",
subscriptionFailed:"消息订阅失败,可能无法接收新消息",
break:"连接断开",
retry:"秒后重试",
disconnectWaiting:"断线重连中...",
sendFailed:"发送消息失败,请重试",
noHistory:"暂无历史消息",
historicalFailure:"加载历史消息失败,请重试",
loadingHistory:"正在加载更多历史消息...",
noMoreHistory:"没有更多历史消息了",
Loaded:"已加载历史消息",
newMessage:"新消息",
pictureMessage:"图片消息",
initializationFailed:"初始化失败,请刷新页面重试",
beSorry:"抱歉,我暂时无法回答这个问题。请排队等待人工客服或提交工单。",
today:"今天",
yesterday:"昨天",
canOnlyUploadImages:"只能上传图片文件!",
imageSizeExceeded:"图片大小不能超过5MB!",
uploading:"正在上传图片...",
pictureFailed:"发送图片失败,请重试",
readImage:"读取图片失败,请重试",
processingFailed:"图片处理失败,请重试",
Disconnected:"连接已断开",
reconnecting:"正在重连...",
contactList:"联系列表",
search:"搜索最近联系人",
tourist:"游客",
important:"重要",
markAsImportant:"标记为重要",
cancelImportant:"已取消重要标记",
markingFailed:"标记操作失败,请重试",
select:"请选择联系人",
notSelected:"您尚未选择联系人",
None:"暂无消息记录",
sendPicture:"发送图片",
inputMessage:"请输入消息按Enter键发送按Ctrl+Enter键换行",
bottom:"回到底部",
Preview:"预览图片",
chatRoom:"聊天室",
CLOSED:"已关闭",
picture2:"图片",
Unnamed:"未命名聊天室",
noNewsAtTheMoment:"暂无消息",
contactFailed:"加载更多联系人失败",
listException:"获取聊天室列表异常",
my:"我",
unknownSender:"未知发送者",
recordFailed:"加载聊天记录失败",
messageException:"加载消息异常",
chooseFirst:"请先选择联系人",
chatDisconnected:"聊天连接已断开,请刷新页面重试",
pictureSuccessful:"图片已发送",
},
@ -28,5 +92,73 @@ export const ChatWidget_en = {
onlyImages:"Only image files can be uploaded!",
imageTooLarge:"The image size cannot exceed 5MB!",
imageReceived:"We have received your image, and we will handle your question as soon as possible.",
}
networkError: "Network disconnected, please refresh page",
openCustomerService: "Open customer service chat",
connectToCustomerService: "Connecting to customer service...",
connectionFailed: "Connection failed, please refresh page",
tryConnectingAgain: "Retry connection",
loading: "Loading...",
loadMore: "Load more history",
welcomeToUse: "Welcome to online service, how can I help you?",
picture: "Chat image",
read: "Read",
unread: "Unread",
subscriptionFailed: "Message subscription failed",
break: "Connection lost",
retry: "Retry in seconds",
disconnectWaiting: "Reconnecting...",
sendFailed: "Send failed, please retry",
noHistory: "No history",
historicalFailure: "Failed to load history",
loadingHistory: "Loading more history...",
noMoreHistory: "No more history",
Loaded: "History loaded",
newMessage: "New message",
pictureMessage: "Image message",
initializationFailed: "Initialization failed, please refresh",
beSorry: "Sorry, I cannot answer this. Please wait for agent or submit ticket",
today: "Today",
yesterday: "Yesterday",
canOnlyUploadImages: "Only image files allowed",
imageSizeExceeded: "Image size exceeds 5MB",
uploading: "Uploading image...",
pictureFailed: "Failed to send image",
readImage: "Failed to read image",
processingFailed: "Image processing failed",
Disconnected: "Disconnected",
reconnecting: "Reconnecting...",
contactList: "Contact list",
search: "Search contacts",
tourist: "Guest",
important: "Important",
markAsImportant: "Mark as important",
cancelImportant: "Unmarked as important",
markingFailed: "Marking failed",
select: "Select contact",
notSelected: "No contact selected",
None: "No messages",
sendPicture: "Send image",
inputMessage: "Type message, Enter to send, Ctrl+Enter for new line",
bottom: "Back to bottom",
Preview: "Preview image",
chatRoom: "Chat room",
CLOSED: "Closed",
picture2: "Image",
Unnamed: "Unnamed chat",
noNewsAtTheMoment: "No messages",
contactFailed: "Failed to load contacts",
listException: "Failed to get chat list",
my: "Me",
unknownSender: "Unknown sender",
recordFailed: "Failed to load chat records",
messageException: "Failed to load messages",
chooseFirst: "Please select contact first",
chatDisconnected: "Chat disconnected, please refresh",
pictureSuccessful: "Image sent",
}
}

View File

@ -23,7 +23,7 @@ Vue.use(ElementUI, {
});
Vue.prototype.$axios = axios
// console.log = ()=>{} //全局关闭打印
console.log = ()=>{} //全局关闭打印
// 全局注册混入
Vue.mixin(loadingStateMixin);
Vue.mixin(networkRecoveryMixin);

File diff suppressed because it is too large Load Diff

View File

@ -1440,67 +1440,37 @@ export default {
return width + marginLeft + marginRight;
},
// 左滑动逻辑
scrollLeft() {
const listEl = this.$refs.currencyList;
const listBox = this.$refs.listBox;
if (!listEl || !listBox) return;
const itemFullWidth = this.getItemFullWidth();
const step = 2 * itemFullWidth; // 每次滑动2个币种
const allLength = this.currencyList.length * itemFullWidth;
const boxLength = listBox.clientWidth;
if (allLength <= boxLength) return;
let currentLeft = Math.abs(parseInt(listEl.style.transform.replace('translateX(', '').replace('px)', '')) || 0);
let newLeft = currentLeft - step;
listEl.classList.add('scrolling');
if (newLeft <= 0) {
listEl.style.transform = 'translateX(0)';
const allLength = this.currencyList.length * 120
const boxLength = document.getElementById('list-box').clientWidth
if (allLength < boxLength) return
const listEl = document.getElementById('list')
const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left))
if (leftMove + boxLength - 360 < boxLength) {
// 到最开始的时候
listEl.style.left = '0PX'
} else {
listEl.style.transform = `translateX(-${newLeft}px)`;
listEl.style.left = '-' + (leftMove - 360) + 'PX'
}
// 增加动画时间到 500ms
setTimeout(() => {
listEl.classList.remove('scrolling');
}, 500);
},
},
// 右滑动逻辑
scrollRight() {
const allLength = this.currencyList.length * 120
const boxLength = document.getElementById('list-box').clientWidth
if (allLength < boxLength) return
const listEl = document.getElementById('list')
const leftMove = Math.abs(parseInt(window.getComputedStyle(listEl, null)?.left))
if (leftMove + boxLength + 360 > allLength) {
listEl.style.left = '-' + (allLength - boxLength) + 'PX'
} else {
listEl.style.left = '-' + (leftMove + 360) + 'PX'
}
},
// 右滑动逻辑
scrollRight() {
const listEl = this.$refs.currencyList;
const listBox = this.$refs.listBox;
if (!listEl || !listBox) return;
const itemFullWidth = this.getItemFullWidth();
const step = 2 * itemFullWidth; // 每次滑动2个币种
const allLength = this.currencyList.length * itemFullWidth;
const boxLength = listBox.clientWidth;
if (allLength <= boxLength) return;
let currentLeft = Math.abs(parseInt(listEl.style.transform.replace('translateX(', '').replace('px)', '')) || 0);
let newLeft = currentLeft + step;
const maxLeft = allLength - boxLength;
listEl.classList.add('scrolling');
if (newLeft >= maxLeft) {
listEl.style.transform = `translateX(-${maxLeft}px)`;
} else {
listEl.style.transform = `translateX(-${newLeft}px)`;
}
// 增加动画时间到 500ms
setTimeout(() => {
listEl.classList.remove('scrolling');
}, 500);
},
// // 左滑动逻辑
// scrollLeft() {
// const allLength = this.currencyList.length * 120

View File

@ -21,12 +21,12 @@
</span>
</template>
<ul class="moveCurrencyBox" >
<li @click="clickCurrency(item)" v-for="item in currencyList" :key="item.value">
<img :src="item.img" alt="coin" loading="lazy"/>
<p>{{ item.label }}</p>
</li>
</ul>
<ul class="moveCurrencyBox" >
<li @click="clickCurrency(item)" v-for="item in currencyList" :key="item.value">
<img :src="item.img" alt="coin" loading="lazy"/>
<p>{{ item.label }}</p>
</li>
</ul>
</el-submenu>
@ -340,29 +340,6 @@
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-card>
<div class="monitor-list">
<div class="btn left" @click="scrollLeft">
<i class="iconfont icon-icon-prev" />
</div>
<div ref="listBox" class="list-box">
<div ref="currencyList" class="list">
<div
v-for="item in currencyList"
:key="item.value"
@click="clickCurrency(item)"
class="list-item"
>
<img :src="item.img" alt="coin" />
<span :class="{ active: itemActive === item.value }">
{{ item.label }}
</span>
</div>
</div>
</div>
<div class="btn right" @click="scrollRight">
<i class="iconfont icon-zuoyoujiantou1" />
</div>
</div>
<!-- <div class="monitor-list">
<div class="btn left" @click="scrollLeft">
<i class="iconfont icon-icon-prev" />
</div>
@ -384,10 +361,11 @@
<div class="btn right" @click="scrollRight">
<i class="iconfont icon-zuoyoujiantou1" />
</div>
</div> -->
</div>
</el-card>
</el-col>
</el-row>
<section class="describeBox">
<p> <i class="iconfont icon-tishishuoming "></i><span class="describeTitle">{{ $t(`home.describeTitle`) }}</span>{{ $t(`home.describe`) }} <span class="view" @click="handelJump(`/allocationExplanation`)"> {{ $t(`home.view`) }} </span> </p>
</section>
@ -783,7 +761,7 @@ export default {
};
</script>
<style scoped lang="scss">
<style scoped lang="scss">
//
@media screen and (min-width: 220px) and (max-width: 800px) {
.imgTop {
@ -822,6 +800,7 @@ export default {
.view{
color: #5721e4;
margin-left: 5px;
cursor: pointer;
}
}
@ -848,6 +827,7 @@ export default {
// overflow: hidden;
padding: 5px 5px;
box-sizing: border-box;
cursor: pointer;
// background: palegoldenrod;
img {
@ -863,7 +843,13 @@ export default {
text-transform: capitalize;
}
}
}
.moveCurrencyBox li:hover {
box-shadow: 0px 0px 5px 2px #d2c3ea;
}
.currencySelect{
display: flex;
align-items: center;
@ -1352,6 +1338,7 @@ export default {
.view{
color: #5721e4;
margin-left: 5px;
cursor: pointer;
}
}
@ -1381,6 +1368,7 @@ export default {
padding: 5px 5px;
box-sizing: border-box;
// background: palegoldenrod;
cursor: pointer;
img {
width: 25px;
@ -1395,7 +1383,13 @@ export default {
text-transform: capitalize;
}
}
}
.moveCurrencyBox li:hover {
box-shadow: 0px 0px 5px 2px #d2c3ea;
}
.currencySelect{
display: flex;
align-items: center;
@ -3141,63 +3135,6 @@ export default {
transition: left 1s;
}
}
.list-box {//
width: calc(100% - 100px);
overflow: hidden;
position: relative;
}
.list {
display: flex;
will-change: transform;
padding-left: 2%;
&.scrolling {
// 0.5s使
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.list-item {
flex-shrink: 0;
width: 120px;
height: 95%;
margin-left: 18px;
// 使
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
&:hover {
transform: translateY(-3px);
box-shadow: 0 6px 16px rgba(110, 62, 219, 0.2);
}
img {
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
span {
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
}
}
.btn {
//
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
&:hover {
background-color: #6e3edb;
color: #fff;
transform: scale(1.05);
}
&:active {
transform: scale(0.95);
}
}
}
// -----------------------
@ -3348,6 +3285,7 @@ export default {
cursor: pointer;
margin-left: 8px;
color: #6E3EDB;
// background: palegoldenrod;
}
.view:hover{

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

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.648a91a9.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer src=/js/chunk-vendors-377fed06.159de137.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/app-42f9d7e6.17cb0808.js></script><script defer src=/js/app-5c551db8.2b99b68c.js></script><script defer src=/js/app-01dc9ae1.188fe4f5.js></script><script defer src=/js/app-b4c4f6ec.bf0536f4.js></script><script defer src=/js/app-72600b29.6b68c3d1.js></script><script defer src=/js/app-f035d474.30e8939b.js></script><script defer src=/js/app-113c6c50.28d27f0c.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.23095695.css rel=stylesheet><link href=/css/app-01dc9ae1.825b7ca3.css rel=stylesheet><link href=/css/app-b4c4f6ec.c96edfc1.css rel=stylesheet><link href=/css/app-72600b29.83c22f01.css rel=stylesheet><link href=/css/app-f035d474.0e6b8898.css rel=stylesheet><link href=/css/app-113c6c50.af06316f.css rel=stylesheet></head><body><div id=app></div></body></html>
<!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.12c435f1.js></script><script defer src=/js/app-5c551db8.69e18ab2.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.5adbe93c.js></script><script defer src=/js/app-72600b29.e3c70da1.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.e8e56d1b.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.7553f600.css rel=stylesheet><link href=/css/app-72600b29.f02b800f.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>

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

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-22T06:17:28.553Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-22T06:17:28.553Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
<?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-23T06:27:17.672Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-23T06:27:17.672Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-23T06:27:17.672Z</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-22T06:17:28.543Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-04-22T06:17:28.543Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
<?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-23T06:27:17.662Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-23T06:27:17.662Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>

Binary file not shown.