[patch] 修改逻辑: 在用户误触或开了多个GUI程序的时候不能同时建立多个连接 确保一个账号只能建立一个与后端的连接

This commit is contained in:
2025-10-11 15:30:12 +08:00
parent 2dd384e8e4
commit 160b3f38ed
3 changed files with 121 additions and 5 deletions

85
main.py
View File

@@ -25,6 +25,12 @@ class UpdateSignals(QObject):
update_available = pyqtSignal(str, str) # (latest_version, download_url)
# 新增: 断开连接信号类(用于线程安全的通知)
class DisconnectSignals(QObject):
"""断开连接信号"""
account_disconnected = pyqtSignal(str) # (disconnect_message)
# 新增: 用户名密码输入对话框类
class LoginWindow(QMainWindow):
def __init__(self):
@@ -49,6 +55,10 @@ class LoginWindow(QMainWindow):
# 创建版本更新信号对象(线程安全)
self.update_signals = UpdateSignals()
self.update_signals.update_available.connect(self._show_update_dialog)
# 创建断开连接信号对象(线程安全)
self.disconnect_signals = DisconnectSignals()
self.disconnect_signals.account_disconnected.connect(self._show_disconnect_dialog)
self.initUI()
@@ -436,6 +446,78 @@ class LoginWindow(QMainWindow):
except Exception as e:
self.add_log(f"处理token错误失败: {e}", "ERROR")
def on_disconnect(self, disconnect_msg: str):
"""处理被踢下线通知(可能在子线程中调用)"""
try:
self.add_log(f"⚠️ 收到断开通知: {disconnect_msg}", "WARNING")
# 通过信号发射到主线程(线程安全)
self.disconnect_signals.account_disconnected.emit(disconnect_msg)
except Exception as e:
self.add_log(f"❌ 处理断开通知失败: {e}", "ERROR")
def _show_disconnect_dialog(self, disconnect_msg: str):
"""显示断开连接对话框(信号槽函数,在主线程中执行)"""
try:
self.add_log(f"⚠️ 显示断开连接对话框: {disconnect_msg}", "WARNING")
# 显示警告对话框
QMessageBox.warning(
self,
"连接已断开",
f"{disconnect_msg}\n\n请确保用户只在一台设备登录。",
QMessageBox.Ok
)
# 断开所有连接
self._disconnect_all_connections()
# 重置 UI 状态(返回登录界面)
self._reset_to_login_state()
self.add_log("✅ 已断开连接,返回登录界面", "INFO")
except Exception as e:
self.add_log(f"❌ 显示断开对话框失败: {e}", "ERROR")
import traceback
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
def _disconnect_all_connections(self):
"""断开所有连接"""
try:
self.add_log("🔌 正在断开所有连接...", "INFO")
# 使用 WebSocket 管理器断开所有连接
from WebSocket.backend_singleton import get_websocket_manager
ws_manager = get_websocket_manager()
ws_manager.disconnect_all()
self.add_log("✅ 所有连接已断开", "SUCCESS")
except Exception as e:
self.add_log(f"❌ 断开连接失败: {e}", "ERROR")
def _reset_to_login_state(self):
"""重置到登录状态"""
try:
# 清空已连接平台列表
self.connected_platforms.clear()
# 重置状态标签
self.status_label.setText("等待连接...")
self.status_label.setStyleSheet(
"color: #95a5a6; margin-top: 5px;")
# 重置按钮状态
self.login_btn.setEnabled(True)
self.login_btn.setText("重新连接")
self.login_btn.setObjectName("loginButton") # 恢复原始样式
self.login_btn.setStyleSheet(self.login_btn.styleSheet()) # 刷新样式
self.add_log("✅ UI 已重置到登录状态", "DEBUG")
except Exception as e:
self.add_log(f"❌ 重置 UI 状态失败: {e}", "ERROR")
def delayed_platform_summary(self):
"""定时器触发的汇总显示更新"""
@@ -651,7 +733,8 @@ class LoginWindow(QMainWindow):
success=lambda: self.add_log("WebSocket连接管理器连接成功", "SUCCESS"),
error=lambda error: self.add_log(f"WebSocket连接管理器错误: {error}", "ERROR"),
platform_connected=self.on_platform_connected, # 新增:平台连接回调
token_error=self.on_token_error # 新增token错误回调
token_error=self.on_token_error, # 新增token错误回调
disconnect=self.on_disconnect # 新增:被踢下线回调
)
# 连接后端