import QtQuick 2.15 import QtQuick.Window 2.15 import QtGraphicalEffects 1.15 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 import QtQuick.Dialogs 1.3 import HuskarUI.Basic 1.0 import QmlTool 1.0 import SSHManager 1.0 import FileTransfer 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 Item { anchors.fill: parent anchors.leftMargin: 1 property string server_ip: "192.168.1.100" // 示例 IP property string server_port: "22" // 示例 IP property string server_user: "root" // 示例 IP property string server_passwd: "123456" // 示例 IP property int page_state: 0 // 页面状态 property string dps_version_ready: "undefine" // dps版本 property string java_p_version_ready: "undefine" // java插件版本 property string java_version_ready: "undefine" // java版本 //安装dps的flag 0需要安装 1需要更新 2不显示 property int dpsInstallationFlag : 2; //安装javap的flag 0需要安装 1需要更新 2不显示 property int javapInstallationFlag : 2; //安装java的flag 0需要安装 1需要更新 2不显示 property int javaInstallationFlag : 2; //我的服务器插件窗口 property var myPluginsWidow: null Component.onCompleted: { GlobalVars.tab_server = this; SSHManager.connectionSuccess.connect(connectionSuccess) SSHManager.connectionFailed.connect(connectionFailed) SSHManager.shellOutput.connect(consoleOutput) FileTransfer.downloadCompleted.connect(downloadCompleted) FileTransfer.downloadProgressChanged.connect(downloadProgressChanged) FileTransfer.uploadCompleted.connect(uploadCompleted) FileTransfer.uploadProgressChanged.connect(uploadProgressChanged) } Component.onDestruction: { // 断开所有信号连接 SSHManager.connectionSuccess.disconnect(connectionSuccess); SSHManager.connectionFailed.disconnect(connectionFailed); SSHManager.shellOutput.disconnect(consoleOutput) FileTransfer.downloadCompleted.disconnect(downloadCompleted) FileTransfer.downloadProgressChanged.disconnect(downloadProgressChanged) FileTransfer.uploadCompleted.disconnect(uploadCompleted) FileTransfer.uploadProgressChanged.disconnect(uploadProgressChanged) } function init(ip, port, user, passwd){ server_ip = ip; server_port = port; server_user = user; server_passwd = passwd; //尝试连接ssh服务器 SSHManager.connectAndStartShell(server_ip, server_port, server_user, server_passwd) } //ssh链接成功的信号 function connectionSuccess(){ GlobalVars.sshConnectServer = server_ip getServerPluginsState(); } //ssh链接失败的信号 function connectionFailed(error){ page_state = 2 } //ssh控制台输出的信号 function consoleOutput(msg){ //如果解压命令执行成功重新拉取版本信息 if(msg.indexOf("DP-S插件解压成功") !== -1 || msg.indexOf("JAVA插件解压成功") !== -1 || msg.indexOf("JAVA安装成功") !== -1){ getServerPluginsState(); } //删除插件成功 else if(msg.indexOf("删除插件成功!")!== -1){ GlobalVars.getServerPlugins(server_ip) GlobalVars.msg_control.success("删除插件成功!"); } } //下载完成的信号 function downloadCompleted(success, message) { if (success) { //如果下载了dps 就上传dps if(message === "dps"){ FileTransfer.postUpload("http://" + server_ip + ":65170/api/uploadfiles","download/dp_s.tar","/rindro/download/","dps") GlobalVars.msg_control.success("DP-S插件本体下载成功!现在准备上传!") } //如果下载javap else if(message === "javap"){ FileTransfer.postUpload("http://" + server_ip + ":65170/api/uploadfiles","download/RT.tar.gz","/rindro/download/","javap") GlobalVars.msg_control.success("JAVA插件本体下载成功!现在准备上传!") } } else { GlobalVars.msg_control.error("错误:" + message) progressobj.visible = false } } //下载进度的信号 function downloadProgressChanged(rate,add){ if(rate)progressobj.currentValue = rate * 100.0; } //上传完成的信号 function uploadCompleted(success, message) { if (success) { //上传完dp_s解压 if(message === "dps"){ GlobalVars.sendPostRequestByIp("http://" + server_ip + ":65170","/api/addrun",{},function(error, response) {}) SSHManager.sendInput("echo '开始解压DP-S插件'") SSHManager.sendInput("sudo tar -xvf /rindro/download/dp_s.tar -C /") SSHManager.sendInput("chmod 777 /dp_s") SSHManager.sendInput("echo -e \"\\033[32mDP-S插件解压成功\\033[0m\"") GlobalVars.msg_control.success("DP-S插件本体上传成功!现在将执行解压操作!在右侧控制台页面出现'DP-S插件解压成功'字样则为安装成功!") progressobj.visible = false dps_version_ready = "undefine" } else if(message === "javap"){ SSHManager.sendInput("echo '开始解压JAVA插件'") SSHManager.sendInput("sudo rm -rf /java_plugin") SSHManager.sendInput("sudo mkdir /java_plugin") SSHManager.sendInput("sudo tar -zxvf /rindro/download/RT.tar.gz -C /java_plugin/") SSHManager.sendInput("grep -q \"cd /java_plugin \n./Restart\" \"/root/run\" || echo \"cd /java_plugin \n./Restart\" >> \"/root/run\" && chmod +x /root/run") SSHManager.sendInput("echo -e \"\\033[32mJAVA插件解压成功\\033[0m\"") GlobalVars.msg_control.success("JAVA插件本体上传成功!现在将执行解压操作!在右侧控制台页面出现'JAVA插件解压成功'字样则为安装成功!") progressobj.visible = false java_p_version_ready = "undefine" } } else { GlobalVars.msg_control.error("错误:" + message) progressobj.visible = false } } //上传进度的信号 function uploadProgressChanged(rate,add){ if(rate)progressobj.currentValue = rate * 100.0; } //获取服务器插件版本 function getServerPluginsState(){ //向网关发送http请求 获取版本 GlobalVars.getServerInfo("http://" + server_ip + ":65170",function(flag,type,info){ //dps插件 if(type === 0){ //如果安装了 if(flag){ dps_version_ready = info.ProjectVersion //需要更新 if(parseFloat(GlobalVars.all_Version.dpsVer) > parseFloat(info.ProjectVersion)){ dpsInstallationFlag = 1 dps_install.visible = true } else dpsInstallationFlag = 2 } //如果没有安装 else { dps_version_ready = "noinstall" dpsInstallationFlag = 0 } } //java插件 else if(type === 1){ //如果安装了 if(flag){ java_p_version_ready = info.ProjectVersion //需要更新 if(parseFloat(GlobalVars.all_Version.jarVer) > parseFloat(info.ProjectVersion)){ javapInstallationFlag = 1 javap_install.visible = true } else javapInstallationFlag = 2 } //如果没有安装 else { java_p_version_ready = "noinstall" javapInstallationFlag = 0 } } //java版本 else if(type === 2){ //如果安装了 if(flag){ java_version_ready = info.ProjectVersion javaInstallationFlag = 2 } //如果没有安装 else { java_version_ready = "noinstall" javaInstallationFlag = 0 } } //连通测试函数 else if(type === 3){ //如果回复了信息才算连接成功 page_state = 1 } }); } FileDialog { id: fileDialog title: "请选择保存路径" selectFolder: true // 选择文件而非文件夹 selectMultiple: false // 不允许多选 property int dtype: 0 onAccepted: { var filePath = fileDialog.fileUrl.toString() var cleanPath = filePath.replace(/^(file:\/{2,3})/, ""); var filename = "客户端插件包.zip"; var filekey = "dps"; if(dtype === 1){ filename = "Yosin.key"; filekey = "dps"; } GlobalVars.downlad_quest_window.addQuest(filename,[ function(quest){ //下载 quest.status = 1; FileTransfer.postDownload(GlobalVars.server_url + "/rindro/download", cleanPath + "/" + filename,{projectName:"通用"},"quest"); }, function(quest){ GlobalVars.msg_control.success(cleanPath + filename + "已下载完成!"); quest.instruction = true }]); } onRejected: { } } property string selectedFilePath: "" //进度条对象 property var progressobj : null //进度 property double progressRate: 0.0 //没加载出来的页面 BusyIndicator { id:loadingpage visible: page_state === 0 anchors.centerIn: parent color: "#FF5722" // 橙色 size: 32 duration: 12000 } //连接错误的页面 Text { visible: page_state === 2 id:errorpage text: "连接服务器失败,请前往个人中心,修改账号密码以测试您的服务器连接!" anchors.centerIn: parent font { pixelSize: 24 family: HusTheme.Primary.fontPrimaryFamily bold: true } color: HusTheme.Primary.colorTextBase } // 新增:服务器信息区域 Rectangle { visible: page_state === 1 id:supage anchors.fill: parent color:"transparent" HusRectangle{ id: top_rect anchors { top: parent.top left: parent.left right: parent.right bottomMargin: 0 topMargin: 4 margins:10 } height: 50 topLeftRadius: 8 topRightRadius: 8 border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" Text { id:server_ip_label anchors.left: parent.left anchors.leftMargin: 20 anchors.verticalCenter: parent.verticalCenter text: "服务器IP:" font { pixelSize: 22 family: HusTheme.Primary.fontPrimaryFamily bold: true } color: HusTheme.Primary.colorTextBase } //用户名 Text { id:username anchors.left: server_ip_label.right anchors.leftMargin: 10 anchors.verticalCenter: parent.verticalCenter text: server_ip font { pixelSize: 14 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } HusButton { text: qsTr("查看我的服务器插件") type: HusButton.Type_Text anchors.right: parent.right anchors.rightMargin: 10 anchors.verticalCenter: parent.verticalCenter onClicked: { if (!myPluginsWidow) { // 创建新窗口 var component = Qt.createComponent("Window_ServerPlugins.qml"); myPluginsWidow = component.createObject(parent); // 绑定关闭时自动销毁 myPluginsWidow.closing.connect(function() { myPluginsWidow.destroy() myPluginsWidow = null // 关键:释放引用 }) } myPluginsWidow.y = GlobalVars.main_Window.y + 90 myPluginsWidow.show() myPluginsWidow.init(server_ip); myPluginsWidow.raise() // 把窗口提到最前面 } } } // 服务器信息卡片 HusRectangle { id:server_info anchors { top: top_rect.bottom left: parent.left right: parent.right topMargin: -2 margins:10 } height: 94 color: "transparent" bottomLeftRadius: 8 bottomRightRadius: 8 border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 antialiasing: true HusButton { id:download_clientplugins text: qsTr("下载双端插件包") type: HusButton.Type_Text anchors.right: parent.right anchors.rightMargin: 10 anchors.bottom:parent.bottom anchors.bottomMargin: 10 onClicked: { fileDialog.dtype = 0 fileDialog.open() } HusToolTip { x: 0 visible: parent.hovered arrowVisible: true text: qsTr("使用双端插件才需要安装,仅使用dps服务端插件不需要安装!") position: HusToolTip.Position_Top } } // DelButton { // id:build_clientplugins_keys // text: qsTr("生成客户端授权Key") // type: DelButton.Type_Text // anchors.right: parent.right // anchors.rightMargin: 10 // anchors.top:download_clientplugins.bottom // anchors.topMargin: 10 // onClicked: { // fileDialog.dtype = 1 // fileDialog.open() // } // } Rectangle{ id:plugins_group anchors.left: parent.left anchors.leftMargin: 10 width:200 height:parent.height color: "transparent" Text { id:state_label_dps anchors.top: parent.top anchors.topMargin: 10 anchors.left: parent.left anchors.leftMargin: 10 text: "DP-S插件状态: " font { pixelSize: 16 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextSecondary } Text { id:state_label_javap anchors.top: state_label_dps.top anchors.topMargin: 27 anchors.left: parent.left anchors.leftMargin: 10 text: "JAVA插件状态: " font { pixelSize: 16 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextSecondary } Text { id:state_label_java anchors.top: state_label_javap.top anchors.topMargin: 27 anchors.left: parent.left anchors.leftMargin: 10 text: "JAVA版本状态: " font { pixelSize: 16 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextSecondary } BusyIndicator { anchors.left: state_label_dps.right anchors.leftMargin: 8 anchors.top: state_label_dps.top anchors.topMargin: 2 visible: dps_version_ready === "undefine" ? true : false color: "#FF5722" // 橙色 size: 18 duration: 12000 } BusyIndicator { anchors.left: state_label_javap.right anchors.leftMargin: 8 anchors.top: state_label_javap.top anchors.topMargin: 2 visible: java_p_version_ready === "undefine" ? true : false color: "#FF5722" // 橙色 size: 18 duration: 12000 } BusyIndicator { anchors.left: state_label_java.right anchors.leftMargin: 8 anchors.top: state_label_java.top anchors.topMargin: 2 visible: java_version_ready === "undefine" ? true : false color: "#FF5722" // 橙色 size: 18 duration: 12000 } HusTag { id:dps_tag anchors.left: state_label_dps.right anchors.leftMargin: 6 anchors.top: state_label_dps.top anchors.topMargin: -2 visible: dps_version_ready != "undefine" ? true : false text: dps_version_ready === "noinstall" ? "未安装" : dps_version_ready presetColor: dps_version_ready === "noinstall" ? "red" : "green" } HusTag { anchors.left: state_label_javap.right anchors.leftMargin: 6 anchors.top: state_label_javap.top anchors.topMargin: -2 visible: java_p_version_ready != "undefine" ? true : false text: java_p_version_ready === "noinstall" ? "未安装" : java_p_version_ready presetColor: java_p_version_ready === "noinstall" ? "red" : "green" } HusTag { anchors.left: state_label_java.right anchors.leftMargin: 6 anchors.top: state_label_java.top anchors.topMargin: -2 visible: java_version_ready != "undefine" ? true : false text: java_version_ready === "noinstall" ? "未安装" : java_version_ready presetColor: java_version_ready === "noinstall" ? "red" : "green" } HusIconButton { id:dps_install anchors.left: plugins_group.left anchors.leftMargin: 200 anchors.top: plugins_group.top anchors.topMargin: 5 visible: dpsInstallationFlag === 2 ? false : true text: dpsInstallationFlag === 1 ? "更新DP-S插件" : "安装DP-S插件" type: HusButton.Type_Text onClicked: { FileTransfer.postDownload(GlobalVars.server_url + "/rindro/download/all", "download/dp_s.tar",{key : "dps"},"dps") visible = false; dps_progress.visible = true; progressobj = dps_progress; } } CustomProgressBar { id:dps_progress anchors.left: dps_install.left anchors.top: dps_install.top anchors.topMargin: 8 visible: false } HusIconButton { id:javap_install anchors.left: plugins_group.left anchors.leftMargin: 200 anchors.top: plugins_group.top anchors.topMargin: 32 visible: javapInstallationFlag === 2 ? false : true text: javapInstallationFlag === 1 ? "更新JAVA插件" : "安装JAVA插件" type: HusButton.Type_Text onClicked: { FileTransfer.postDownload(GlobalVars.server_url + "/rindro/download/all", "download/RT.tar.gz",{key : "javap"},"javap") visible = false; javap_progress.visible = true; progressobj = javap_progress; } } CustomProgressBar { id:javap_progress anchors.left: javap_install.left anchors.top: javap_install.top anchors.topMargin: 8 visible: false } HusIconButton { id:java_install anchors.left: plugins_group.left anchors.leftMargin: 200 anchors.top: plugins_group.top anchors.topMargin: 59 visible: javaInstallationFlag === 0 ? true : false text: "安装JAVA" type: HusButton.Type_Text onClicked: { SSHManager.sendInput("yum install -y java") SSHManager.sendInput("echo -e \"\\033[32mJAVA安装成功\\033[0m\"") } } CustomProgressBar { id:java_progress anchors.left: java_install.left anchors.top: java_install.top anchors.topMargin: 8 visible: false } } } Rectangle{ id:ssh_console // height: parent.height * 0.7 // anchors.fill: parent anchors.top: server_info.bottom anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom anchors.margins: 10 radius: 8 border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" ServerConsole{ anchors.fill:parent } } } }