1.游客功能添加、删除列表离线游客 目前游客断开没有返回关闭信息
2.游客收不到客服消息 已处理 3.中英文翻译 已完成 4.将本地时间修改为UTC时间 完成 5.发送图片有问题 又重新改回url上传 6.游客用户增加提示和跳转登录的功能 7.客服消息换行及显示已处理 8.客服端限制输入400个字符 用户端限制输入300个字符 完成
This commit is contained in:
@@ -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>
|
||||||
<input
|
<div class="chat-input-wrapper" style="display: flex;align-items: center;">
|
||||||
type="text"
|
<input
|
||||||
class="chat-input"
|
type="text"
|
||||||
v-model="inputMessage"
|
class="chat-input"
|
||||||
@keyup.enter="sendMessage"
|
v-model="inputMessage"
|
||||||
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
|
:maxlength="maxMessageLength"
|
||||||
:disabled="connectionStatus !== 'connected'"
|
@input="handleInputMessage"
|
||||||
/>
|
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
|
||||||
|
: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,14 +1143,22 @@ export default {
|
|||||||
this.isChatOpen = !this.isChatOpen;
|
this.isChatOpen = !this.isChatOpen;
|
||||||
|
|
||||||
// 1. 判别身份
|
// 1. 判别身份
|
||||||
// this.determineUserType();
|
const userInfo = JSON.parse(
|
||||||
|
localStorage.getItem("jurisdiction") || "{}"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (userInfo.roleKey === "customer_service") {
|
||||||
|
// 客服用户 跳转到客服页面
|
||||||
|
this.userType = 2;
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
this.$router.push(`/${lang}/customerService`);
|
||||||
|
return;
|
||||||
|
// this.userEmail = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 2. 如果是客服,跳转到客服页面
|
|
||||||
if (this.userType === 2) {
|
|
||||||
const lang = this.$i18n.locale;
|
|
||||||
this.$router.push(`/${lang}/customerService`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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"
|
>{{
|
||||||
? $t("chat.Disconnected") || "连接已断开"
|
connectionStatus === "error"
|
||||||
: $t("chat.reconnecting") || "正在连接..."
|
? $t("chat.Disconnected") || "连接已断开"
|
||||||
}} </span>
|
: $t("chat.reconnecting") || "正在连接..."
|
||||||
|
}}
|
||||||
|
</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();
|
||||||
|
this.sendMessage();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 阻止默认行为
|
|
||||||
e.preventDefault();
|
|
||||||
// 发送消息
|
|
||||||
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",
|
||||||
{},
|
{},
|
||||||
@@ -725,7 +760,7 @@ export default {
|
|||||||
this.addMessageToChat({
|
this.addMessageToChat({
|
||||||
sender: this.$t("chat.my") || "我",
|
sender: this.$t("chat.my") || "我",
|
||||||
content: messageContent,
|
content: messageContent,
|
||||||
time: new Date().toISOString() , // 使用 UTC 时间字符串
|
time: new Date().toISOString(), // 使用 UTC 时间字符串
|
||||||
isSelf: true,
|
isSelf: true,
|
||||||
isImage: false,
|
isImage: false,
|
||||||
roomId: this.currentContactId,
|
roomId: this.currentContactId,
|
||||||
@@ -739,18 +774,27 @@ 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>");
|
||||||
|
},
|
||||||
|
|
||||||
// 订阅个人消息队列
|
// 订阅个人消息队列
|
||||||
subscribeToPersonalMessages() {
|
subscribeToPersonalMessages() {
|
||||||
@@ -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,
|
||||||
};
|
};
|
||||||
@@ -951,17 +995,16 @@ export default {
|
|||||||
this.contacts = [...this.contacts, ...uniqueNewContacts];
|
this.contacts = [...this.contacts, ...uniqueNewContacts];
|
||||||
this.sortContacts();
|
this.sortContacts();
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
this.$message({
|
this.$message({
|
||||||
message: this.$t("chat.contactFailed") || "加载更多联系人失败",
|
message: this.$t("chat.contactFailed") || "加载更多联系人失败",
|
||||||
type: "error",
|
type: "error",
|
||||||
duration: 3000,
|
duration: 3000,
|
||||||
showClose: true,
|
showClose: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} 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`;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1928,7 +1984,7 @@ export default {
|
|||||||
if (!this.currentContact) return;
|
if (!this.currentContact) return;
|
||||||
this.$refs.imageInput.click();
|
this.$refs.imageInput.click();
|
||||||
},
|
},
|
||||||
// 将本地时间转换为 UTC 时间
|
// 将本地时间转换为 UTC 时间
|
||||||
convertToUTC(date) {
|
convertToUTC(date) {
|
||||||
if (!date) return null;
|
if (!date) return null;
|
||||||
const d = new Date(date);
|
const d = new Date(date);
|
||||||
@@ -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.
1
mining-pool/test/css/app-42f9d7e6.582537b2.css
Normal file
1
mining-pool/test/css/app-42f9d7e6.582537b2.css
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/css/app-42f9d7e6.582537b2.css.gz
Normal file
BIN
mining-pool/test/css/app-42f9d7e6.582537b2.css.gz
Normal file
Binary file not shown.
1
mining-pool/test/css/app-8e0489d9.896a6438.css
Normal file
1
mining-pool/test/css/app-8e0489d9.896a6438.css
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/css/app-8e0489d9.896a6438.css.gz
Normal file
BIN
mining-pool/test/css/app-8e0489d9.896a6438.css.gz
Normal file
Binary file not shown.
1
mining-pool/test/css/app-f035d474.0348646a.css
Normal file
1
mining-pool/test/css/app-f035d474.0348646a.css
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/css/app-f035d474.0348646a.css.gz
Normal file
BIN
mining-pool/test/css/app-f035d474.0348646a.css.gz
Normal file
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>
|
||||||
1
mining-pool/test/js/app-42f9d7e6.4b5b04f4.js
Normal file
1
mining-pool/test/js/app-42f9d7e6.4b5b04f4.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-42f9d7e6.4b5b04f4.js.gz
Normal file
BIN
mining-pool/test/js/app-42f9d7e6.4b5b04f4.js.gz
Normal file
Binary file not shown.
1
mining-pool/test/js/app-5c551db8.2530417a.js
Normal file
1
mining-pool/test/js/app-5c551db8.2530417a.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-5c551db8.2530417a.js.gz
Normal file
BIN
mining-pool/test/js/app-5c551db8.2530417a.js.gz
Normal file
Binary file not shown.
1
mining-pool/test/js/app-8e0489d9.bb9b6a2c.js
Normal file
1
mining-pool/test/js/app-8e0489d9.bb9b6a2c.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-8e0489d9.bb9b6a2c.js.gz
Normal file
BIN
mining-pool/test/js/app-8e0489d9.bb9b6a2c.js.gz
Normal file
Binary file not shown.
1
mining-pool/test/js/app-f035d474.4fade95e.js
Normal file
1
mining-pool/test/js/app-f035d474.4fade95e.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-f035d474.4fade95e.js.gz
Normal file
BIN
mining-pool/test/js/app-f035d474.4fade95e.js.gz
Normal file
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.
Reference in New Issue
Block a user