var appInsLogLevel = ""; function setAppInstallLogLevel() { var level = logLevel.value; fetch("/api/app-install/loglevel", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ level: level }), }) .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } appInsLogLevel = level; }) .catch(function (e) { logLevel.value = appInsLogLevel; }); } function getAppInstallLogLevel() { fetch("/api/app-install/loglevel") .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } return r.json(); }) .then(function (d) { appInsLogLevel = d.log_level; logLevel.value = d.log_level; }) .catch(function (e) { appInsLogLevel = ""; logLevel.value = ""; }); } function downloadAppInstallLogFile(event) { var btn = event.currentTarget; btn.disabled = true; fetch("/api/app-install/logfile") .then(function (r) { if (!r.ok) { throw new Error("HTTP " + r.status); } var disposition = r.headers.get("Content-Disposition"); var filename = "app-install.log.tar.gz"; if (disposition) { var match = disposition.match(/filename="?([^";]+)"?/); if (match) { filename = match[1]; } } return r.blob().then(function (blob) { return { blob: blob, filename: filename }; }); }) .then(function (res) { downloadBlobFile(res.blob, res.filename); alert("下载成功"); }) .catch(function (e) { console.error("download failed:", e); alert("下载失败: " + e.message); }) .finally(function () { btn.disabled = false; btn.textContent = "下载"; }); } function restartAppInstallService(event) { if (!confirm("确定重启应该管理服务吗?")) { return; } var btn = event.currentTarget; btn.disabled = true; fetch("/api/app-install/restart", { method: "POST", }) .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } alert("重启成功"); }) .catch(function (e) { console.error("restart failed:", e); alert("重启失败: " + e.message); }) .finally(function () { btn.disabled = false; }); } var appInsStatusTimer = null; var userAppOperating = false; function getAppInstallStatus() { if (userAppOperating || userAppUploading) { return; } fetch("/api/app-install/status") .then(function (r) { if (!r.ok) { throw new Error("HTTP " + r.status); } return r.json(); }) .then(function (data) { [ "avar1", "avar2", "avar3", "avar4", "bvar1", "bvar2", "bvar3", "bvar4", "bvar5", "cvar1", "cvar2", "cvar3", "cvar4", "cvar5", ].forEach(function (id) { setText(id, data[id], "page6"); }); updateAppInstallButtons(Number(data.state)); }) .catch(function (e) { console.error("getAppInstallStatus() failed:", e); [ "avar1", "avar2", "avar3", "avar4", "bvar1", "bvar2", "bvar3", "bvar4", "bvar5", "cvar1", "cvar2", "cvar3", "cvar4", "cvar5", ].forEach(function (id) { setText(id, null, "page6"); }); updateAppInstallButtons(-1); }); getAppInstallLogLevel(); } function startAppInstallStatusRefresh() { if (appInsStatusTimer) { return; } getAppInstallStatus(); appInsStatusTimer = setInterval(function () { getAppInstallStatus(); }, 5000); } function stopAppInstallStatusRefresh() { if (appInsStatusTimer) { clearInterval(appInsStatusTimer); appInsStatusTimer = null; } } function updateAppInstallButtons(state) { switch (state) { case 0: // 无安装包, 等待上传 setBtnStatus("btn1", true, "page6"); setBtnStatus("btn2", false, "page6"); setBtnStatus("btn3", false, "page6"); setBtnStatus("btn4", false, "page6"); setBtnStatus("btn5", false, "page6"); setBtnStatus("btn6", false, "page6"); break; case 1: // 有安装包, 未安装时 setBtnStatus("btn1", false, "page6"); setBtnStatus("btn2", true, "page6"); setBtnStatus("btn3", true, "page6"); setBtnStatus("btn4", true, "page6"); setBtnStatus("btn5", false, "page6"); setBtnStatus("btn6", false, "page6"); break; case 2: // 有安装包, 已安装时 setBtnStatus("btn1", false, "page6"); setBtnStatus("btn2", true, "page6"); setBtnStatus("btn3", false, "page6"); setBtnStatus("btn4", false, "page6"); setBtnStatus("btn5", true, "page6"); setBtnStatus("btn6", true, "page6"); break; case 4: // 禁用所有, 特殊操作 setBtnStatus("btn1", false, "page6"); setBtnStatus("btn2", false, "page6"); setBtnStatus("btn3", false, "page6"); setBtnStatus("btn4", false, "page6"); setBtnStatus("btn5", false, "page6"); setBtnStatus("btn6", false, "page6"); break; default: setBtnStatus("btn1", true, "page6"); setBtnStatus("btn2", true, "page6"); setBtnStatus("btn3", true, "page6"); setBtnStatus("btn4", true, "page6"); setBtnStatus("btn5", true, "page6"); setBtnStatus("btn6", true, "page6"); break; } } var userAppUploading = false; function onBtn1Click() { if (userAppUploading) { return; } document.getElementById("userAppPkg").click(); } function uploadUserAppPkg(input) { var file = input.files[0]; if (!file) { return; } if (!file.name.toLowerCase().endsWith(".tar.gz")) { alert("只允许上传 tar.gz 类型的文件"); input.value = ""; return; } userAppUploading = true; setBtnStatus("btn1", false, "page6"); var formData = new FormData(); formData.append("file", file); var xhr = new XMLHttpRequest(); xhr.open("POST", "/api/app-install/uploadUserAppPkg", true); xhr.timeout = 600000; // 10分钟 xhr.upload.onprogress = function (e) { if (!e.lengthComputable) { return; } var percent = Math.floor((e.loaded * 100) / e.total); if (percent >= 100) { setText("bvar5", "上传完成,正在处理安装包,请稍候...", "page6"); } else { setText("bvar5", "正在上传 " + file.name + " (" + percent + "%)", "page6"); } }; xhr.onload = function () { if (xhr.status !== 200) { userAppUploading = false; input.value = ""; setText("bvar5", "上传失败: " + xhr.responseText, "page6"); setBtnStatus("btn1", true, "page6"); return; } importUserAppPkg("/tmp/" + file.name).finally(function () { userAppUploading = false; input.value = ""; setBtnStatus("btn1", true, "page6"); }); }; xhr.onerror = function () { userAppUploading = false; input.value = ""; setText("bvar5", "上传失败,请检查网络连接", "page6"); setBtnStatus("btn1", true, "page6"); }; xhr.ontimeout = function () { userAppUploading = false; input.value = ""; setText("bvar5", "上传超时,请稍后重新尝试", "page6"); setBtnStatus("btn1", true, "page6"); }; xhr.send(formData); } function importUserAppPkg(file) { userAppOperating = true; stopAppInstallStatusRefresh(); updateAppInstallButtons(4); setText("bvar5", "正在导入当前上传的安装包,请稍候...", "page6"); return fetch("/api/app-install/importUserAppPkg", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ file: file }), }) .then(function (res) { if (!res.ok) { return res.text().then(function (t) { throw new Error(t); }); } return res.json(); }) .then(function (data) { if (data.result !== "success") { throw new Error("返回结果异常"); } return true; }) .catch(function (err) { setText("bvar5", "导入过程中发生错误: " + err.message, "page6"); return false; }) .finally(function () { userAppOperating = false; startAppInstallStatusRefresh(); }); } function onBtn2Click() { window.location.href = "/api/app-install/downloadUserAppPkg"; } function onBtn3Click() { if (!confirm("确定删除当前已上传的安装包吗?")) { return; } userAppOperating = true; stopAppInstallStatusRefresh(); updateAppInstallButtons(4); setText("bvar5", "正在删除当前已上传的安装包,请稍候...", "page6"); fetch("/api/app-install/removeUserAppPkg", { method: "POST", }) .then(function (res) { if (!res.ok) { return res.text().then(function (t) { throw new Error(t); }); } return res.json(); }) .then(function (data) { if (data.result !== "success") { throw new Error("返回结果异常"); } }) .catch(function (err) { setText("bvar5", "删除过程中发生错误: " + err.message, "page6"); }) .finally(function () { userAppOperating = false; startAppInstallStatusRefresh(); }); } function onBtn4Click() { userAppOperating = true; stopAppInstallStatusRefresh(); updateAppInstallButtons(4); setText("bvar5", "正在使用当前安装包安装用户应用,请稍候...", "page6"); fetch("/api/app-install/installUserApp", { method: "POST", }) .then(function (res) { if (!res.ok) { return res.text().then(function (t) { throw new Error(t); }); } return res.json(); }) .then(function (data) { if (data.result !== "success") { throw new Error("返回结果异常"); } }) .catch(function (err) { setText("bvar5", "安装过程中发生错误: " + err.message, "page6"); }) .finally(function () { userAppOperating = false; startAppInstallStatusRefresh(); }); } function onBtn5Click() { if (!confirm("确定卸载当前已经安装的用户应用吗?")) { return; } userAppOperating = true; stopAppInstallStatusRefresh(); updateAppInstallButtons(4); setText("bvar5", "正在卸载当前已经安装的用户应用,请稍候...", "page6"); fetch("/api/app-install/uninstallUserApp", { method: "POST", }) .then(function (res) { if (!res.ok) { return res.text().then(function (t) { throw new Error(t); }); } return res.json(); }) .then(function (data) { if (data.result !== "success") { throw new Error("返回结果异常"); } }) .catch(function (err) { setText("bvar5", "卸载过程中发生错误: " + err.message, "page6"); }) .finally(function () { userAppOperating = false; startAppInstallStatusRefresh(); }); } function onBtn6Click() { if (!confirm("确定重启当前已经安装的用户应用吗?")) { return; } setBtnStatus("btn6", false, "page6"); fetch("/api/user-app/restart", { method: "POST", }) .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } alert("重启成功"); }) .catch(function (e) { console.error("restart failed:", e); alert("重启失败: " + e.message); }) .finally(function () { setBtnStatus("btn6", true, "page6"); }); } function initPage6() { startAppInstallStatusRefresh(); connectLog("yfkj-app-install.service", "text1"); } function exitPage6() { stopAppInstallStatusRefresh(); disconnectLog(); }