From 3a17ed0da16ed4ae8d7cbef7f66cae615bc7dbba Mon Sep 17 00:00:00 2001 From: jjz <3082705704@qq.com> Date: Mon, 29 Sep 2025 14:49:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E7=94=A8=E6=88=B7=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebSocket/BackendClient.py | 18 ++++++++++++++- WebSocket/backend_singleton.py | 31 +++++++++++++++++++++++++ main.py | 41 ++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/WebSocket/BackendClient.py b/WebSocket/BackendClient.py index a9e39ac..c15e976 100644 --- a/WebSocket/BackendClient.py +++ b/WebSocket/BackendClient.py @@ -30,6 +30,7 @@ class BackendClient: self.login_callback: Optional[Callable] = None # 新增:平台登录(下发cookies)回调 self.success_callback: Optional[Callable] = None # 新增:后端连接成功回调 self.token_error_callback: Optional[Callable] = None # 新增:token错误回调 + self.version_callback: Optional[Callable] = None # 新增:版本检查回调 self.is_connected = False @@ -263,7 +264,8 @@ class BackendClient: error: Callable = None, login: Callable = None, success: Callable = None, - token_error: Callable = None): + token_error: Callable = None, + version: Callable = None): """设置各种消息类型的回调函数""" if store_list: self.store_list_callback = store_list @@ -283,6 +285,8 @@ class BackendClient: self.success_callback = success if token_error: self.token_error_callback = token_error + if version: + self.version_callback = version def on_connected(self): """连接成功时的处理""" @@ -437,6 +441,8 @@ class BackendClient: self._handle_token_error(message) elif msg_type == 'staff_list': self._handle_staff_list(message) + elif msg_type == 'version_response': # 新增:版本检查响应 + self._handle_version_response(message) else: print(f"未知消息类型: {msg_type}") @@ -1213,6 +1219,16 @@ class BackendClient: if self.customers_callback: # 假设客服列表更新也触发客服列表回调 self.customers_callback(staff_list, store_id) + def _handle_version_response(self, message: Dict[str, Any]): + """处理版本检查响应""" + latest_version = message.get('latest_version') + download_url = message.get('download_url') + + print(f"收到版本检查响应: 最新版本={latest_version}, 下载地址={download_url}") + + if self.version_callback: + self.version_callback(message) + # ==================== 辅助方法 ==================== def set_token(self, token: str): diff --git a/WebSocket/backend_singleton.py b/WebSocket/backend_singleton.py index c602c28..54e91c3 100644 --- a/WebSocket/backend_singleton.py +++ b/WebSocket/backend_singleton.py @@ -27,7 +27,13 @@ class WebSocketManager: """WebSocket连接管理器,统一处理后端连接和平台监听""" def __init__(self): + # 后端客户端 self.backend_client = None + self.is_connected = False + + # 版本检查器 + self.version_checker = None + self.gui_update_callback = None self.platform_listeners = {} # 存储各平台的监听器 self.connected_platforms = [] # 存储已连接的平台列表 # <- 新增 self.callbacks = { @@ -105,6 +111,8 @@ class WebSocketManager: self._log("连接服务成功", "SUCCESS") if self.callbacks['success']: self.callbacks['success']() + # 启动版本检查器 + self._start_version_checker() except Exception as e: self._log(f"成功回调执行失败: {e}", "ERROR") @@ -144,6 +152,8 @@ class WebSocketManager: self._log("连接服务成功", "SUCCESS") if self.callbacks['success']: self.callbacks['success']() + # 启动版本检查器 + self._start_version_checker() except Exception as e: self._log(f"成功回调执行失败: {e}", "ERROR") @@ -220,6 +230,27 @@ class WebSocketManager: import traceback self._log(f"错误详情: {traceback.format_exc()}", "DEBUG") + def _start_version_checker(self): + """启动版本检查器""" + try: + from version_checker import VersionChecker + self.version_checker = VersionChecker( + backend_client=self.backend_client, + update_callback=self._on_update_available + ) + self.backend_client.version_callback = self.version_checker.handle_version_response + self.version_checker.start() + self._log("✅ 版本检查器已启动,将每10分钟检查一次更新", "SUCCESS") + except Exception as e: + self._log(f"❌ 启动版本检查器失败: {e}", "ERROR") + + def _on_update_available(self, latest_version, download_url): + """发现新版本时的处理""" + self._log(f"🔔 发现新版本 {latest_version}", "INFO") + # 通知主GUI显示更新提醒 + if hasattr(self, 'gui_update_callback') and self.gui_update_callback: + self.gui_update_callback(latest_version, download_url) + def _start_jd_listener(self, store_id: str, cookies: str): """启动京东平台监听""" try: diff --git a/main.py b/main.py index e9f42c4..348f3d4 100644 --- a/main.py +++ b/main.py @@ -42,6 +42,9 @@ class LoginWindow(QMainWindow): # 日志管理相关变量已删除 self.initUI() + + # 延迟设置版本检查器,确保WebSocket连接已建立 + QTimer.singleShot(5000, self.setup_version_checker) def initUI(self): # 设置窗口基本属性 @@ -699,6 +702,44 @@ class LoginWindow(QMainWindow): self.quit_application() event.accept() + def setup_version_checker(self): + """设置版本检查器的GUI回调""" + try: + from WebSocket.backend_singleton import get_websocket_manager + ws_manager = get_websocket_manager() + if ws_manager: + ws_manager.gui_update_callback = self.show_update_notification + self.add_log("✅ 版本检查器GUI回调已设置", "SUCCESS") + else: + self.add_log("⚠️ WebSocket管理器未初始化", "WARNING") + except Exception as e: + self.add_log(f"❌ 设置版本检查器失败: {e}", "ERROR") + + def show_update_notification(self, latest_version, download_url): + """显示版本更新通知""" + try: + reply = QMessageBox.question( + self, + "版本更新", + f"发现新版本 {latest_version},是否立即更新?\n\n点击确定将打开下载页面。", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.Yes + ) + + if reply == QMessageBox.Yes: + self.trigger_update(download_url) + except Exception as e: + self.add_log(f"❌ 显示更新通知失败: {e}", "ERROR") + + def trigger_update(self, download_url): + """触发更新下载""" + import webbrowser + try: + webbrowser.open(download_url) + self.add_log("✅ 已打开更新下载页面", "SUCCESS") + except Exception as e: + self.add_log(f"❌ 打开下载页面失败: {e}", "ERROR") + def main(): """主函数,用于测试界面"""