1.游客功能添加、删除列表离线游客 目前游客断开没有返回关闭信息
2.游客收不到客服消息 已处理 3.中英文翻译 已完成 4.将本地时间修改为UTC时间 完成 5.发送图片有问题 又重新改回url上传 6.游客用户增加提示和跳转登录的功能 7.客服消息换行及显示已处理 8.客服端限制输入400个字符 用户端限制输入300个字符 完成
This commit is contained in:
parent
99b471bb86
commit
e0a7fb8ee2
|
@ -137,6 +137,8 @@
|
||||||
<i v-else class="el-icon-user"></i>
|
<i v-else class="el-icon-user"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="message-content">
|
<div class="message-content">
|
||||||
|
<!-- 时间显示在右上角 -->
|
||||||
|
<!-- <span class="message-time">{{ formatTime(msg.time) }}</span> -->
|
||||||
<!-- 文本消息 -->
|
<!-- 文本消息 -->
|
||||||
<div v-if="!msg.isImage" class="message-text">
|
<div v-if="!msg.isImage" class="message-text">
|
||||||
{{ msg.text }}
|
{{ msg.text }}
|
||||||
|
@ -153,7 +155,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="message-footer">
|
<div class="message-footer">
|
||||||
<span class="message-time">{{ formatTime(msg.time) }}</span>
|
<!-- <span class="message-time">{{ formatTime(msg.time) }}</span> -->
|
||||||
<!-- 添加已读状态显示 -->
|
<!-- 添加已读状态显示 -->
|
||||||
<span
|
<span
|
||||||
v-if="msg.type === 'user'"
|
v-if="msg.type === 'user'"
|
||||||
|
@ -191,14 +193,18 @@
|
||||||
:disabled="connectionStatus !== 'connected'"
|
:disabled="connectionStatus !== 'connected'"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="chat-input-wrapper" style="display: flex;align-items: center;">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
class="chat-input"
|
class="chat-input"
|
||||||
v-model="inputMessage"
|
v-model="inputMessage"
|
||||||
@keyup.enter="sendMessage"
|
:maxlength="maxMessageLength"
|
||||||
|
@input="handleInputMessage"
|
||||||
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
|
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
|
||||||
:disabled="connectionStatus !== 'connected'"
|
:disabled="connectionStatus !== 'connected'"
|
||||||
/>
|
/>
|
||||||
|
<!-- <span class="input-counter">{{ maxMessageLength - inputMessage.length }}</span> -->
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
class="chat-send"
|
class="chat-send"
|
||||||
@click="sendMessage"
|
@click="sendMessage"
|
||||||
|
@ -282,6 +288,8 @@ export default {
|
||||||
connectionError: null, // 添加错误信息存储
|
connectionError: null, // 添加错误信息存储
|
||||||
showRefreshButton: false, // 添加刷新按钮
|
showRefreshButton: false, // 添加刷新按钮
|
||||||
heartbeatCheckInterval: 30000, // 每30秒检查一次心跳
|
heartbeatCheckInterval: 30000, // 每30秒检查一次心跳
|
||||||
|
|
||||||
|
maxMessageLength: 300,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -601,10 +609,19 @@ export default {
|
||||||
handleBeforeUnload() {
|
handleBeforeUnload() {
|
||||||
this.disconnectWebSocket();
|
this.disconnectWebSocket();
|
||||||
},
|
},
|
||||||
|
//只能输入300个字符
|
||||||
|
handleInputMessage() {
|
||||||
|
if (this.inputMessage.length > this.maxMessageLength) {
|
||||||
|
this.inputMessage = this.inputMessage.slice(0, this.maxMessageLength);
|
||||||
|
}
|
||||||
|
},
|
||||||
// 发送消息
|
// 发送消息
|
||||||
sendMessage() {
|
sendMessage() {
|
||||||
if (!this.inputMessage.trim()) return;
|
if (!this.inputMessage.trim()) return;
|
||||||
|
if (this.inputMessage.length > this.maxMessageLength) {
|
||||||
|
this.$message.warning(`消息不能超过${this.maxMessageLength}个字符`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 检查 WebSocket 连接状态
|
// 检查 WebSocket 连接状态
|
||||||
if (!this.stompClient || !this.stompClient.connected) {
|
if (!this.stompClient || !this.stompClient.connected) {
|
||||||
|
@ -1126,15 +1143,23 @@ export default {
|
||||||
this.isChatOpen = !this.isChatOpen;
|
this.isChatOpen = !this.isChatOpen;
|
||||||
|
|
||||||
// 1. 判别身份
|
// 1. 判别身份
|
||||||
// this.determineUserType();
|
const userInfo = JSON.parse(
|
||||||
|
localStorage.getItem("jurisdiction") || "{}"
|
||||||
|
);
|
||||||
|
|
||||||
// 2. 如果是客服,跳转到客服页面
|
if (userInfo.roleKey === "customer_service") {
|
||||||
if (this.userType === 2) {
|
// 客服用户 跳转到客服页面
|
||||||
|
this.userType = 2;
|
||||||
const lang = this.$i18n.locale;
|
const lang = this.$i18n.locale;
|
||||||
this.$router.push(`/${lang}/customerService`);
|
this.$router.push(`/${lang}/customerService`);
|
||||||
return;
|
return;
|
||||||
|
// this.userEmail = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (this.isChatOpen) {
|
if (this.isChatOpen) {
|
||||||
try {
|
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>
|
</style>
|
|
@ -634,87 +634,87 @@ const router = new VueRouter({
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
router.beforeEach((to, from, next) => {
|
// router.beforeEach((to, from, next) => {
|
||||||
// 检查语言参数
|
// // 检查语言参数
|
||||||
const lang = to.params.lang;
|
// const lang = to.params.lang;
|
||||||
const supportedLanguages = ['zh', 'en'];
|
// const supportedLanguages = ['zh', 'en'];
|
||||||
|
|
||||||
// 如果路径以斜杠结尾且不是根路径,则重定向
|
// // 如果路径以斜杠结尾且不是根路径,则重定向
|
||||||
if (to.path.endsWith('/') && to.path.length > 1) {
|
// if (to.path.endsWith('/') && to.path.length > 1) {
|
||||||
const path = to.path.slice(0, -1);
|
// const path = to.path.slice(0, -1);
|
||||||
return next({
|
// return next({
|
||||||
path,
|
// path,
|
||||||
query: to.query,
|
// query: to.query,
|
||||||
hash: to.hash,
|
// hash: to.hash,
|
||||||
params: to.params
|
// params: to.params
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (!lang && to.path !== '/') {
|
// if (!lang && to.path !== '/') {
|
||||||
const defaultLang = localStorage.getItem('lang') || 'en';
|
// const defaultLang = localStorage.getItem('lang') || 'en';
|
||||||
return next(`/${defaultLang}${to.path}`);
|
// return next(`/${defaultLang}${to.path}`);
|
||||||
}
|
// }
|
||||||
|
|
||||||
let data = localStorage.getItem("jurisdiction");
|
// let data = localStorage.getItem("jurisdiction");
|
||||||
let jurisdiction =JSON.parse(data);
|
// let jurisdiction =JSON.parse(data);
|
||||||
|
|
||||||
localStorage.setItem('superReportError',"")
|
// localStorage.setItem('superReportError',"")
|
||||||
let element = document.getElementsByClassName('el-main')[0];
|
// let element = document.getElementsByClassName('el-main')[0];
|
||||||
if(element){
|
// if(element){
|
||||||
element.scrollTop = 0
|
// element.scrollTop = 0
|
||||||
}
|
// }
|
||||||
|
|
||||||
let token
|
// let token
|
||||||
try{
|
// try{
|
||||||
token =JSON.parse(localStorage.getItem('token'))
|
// token =JSON.parse(localStorage.getItem('token'))
|
||||||
}catch(e){
|
// }catch(e){
|
||||||
console.log(e);
|
// console.log(e);
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
if (token) {
|
// if (token) {
|
||||||
|
|
||||||
|
|
||||||
if (to.path === `/${lang}/login`|| to.path === `/${lang}/register`) {
|
// if (to.path === `/${lang}/login`|| to.path === `/${lang}/register`) {
|
||||||
next({ path: `/${lang}` })
|
// next({ path: `/${lang}` })
|
||||||
}else if(to.meta.allAuthority && to.meta.allAuthority[0] ==`all`){
|
// }else if(to.meta.allAuthority && to.meta.allAuthority[0] ==`all`){
|
||||||
next()
|
// next()
|
||||||
}else if(jurisdiction.roleKey && to.meta.allAuthority&&to.meta.allAuthority.some(item=>item == jurisdiction.roleKey )){
|
// }else if(jurisdiction.roleKey && to.meta.allAuthority&&to.meta.allAuthority.some(item=>item == jurisdiction.roleKey )){
|
||||||
next()
|
// next()
|
||||||
}else{
|
// }else{
|
||||||
console.log(to.meta.allAuthority,to.path,"权限");
|
// console.log(to.meta.allAuthority,to.path,"权限");
|
||||||
|
|
||||||
Message({//权限不足
|
// Message({//权限不足
|
||||||
showClose: true,
|
// showClose: true,
|
||||||
message:i18n.t(`mining.jurisdiction`),
|
// message:i18n.t(`mining.jurisdiction`),
|
||||||
type: 'error'
|
// type: 'error'
|
||||||
});
|
// });
|
||||||
|
|
||||||
next({ path: `/${lang}` }) // 添加这行,重定向到首页
|
// next({ path: `/${lang}` }) // 添加这行,重定向到首页
|
||||||
}
|
// }
|
||||||
|
|
||||||
}else{
|
// }else{
|
||||||
|
|
||||||
|
|
||||||
let paths = [`/${lang}/miningAccount`,`/${lang}/workOrderRecords`,`/${lang}/userWorkDetails`,`/${lang}/submitWorkOrder`,`/${lang}/workOrderBackend`,`/${lang}/BKWorkDetails`]
|
// let paths = [`/${lang}/miningAccount`,`/${lang}/workOrderRecords`,`/${lang}/userWorkDetails`,`/${lang}/submitWorkOrder`,`/${lang}/workOrderBackend`,`/${lang}/BKWorkDetails`]
|
||||||
if (paths.includes(to.path) || to.path.includes(`personalCenter`) ) {
|
// if (paths.includes(to.path) || to.path.includes(`personalCenter`) ) {
|
||||||
|
|
||||||
Message({//权限不足
|
// Message({//权限不足
|
||||||
showClose: true,
|
// showClose: true,
|
||||||
message:i18n.t(`mining.logInFirst`),
|
// message:i18n.t(`mining.logInFirst`),
|
||||||
type: 'error'
|
// type: 'error'
|
||||||
});
|
// });
|
||||||
|
|
||||||
next({ path: `/${lang}/login` })
|
// next({ path: `/${lang}/login` })
|
||||||
} else {
|
// } else {
|
||||||
|
|
||||||
next()
|
// next()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})
|
// })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,13 @@
|
||||||
connectionStatus === 'error' ? 'el-icon-warning' : 'el-icon-loading'
|
connectionStatus === 'error' ? 'el-icon-warning' : 'el-icon-loading'
|
||||||
"
|
"
|
||||||
></i>
|
></i>
|
||||||
<span>{{
|
<span
|
||||||
|
>{{
|
||||||
connectionStatus === "error"
|
connectionStatus === "error"
|
||||||
? $t("chat.Disconnected") || "连接已断开"
|
? $t("chat.Disconnected") || "连接已断开"
|
||||||
: $t("chat.reconnecting") || "正在连接..."
|
: $t("chat.reconnecting") || "正在连接..."
|
||||||
}} </span>
|
}}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- 聊天窗口主体 -->
|
<!-- 聊天窗口主体 -->
|
||||||
<div class="cs-chat-wrapper">
|
<div class="cs-chat-wrapper">
|
||||||
|
@ -58,7 +60,6 @@
|
||||||
<div class="cs-contact-info">
|
<div class="cs-contact-info">
|
||||||
<div class="cs-contact-name">
|
<div class="cs-contact-name">
|
||||||
{{ contact.name }}
|
{{ contact.name }}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="cs-contact-msg">
|
<div class="cs-contact-msg">
|
||||||
<span v-if="contact.important" class="important-tag"
|
<span v-if="contact.important" class="important-tag"
|
||||||
|
@ -200,9 +201,11 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="cs-bubble">
|
<div class="cs-bubble">
|
||||||
<div class="cs-sender">{{ message.sender }}</div>
|
<div class="cs-sender">{{ message.sender }}</div>
|
||||||
<div v-if="!message.isImage" class="cs-text">
|
<div
|
||||||
{{ message.content }}
|
v-if="!message.isImage"
|
||||||
</div>
|
class="cs-text"
|
||||||
|
v-html="formatMessageContent(message.content)"
|
||||||
|
></div>
|
||||||
<div v-else class="cs-image">
|
<div v-else class="cs-image">
|
||||||
<img
|
<img
|
||||||
:src="message.content"
|
:src="message.content"
|
||||||
|
@ -235,7 +238,7 @@
|
||||||
<!-- <i class="el-icon-s-opportunity" title="发送表情"></i> -->
|
<!-- <i class="el-icon-s-opportunity" title="发送表情"></i> -->
|
||||||
<!-- <i class="el-icon-scissors" title="截图"></i> -->
|
<!-- <i class="el-icon-scissors" title="截图"></i> -->
|
||||||
</div>
|
</div>
|
||||||
<!-- @keydown.enter.prevent="sendMessage" -->
|
<!-- @keydown.enter.native="handleKeyDown" -->
|
||||||
<div class="cs-input-area">
|
<div class="cs-input-area">
|
||||||
<el-input
|
<el-input
|
||||||
type="textarea"
|
type="textarea"
|
||||||
|
@ -246,12 +249,13 @@
|
||||||
$t(`chat.inputMessage`) ||
|
$t(`chat.inputMessage`) ||
|
||||||
`请输入消息,按Enter键发送,按Ctrl+Enter键换行`
|
`请输入消息,按Enter键发送,按Ctrl+Enter键换行`
|
||||||
"
|
"
|
||||||
@keydown.enter.native="handleKeyDown"
|
@keydown.native="handleKeyDown"
|
||||||
|
@input="handleInputLimit"
|
||||||
></el-input>
|
></el-input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="cs-send-area">
|
<div class="cs-send-area">
|
||||||
<span class="cs-counter">{{ inputMessage.length }}/500</span>
|
<span class="cs-counter">{{ inputMessage.length }}/400</span>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
:disabled="!currentContact || !inputMessage.trim() || sending"
|
:disabled="!currentContact || !inputMessage.trim() || sending"
|
||||||
|
@ -387,6 +391,12 @@ export default {
|
||||||
}
|
}
|
||||||
// 在组件创建时加载手动创建的聊天室
|
// 在组件创建时加载手动创建的聊天室
|
||||||
this.loadManualCreatedRooms();
|
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 连接
|
// 初始化 WebSocket 连接
|
||||||
this.initWebSocket();
|
this.initWebSocket();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -443,14 +453,26 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleKeyDown(e) {
|
handleKeyDown(e) {
|
||||||
// 如果按住了 Ctrl 键,则不发送消息(换行)
|
if (e.key === "Enter") {
|
||||||
if (e.ctrlKey) {
|
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();
|
e.preventDefault();
|
||||||
// 发送消息
|
|
||||||
this.sendMessage();
|
this.sendMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 初始化 WebSocket 连接
|
// 初始化 WebSocket 连接
|
||||||
|
@ -467,7 +489,7 @@ export default {
|
||||||
this.stompClient.maxWebSocketMessageSize = 16 * 1024 * 1024; // 设置最大消息大小为16MB
|
this.stompClient.maxWebSocketMessageSize = 16 * 1024 * 1024; // 设置最大消息大小为16MB
|
||||||
this.stompClient.webSocketFactory = () => {
|
this.stompClient.webSocketFactory = () => {
|
||||||
const ws = new WebSocket(wsUrl);
|
const ws = new WebSocket(wsUrl);
|
||||||
ws.binaryType = 'arraybuffer'; // 设置二进制类型为 arraybuffer
|
ws.binaryType = "arraybuffer"; // 设置二进制类型为 arraybuffer
|
||||||
return ws;
|
return ws;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -553,18 +575,18 @@ export default {
|
||||||
|
|
||||||
// 标准化处理 返回的格式 "\"guest_1748242041830_jmz4c9qx5\""
|
// 标准化处理 返回的格式 "\"guest_1748242041830_jmz4c9qx5\""
|
||||||
const normalize = (str) => {
|
const normalize = (str) => {
|
||||||
if (!str) return '';
|
if (!str) return "";
|
||||||
if (typeof str === 'object' && 'value' in str) str = str.value;
|
if (typeof str === "object" && "value" in str) str = str.value;
|
||||||
str = String(str).trim().toLowerCase();
|
str = String(str).trim().toLowerCase();
|
||||||
// 去除所有首尾引号
|
// 去除所有首尾引号
|
||||||
str = str.replace(/^['"]+|['"]+$/g, '');
|
str = str.replace(/^['"]+|['"]+$/g, "");
|
||||||
return str;
|
return str;
|
||||||
};
|
};
|
||||||
|
|
||||||
const targetEmail = normalize(closedUserEmail);
|
const targetEmail = normalize(closedUserEmail);
|
||||||
// 在联系人列表中查找对应的聊天室
|
// 在联系人列表中查找对应的聊天室
|
||||||
|
|
||||||
const contactIndex = this.contacts.findIndex(contact => {
|
const contactIndex = this.contacts.findIndex((contact) => {
|
||||||
const contactEmail = normalize(contact.name);
|
const contactEmail = normalize(contact.name);
|
||||||
return contactEmail === targetEmail;
|
return contactEmail === targetEmail;
|
||||||
});
|
});
|
||||||
|
@ -688,6 +710,13 @@ export default {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
return new Date(now.getTime() + now.getTimezoneOffset() * 60000);
|
return new Date(now.getTime() + now.getTimezoneOffset() * 60000);
|
||||||
},
|
},
|
||||||
|
//只能输入400个字符
|
||||||
|
handleInputLimit(val) {
|
||||||
|
if (val.length > 400) {
|
||||||
|
this.inputMessage = val.slice(0, 400);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// 发送消息
|
// 发送消息
|
||||||
async sendMessage() {
|
async sendMessage() {
|
||||||
if (!this.inputMessage.trim() || !this.currentContact || this.sending)
|
if (!this.inputMessage.trim() || !this.currentContact || this.sending)
|
||||||
|
@ -698,23 +727,29 @@ export default {
|
||||||
this.sending = true;
|
this.sending = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 判断接收者类型
|
// 检查连接状态
|
||||||
if (this.currentContact.sendUserType !== undefined) {
|
if (!this.isWebSocketConnected) {
|
||||||
this.receiveUserType = this.currentContact.sendUserType;
|
this.$message.warning(
|
||||||
} else {
|
this.$t("chat.reconnecting") || "正在重新连接..."
|
||||||
this.receiveUserType = 1;
|
);
|
||||||
|
await this.initWebSocket(); // 尝试重新连接
|
||||||
}
|
}
|
||||||
|
// 正确设置接收者类型
|
||||||
|
const receiveUserType =
|
||||||
|
this.currentContact.sendUserType !== undefined
|
||||||
|
? this.currentContact.sendUserType
|
||||||
|
: 1; // 默认登录用户
|
||||||
|
|
||||||
const message = {
|
const message = {
|
||||||
content: messageContent,
|
content: messageContent,
|
||||||
type: 1, // 1 表示文字消息
|
type: 1, // 1 表示文字消息
|
||||||
email: this.currentContact.name,
|
email: this.currentContact.name,
|
||||||
receiveUserType: this.receiveUserType,
|
receiveUserType: receiveUserType,
|
||||||
roomId: this.currentContactId,
|
roomId: this.currentContactId,
|
||||||
// sendTime: this.convertToUTC(new Date()).toISOString() // 添加 UTC 时间
|
// sendTime: this.convertToUTC(new Date()).toISOString() // 添加 UTC 时间
|
||||||
};
|
};
|
||||||
|
|
||||||
// 发送消息
|
// // 发送消息
|
||||||
this.stompClient.send(
|
this.stompClient.send(
|
||||||
"/point/send/message/to/user",
|
"/point/send/message/to/user",
|
||||||
{},
|
{},
|
||||||
|
@ -739,17 +774,26 @@ export default {
|
||||||
if (contact) {
|
if (contact) {
|
||||||
contact.unread = 0;
|
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;
|
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
|
lastTime: messageData.time, // 直接使用 createTime
|
||||||
unread: 1,
|
unread: 1,
|
||||||
important: false,
|
important: false,
|
||||||
isGuest: messageData.sendUserType === 0,
|
isGuest: msg.sendUserType === 0,
|
||||||
sendUserType: messageData.sendUserType,
|
sendUserType: messageData.sendUserType,
|
||||||
isManualCreated: true,
|
isManualCreated: true,
|
||||||
};
|
};
|
||||||
|
@ -961,7 +1005,6 @@ export default {
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("5858", error);
|
console.error("5858", error);
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
this.isLoadingMoreContacts = false;
|
this.isLoadingMoreContacts = false;
|
||||||
}
|
}
|
||||||
|
@ -1181,7 +1224,9 @@ export default {
|
||||||
|
|
||||||
// 获取该聊天室的最新消息时间
|
// 获取该聊天室的最新消息时间
|
||||||
const latestMessage = this.messages[room.id]?.[0] || null;
|
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 {
|
return {
|
||||||
roomId: room.id,
|
roomId: room.id,
|
||||||
|
@ -1503,16 +1548,16 @@ export default {
|
||||||
this.$message({ message: "正在上传图片...", type: "info" });
|
this.$message({ message: "正在上传图片...", type: "info" });
|
||||||
// 创建 FormData
|
// 创建 FormData
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('file', file);
|
formData.append("file", file);
|
||||||
|
|
||||||
// 上传图片
|
// 上传图片
|
||||||
const response = await this.$axios({
|
const response = await this.$axios({
|
||||||
method: 'post',
|
method: "post",
|
||||||
url: `${process.env.VUE_APP_BASE_API}pool/ticket/uploadFile`,
|
url: `${process.env.VUE_APP_BASE_API}pool/ticket/uploadFile`,
|
||||||
data: formData,
|
data: formData,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'multipart/form-data'
|
"Content-Type": "multipart/form-data",
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response.data.code === 200) {
|
if (response.data.code === 200) {
|
||||||
|
@ -1537,7 +1582,8 @@ export default {
|
||||||
|
|
||||||
// 等待图片加载完成后滚动到底部
|
// 等待图片加载完成后滚动到底部
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const img = this.$refs.messageContainer.querySelector('.cs-image img');
|
const img =
|
||||||
|
this.$refs.messageContainer.querySelector(".cs-image img");
|
||||||
if (img) {
|
if (img) {
|
||||||
// 创建一个新的 Promise 来处理图片加载
|
// 创建一个新的 Promise 来处理图片加载
|
||||||
const imgLoadPromise = new Promise((resolve) => {
|
const imgLoadPromise = new Promise((resolve) => {
|
||||||
|
@ -1578,7 +1624,7 @@ export default {
|
||||||
showClose: true,
|
showClose: true,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
throw new Error(response.data.msg || '上传失败');
|
throw new Error(response.data.msg || "上传失败");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("上传图片异常:", error);
|
console.error("上传图片异常:", error);
|
||||||
|
@ -1611,7 +1657,6 @@ export default {
|
||||||
receiveUserType: this.currentContact.sendUserType || 1,
|
receiveUserType: this.currentContact.sendUserType || 1,
|
||||||
roomId: this.currentContactId,
|
roomId: this.currentContactId,
|
||||||
content: imageUrl, // 使用接口返回的url
|
content: imageUrl, // 使用接口返回的url
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.stompClient.send(
|
this.stompClient.send(
|
||||||
|
@ -1709,17 +1754,26 @@ export default {
|
||||||
|
|
||||||
// 根据重要性对联系人列表排序
|
// 根据重要性对联系人列表排序
|
||||||
sortContacts() {
|
sortContacts() {
|
||||||
|
|
||||||
|
console.log("排序前的联系人列表", this.contacts);
|
||||||
this.contacts.sort((a, b) => {
|
this.contacts.sort((a, b) => {
|
||||||
// 首先按重要性排序(重要的在前)
|
// 首先按重要性排序(重要的在前)
|
||||||
if (a.important && !b.important) return -1;
|
if (a.important && !b.important) return -1;
|
||||||
if (!a.important && b.important) return 1;
|
if (!a.important && b.important) return 1;
|
||||||
|
|
||||||
// 确保日期字符串正确比较
|
// 确保日期字符串正确比较
|
||||||
const aTime = a.lastTime || '';
|
// const aTime = a.lastTime || "";
|
||||||
const bTime = b.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) {
|
formatTime(date) {
|
||||||
if (!date) return "";
|
if (!date) return "";
|
||||||
const str = typeof date === 'string' ? date : date.toISOString();
|
const str = typeof date === "string" ? date : date.toISOString();
|
||||||
const [d, t] = str.split('T');
|
const [d, t] = str.split("T");
|
||||||
if (!t) return str;
|
if (!t) return str;
|
||||||
const [hour, minute] = t.split(':');
|
const [hour, minute] = t.split(":");
|
||||||
// 取当前UTC日期
|
// 取当前UTC日期
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const nowUTC = now.toISOString().split('T')[0];
|
const nowUTC = now.toISOString().split("T")[0];
|
||||||
const msgUTC = d;
|
const msgUTC = d;
|
||||||
if (nowUTC === msgUTC) {
|
if (nowUTC === msgUTC) {
|
||||||
return `UTC ${this.$t("chat.today")} ${hour}:${minute}`;
|
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) {
|
if (yesterdayUTC === msgUTC) {
|
||||||
return `UTC ${this.$t("chat.yesterday")} ${hour}:${minute}`;
|
return `UTC ${this.$t("chat.yesterday")} ${hour}:${minute}`;
|
||||||
}
|
}
|
||||||
|
@ -1795,12 +1851,12 @@ export default {
|
||||||
formatLastTime(date) {
|
formatLastTime(date) {
|
||||||
if (!date) return "";
|
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;
|
if (!timePart) return str;
|
||||||
// 只取小时和分钟
|
// 只取小时和分钟
|
||||||
const [hours, minutes] = timePart.split(':');
|
const [hours, minutes] = timePart.split(":");
|
||||||
return `${hours}:${minutes} UTC`;
|
return `${hours}:${minutes} UTC`;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1944,11 +2000,10 @@ export default {
|
||||||
|
|
||||||
// 修正后端返回不带Z的UTC时间字符串
|
// 修正后端返回不带Z的UTC时间字符串
|
||||||
fixToUTC(str) {
|
fixToUTC(str) {
|
||||||
if (typeof str !== 'string') return str;
|
if (typeof str !== "string") return str;
|
||||||
if (str.endsWith('Z') || /[+-]\d{2}:?\d{2}$/.test(str)) return str;
|
if (str.endsWith("Z") || /[+-]\d{2}:?\d{2}$/.test(str)) return str;
|
||||||
return str + 'Z';
|
return str + "Z";
|
||||||
},
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
<span class="title">{{ $t(`personal.verificationCode`) }}</span>
|
<span class="title">{{ $t(`personal.verificationCode`) }}</span>
|
||||||
<div class="verificationCode">
|
<div class="verificationCode">
|
||||||
<el-input
|
<el-input
|
||||||
type="email"
|
type="text"
|
||||||
v-model="closeParams.eCode"
|
v-model="closeParams.eCode"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
:placeholder="$t(`user.verificationCode`)"
|
: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.
|
@ -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.
|
@ -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.
|
@ -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.
Loading…
Reference in New Issue