From 12a3457fe9814e06c16d00e4e9fbc90ab5827262 Mon Sep 17 00:00:00 2001 From: xiaji Date: Sun, 31 Aug 2025 11:07:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=BF=9C=E7=A8=8B=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E7=9A=84=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote_commands_tab.cpython-38.pyc | Bin 7527 -> 10232 bytes app.log | 48 +++++++ main.py | 4 + remote_commands_tab.py | 126 +++++++++++++++++- 4 files changed, 177 insertions(+), 1 deletion(-) diff --git a/__pycache__/remote_commands_tab.cpython-38.pyc b/__pycache__/remote_commands_tab.cpython-38.pyc index 5e92f1cb6fb422880c15ae6c551d6f2fc21357e1..d8835ce47a94df742892d3d3bab12317f1149cf5 100644 GIT binary patch delta 3244 zcmbtW>u(&@6`wmZyPln$efqUoKeCWwx@i&wv`Dq;igzPIor;!J-Gbc3cO36#y}R6* zDY03zfaBnV8X_h<6O^%Psvs1n)K$}#r2W8$_7A8;yIjmPFq7KVAtwBj7-6?vHtb zl_1ZfdUI=JH)*D(~gnixu}Xgrj*?Ue`73Nr?AhAGhy zf5joN40*3O%wxG;L!fsF6%4G|Uxs&72@Nlh`H(3(|e z^3>T`aLmLzKMOtyZIRZid4`U>_DpPy9Jk+#eeZV3Pr^izqePQb0#a063(@$$^(19$- zF@b`i$fBSqrtE>9d*c5E)xZT5NFU~wf}Ulp06Js#N4OJPv_=PE+Ud#R}|~Hc8&>p9JF|vD3-L-8}m9@cgdG zeHrFw>6X}y8ipRV|CxM1DS}oZ?0)-}fsrbOA|CM@qg2K_%LAZ%2(01=lvr>`v&5i_ z)W_i|Ax%*~j7T2Vy2e=zga*ncG${c8xq^^}zk=mA`JBKEL(B8=GrQ4oX?c)&Pt(mM(4n#jY>D<55(~8i3)( zgYJgQqF-c&0up^g<5~9$c;_5o5~e)#f+BRpY=>-rvi*57VZYQJsE&g#0B#tTAKQv=S6mmV z+irWj5y@*3#F~t{DLFD=&4*~?&Dlnr)eBL*t%@&b{nGE;Wp=TcfMNH!y3K3#{mtLM z!-2>a!G-tGw)Sv?aktS_+IJ&>x~=d6OuxQB%V3+r0%@SQ=nNkak>Tgk&HA@%^?$lx z8-@|TxC3$wf9hfQTUF6`jQRk7k`q8OqFq>^7BYRNlvm*j-U}tn2UmRaQbj`Th{#SO z^q}B?Q}+as4?7Xc&sQ|aqi7uW^1N(D!B4En9NjU{WBE9oH-vmo)my1pzLy*Nn$J#u z3*Dh{mVp;(!3u`@+FRbN zYV#zLy7d~l%|h_qnySBivcC9-#))SeXHU4tm-?yKKfZiUZCqGw*vnV1oW1(T<@(DP z8?UTxoqqP?%g^y1YBEIoECbZQUWABqLF5EBliJIsQt3n|Dd5i3!3sHiY_kIHwHf6} zOE-|gYtqkjqb81**w@(xeeO2M&p~D>JK>&f*h`SA=7YVlFndFe$isLE8}bfNwsS;_ zD~qfDG8HgCBkcPza$q delta 817 zcmX|<&ubGw6vyW!*>sX@+N4Q#+uF3mV9H`aBle(GAr!@fv}n;ntHd;kZPGM}v%8{o zpVK&69!`-&<=J<}=^7Z5pMtb}8GoaZ)s3`lt8H6Ft9sWG3I*j8rywj>5=%0ZoPcRL zmptRXOKJdR`6+b)cBG+QffLfv@^V+3)D;oOUE(a^2BAhM%8Xu!@1it=2nHIcu$Gkt zO?Nl-0`xDU*;UGoYDtJPYEhH1%z*qeu%OK2@~yitI0LXKUksfL+GxCI?%vQj2(~D; zEsf#(M{kq#J~@u6tC*IkwMCI!$}R-qAh$jyOfoJKEW#ax5fE9N=DDc0TSZ$m#Hx&@ z4+l$V{$O$<{m`pa+@n~Z7c0i)P4Bg~xdxAK`vEG4}c| D_n5gS diff --git a/app.log b/app.log index cf8d5d6..7da514a 100644 --- a/app.log +++ b/app.log @@ -86,3 +86,51 @@ 2025-08-31 11:02:03.902 | INFO | remote_commands_tab:clone_repository:235 - 克隆仓库 2025-08-31 11:02:03.903 | INFO | remote_commands_tab:run:53 - 执行远程命令: mkdir -p /home/xiaji && cd /home/xiaji && git clone http://192.168.3.241:3000/xiaji/webstatus.git 2025-08-31 11:02:03.914 | ERROR | remote_commands_tab:run:104 - 命令执行失败,退出状态: 128 +2025-08-31 11:04:10.367 | INFO | __main__::56 - 启动应用程序 +2025-08-31 11:04:10.389 | INFO | __main__:__init__:13 - 初始化主窗口 +2025-08-31 11:04:10.390 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:04:10.396 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:04:10.396 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:04:10.396 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:04:10.397 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:04:10.399 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:04:10.402 | INFO | remote_commands_tab:init_ui:226 - 远程命令标签页UI初始化完成 +2025-08-31 11:04:10.402 | INFO | __main__:__init__:32 - 主窗口初始化完成 +2025-08-31 11:04:11.854 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:04:11.954 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:04:13.472 | INFO | __main__:on_tab_changed:35 - 标签页切换到: 1 +2025-08-31 11:04:13.473 | INFO | remote_commands_tab:set_ssh_client:229 - 设置SSH客户端 +2025-08-31 11:04:13.474 | INFO | remote_commands_tab:set_server_config:240 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 11:04:13.475 | INFO | remote_commands_tab:refresh_directory:329 - 刷新目录列表 +2025-08-31 11:04:13.477 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 11:04:13.486 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 11:04:18.574 | INFO | remote_commands_tab:refresh_directory:329 - 刷新目录列表 +2025-08-31 11:04:18.576 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 11:04:18.584 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 11:05:13.449 | INFO | __main__::56 - 启动应用程序 +2025-08-31 11:05:13.473 | INFO | __main__:__init__:13 - 初始化主窗口 +2025-08-31 11:05:13.474 | INFO | server_connection_tab:__init__:14 - 初始化服务器连接标签页 +2025-08-31 11:05:13.482 | INFO | server_connection_tab:init_ui:93 - 服务器连接标签页UI初始化完成 +2025-08-31 11:05:13.482 | INFO | server_connection_tab:load_config:96 - 加载配置文件 +2025-08-31 11:05:13.482 | INFO | server_connection_tab:load_config:103 - 成功加载配置文件: c:\Users\xiaji\Documents\个人文件夹\夏骥\桌面部署\config.json +2025-08-31 11:05:13.484 | INFO | server_connection_tab:on_alias_changed:122 - 选择别名: 测试机 +2025-08-31 11:05:13.485 | INFO | remote_commands_tab:__init__:116 - 初始化远程命令标签页 +2025-08-31 11:05:13.486 | INFO | remote_commands_tab:init_ui:229 - 远程命令标签页UI初始化完成 +2025-08-31 11:05:13.486 | INFO | __main__:__init__:32 - 主窗口初始化完成 +2025-08-31 11:05:25.546 | INFO | server_connection_tab:connect_to_server:188 - 尝试连接服务器 +2025-08-31 11:05:25.636 | INFO | server_connection_tab:connect_to_server:207 - 成功连接到服务器: 192.168.3.157 +2025-08-31 11:05:28.431 | INFO | __main__:on_tab_changed:35 - 标签页切换到: 1 +2025-08-31 11:05:28.432 | INFO | remote_commands_tab:set_ssh_client:232 - 设置SSH客户端 +2025-08-31 11:05:28.433 | INFO | remote_commands_tab:set_server_config:243 - 设置服务器配置: git_url=http://192.168.3.241:3000/xiaji/webstatus.git, remote_dir=/home/xiaji +2025-08-31 11:05:28.433 | INFO | remote_commands_tab:refresh_directory:332 - 刷新目录列表 +2025-08-31 11:05:28.433 | INFO | remote_commands_tab:refresh_directory:344 - 使用用户输入目录: /home/xiaji +2025-08-31 11:05:28.435 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji && pwd && ls -la +2025-08-31 11:05:28.447 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji && pwd && ls -la +2025-08-31 11:05:38.554 | INFO | remote_commands_tab:refresh_directory:332 - 刷新目录列表 +2025-08-31 11:05:38.555 | INFO | remote_commands_tab:refresh_directory:344 - 使用用户输入目录: /home/xiaji/statuspage +2025-08-31 11:05:38.556 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji/statuspage && pwd && ls -la +2025-08-31 11:05:38.563 | ERROR | remote_commands_tab:run:104 - 命令执行失败,退出状态: 1 +2025-08-31 11:06:07.009 | INFO | remote_commands_tab:refresh_directory:332 - 刷新目录列表 +2025-08-31 11:06:07.010 | INFO | remote_commands_tab:refresh_directory:344 - 使用用户输入目录: /home/xiaji/webstatus +2025-08-31 11:06:07.011 | INFO | remote_commands_tab:run:53 - 执行远程命令: cd /home/xiaji/webstatus && pwd && ls -la +2025-08-31 11:06:07.020 | INFO | remote_commands_tab:run:101 - 命令执行成功: cd /home/xiaji/webstatus && pwd && ls -la diff --git a/main.py b/main.py index 9f52dc2..ee27901 100644 --- a/main.py +++ b/main.py @@ -46,6 +46,10 @@ class MainWindow(QMainWindow): git_url = server_config.get("git_url", "") remote_dir = server_config.get("remote_dir", "") self.remote_commands_tab.set_server_config(git_url, remote_dir) + else: + # 如果没有配置远程目录,初始化为默认目录 + self.remote_commands_tab.current_dir_display.setText("~") + self.remote_commands_tab.refresh_directory() if __name__ == "__main__": logger.add("app.log", rotation="10 MB") diff --git a/remote_commands_tab.py b/remote_commands_tab.py index 88b6997..e5174ad 100644 --- a/remote_commands_tab.py +++ b/remote_commands_tab.py @@ -161,6 +161,51 @@ class RemoteCommandsTab(QWidget): git_group.setLayout(git_layout) main_layout.addWidget(git_group) + # 目录管理组 + dir_group = QGroupBox("目录管理") + dir_layout = QVBoxLayout() + + # 当前目录显示 + current_dir_layout = QHBoxLayout() + current_dir_layout.addWidget(QLabel("当前目录:")) + self.current_dir_display = QLineEdit() + # 允许用户输入当前目录路径 + # self.current_dir_display.setReadOnly(True) + # 添加回车键刷新目录功能 + self.current_dir_display.returnPressed.connect(self.refresh_directory) + current_dir_layout.addWidget(self.current_dir_display) + + # 刷新目录按钮 + self.refresh_dir_button = QPushButton("刷新目录") + self.refresh_dir_button.clicked.connect(self.refresh_directory) + current_dir_layout.addWidget(self.refresh_dir_button) + + dir_layout.addLayout(current_dir_layout) + + # 目录列表 + dir_list_layout = QHBoxLayout() + dir_list_layout.addWidget(QLabel("目录内容:")) + self.dir_list_text = QTextEdit() + self.dir_list_text.setReadOnly(True) + self.dir_list_text.setMaximumHeight(150) + dir_list_layout.addWidget(self.dir_list_text) + dir_layout.addLayout(dir_list_layout) + + # 删除目录 + delete_dir_layout = QHBoxLayout() + delete_dir_layout.addWidget(QLabel("删除目录:")) + self.delete_dir_input = QLineEdit() + delete_dir_layout.addWidget(self.delete_dir_input) + + self.delete_dir_button = QPushButton("删除目录") + self.delete_dir_button.clicked.connect(self.delete_directory) + delete_dir_layout.addWidget(self.delete_dir_button) + + dir_layout.addLayout(delete_dir_layout) + + dir_group.setLayout(dir_layout) + main_layout.addWidget(dir_group) + # 命令输出区域 output_group = QGroupBox("命令输出") output_layout = QVBoxLayout() @@ -198,6 +243,11 @@ class RemoteCommandsTab(QWidget): logger.info(f"设置服务器配置: git_url={git_url}, remote_dir={remote_dir}") self.repo_url_input.setText(git_url) self.remote_dir_display.setText(remote_dir) + + # 如果设置了远程目录,也设置为当前目录 + if remote_dir: + self.current_dir_display.setText(remote_dir) + self.refresh_directory() def install_git(self): logger.info("安装Git") @@ -269,7 +319,81 @@ class RemoteCommandsTab(QWidget): self.status_label.setText(message) self.status_label.setStyleSheet("color: green;") QMessageBox.information(self, "成功", message) + + # 如果是目录相关操作,刷新目录列表 + if "删除" in message or "目录" in message: + self.refresh_directory() else: self.status_label.setText(message) self.status_label.setStyleSheet("color: red;") - QMessageBox.warning(self, "错误", message) \ No newline at end of file + QMessageBox.warning(self, "错误", message) + + def refresh_directory(self): + logger.info("刷新目录列表") + + if not self.ssh_client: + QMessageBox.warning(self, "警告", "请先连接到服务器") + return + + current_dir = self.current_dir_display.text().strip() + if not current_dir: + current_dir = "~" # 默认用户主目录 + self.current_dir_display.setText(current_dir) + logger.info(f"使用默认目录: {current_dir}") + else: + logger.info(f"使用用户输入目录: {current_dir}") + + self.status_label.setText("正在刷新目录列表...") + + # 创建并启动线程执行命令 + command = f"cd {current_dir} && pwd && ls -la" + self.command_thread = RemoteCommandThread(self.ssh_client, command) + self.command_thread.output_signal.connect(self.append_dir_output) + self.command_thread.finished_signal.connect(self.on_dir_refresh_finished) + self.command_thread.start() + + def append_dir_output(self, text): + self.dir_list_text.append(text) + + def on_dir_refresh_finished(self, success, message): + if success: + self.status_label.setText("目录列表已刷新") + self.status_label.setStyleSheet("color: green;") + else: + self.status_label.setText("刷新目录列表失败") + self.status_label.setStyleSheet("color: red;") + QMessageBox.warning(self, "错误", f"刷新目录列表失败: {message}") + + def delete_directory(self): + logger.info("删除目录") + + if not self.ssh_client: + QMessageBox.warning(self, "警告", "请先连接到服务器") + return + + dir_to_delete = self.delete_dir_input.text().strip() + if not dir_to_delete: + QMessageBox.warning(self, "警告", "请输入要删除的目录名") + return + + current_dir = self.current_dir_display.text().strip() + if not current_dir: + current_dir = "~" + + # 确认删除 + reply = QMessageBox.question(self, "确认删除", + f"确定要删除目录 '{current_dir}/{dir_to_delete}' 及其所有内容吗?\n此操作不可撤销!", + QMessageBox.Yes | QMessageBox.No, QMessageBox.No) + + if reply == QMessageBox.No: + return + + self.output_text.clear() + self.status_label.setText("正在删除目录...") + + # 创建并启动线程执行命令 + command = f"cd {current_dir} && rm -rf {dir_to_delete}" + self.command_thread = RemoteCommandThread(self.ssh_client, command) + self.command_thread.output_signal.connect(self.append_output) + self.command_thread.finished_signal.connect(self.on_command_finished) + self.command_thread.start() \ No newline at end of file