后台系统: 用户详情页面添加钱包余额显示、用户管理优化记录用户选择币种、 新增广播增加查看按钮内容、及对应跳转对应页面路径 增加帮助中心页面、公告中心页面 完成

This commit is contained in:
2025-07-11 16:33:34 +08:00
parent c6f765f858
commit a0ebd8254a
63 changed files with 5379 additions and 680 deletions

View File

@@ -203,6 +203,7 @@
:disabled="connectionStatus !== 'connected'"
/>
</div>
<!-- :disabled="connectionStatus !== 'connected'" -->
<div
class="chat-input-wrapper"
style="display: flex; align-items: center"
@@ -215,7 +216,7 @@
@input="handleInputMessage"
@keydown.enter="handleEnterKey"
:placeholder="$t('chat.inputPlaceholder') || '请输入您的问题...'"
:disabled="connectionStatus !== 'connected'"
/>
<!-- <span class="input-counter">{{ maxMessageLength - inputMessage.length }}</span> -->
</div>
@@ -309,11 +310,12 @@ export default {
lastErrorTime: 0, // 最后一次错误时间
lastConnectedEmail: null, // 最后连接的用户email用于防止重复连接
userViewHistory: false, // 是否在查看历史消息
customerIsOnline: true, // 保存客服在线状态
customerIsOnline: false, // 保存客服在线状态
jurisdiction: {
roleKey: "",
},
token: "",
};
},
computed: {
@@ -375,8 +377,19 @@ export default {
// === 移除 markMessagesAsRead 调用,防止切换窗口时误清未读 ===
}
},
token(val) {
console.log("token变化打印",val);
if (!val) {
this.forceDisconnectAll()
this.$nextTick(() => {
this.determineUserType()
})
}
},
},
async created() {
let jurisdiction = localStorage.getItem("jurisdiction");
try {
@@ -410,6 +423,11 @@ export default {
}
this.jurisdiction = jurisdiction;
let customerIsOnline = localStorage.getItem("customerIsOnline");
this.customerIsOnline = JSON.parse(customerIsOnline);
let token = localStorage.getItem("token");
this.token = JSON.parse(token);
window.addEventListener("setItem", () => {
let jurisdiction = localStorage.getItem("jurisdiction");
try {
@@ -420,6 +438,12 @@ export default {
jurisdiction = { roleKey: "" };
}
this.jurisdiction = jurisdiction;
let customerIsOnline = localStorage.getItem("customerIsOnline");
this.customerIsOnline = JSON.parse(customerIsOnline);
let token = localStorage.getItem("token");
this.token = JSON.parse(token);
});
// 添加页面卸载事件监听
@@ -542,6 +566,7 @@ export default {
this.jurisdiction.roleKey =="customer_service" ||
this.jurisdiction.roleKey == "admin" ||
this.jurisdiction.roleKey == "back_admin"
) return;
// 获取用户ID和未读消息数
const userData = await this.fetchUserid({ email: this.userEmail });
@@ -586,6 +611,9 @@ export default {
// 确定用户类型和邮箱
async determineUserType() {
console.log("token",this.token);
try {
const token = localStorage.getItem("token");
// console.log("token", token);
@@ -638,7 +666,7 @@ export default {
this.userEmail = email;
if (userInfo.roleKey === "customer_service") {
if (userInfo.roleKey === "customer_service" || userInfo.roleKey === "admin") {
// 客服用户
this.userType = 2;
this.userEmail = "";
@@ -1061,7 +1089,7 @@ export default {
// console.log("🔌 处理连接断开...");
// === 如果用户已经打开聊天窗口,确保保持打开状态 ===
// === 移除自动保持对话框打开的逻辑,只有用户主动打开才保持打开 ===
// if (this.isChatOpen) {
// console.log("📱 聊天窗口已打开,保持打开状态");
// // 不改变 isChatOpen 和 isMinimized 状态
@@ -1098,7 +1126,7 @@ export default {
// `🔄 尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`
// );
// === 在自动重连期间,如果聊天窗口打开,显示连接中状态 ===
// === 在自动重连期间,如果聊天窗口已经打开,显示连接中状态 ===
if (this.isChatOpen) {
this.connectionStatus = "connecting";
}
@@ -1208,6 +1236,11 @@ export default {
},
// 发送消息
sendMessage() {
// 网络断开时阻止发送消息并提示
if (this.networkStatus !== "online") {
this.$message({
@@ -1631,21 +1664,16 @@ export default {
// 修改 fetchUserid 方法,添加 token 检查
async fetchUserid(params) {
try {
// 先检查是否有 token
// const token = localStorage.getItem("token");
// if (!token) {
// console.log("用户未登录,不发起 getUserid 请求");
// // 对于未登录用户,可以生成一个临时 ID
// this.roomId = `guest_${Date.now()}`;
// this.receivingEmail = "customer_service@example.com"; // 或默认客服邮箱
// return null;
// }
const res = await getUserid(params);
if (res && res.code == 200) {
// console.log("获取用户ID成功:", res);
this.receivingEmail = res.data.userEmail;
this.roomId = res.data.id;
this.customerIsOnline = res.data.customerIsOnline;
localStorage.setItem(`customerIsOnline`,JSON.stringify(this.customerIsOnline))
return res.data;
} else {
console.warn("获取用户ID未返回有效数据");
@@ -1991,7 +2019,7 @@ export default {
// connectionStatus: this.connectionStatus,
// isWebSocketConnected: this.isWebSocketConnected,
// });
this.fetchUserid({ email: this.userEmail })
const wasOpen = this.isChatOpen;
this.isChatOpen = !this.isChatOpen;
@@ -2455,14 +2483,14 @@ export default {
},
/**
* 优化:重试连接按钮处理 - 保持对话框打开,直接重连
* 优化:重试连接按钮处理 - 直接重连,不自动打开对话框
*/
async handleRetryConnect() {
try {
// console.log("🔄 用户点击重试连接...");
// === 多窗口切换:抢占活跃权 ===
this.setWindowActive();
// this.setWindowActive(); // 移除此方法调用因为setWindowActive方法在代码中没有定义
// === 重置连接状态,立即显示连接中 ===
this.connectionStatus = "connecting";
@@ -2730,9 +2758,9 @@ export default {
this.isReconnecting = false;
this.showRefreshButton = false; // 不显示刷新按钮,用户只需关闭多余窗口
// === 确保聊天对话框保持打开状态 ===
this.isChatOpen = true;
this.isMinimized = false;
// === 移除自动打开对话框的逻辑,只有用户主动点击才打开 ===
// this.isChatOpen = true;
// this.isMinimized = false;
this.$forceUpdate();
// console.log("🔥 连接数上限错误处理完成,提示用户关闭多余窗口");
@@ -3042,9 +3070,9 @@ export default {
this.isHandlingError = true;
this.lastErrorTime = now;
// === 确保聊天对话框保持打开状态 ===
this.isChatOpen = true;
this.isMinimized = false;
// === 移除自动打开对话框的逻辑,只有用户主动点击才打开 ===
// this.isChatOpen = true;
// this.isMinimized = false;
// 清除验证定时器
this.clearConnectionVerification();
@@ -3073,9 +3101,9 @@ export default {
// console.error("❌ 重新连接失败:", error);
this.isHandlingError = false;
// === 连接失败时确保对话框仍然打开 ===
this.isChatOpen = true;
this.isMinimized = false;
// === 移除自动打开对话框的逻辑,只有用户主动点击才打开 ===
// this.isChatOpen = true;
// this.isMinimized = false;
this.connectionStatus = "error";
this.showRefreshButton = true;
});
@@ -3098,9 +3126,9 @@ export default {
this.isHandlingError = true;
this.lastErrorTime = now;
// === 确保聊天对话框保持打开状态 ===
this.isChatOpen = true;
this.isMinimized = false;
// === 移除自动打开对话框的逻辑,只有用户主动点击才打开 ===
// this.isChatOpen = true;
// this.isMinimized = false;
// === 增加重连次数并检查限制 ===
this.reconnectAttempts++;
@@ -3138,9 +3166,9 @@ export default {
console.error("❌ 超时重连失败:", error);
this.isHandlingError = false;
// === 重连失败时确保对话框仍然打开 ===
this.isChatOpen = true;
this.isMinimized = false;
// === 移除自动打开对话框的逻辑,只有用户主动点击才打开 ===
// this.isChatOpen = true;
// this.isMinimized = false;
this.connectionStatus = "error";
this.connectionError =
this.$t("chat.reconnectFailed") || "重连失败,请稍后重试";
@@ -3159,9 +3187,9 @@ export default {
console.error("❌ 强制断开连接失败:", error);
this.isHandlingError = false;
// === 处理失败时确保对话框仍然打开 ===
this.isChatOpen = true;
this.isMinimized = false;
// === 移除自动打开对话框的逻辑,只有用户主动点击才打开 ===
// this.isChatOpen = true;
// this.isMinimized = false;
this.connectionStatus = "error";
this.connectionError =
this.$t("chat.connectionFailed") || "连接处理失败,请稍后重试";