更新服务条款页面内容
This commit is contained in:
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<router-view class="page" />
|
<router-view class="page" />
|
||||||
<ChatWidget v-if="!$route.path.includes('/customerService')" />
|
<!-- <ChatWidget v-if="!$route.path.includes('/customerService') && !$isMobile" /> -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script >
|
<script >
|
||||||
|
|||||||
@@ -112,39 +112,41 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 消息项 -->
|
<!-- 消息项 -->
|
||||||
<div
|
<div v-for="(msg, index) in displayMessages" :key="msg.id || index">
|
||||||
v-for="(msg, index) in messages"
|
<!-- 时间分割条 -->
|
||||||
:key="index"
|
<div v-if="msg.isTimeDivider" class="chat-time-divider">
|
||||||
class="chat-message"
|
{{ formatTimeDivider(msg.time) }}
|
||||||
:class="{
|
</div>
|
||||||
'chat-message-user': msg.type === 'user',
|
|
||||||
'chat-message-system': msg.type === 'system',
|
|
||||||
'chat-message-loading': msg.isLoading,
|
|
||||||
'chat-message-hint': msg.isSystemHint,
|
|
||||||
'chat-message-history': msg.isHistory,
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<!-- 系统提示消息,如加载中、无更多消息等 -->
|
<!-- 系统提示消息,如加载中、无更多消息等 -->
|
||||||
<div v-if="msg.isLoading || msg.isSystemHint" class="system-hint">
|
<div
|
||||||
|
v-else-if="msg.isLoading || msg.isSystemHint"
|
||||||
|
class="system-hint"
|
||||||
|
>
|
||||||
<i v-if="msg.isLoading" class="el-icon-loading"></i>
|
<i v-if="msg.isLoading" class="el-icon-loading"></i>
|
||||||
<span>{{ msg.text }}</span>
|
<span>{{ msg.text }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 普通消息 -->
|
<!-- 普通消息 -->
|
||||||
<template v-else>
|
<div
|
||||||
|
v-else
|
||||||
|
class="chat-message"
|
||||||
|
:class="{
|
||||||
|
'chat-message-user': msg.type === 'user',
|
||||||
|
'chat-message-system': msg.type === 'system',
|
||||||
|
'chat-message-loading': msg.isLoading,
|
||||||
|
'chat-message-hint': msg.isSystemHint,
|
||||||
|
'chat-message-history': msg.isHistory,
|
||||||
|
}"
|
||||||
|
>
|
||||||
<div class="message-avatar">
|
<div class="message-avatar">
|
||||||
<i v-if="msg.type === 'system'" class="el-icon-service"></i>
|
<i v-if="msg.type === 'system'" class="el-icon-service"></i>
|
||||||
<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> -->
|
<!-- <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 }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 图片消息 -->
|
|
||||||
<div v-else class="message-image">
|
<div v-else class="message-image">
|
||||||
<img
|
<img
|
||||||
:src="msg.imageUrl"
|
:src="msg.imageUrl"
|
||||||
@@ -153,10 +155,7 @@
|
|||||||
@load="handleImageLoad"
|
@load="handleImageLoad"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="message-footer">
|
<div class="message-footer">
|
||||||
<!-- <span class="message-time">{{ formatTime(msg.time) }}</span> -->
|
|
||||||
<!-- 添加已读状态显示 -->
|
|
||||||
<span
|
<span
|
||||||
v-if="msg.type === 'user'"
|
v-if="msg.type === 'user'"
|
||||||
class="message-read-status"
|
class="message-read-status"
|
||||||
@@ -169,7 +168,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
@@ -193,18 +192,21 @@
|
|||||||
:disabled="connectionStatus !== 'connected'"
|
:disabled="connectionStatus !== 'connected'"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-input-wrapper" style="display: flex;align-items: center;">
|
<div
|
||||||
<input
|
class="chat-input-wrapper"
|
||||||
type="text"
|
style="display: flex; align-items: center"
|
||||||
class="chat-input"
|
>
|
||||||
v-model="inputMessage"
|
<input
|
||||||
:maxlength="maxMessageLength"
|
type="text"
|
||||||
@input="handleInputMessage"
|
class="chat-input"
|
||||||
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
|
v-model="inputMessage"
|
||||||
:disabled="connectionStatus !== 'connected'"
|
:maxlength="maxMessageLength"
|
||||||
/>
|
@input="handleInputMessage"
|
||||||
<!-- <span class="input-counter">{{ maxMessageLength - inputMessage.length }}</span> -->
|
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
|
||||||
</div>
|
:disabled="connectionStatus !== 'connected'"
|
||||||
|
/>
|
||||||
|
<!-- <span class="input-counter">{{ maxMessageLength - inputMessage.length }}</span> -->
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
class="chat-send"
|
class="chat-send"
|
||||||
@click="sendMessage"
|
@click="sendMessage"
|
||||||
@@ -292,6 +294,33 @@ export default {
|
|||||||
maxMessageLength: 300,
|
maxMessageLength: 300,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
/**
|
||||||
|
* 生成带有时间分割条的消息列表
|
||||||
|
* @returns {Array} 消息和分割条混合数组
|
||||||
|
*/
|
||||||
|
displayMessages() {
|
||||||
|
const result = [];
|
||||||
|
const interval = 5 * 60 * 1000; // 5分钟
|
||||||
|
let lastTime = null;
|
||||||
|
|
||||||
|
this.messages.forEach((msg, idx) => {
|
||||||
|
if (!msg.isSystemHint && !msg.isLoading) {
|
||||||
|
const msgTime = new Date(msg.time); // 直接new即可
|
||||||
|
if (!lastTime || msgTime - lastTime > interval) {
|
||||||
|
result.push({
|
||||||
|
isTimeDivider: true,
|
||||||
|
time: msg.time, // 直接用字符串
|
||||||
|
id: `divider-${msg.time}-${idx}`,
|
||||||
|
});
|
||||||
|
lastTime = msgTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.push(msg);
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
async created() {
|
async created() {
|
||||||
this.determineUserType();
|
this.determineUserType();
|
||||||
@@ -321,6 +350,9 @@ export default {
|
|||||||
document.addEventListener("mousemove", this.updateLastActivityTime);
|
document.addEventListener("mousemove", this.updateLastActivityTime);
|
||||||
document.addEventListener("keydown", this.updateLastActivityTime);
|
document.addEventListener("keydown", this.updateLastActivityTime);
|
||||||
document.addEventListener("click", this.updateLastActivityTime);
|
document.addEventListener("click", this.updateLastActivityTime);
|
||||||
|
|
||||||
|
// 监听退出登录事件
|
||||||
|
this.$bus.$on("user-logged-out", this.handleLogout);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 初始化聊天系统
|
// 初始化聊天系统
|
||||||
@@ -447,7 +479,9 @@ export default {
|
|||||||
this.connectionError = null;
|
this.connectionError = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const wsUrl = `${process.env.VUE_APP_BASE_API}chat/ws`;
|
// 将 https 替换为 wss
|
||||||
|
const baseUrl = process.env.VUE_APP_BASE_API.replace("https", "wss");
|
||||||
|
const wsUrl = `${baseUrl}chat/ws`;
|
||||||
this.stompClient = Stomp.client(wsUrl);
|
this.stompClient = Stomp.client(wsUrl);
|
||||||
this.stompClient.splitLargeFrames = true;
|
this.stompClient.splitLargeFrames = true;
|
||||||
const headers = {
|
const headers = {
|
||||||
@@ -479,11 +513,12 @@ export default {
|
|||||||
(error) => {
|
(error) => {
|
||||||
console.error("WebSocket Error:", error);
|
console.error("WebSocket Error:", error);
|
||||||
if (error.message.includes("503")) {
|
if (error.message.includes("503")) {
|
||||||
this.connectionError = this.$t("chat.server500");//服务器暂时不可用,请稍后重试
|
this.connectionError = this.$t("chat.server500"); //服务器暂时不可用,请稍后重试
|
||||||
} else if (error.message.includes("handshake")) {
|
} else if (error.message.includes("handshake")) {
|
||||||
this.connectionError = this.$t("chat.CheckNetwork");//"连接失败,请检查网络后重试"
|
this.connectionError = this.$t("chat.CheckNetwork"); //"连接失败,请检查网络后重试"
|
||||||
} else {
|
} else {
|
||||||
this.connectionError = error.message || this.$t("chat.connectionFailed"); // "连接失败,请刷新页面重试";
|
this.connectionError =
|
||||||
|
error.message || this.$t("chat.connectionFailed"); // "连接失败,请刷新页面重试";
|
||||||
}
|
}
|
||||||
this.isReconnecting = false;
|
this.isReconnecting = false;
|
||||||
this.handleDisconnect();
|
this.handleDisconnect();
|
||||||
@@ -496,7 +531,7 @@ export default {
|
|||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("初始化 WebSocket 失败:", error);
|
console.error("初始化 WebSocket 失败:", error);
|
||||||
this.connectionError = this.$t("chat.initializationFailed");//"初始化连接失败,请刷新页面重试";
|
this.connectionError = this.$t("chat.initializationFailed"); //"初始化连接失败,请刷新页面重试";
|
||||||
this.isReconnecting = false;
|
this.isReconnecting = false;
|
||||||
this.handleDisconnect();
|
this.handleDisconnect();
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
@@ -515,12 +550,12 @@ export default {
|
|||||||
clearTimeout(this.reconnectTimer);
|
clearTimeout(this.reconnectTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// === 新增:统一处理连接数上限错误 ===
|
// ===统一处理连接数上限错误 ===
|
||||||
if (
|
if (
|
||||||
this.handleConnectionError({
|
this.handleConnectionError({
|
||||||
code: this.connectionError?.code,
|
code: this.connectionError?.code,
|
||||||
error: this.connectionError?.error,
|
error: this.connectionError?.error,
|
||||||
message: this.connectionError
|
message: this.connectionError,
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
@@ -537,20 +572,19 @@ export default {
|
|||||||
// 其余错误类型提示
|
// 其余错误类型提示
|
||||||
let retryMessage = "";
|
let retryMessage = "";
|
||||||
if (this.connectionError && this.connectionError.includes("503")) {
|
if (this.connectionError && this.connectionError.includes("503")) {
|
||||||
retryMessage =this.$t(`chat.server500`);//服务器暂时不可用,正在重试
|
retryMessage = this.$t(`chat.server500`); //服务器暂时不可用,正在重试
|
||||||
} else if (
|
} else if (
|
||||||
this.connectionError &&
|
this.connectionError &&
|
||||||
this.connectionError.includes("handshake")
|
this.connectionError.includes("handshake")
|
||||||
) {
|
) {
|
||||||
retryMessage =this.$t(`chat.connectionFailed`);//连接失败,请刷新页面重试
|
retryMessage = this.$t(`chat.connectionFailed`); //连接失败,请刷新页面重试
|
||||||
} else {
|
} else {
|
||||||
|
//三秒重试
|
||||||
retryMessage = `${this.$t("chat.break")},${
|
retryMessage = `${this.$t("chat.break")},${
|
||||||
this.reconnectInterval / 1000
|
this.reconnectInterval / 1000
|
||||||
}${this.$t("chat.retry")}...`;
|
}${this.$t("chat.retry")}...`;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$message.warning(retryMessage);
|
|
||||||
|
|
||||||
this.$message({
|
this.$message({
|
||||||
message: retryMessage,
|
message: retryMessage,
|
||||||
type: "warning",
|
type: "warning",
|
||||||
@@ -584,7 +618,7 @@ export default {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 网络断开时,显示提示
|
// 网络断开时,显示提示
|
||||||
this.$message.warning(this.$t("chat.CheckNetwork"));//连接失败,请检查网络后重试
|
this.$message.warning(this.$t("chat.CheckNetwork")); //连接失败,请检查网络后重试
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 开始活动检测
|
// 开始活动检测
|
||||||
@@ -611,22 +645,22 @@ export default {
|
|||||||
},
|
},
|
||||||
//只能输入300个字符
|
//只能输入300个字符
|
||||||
handleInputMessage() {
|
handleInputMessage() {
|
||||||
if (this.inputMessage.length > this.maxMessageLength) {
|
if (this.inputMessage.length > this.maxMessageLength) {
|
||||||
this.inputMessage = this.inputMessage.slice(0, 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) {
|
if (this.inputMessage.length > this.maxMessageLength) {
|
||||||
this.$message.warning(`消息不能超过${this.maxMessageLength}个字符`);
|
this.$message.warning(`消息不能超过${this.maxMessageLength}个字符`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查 WebSocket 连接状态
|
// 检查 WebSocket 连接状态
|
||||||
if (!this.stompClient || !this.stompClient.connected) {
|
if (!this.stompClient || !this.stompClient.connected) {
|
||||||
console.log("发送消息时连接已断开,尝试重连...");
|
console.log("发送消息时连接已断开,尝试重连...");
|
||||||
this.$message.warning(this.$t("chat.attemptToReconnect"));//连接已断开,正在尝试重连...
|
this.$message.warning(this.$t("chat.attemptToReconnect")); //连接已断开,正在尝试重连...
|
||||||
this.handleDisconnect();
|
this.handleDisconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -681,7 +715,7 @@ export default {
|
|||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("发送消息失败:", error);
|
console.error("发送消息失败:", error);
|
||||||
this.$message.error(this.$t("chat.sendFailed"));//发送消息失败,请重试
|
this.$message.error(this.$t("chat.sendFailed")); //发送消息失败,请重试
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -830,7 +864,9 @@ export default {
|
|||||||
text: msg.content,
|
text: msg.content,
|
||||||
isImage: msg.type === 2,
|
isImage: msg.type === 2,
|
||||||
imageUrl: msg.type === 2 ? msg.content : null,
|
imageUrl: msg.type === 2 ? msg.content : null,
|
||||||
time: new Date(msg.createTime),
|
time: typeof msg.createTime === 'string'
|
||||||
|
? msg.createTime
|
||||||
|
: new Date(msg.createTime).toISOString(),
|
||||||
id: msg.id,
|
id: msg.id,
|
||||||
roomId: msg.roomId,
|
roomId: msg.roomId,
|
||||||
sender: msg.sendEmail,
|
sender: msg.sendEmail,
|
||||||
@@ -857,7 +893,7 @@ export default {
|
|||||||
this.messages = [
|
this.messages = [
|
||||||
{
|
{
|
||||||
type: "system",
|
type: "system",
|
||||||
text: this.$t("chat.noHistory")||"暂无历史消息",
|
text: this.$t("chat.noHistory") || "暂无历史消息",
|
||||||
isSystemHint: true,
|
isSystemHint: true,
|
||||||
time: new Date(),
|
time: new Date(),
|
||||||
},
|
},
|
||||||
@@ -865,11 +901,12 @@ export default {
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("加载历史消息失败:", error);
|
console.error("加载历史消息失败:", error);
|
||||||
this.$message.error(this.$t("chat.historicalFailure"));//加载历史消息失败
|
this.$message.error(this.$t("chat.historicalFailure")); //加载历史消息失败
|
||||||
this.messages = [
|
this.messages = [
|
||||||
{
|
{
|
||||||
type: "system",
|
type: "system",
|
||||||
text: this.$t("chat.historicalFailure")||"加载历史消息失败,请重试",
|
text:
|
||||||
|
this.$t("chat.historicalFailure") || "加载历史消息失败,请重试",
|
||||||
isSystemHint: true,
|
isSystemHint: true,
|
||||||
time: new Date().toISOString(),
|
time: new Date().toISOString(),
|
||||||
isError: true,
|
isError: true,
|
||||||
@@ -900,7 +937,7 @@ export default {
|
|||||||
// 添加没有更多消息的提示
|
// 添加没有更多消息的提示
|
||||||
this.messages.unshift({
|
this.messages.unshift({
|
||||||
type: "system",
|
type: "system",
|
||||||
text: this.$t("chat.noMoreHistory")||"没有更多历史消息了",
|
text: this.$t("chat.noMoreHistory") || "没有更多历史消息了",
|
||||||
isSystemHint: true,
|
isSystemHint: true,
|
||||||
time: new Date(),
|
time: new Date(),
|
||||||
});
|
});
|
||||||
@@ -910,7 +947,7 @@ export default {
|
|||||||
// 显示加载中提示
|
// 显示加载中提示
|
||||||
const loadingMsg = {
|
const loadingMsg = {
|
||||||
type: "system",
|
type: "system",
|
||||||
text: this.$t("chat.loadingHistory")||"正在加载更多历史消息...",
|
text: this.$t("chat.loadingHistory") || "正在加载更多历史消息...",
|
||||||
isLoading: true,
|
isLoading: true,
|
||||||
time: new Date(),
|
time: new Date(),
|
||||||
};
|
};
|
||||||
@@ -945,7 +982,7 @@ export default {
|
|||||||
if (historyMessages.length === 0) {
|
if (historyMessages.length === 0) {
|
||||||
this.messages.unshift({
|
this.messages.unshift({
|
||||||
type: "system",
|
type: "system",
|
||||||
text: this.$t("chat.noMoreHistory")||"没有更多历史消息了",
|
text: this.$t("chat.noMoreHistory") || "没有更多历史消息了",
|
||||||
isSystemHint: true,
|
isSystemHint: true,
|
||||||
time: new Date(),
|
time: new Date(),
|
||||||
});
|
});
|
||||||
@@ -964,7 +1001,7 @@ export default {
|
|||||||
console.error("加载更多历史消息失败:", error);
|
console.error("加载更多历史消息失败:", error);
|
||||||
this.messages.unshift({
|
this.messages.unshift({
|
||||||
type: "system",
|
type: "system",
|
||||||
text: this.$t("chat.historicalFailure")||"加载更多历史消息失败",
|
text: this.$t("chat.historicalFailure") || "加载更多历史消息失败",
|
||||||
isError: true,
|
isError: true,
|
||||||
time: new Date(),
|
time: new Date(),
|
||||||
});
|
});
|
||||||
@@ -986,7 +1023,9 @@ export default {
|
|||||||
text: msg.content || "",
|
text: msg.content || "",
|
||||||
isImage: msg.type === 2,
|
isImage: msg.type === 2,
|
||||||
imageUrl: msg.type === 2 ? msg.content : null, // 图片消息直接使用content作为imageUrl
|
imageUrl: msg.type === 2 ? msg.content : null, // 图片消息直接使用content作为imageUrl
|
||||||
time: new Date(msg.createTime),
|
time: typeof msg.createTime === 'string'
|
||||||
|
? msg.createTime
|
||||||
|
: new Date(msg.createTime).toISOString(),
|
||||||
id: msg.id,
|
id: msg.id,
|
||||||
roomId: msg.roomId,
|
roomId: msg.roomId,
|
||||||
sender: msg.sendEmail,
|
sender: msg.sendEmail,
|
||||||
@@ -1056,7 +1095,9 @@ export default {
|
|||||||
text: data.content,
|
text: data.content,
|
||||||
isImage: data.type === 2,
|
isImage: data.type === 2,
|
||||||
imageUrl: data.type === 2 ? data.content : null, // 图片消息直接使用content作为imageUrl
|
imageUrl: data.type === 2 ? data.content : null, // 图片消息直接使用content作为imageUrl
|
||||||
time: new Date(data.sendTime).toISOString(),
|
time: typeof data.sendTime === 'string'
|
||||||
|
? data.sendTime
|
||||||
|
: new Date(data.sendTime).toISOString(),
|
||||||
id: data.id,
|
id: data.id,
|
||||||
roomId: data.roomId,
|
roomId: data.roomId,
|
||||||
sender: data.sendEmail,
|
sender: data.sendEmail,
|
||||||
@@ -1111,7 +1152,9 @@ export default {
|
|||||||
// 创建通知
|
// 创建通知
|
||||||
createNotification(message) {
|
createNotification(message) {
|
||||||
const notification = new Notification("新消息", {
|
const notification = new Notification("新消息", {
|
||||||
body: message.isImage ? `[ ${this.$t("chat.pictureMessage")}]`|| "[图片消息]" : message.text,
|
body: message.isImage
|
||||||
|
? `[ ${this.$t("chat.pictureMessage")}]` || "[图片消息]"
|
||||||
|
: message.text,
|
||||||
icon: "/path/to/notification-icon.png", // 添加适当的图标
|
icon: "/path/to/notification-icon.png", // 添加适当的图标
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1143,22 +1186,16 @@ export default {
|
|||||||
this.isChatOpen = !this.isChatOpen;
|
this.isChatOpen = !this.isChatOpen;
|
||||||
|
|
||||||
// 1. 判别身份
|
// 1. 判别身份
|
||||||
const userInfo = JSON.parse(
|
const userInfo = JSON.parse(localStorage.getItem("jurisdiction") || "{}");
|
||||||
localStorage.getItem("jurisdiction") || "{}"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (userInfo.roleKey === "customer_service") {
|
|
||||||
// 客服用户 跳转到客服页面
|
|
||||||
this.userType = 2;
|
|
||||||
const lang = this.$i18n.locale;
|
|
||||||
this.$router.push(`/${lang}/customerService`);
|
|
||||||
return;
|
|
||||||
// this.userEmail = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (userInfo.roleKey === "customer_service") {
|
||||||
|
// 客服用户 跳转到客服页面
|
||||||
|
this.userType = 2;
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
this.$router.push(`/${lang}/customerService`);
|
||||||
|
return;
|
||||||
|
// this.userEmail = "";
|
||||||
|
}
|
||||||
|
|
||||||
if (this.isChatOpen) {
|
if (this.isChatOpen) {
|
||||||
try {
|
try {
|
||||||
@@ -1190,7 +1227,9 @@ export default {
|
|||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("初始化聊天失败:", error);
|
console.error("初始化聊天失败:", error);
|
||||||
this.$message.error(this.$t("chat.initializationFailed")||"初始化聊天失败,请重试");
|
this.$message.error(
|
||||||
|
this.$t("chat.initializationFailed") || "初始化聊天失败,请重试"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1225,7 +1264,8 @@ export default {
|
|||||||
handleAutoResponse(message) {
|
handleAutoResponse(message) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
let response =
|
let response =
|
||||||
this.$t("chat.beSorry")||"抱歉,我暂时无法回答这个问题。请排队等待人工客服或提交工单。";
|
this.$t("chat.beSorry") ||
|
||||||
|
"抱歉,我暂时无法回答这个问题。请排队等待人工客服或提交工单。";
|
||||||
|
|
||||||
// 检查是否匹配自动回复关键词
|
// 检查是否匹配自动回复关键词
|
||||||
for (const [keyword, reply] of Object.entries(this.autoResponses)) {
|
for (const [keyword, reply] of Object.entries(this.autoResponses)) {
|
||||||
@@ -1330,9 +1370,9 @@ export default {
|
|||||||
|
|
||||||
// 判断消息是今天、昨天还是更早的日期
|
// 判断消息是今天、昨天还是更早的日期
|
||||||
if (messageDate.getTime() === today.getTime()) {
|
if (messageDate.getTime() === today.getTime()) {
|
||||||
return `${this.$t("chat.today")} ${timeString}`;//今天
|
return `${this.$t("chat.today")} ${timeString}`; //今天
|
||||||
} else if (messageDate.getTime() === yesterday.getTime()) {
|
} else if (messageDate.getTime() === yesterday.getTime()) {
|
||||||
return `${this.$t("chat.yesterday")} ${timeString}`;//昨天
|
return `${this.$t("chat.yesterday")} ${timeString}`; //昨天
|
||||||
} else {
|
} else {
|
||||||
// 超过两天的消息显示完整日期
|
// 超过两天的消息显示完整日期
|
||||||
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
|
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
|
||||||
@@ -1342,6 +1382,42 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// 聊天分割条时间格式化
|
||||||
|
/**
|
||||||
|
* 聊天分割条时间格式化
|
||||||
|
* @param {string|Date} date
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
formatTimeDivider(date) {
|
||||||
|
if (!date) return '';
|
||||||
|
let d = typeof date === 'string' ? new Date(date) : date;
|
||||||
|
if (!(d instanceof Date) || isNaN(d.getTime())) return '';
|
||||||
|
|
||||||
|
// 获取UTC年月日
|
||||||
|
const now = new Date();
|
||||||
|
const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
|
||||||
|
const yesterday = new Date(today);
|
||||||
|
yesterday.setUTCDate(today.getUTCDate() - 1);
|
||||||
|
|
||||||
|
const msgDate = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
|
||||||
|
|
||||||
|
// 获取UTC小时和分钟
|
||||||
|
const hour = String(d.getUTCHours()).padStart(2, '0');
|
||||||
|
const min = String(d.getUTCMinutes()).padStart(2, '0');
|
||||||
|
|
||||||
|
if (msgDate.getTime() === today.getTime()) {
|
||||||
|
return `${this.$t("chat.today")} ${hour}:${min}`|| `今天 ${hour}:${min}`;
|
||||||
|
} else if (msgDate.getTime() === yesterday.getTime()) {
|
||||||
|
return `${this.$t("chat.yesterday")} ${hour}:${min}`|| `昨天 ${hour}:${min}`;
|
||||||
|
} else {
|
||||||
|
const y = d.getUTCFullYear();
|
||||||
|
const m = String(d.getUTCMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(d.getUTCDate()).padStart(2, '0');
|
||||||
|
return `${y}-${m}-${day} ${hour}:${min}`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
handleClickOutside(event) {
|
handleClickOutside(event) {
|
||||||
if (this.isChatOpen) {
|
if (this.isChatOpen) {
|
||||||
const chatElement = this.$el.querySelector(".chat-dialog");
|
const chatElement = this.$el.querySelector(".chat-dialog");
|
||||||
@@ -1387,7 +1463,10 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
this.$message({ message: this.$t("chat.uploading")||"正在上传图片...", type: "info" });
|
this.$message({
|
||||||
|
message: this.$t("chat.uploading") || "正在上传图片...",
|
||||||
|
type: "info",
|
||||||
|
});
|
||||||
// 创建 FormData
|
// 创建 FormData
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append("file", file);
|
formData.append("file", file);
|
||||||
@@ -1427,11 +1506,17 @@ export default {
|
|||||||
};
|
};
|
||||||
reader.readAsDataURL(file);
|
reader.readAsDataURL(file);
|
||||||
} else {
|
} else {
|
||||||
throw new Error(response.data.msg || this.$t("chat.pictureFailed")||"发送图片失败,请重试");
|
throw new Error(
|
||||||
|
response.data.msg ||
|
||||||
|
this.$t("chat.pictureFailed") ||
|
||||||
|
"发送图片失败,请重试"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("图片处理失败:", error);
|
console.error("图片处理失败:", error);
|
||||||
this.$message.error(this.$t("chat.processingFailed")||"图片处理失败,请重试");
|
this.$message.error(
|
||||||
|
this.$t("chat.processingFailed") || "图片处理失败,请重试"
|
||||||
|
);
|
||||||
} finally {
|
} finally {
|
||||||
this.$refs.imageUpload.value = "";
|
this.$refs.imageUpload.value = "";
|
||||||
}
|
}
|
||||||
@@ -1441,7 +1526,9 @@ export default {
|
|||||||
sendImageMessage(imageUrl) {
|
sendImageMessage(imageUrl) {
|
||||||
if (!this.stompClient || !this.stompClient.connected) {
|
if (!this.stompClient || !this.stompClient.connected) {
|
||||||
console.log("发送消息时连接已断开,尝试重连...");
|
console.log("发送消息时连接已断开,尝试重连...");
|
||||||
this.$message.warning(this.$t("chat.attemptToReconnect")||"连接已断开,正在尝试重连...");
|
this.$message.warning(
|
||||||
|
this.$t("chat.attemptToReconnect") || "连接已断开,正在尝试重连..."
|
||||||
|
);
|
||||||
this.handleDisconnect();
|
this.handleDisconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1462,7 +1549,9 @@ export default {
|
|||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("发送图片消息失败:", error);
|
console.error("发送图片消息失败:", error);
|
||||||
this.$message.error(this.$t("chat.pictureFailed")||"发送图片失败,请重试");
|
this.$message.error(
|
||||||
|
this.$t("chat.pictureFailed") || "发送图片失败,请重试"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1522,9 +1611,14 @@ export default {
|
|||||||
console.error("重试连接失败:", error);
|
console.error("重试连接失败:", error);
|
||||||
this.connectionStatus = "error";
|
this.connectionStatus = "error";
|
||||||
this.isReconnecting = false;
|
this.isReconnecting = false;
|
||||||
this.connectionError = error.message || this.$t("chat.retryFailed")||"重试连接失败,请刷新页面";
|
this.connectionError =
|
||||||
|
error.message ||
|
||||||
|
this.$t("chat.retryFailed") ||
|
||||||
|
"重试连接失败,请刷新页面";
|
||||||
this.showRefreshButton = true;
|
this.showRefreshButton = true;
|
||||||
this.$message.error(this.$t("chat.retryFailed")||"重试连接失败,请刷新页面重试");
|
this.$message.error(
|
||||||
|
this.$t("chat.retryFailed") || "重试连接失败,请刷新页面重试"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1581,26 +1675,88 @@ export default {
|
|||||||
*/
|
*/
|
||||||
handleConnectionError(errorObj) {
|
handleConnectionError(errorObj) {
|
||||||
if (!errorObj) return false;
|
if (!errorObj) return false;
|
||||||
// 1. 优先判断 error/code 字段
|
|
||||||
if (errorObj.error === 'MAX_CONNECTIONS' || errorObj.code === 429) {
|
// 获取错误码
|
||||||
this.connectionError = this.$t('chat.maxConnectionsError') || '连接数已达上限,请刷新页面重试';
|
const errorCode = errorObj.code;
|
||||||
this.isReconnecting = false;
|
const errorMessage = errorObj.message || "";
|
||||||
this.showRefreshButton = true;
|
|
||||||
return true;
|
// 根据错误码处理不同情况
|
||||||
|
switch (errorCode) {
|
||||||
|
case 1020: // IP_LIMIT_CONNECT
|
||||||
|
this.connectionError =
|
||||||
|
this.$t("chat.ipLimitError") ||
|
||||||
|
"本机连接数已达上限,请刷新页面重试";
|
||||||
|
this.isReconnecting = false;
|
||||||
|
this.showRefreshButton = true;
|
||||||
|
this.$message.error(this.connectionError);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case 1021: // MAX_LIMIT_CONNECT
|
||||||
|
this.connectionError =
|
||||||
|
this.$t("chat.serverLimitError") ||
|
||||||
|
"服务器连接数已达上限,请稍后刷新重试";
|
||||||
|
this.isReconnecting = false;
|
||||||
|
this.showRefreshButton = true;
|
||||||
|
this.$message.error(this.connectionError);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case 1022: // SET_PRINCIPAL_FAIL
|
||||||
|
this.connectionError =
|
||||||
|
this.$t("chat.identityError") || "用户身份设置失败,请刷新页面重试";
|
||||||
|
this.isReconnecting = false;
|
||||||
|
this.showRefreshButton = true;
|
||||||
|
this.$message.error(this.connectionError);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case 1023: // GET_PRINCIPAL_FAIL
|
||||||
|
this.connectionError =
|
||||||
|
this.$t("chat.emailError") || "用户信息获取失败,请刷新页面重试";
|
||||||
|
this.isReconnecting = false;
|
||||||
|
this.showRefreshButton = true;
|
||||||
|
this.$message.error(this.connectionError);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// 处理其他可能的错误情况
|
||||||
|
if (
|
||||||
|
errorMessage.includes("连接数已达上限") ||
|
||||||
|
errorMessage.toLowerCase().includes("maximum connections")
|
||||||
|
) {
|
||||||
|
this.connectionError =
|
||||||
|
this.$t("chat.maxConnectionsError") ||
|
||||||
|
"连接数已达上限,请刷新页面重试";
|
||||||
|
this.isReconnecting = false;
|
||||||
|
this.showRefreshButton = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
// 2. 兜底判断 message 关键词(兼容历史/异常情况)
|
},
|
||||||
const msg = errorObj.message || '';
|
|
||||||
if (msg.includes('连接数已达上限') || msg.toLowerCase().includes('maximum connections')) {
|
// 处理退出登录
|
||||||
this.connectionError = this.$t('chat.maxConnectionsError') || '连接数已达上限,请刷新页面重试';
|
handleLogout() {
|
||||||
this.isReconnecting = false;
|
// 断开 WebSocket 连接
|
||||||
this.showRefreshButton = true;
|
this.disconnectWebSocket();
|
||||||
return true;
|
// 重置状态
|
||||||
}
|
this.isChatOpen = false;
|
||||||
return false;
|
this.isMinimized = true;
|
||||||
|
this.messages = [];
|
||||||
|
this.unreadMessages = 0;
|
||||||
|
this.connectionStatus = "disconnected";
|
||||||
|
this.isWebSocketConnected = false;
|
||||||
|
this.userType = 0;
|
||||||
|
this.userEmail = "";
|
||||||
|
this.roomId = "";
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
|
// 移除退出登录事件监听
|
||||||
|
this.$bus.$off("user-logged-out", this.handleLogout);
|
||||||
|
|
||||||
|
// 调用退出登录处理方法
|
||||||
|
this.handleLogout();
|
||||||
|
|
||||||
// 移除滚动监听
|
// 移除滚动监听
|
||||||
if (this.$refs.chatBody) {
|
if (this.$refs.chatBody) {
|
||||||
this.$refs.chatBody.removeEventListener("scroll", this.handleChatScroll);
|
this.$refs.chatBody.removeEventListener("scroll", this.handleChatScroll);
|
||||||
@@ -1837,9 +1993,24 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.message-content {
|
.message-content {
|
||||||
|
position: relative;
|
||||||
max-width: 70%;
|
max-width: 70%;
|
||||||
padding: 10px 15px;
|
padding: 18px 15px 10px 15px; // 上方多留空间给时间
|
||||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||||
|
|
||||||
|
.message-time {
|
||||||
|
position: absolute;
|
||||||
|
top: 6px;
|
||||||
|
right: 15px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: #bbb;
|
||||||
|
pointer-events: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
// 用户消息气泡内时间颜色适配
|
||||||
|
.chat-message-user & .message-time {
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.message-text {
|
.message-text {
|
||||||
@@ -2185,34 +2356,18 @@ export default {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.chat-time-divider {
|
||||||
|
text-align: center;
|
||||||
|
margin: 16px 0;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
background: rgba(180, 180, 180, 0.6);
|
||||||
|
display: inline-block;
|
||||||
.message-content {
|
padding: 2px 12px;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 1px 2px rgba(0,0,0,0.04);
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
position: relative;
|
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>
|
||||||
@@ -382,10 +382,15 @@ export default {
|
|||||||
document.addEventListener("click", function () {
|
document.addEventListener("click", function () {
|
||||||
const dropdown = document.querySelector(".dropdown");
|
const dropdown = document.querySelector(".dropdown");
|
||||||
const arrow = document.querySelector(".arrow");
|
const arrow = document.querySelector(".arrow");
|
||||||
if (dropdown.classList.contains("show")) {
|
try {
|
||||||
|
if (dropdown.classList.contains("show")) {
|
||||||
dropdown.classList.remove("show");
|
dropdown.classList.remove("show");
|
||||||
arrow.classList.remove("up");
|
arrow.classList.remove("up");
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -445,6 +450,8 @@ export default {
|
|||||||
async fetchSignOut() {
|
async fetchSignOut() {
|
||||||
const data = await getLogout();
|
const data = await getLogout();
|
||||||
if (data && data.code == 200) {
|
if (data && data.code == 200) {
|
||||||
|
// 调用 Vuex 的 logout action 清除前端状态
|
||||||
|
await this.$store.dispatch('logout')
|
||||||
const lang = this.$i18n.locale;
|
const lang = this.$i18n.locale;
|
||||||
this.$router.push(`/${lang}`);
|
this.$router.push(`/${lang}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,10 @@ export const ChatWidget_zh = {
|
|||||||
attemptToReconnect:"连接已断开,正在尝试重连...",
|
attemptToReconnect:"连接已断开,正在尝试重连...",
|
||||||
retryFailed:"重试连接失败,请刷新页面",
|
retryFailed:"重试连接失败,请刷新页面",
|
||||||
maxConnectionsError:"连接数已达上限,请刷新页面重试",
|
maxConnectionsError:"连接数已达上限,请刷新页面重试",
|
||||||
|
ipLimitError:"本机连接数已达上限,请刷新页面重试",
|
||||||
|
serverLimitError:"服务器连接数已达上限,请稍后刷新重试",
|
||||||
|
identityError:"用户身份设置失败,请刷新页面重试",
|
||||||
|
emailError:"用户信息获取失败,请刷新页面重试",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@@ -178,7 +182,10 @@ export const ChatWidget_en = {
|
|||||||
attemptToReconnect:"Connection lost, attempting to reconnect...",
|
attemptToReconnect:"Connection lost, attempting to reconnect...",
|
||||||
retryFailed:"Retry connection failed, please refresh page",
|
retryFailed:"Retry connection failed, please refresh page",
|
||||||
maxConnectionsError:"Connection limit reached, please refresh page",
|
maxConnectionsError:"Connection limit reached, please refresh page",
|
||||||
|
ipLimitError:"Connection limit reached, please refresh page",
|
||||||
|
serverLimitError:"Connection limit reached, please try again later",
|
||||||
|
identityError:"Failed to set user identity, please refresh page",
|
||||||
|
emailError:"Failed to get user information, please refresh page",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -15,6 +15,9 @@ import networkRecoveryMixin from './mixins/networkRecoveryMixin';
|
|||||||
import './utils/loadingRecovery';
|
import './utils/loadingRecovery';
|
||||||
import errorNotificationManager from '../src/utils/errorNotificationManager';
|
import errorNotificationManager from '../src/utils/errorNotificationManager';
|
||||||
|
|
||||||
|
// 创建事件总线 用于组件通信
|
||||||
|
Vue.prototype.$bus = new Vue();
|
||||||
|
|
||||||
Vue.use(MetaInfo)
|
Vue.use(MetaInfo)
|
||||||
Vue.prototype.$addStorageEvent = $addStorageEvent // 添加storage事件
|
Vue.prototype.$addStorageEvent = $addStorageEvent // 添加storage事件
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/miningAccount/index.vue'),
|
component: () => import('../views/miningAccount/index.vue'),
|
||||||
meta: {title: '挖矿账户页面',
|
meta: {title: '挖矿账户页面',
|
||||||
description:i18n.t(`seo.miningAccount`),
|
description:i18n.t(`seo.miningAccount`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控'
|
// keywords: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控',
|
en: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控',
|
||||||
@@ -63,7 +63,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/reportBlock/index.vue'),
|
component: () => import('../views/reportBlock/index.vue'),
|
||||||
meta: {title: '报块页面',
|
meta: {title: '报块页面',
|
||||||
description:i18n.t(`seo.reportBlock`),
|
description:i18n.t(`seo.reportBlock`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,报块页面,幸运值,区块高度,Block page,Lucky Value,block height,Mining Pool'
|
// keywords: 'M2Pool 矿池,报块页面,幸运值,区块高度,Block page,Lucky Value,block height,Mining Pool'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Block page,Lucky Value,block height,Mining Pool',
|
en: 'Block page,Lucky Value,block height,Mining Pool',
|
||||||
@@ -308,7 +308,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/submitWorkOrder/index.vue'),
|
component: () => import('../views/submitWorkOrder/index.vue'),
|
||||||
meta: {title: '提交工单页面',
|
meta: {title: '提交工单页面',
|
||||||
description:i18n.t(`seo.submitWorkOrder`),
|
description:i18n.t(`seo.submitWorkOrder`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,提交工单,技术支持,问题处理,Mining Pool,Work Order Submission, Technical Support, Troubleshooting'
|
// keywords: 'M2Pool 矿池,提交工单,技术支持,问题处理,Mining Pool,Work Order Submission, Technical Support, Troubleshooting'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Mining Pool,Work Order Submission, Technical Support, Troubleshooting',
|
en: 'Mining Pool,Work Order Submission, Technical Support, Troubleshooting',
|
||||||
@@ -322,7 +322,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/workOrderRecords/index.vue'),
|
component: () => import('../views/workOrderRecords/index.vue'),
|
||||||
meta: {title: '工单记录页面(用户)',
|
meta: {title: '工单记录页面(用户)',
|
||||||
description:i18n.t(`seo.workOrderRecords`),
|
description:i18n.t(`seo.workOrderRecords`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,用户工单记录,处理状态,问题进度,User Work Order Records, Processing Status, Issue Progress'
|
// keywords: 'M2Pool 矿池,用户工单记录,处理状态,问题进度,User Work Order Records, Processing Status, Issue Progress'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'User Work Order Records, Processing Status, Issue Progress',
|
en: 'User Work Order Records, Processing Status, Issue Progress',
|
||||||
@@ -336,7 +336,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/userWorkDetails/index.vue'),
|
component: () => import('../views/userWorkDetails/index.vue'),
|
||||||
meta: {title: '工单详情页面(用户)',
|
meta: {title: '工单详情页面(用户)',
|
||||||
description:i18n.t(`seo.userWorkDetails`),
|
description:i18n.t(`seo.userWorkDetails`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,用户工单详情,问题描述,补充提交,User Work Order Details, Problem Description, Additional Submissions'
|
// keywords: 'M2Pool 矿池,用户工单详情,问题描述,补充提交,User Work Order Details, Problem Description, Additional Submissions'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'User Work Order Details, Problem Description, Additional Submissions',
|
en: 'User Work Order Details, Problem Description, Additional Submissions',
|
||||||
@@ -408,7 +408,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/index.vue'),
|
component: () => import('../views/personalCenter/index.vue'),
|
||||||
meta: {title: '个人中心页面',
|
meta: {title: '个人中心页面',
|
||||||
description:i18n.t(`seo.personalCenter`),
|
description:i18n.t(`seo.personalCenter`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,挖矿账户,只读页面设置,安全设置,API密钥生成,Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation'
|
// keywords: 'M2Pool 矿池,个人中心,挖矿账户,只读页面设置,安全设置,API密钥生成,Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation',
|
en: 'Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation',
|
||||||
@@ -422,7 +422,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/personalMining/index.vue'),
|
component: () => import('../views/personalCenter/personalMining/index.vue'),
|
||||||
meta: {title: '挖矿账户设置页面',
|
meta: {title: '挖矿账户设置页面',
|
||||||
description:i18n.t(`seo.personalMining`),
|
description:i18n.t(`seo.personalMining`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,挖矿账户设置,币种账户,Personal Center,Mining Account Settings,Coin Accounts'
|
// keywords: 'M2Pool 矿池,个人中心,挖矿账户设置,币种账户,Personal Center,Mining Account Settings,Coin Accounts'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Personal Center,Mining Account Settings,Coin Accounts',
|
en: 'Personal Center,Mining Account Settings,Coin Accounts',
|
||||||
@@ -436,7 +436,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/readOnly/index.vue'),
|
component: () => import('../views/personalCenter/readOnly/index.vue'),
|
||||||
meta: {title: '只读页面设置',
|
meta: {title: '只读页面设置',
|
||||||
description:i18n.t(`seo.readOnly`),
|
description:i18n.t(`seo.readOnly`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,只读页面设置,矿池分享,Personal Center,Read-Only Page Setting,Mining Pool Sharing'
|
// keywords: 'M2Pool 矿池,个人中心,只读页面设置,矿池分享,Personal Center,Read-Only Page Setting,Mining Pool Sharing'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Personal Center,Read-Only Page Setting,Mining Pool Sharing',
|
en: 'Personal Center,Read-Only Page Setting,Mining Pool Sharing',
|
||||||
@@ -450,7 +450,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/securitySetting/index.vue'),
|
component: () => import('../views/personalCenter/securitySetting/index.vue'),
|
||||||
meta: {title: '安全设置页面',
|
meta: {title: '安全设置页面',
|
||||||
description:i18n.t(`seo.securitySetting`),
|
description:i18n.t(`seo.securitySetting`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,安全设置,密码修改,Security settings, password change'
|
// keywords: 'M2Pool 矿池,安全设置,密码修改,Security settings, password change'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Security settings, password change',
|
en: 'Security settings, password change',
|
||||||
@@ -464,7 +464,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/personal/index.vue'),
|
component: () => import('../views/personalCenter/personal/index.vue'),
|
||||||
meta: {title: '个人信息页面',
|
meta: {title: '个人信息页面',
|
||||||
description:i18n.t(`seo.personal`),
|
description:i18n.t(`seo.personal`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,个人信息,登录历史,Personal Information, Login History'
|
// keywords: 'M2Pool 矿池,个人信息,登录历史,Personal Information, Login History'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Personal Information, Login History',
|
en: 'Personal Information, Login History',
|
||||||
@@ -478,7 +478,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/miningReport/index.vue'),
|
component: () => import('../views/personalCenter/miningReport/index.vue'),
|
||||||
meta: {title: '挖矿报告页面',
|
meta: {title: '挖矿报告页面',
|
||||||
description:i18n.t(`seo.miningReport`),
|
description:i18n.t(`seo.miningReport`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,挖矿报告,订阅服务,Mining Report, Subscription Service'
|
// keywords: 'M2Pool 矿池,个人中心,挖矿报告,订阅服务,Mining Report, Subscription Service'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'Mining Report, Subscription Service',
|
en: 'Mining Report, Subscription Service',
|
||||||
@@ -493,7 +493,7 @@ const childrenRoutes = [
|
|||||||
component: () => import('../views/personalCenter/personalAPI/index.vue'),
|
component: () => import('../views/personalCenter/personalAPI/index.vue'),
|
||||||
meta: {title: 'API页面',
|
meta: {title: 'API页面',
|
||||||
description:i18n.t(`seo.personalAPI`),
|
description:i18n.t(`seo.personalAPI`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority:[`admin`,`registered`,`customer_service`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,API 页面,API密钥生成,API Page,API Key Generation'
|
// keywords: 'M2Pool 矿池,个人中心,API 页面,API密钥生成,API Page,API Key Generation'
|
||||||
keywords:{
|
keywords:{
|
||||||
en: 'API Page,API Key Generation',
|
en: 'API Page,API Key Generation',
|
||||||
@@ -634,87 +634,88 @@ 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);
|
||||||
|
console.log(jurisdiction,"权限");
|
||||||
|
|
||||||
// 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()
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// })
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,48 @@ Vue.use(Vuex)
|
|||||||
|
|
||||||
export default new Vuex.Store({
|
export default new Vuex.Store({
|
||||||
state: {
|
state: {
|
||||||
|
isLoggedIn: false,
|
||||||
|
userInfo: null
|
||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
|
isLoggedIn: state => state.isLoggedIn,
|
||||||
|
userInfo: state => state.userInfo
|
||||||
},
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
|
SET_LOGIN_STATE(state, isLoggedIn) {
|
||||||
|
state.isLoggedIn = isLoggedIn
|
||||||
|
},
|
||||||
|
SET_USER_INFO(state, userInfo) {
|
||||||
|
state.userInfo = userInfo
|
||||||
|
},
|
||||||
|
CLEAR_USER_DATA(state) {
|
||||||
|
state.isLoggedIn = false
|
||||||
|
state.userInfo = null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
|
// 退出登录
|
||||||
|
async logout({ commit }) {
|
||||||
|
try {
|
||||||
|
// 清除本地存储
|
||||||
|
localStorage.removeItem('token')
|
||||||
|
localStorage.removeItem('userEmail')
|
||||||
|
localStorage.removeItem('jurisdiction')
|
||||||
|
|
||||||
|
// 清除 Vuex 状态
|
||||||
|
commit('CLEAR_USER_DATA')
|
||||||
|
|
||||||
|
// 触发全局事件,通知其他组件用户已退出
|
||||||
|
if (Vue.prototype.$bus) {
|
||||||
|
Vue.prototype.$bus.$emit('user-logged-out')
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
console.error('退出登录失败:', error)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
modules: {
|
modules: {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,8 @@
|
|||||||
<div class="textBox">
|
<div class="textBox">
|
||||||
<p>{{ $t(`ServiceTerms.clauseService1`) }}</p>
|
<p>{{ $t(`ServiceTerms.clauseService1`) }}</p>
|
||||||
<p>{{ $t(`ServiceTerms.clauseService2`) }}</p>
|
<p>{{ $t(`ServiceTerms.clauseService2`) }}</p>
|
||||||
<p><span style="font-weight: 600;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
|
|
||||||
|
<p style="text-align: justify;"><span style="font-weight: 600 ;text-align: justify;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -117,7 +118,8 @@
|
|||||||
<div class="textBox">
|
<div class="textBox">
|
||||||
<p>{{ $t(`ServiceTerms.clauseService1`) }}</p>
|
<p>{{ $t(`ServiceTerms.clauseService1`) }}</p>
|
||||||
<p>{{ $t(`ServiceTerms.clauseService2`) }}</p>
|
<p>{{ $t(`ServiceTerms.clauseService2`) }}</p>
|
||||||
<p><span style="font-weight: 600;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
|
|
||||||
|
<p style="text-align: justify;"><span style="font-weight: 600;text-align: justify;">{{ $t(`ServiceTerms.clauseService3`) }} </span>{{ $t(`ServiceTerms.clauseService4`) }}</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ export default {
|
|||||||
loadingRooms: true,
|
loadingRooms: true,
|
||||||
stompClient: null,
|
stompClient: null,
|
||||||
wsConnected: false,
|
wsConnected: false,
|
||||||
userEmail: "497681109@qq.com", // 当前客服邮箱
|
userEmail: "", // 当前客服邮箱
|
||||||
userType: 1, // 0或者1 游客或者登录用户
|
userType: 1, // 0或者1 游客或者登录用户
|
||||||
|
|
||||||
loadingHistory: false, // 是否正在加载历史消息
|
loadingHistory: false, // 是否正在加载历史消息
|
||||||
@@ -331,7 +331,7 @@ export default {
|
|||||||
id: "", //最后一条消息id
|
id: "", //最后一条消息id
|
||||||
roomId: "", //聊天室id
|
roomId: "", //聊天室id
|
||||||
userType: 2, //用户类型
|
userType: 2, //用户类型
|
||||||
email: "497681109@qq.com", //客服邮箱
|
email: "", //客服邮箱
|
||||||
},
|
},
|
||||||
historyAllParams: {
|
historyAllParams: {
|
||||||
//7天以前的历史消息
|
//7天以前的历史消息
|
||||||
@@ -380,8 +380,12 @@ export default {
|
|||||||
|
|
||||||
async created() {
|
async created() {
|
||||||
try {
|
try {
|
||||||
// 初始化用户信息
|
let userEmail = localStorage.getItem("userEmail");
|
||||||
// this.determineUserType();
|
this.userEmail = JSON.parse(userEmail);
|
||||||
|
window.addEventListener("setItem", () => {
|
||||||
|
let userEmail = localStorage.getItem("userEmail");
|
||||||
|
this.userEmail = JSON.parse(userEmail);
|
||||||
|
});
|
||||||
|
|
||||||
// 获取聊天室列表
|
// 获取聊天室列表
|
||||||
await this.fetchRoomList();
|
await this.fetchRoomList();
|
||||||
@@ -391,12 +395,8 @@ export default {
|
|||||||
}
|
}
|
||||||
// 在组件创建时加载手动创建的聊天室
|
// 在组件创建时加载手动创建的聊天室
|
||||||
this.loadManualCreatedRooms();
|
this.loadManualCreatedRooms();
|
||||||
let userEmail = localStorage.getItem("userEmail");
|
|
||||||
this.userEmail = JSON.parse(userEmail);
|
console.log(this.userEmail,"初始化的时候")
|
||||||
window.addEventListener("setItem", () => {
|
|
||||||
let userEmail = localStorage.getItem("userEmail");
|
|
||||||
this.userEmail = JSON.parse(userEmail);
|
|
||||||
});
|
|
||||||
// 初始化 WebSocket 连接
|
// 初始化 WebSocket 连接
|
||||||
this.initWebSocket();
|
this.initWebSocket();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -418,6 +418,8 @@ export default {
|
|||||||
let userEmail = localStorage.getItem("userEmail");
|
let userEmail = localStorage.getItem("userEmail");
|
||||||
this.userEmail = JSON.parse(userEmail);
|
this.userEmail = JSON.parse(userEmail);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log(this.userEmail,"mounted")
|
||||||
// 确保初始加载后滚动到底部
|
// 确保初始加载后滚动到底部
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.scrollToBottom();
|
this.scrollToBottom();
|
||||||
@@ -480,7 +482,8 @@ export default {
|
|||||||
if (this.isWebSocketConnected) return;
|
if (this.isWebSocketConnected) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const wsUrl = `${process.env.VUE_APP_BASE_API}chat/ws`;
|
const baseUrl = process.env.VUE_APP_BASE_API.replace('https', 'wss');
|
||||||
|
const wsUrl = `${baseUrl}chat/ws`;
|
||||||
this.stompClient = Stomp.client(wsUrl);
|
this.stompClient = Stomp.client(wsUrl);
|
||||||
|
|
||||||
// 配置 STOMP 客户端参数
|
// 配置 STOMP 客户端参数
|
||||||
@@ -1272,13 +1275,12 @@ export default {
|
|||||||
const currentMsgs = this.messages[this.currentContactId] || [];
|
const currentMsgs = this.messages[this.currentContactId] || [];
|
||||||
|
|
||||||
// 取最后一条消息的id
|
// 取最后一条消息的id
|
||||||
const lastMsg =
|
// const lastMsg =
|
||||||
currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
|
// currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
|
||||||
this.history7Params.id = lastMsg ? lastMsg.id : "";
|
this.history7Params.id = currentMsgs[0].id ||"",
|
||||||
// this.history7Params.pageNum += 1; // 递增页码
|
// this.history7Params.pageNum += 1; // 递增页码
|
||||||
this.history7Params.roomId = this.currentContactId;
|
this.history7Params.roomId = this.currentContactId;
|
||||||
this.history7Params.email = this.userEmail;
|
this.history7Params.email = this.userEmail;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.messagesLoading = true;
|
this.messagesLoading = true;
|
||||||
const response = await getHistory7(this.history7Params);
|
const response = await getHistory7(this.history7Params);
|
||||||
@@ -1375,6 +1377,7 @@ export default {
|
|||||||
if (!roomId) return;
|
if (!roomId) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
console.log(this.userEmail,"加载聊天消息")
|
||||||
this.history7Params.email = this.userEmail;
|
this.history7Params.email = this.userEmail;
|
||||||
this.history7Params.roomId = roomId;
|
this.history7Params.roomId = roomId;
|
||||||
const response = await getHistory7(this.history7Params);
|
const response = await getHistory7(this.history7Params);
|
||||||
@@ -1903,7 +1906,6 @@ export default {
|
|||||||
async loadHistory() {
|
async loadHistory() {
|
||||||
this.loadingHistory = true;
|
this.loadingHistory = true;
|
||||||
this.userViewHistory = true; // 用户主动查看历史
|
this.userViewHistory = true; // 用户主动查看历史
|
||||||
console.log("哇哈哈哈哈哈哈", this.currentContactId);
|
|
||||||
if (!this.currentContactId) return;
|
if (!this.currentContactId) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -1912,13 +1914,14 @@ export default {
|
|||||||
const currentMsgs = this.messages[this.currentContactId] || [];
|
const currentMsgs = this.messages[this.currentContactId] || [];
|
||||||
|
|
||||||
// 取最后一条消息的id
|
// 取最后一条消息的id
|
||||||
const lastMsg =
|
// const lastMsg =
|
||||||
currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
|
// currentMsgs.length > 0 ? currentMsgs[currentMsgs.length - 1] : null;
|
||||||
this.history7Params.id = lastMsg ? lastMsg.id : "";
|
this.history7Params.id =currentMsgs[0].id ||"";
|
||||||
// this.history7Params.pageNum += 1; // 递增页码
|
// this.history7Params.pageNum += 1; // 递增页码
|
||||||
this.history7Params.roomId = this.currentContactId;
|
this.history7Params.roomId = this.currentContactId;
|
||||||
this.history7Params.email = this.userEmail;
|
this.history7Params.email = this.userEmail;
|
||||||
const response = await getHistory7(this.history7Params);
|
const response = await getHistory7(this.history7Params);
|
||||||
|
console.log(response,"respons及附加覅封建时代反间谍法附件覅发e");
|
||||||
|
|
||||||
if (response && response.code === 200 && response.data) {
|
if (response && response.code === 200 && response.data) {
|
||||||
let historyMessages = response.data
|
let historyMessages = response.data
|
||||||
|
|||||||
Binary file not shown.
1
mining-pool/test/css/app-42f9d7e6.48b4c830.css
Normal file
1
mining-pool/test/css/app-42f9d7e6.48b4c830.css
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/css/app-42f9d7e6.48b4c830.css.gz
Normal file
BIN
mining-pool/test/css/app-42f9d7e6.48b4c830.css.gz
Normal file
Binary file not shown.
1
mining-pool/test/css/app-8e0489d9.4f99dab4.css
Normal file
1
mining-pool/test/css/app-8e0489d9.4f99dab4.css
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/css/app-8e0489d9.4f99dab4.css.gz
Normal file
BIN
mining-pool/test/css/app-8e0489d9.4f99dab4.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.4b5b04f4.js></script><script defer src=/js/app-5c551db8.2530417a.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.bb9b6a2c.js></script><script defer src=/js/app-72600b29.eb14747d.js></script><script defer src=/js/app-f035d474.4fade95e.js></script><script defer src=/js/app-113c6c50.c73554a4.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.582537b2.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.896a6438.css rel=stylesheet><link href=/css/app-72600b29.9a75824f.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-113c6c50.729eb983.css rel=stylesheet></head><body><div id=app></div></body></html>
|
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_7i8wfzc0art.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><meta name=format-detection content="telephone=no"><meta name=apple-mobile-web-app-capable content=yes><script defer src=/js/chunk-vendors-945ce2fe.648a91a9.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer src=/js/chunk-vendors-377fed06.159de137.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/app-42f9d7e6.8aa0cd9f.js></script><script defer src=/js/app-5c551db8.6973b329.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.fc698aa0.js></script><script defer src=/js/app-72600b29.eb14747d.js></script><script defer src=/js/app-f035d474.4fade95e.js></script><script defer src=/js/app-113c6c50.c73554a4.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.48b4c830.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.4f99dab4.css rel=stylesheet><link href=/css/app-72600b29.9a75824f.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-113c6c50.729eb983.css rel=stylesheet></head><body><div id=app></div></body></html>
|
||||||
1
mining-pool/test/js/app-42f9d7e6.8aa0cd9f.js
Normal file
1
mining-pool/test/js/app-42f9d7e6.8aa0cd9f.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-42f9d7e6.8aa0cd9f.js.gz
Normal file
BIN
mining-pool/test/js/app-42f9d7e6.8aa0cd9f.js.gz
Normal file
Binary file not shown.
1
mining-pool/test/js/app-5c551db8.6973b329.js
Normal file
1
mining-pool/test/js/app-5c551db8.6973b329.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-5c551db8.6973b329.js.gz
Normal file
BIN
mining-pool/test/js/app-5c551db8.6973b329.js.gz
Normal file
Binary file not shown.
1
mining-pool/test/js/app-8e0489d9.fc698aa0.js
Normal file
1
mining-pool/test/js/app-8e0489d9.fc698aa0.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mining-pool/test/js/app-8e0489d9.fc698aa0.js.gz
Normal file
BIN
mining-pool/test/js/app-8e0489d9.fc698aa0.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-30T07:00:26.014Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-30T07:00:26.014Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/en</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><url><loc>https://m2pool.com/en/dataDisplay</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/ServiceTerms</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><url><loc>https://m2pool.com/en/apiFile</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/rate</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/nexaAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/grsAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/monaAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbsAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgbqAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/dgboAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/en/AccessMiningPool/rxdAccess</loc><lastmod>2025-06-06T06:37:26.048Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/zh</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-05-30T07:00:26.007Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://m2pool.com/zh</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/dataDisplay</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/ServiceTerms</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/apiFile</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/rate</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/nexaAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/grsAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/monaAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbsAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgbqAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/dgboAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url><url><loc>https://m2pool.com/zh/AccessMiningPool/rxdAccess</loc><lastmod>2025-06-06T06:37:26.039Z</lastmod><changefreq>weekly</changefreq><priority>0.7</priority></url></urlset>
|
||||||
Binary file not shown.
Reference in New Issue
Block a user