From 4081f9a9db380407b30e2c0824061894a2721d5d Mon Sep 17 00:00:00 2001 From: Leonmmcoset Date: Thu, 25 Sep 2025 21:43:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(app=5Fdetail=5Fwindow):=20=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E5=BA=94=E7=94=A8=E5=AE=89=E8=A3=85=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加统一的错误弹窗函数,改进下载URL处理逻辑 使用本地install目录保存安装文件,添加下载完成后自动打开文件夹功能 替换InfoBar为QMessageBox实现更美观的弹窗提示 --- .gitignore | 1 + .../app_detail_window.cpython-312.pyc | Bin 36855 -> 42150 bytes .../__pycache__/leonapp_gui.cpython-312.pyc | Bin 0 -> 127808 bytes pyqt5fluentdesign/app_detail_window.py | 270 +++++++++++++----- 4 files changed, 196 insertions(+), 75 deletions(-) create mode 100644 pyqt5fluentdesign/__pycache__/leonapp_gui.cpython-312.pyc diff --git a/.gitignore b/.gitignore index 8bd4447..3526b0e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ logs/ /pyqt5fluentdesign/output/ /pyqt5fluentdesign/logs/ +/pyqt5fluentdesign/install/ # 忽略Windows系统文件 Thumbs.db diff --git a/pyqt5fluentdesign/__pycache__/app_detail_window.cpython-312.pyc b/pyqt5fluentdesign/__pycache__/app_detail_window.cpython-312.pyc index 6ec0a120f5e6182f2340a2cd4fd859b6c06daa2a..f55be0f73994821e1ea272edc64ce7531b1379e0 100644 GIT binary patch delta 10282 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 diff --git a/pyqt5fluentdesign/__pycache__/leonapp_gui.cpython-312.pyc b/pyqt5fluentdesign/__pycache__/leonapp_gui.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb201d4b0ee56ce254dcce4408c766334b261367 GIT binary patch literal 127808 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
  • xmkl_S+0VPd5iD$+@0a*u4UKJ=R z3k&)ITn<|V*hx^Dq2?k7TpX~bya%X~mpzs>52%@V7=n^pX)o>9Sbk|r?O1+W0b*1z z$1}d6l%Y2`r+0Y;RyD+&+?JOiOr(e+8! zdG~8FBzfz5mp^!U^tAzi6s#!^Nn^kN4H5}*7>X2Mzyos2ZN+am#&f_Ewl;~o9ur-3 zpW4=imDI|(m`^xaf^u3h@zMjJG2=jmwG-OT;vJ~mLr~&dD42=* z*fK6B<-9ciinQcJ!qO!)l{Q=POPJr13De}l+9@KMD3`b039i~q(n$8VbRTZ@fekB>f~XP-Ds=8C^IRsPnR zW1jyT6QWy-^URBmF1lsH&#h&BHnaU`*)5!r%=TM-36ERM_Wt{BndtY{U9qdI(k=bo zS}%0rhjP;Itw-YTqT5}!O!RxJR#-)O_uVql@2$<&?f5ym>6VFpZ?#+N@iS0<%S6Ao znyt+-xc%ZS6aC&=AJ=M@-qP=_x|l~Oal$PV{obmzt;NsLtXn4fy|vYPui0F9wBVMB tesAoxWSBExz literal 0 HcmV?d00001 diff --git a/pyqt5fluentdesign/app_detail_window.py b/pyqt5fluentdesign/app_detail_window.py index f384ea2..e6b7317 100644 --- a/pyqt5fluentdesign/app_detail_window.py +++ b/pyqt5fluentdesign/app_detail_window.py @@ -1,6 +1,6 @@ # 这破代码有人能修复吗 from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, - QPushButton, QFrame, QLabel, QGridLayout) + QPushButton, QFrame, QLabel, QGridLayout, QMessageBox) from PyQt5.QtCore import Qt, QSize, pyqtSignal, QThread from PyQt5.QtGui import QPixmap, QFont from qfluentwidgets import (InfoBar, InfoBarPosition, TitleLabel, SubtitleLabel, @@ -14,6 +14,25 @@ import tempfile import subprocess import platform +def show_error_dialog(title, message): + """显示错误弹窗,模拟Sweet Alert风格""" + # 创建错误消息框 + msg_box = QMessageBox() + msg_box.setIcon(QMessageBox.Critical) + msg_box.setWindowTitle(title) + + # 设置字体大小 + font = QFont() + font.setPointSize(10) + msg_box.setFont(font) + + # 设置消息内容 + msg_box.setText(message) + msg_box.setStandardButtons(QMessageBox.Ok) + + # 显示弹窗 + msg_box.exec_() + class DownloadThread(QThread): """下载线程,用于在后台下载文件""" progress = pyqtSignal(int) @@ -652,34 +671,44 @@ class AppDetailWindow(QMainWindow): # 检查是否有应用数据 if not hasattr(self, 'app_data'): - InfoBar.error( - title="错误", - content="应用数据未加载,请刷新页面后重试。", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - parent=self - ) + show_error_dialog("错误", "应用数据未加载,请刷新页面后重试。") return - # 创建确认对话框 - reply = QMessageBox.question(self, - "确认安装", - f"您确定要安装{self.app_data.get('name', '未知应用')}吗?\n\n点击'确定'开始安装。", - QMessageBox.Yes | QMessageBox.No, - QMessageBox.No) + # 创建Sweet Alert风格的确认对话框 + confirm_box = QMessageBox() + confirm_box.setWindowTitle("确认安装") + confirm_box.setIcon(QMessageBox.Question) + confirm_box.setText(f"您确定要安装{self.app_data.get('name', '未知应用')}吗?\n\n点击'确定'开始安装。") + + # 设置字体大小 + font = QFont() + font.setPointSize(10) + confirm_box.setFont(font) + + # 添加按钮 + confirm_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + confirm_box.setDefaultButton(QMessageBox.No) + + # 显示对话框 + reply = confirm_box.exec_() if reply == QMessageBox.Yes: - # 显示开始安装的提示 - InfoBar.success( - title="安装开始", - content=f"{self.app_data.get('name', '未知应用')}安装已开始,请稍候...", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - duration=3000, - parent=self - ) + # 创建Sweet Alert风格的成功提示 + success_box = QMessageBox() + success_box.setWindowTitle("安装开始") + success_box.setIcon(QMessageBox.Information) + success_box.setText(f"{self.app_data.get('name', '未知应用')}安装已开始,请稍候...") + + # 设置字体大小 + font = QFont() + font.setPointSize(10) + success_box.setFont(font) + + # 添加按钮 + success_box.setStandardButtons(QMessageBox.Ok) + + # 显示对话框 + success_box.exec_() # 1. 首先尝试从应用数据中获取直接下载链接 download_url = self.app_data.get('direct_download_url') @@ -688,30 +717,75 @@ class AppDetailWindow(QMainWindow): if not download_url: download_url = self.app_data.get('download_url') - # 3. 如果仍然没有下载链接,尝试通过API获取下载链接 + # 3. 根据新API格式,从versions数组中获取最新版本的file_path + if not download_url and 'versions' in self.app_data and isinstance(self.app_data['versions'], list) and self.app_data['versions']: + # 假设versions数组中第一个版本是最新的 + latest_version = self.app_data['versions'][0] + if isinstance(latest_version, dict) and 'file_path' in latest_version: + download_url = latest_version['file_path'] + + # 4. 如果仍然没有下载链接,尝试通过API获取下载链接 if not download_url: try: # 使用app_id通过API获取下载链接 app_id = self.app_data.get('id') if app_id: download_result = self.api_client.make_request('getdownloadlink', {'id': app_id}) - if isinstance(download_result, dict) and 'success' in download_result and download_result['success']: - download_url = download_result.get('data') + if isinstance(download_result, dict): + # 检查是否是新API格式的响应 + if 'data' in download_result: + if isinstance(download_result['data'], dict) and 'versions' in download_result['data'] and download_result['data']['versions']: + latest_version = download_result['data']['versions'][0] + if isinstance(latest_version, dict) and 'file_path' in latest_version: + download_url = latest_version['file_path'] + # 兼容旧API格式 + elif 'success' in download_result and download_result['success']: + download_url = download_result.get('data') except Exception as e: print(f"获取下载链接API调用失败: {str(e)}") # 4. 如果仍然没有下载链接,显示错误信息 if not download_url: - InfoBar.error( - title="错误", - content="无法获取应用的下载链接,请稍后重试。\n可能原因:API返回数据中缺少下载链接字段。", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - parent=self - ) + show_error_dialog("错误", "无法获取应用的下载链接,请稍后重试。\n可能原因:API返回数据中缺少下载链接字段。") return + # 5. 更健壮的URL处理逻辑 + from urllib.parse import urlparse, quote + import os + + # 检查是否看起来像一个文件名(包含扩展名) + is_filename = False + if '.' in download_url: + # 获取最后一个点后的部分作为扩展名 + extension = download_url.split('.')[-1].lower() + # 常见的应用安装包扩展名 + common_extensions = ['exe', 'apk', 'dmg', 'pkg', 'msi', 'appx', 'deb', 'rpm'] + if extension in common_extensions and len(extension) <= 5: + is_filename = True + + # 如果是文件名或不包含协议,处理为完整URL + if is_filename or not download_url.startswith(('http://', 'https://')): + # 使用基础域名 + base_domain = 'leonmmcoset.jjxmm.win:8010' + + # 对于所有情况,统一使用直链形式,不再使用download.php + # 对文件名/路径进行URL编码,处理空格和特殊字符 + if not download_url.startswith(('http://', 'https://')): + # 使用http协议和基础域名,直接拼接文件名或路径 + encoded_path = quote(download_url) + download_url = f'http://leonmmcoset.jjxmm.win:8010/{encoded_path.lstrip("/")}' + + # 额外检查:确保主机名有效(包含点) + parsed_url = urlparse(download_url) + if '.' not in parsed_url.netloc: + # 如果主机名仍然无效,完全重建URL + base_domain = 'leonmmcoset.jjxmm.win:8010' + path = parsed_url.path or parsed_url.netloc + # 对路径进行URL编码 + encoded_path = quote(path) + # 使用http协议 + download_url = f'http://leonmmcoset.jjxmm.win:8010/{encoded_path.lstrip("/")}' + # 创建进度对话框 self.progress_dialog = QProgressDialog( f"正在下载{self.app_data.get('name', '未知应用')}...", @@ -723,11 +797,31 @@ class AppDetailWindow(QMainWindow): self.progress_dialog.setWindowTitle("正在安装") self.progress_dialog.setMinimumDuration(0) - # 创建临时保存路径 + # 创建保存路径 - 使用代码文件夹所在的install目录 file_extension = ".exe" # 假设是Windows可执行文件 app_name = self.app_data.get('name', '未知应用').replace(' ', '_') - temp_dir = tempfile.gettempdir() - save_path = os.path.join(temp_dir, f"{app_name}_installer{file_extension}") + + # 获取当前脚本所在目录 + import os + current_dir = os.path.dirname(os.path.abspath(__file__)) + # 创建install目录路径 + install_dir = os.path.join(current_dir, 'install') + + # 确保install目录存在 + if not os.path.exists(install_dir): + try: + os.makedirs(install_dir) + except Exception as e: + # 如果创建目录失败,回退到临时目录 + show_error_dialog("创建目录失败", f"无法创建安装目录: {str(e)}\n将使用临时目录") + temp_dir = tempfile.gettempdir() + save_path = os.path.join(temp_dir, f"{app_name}_installer{file_extension}") + else: + # 使用install目录 + save_path = os.path.join(install_dir, f"{app_name}_installer{file_extension}") + else: + # 目录已存在,直接使用 + save_path = os.path.join(install_dir, f"{app_name}_installer{file_extension}") # 创建下载线程 self.download_thread = DownloadThread(download_url, save_path) @@ -749,49 +843,75 @@ class AppDetailWindow(QMainWindow): # 在Windows上,直接运行可执行文件 subprocess.Popen([file_path], shell=True) - # 显示安装成功提示 - InfoBar.success( - title="下载完成", - content=f"安装程序已启动,请按照向导完成安装。\n文件位置:{file_path}", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - duration=5000, - parent=self - ) + # 创建Sweet Alert风格的下载完成提示 + success_box = QMessageBox() + success_box.setWindowTitle("下载完成") + success_box.setIcon(QMessageBox.Information) + success_box.setText(f"安装程序已启动,请按照向导完成安装。\n文件位置:{file_path}") + + # 设置字体大小 + font = QFont() + font.setPointSize(10) + success_box.setFont(font) + + # 添加按钮 + success_box.setStandardButtons(QMessageBox.Ok) + + # 显示对话框 + success_box.exec_() + + # 打开下载文件夹并选中文件 + subprocess.Popen(f'explorer /select,"{file_path}"') except Exception as e: - InfoBar.error( - title="启动安装程序失败", - content=f"无法启动安装程序: {str(e)}\n您可以手动运行文件: {file_path}", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - parent=self - ) + show_error_dialog("启动安装程序失败", f"无法启动安装程序: {str(e)}\n您可以手动运行文件: {file_path}") + + # 即使启动安装程序失败,也尝试打开下载文件夹 + try: + subprocess.Popen(f'explorer /select,"{file_path}"') + except Exception as ex: + show_error_dialog("打开文件夹失败", f"无法打开下载文件夹: {str(ex)}") else: # 其他操作系统 - InfoBar.information( - title="下载完成", - content=f"文件已下载完成。\n\n文件位置:{file_path}\n\n请手动运行安装程序。", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - duration=5000, - parent=self - ) + info_box = QMessageBox() + info_box.setWindowTitle("下载完成") + info_box.setIcon(QMessageBox.Information) + info_box.setText(f"文件已下载完成。\n\n文件位置:{file_path}\n\n请手动运行安装程序。") + + # 设置字体大小 + font = QFont() + font.setPointSize(10) + info_box.setFont(font) + + # 添加按钮 + info_box.setStandardButtons(QMessageBox.Ok) + + # 显示对话框 + info_box.exec_() + + # 打开下载文件夹 + try: + import os + import subprocess + # 获取文件所在目录 + folder_path = os.path.dirname(file_path) + if platform.system() == 'Windows': + # Windows下使用explorer打开文件夹并选中文件 + subprocess.Popen(f'explorer /select,"{file_path}"') + elif platform.system() == 'Darwin': + # macOS下使用open命令打开文件夹 + subprocess.Popen(['open', folder_path]) + else: + # Linux下使用xdg-open打开文件夹 + subprocess.Popen(['xdg-open', folder_path]) + except Exception as e: + show_error_dialog("打开文件夹失败", f"无法打开下载文件夹: {str(e)}") def on_download_error(self, error_msg): """下载错误处理""" self.progress_dialog.reject() - InfoBar.error( - title="安装失败", - content=error_msg, - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.TOP, - parent=self - ) + # 使用Sweet Alert风格弹窗显示错误 + show_error_dialog("安装失败", error_msg) def share_app(self): """分享应用""" @@ -802,7 +922,7 @@ class AppDetailWindow(QMainWindow): # 创建分享链接 app_share_url = f"leonapp://app/{self.app_id}" - web_share_url = f"http://leonmcoset.jjxmm.win:8010/app?id={self.app_id}" + web_share_url = f"http://leonmmcoset.jjxmm.win:8010/app?id={self.app_id}" # 创建自定义对话框 dialog = QMessageBox(self)