page6.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. var appInsLogLevel = "";
  2. function setAppInstallLogLevel() {
  3. var level = logLevel.value;
  4. fetch("/api/app-install/loglevel", {
  5. method: "POST",
  6. headers: { "Content-Type": "application/json" },
  7. body: JSON.stringify({ level: level }),
  8. })
  9. .then(function (r) {
  10. if (!r.ok) {
  11. return r.text().then(function (t) {
  12. throw new Error(t);
  13. });
  14. }
  15. appInsLogLevel = level;
  16. })
  17. .catch(function (e) {
  18. logLevel.value = appInsLogLevel;
  19. });
  20. }
  21. function getAppInstallLogLevel() {
  22. fetch("/api/app-install/loglevel")
  23. .then(function (r) {
  24. if (!r.ok) {
  25. return r.text().then(function (t) {
  26. throw new Error(t);
  27. });
  28. }
  29. return r.json();
  30. })
  31. .then(function (d) {
  32. appInsLogLevel = d.log_level;
  33. logLevel.value = d.log_level;
  34. })
  35. .catch(function (e) {
  36. appInsLogLevel = "";
  37. logLevel.value = "";
  38. });
  39. }
  40. function downloadAppInstallLogFile(event) {
  41. var btn = event.currentTarget;
  42. btn.disabled = true;
  43. fetch("/api/app-install/logfile")
  44. .then(function (r) {
  45. if (!r.ok) {
  46. throw new Error("HTTP " + r.status);
  47. }
  48. var disposition = r.headers.get("Content-Disposition");
  49. var filename = "app-install.log.tar.gz";
  50. if (disposition) {
  51. var match = disposition.match(/filename="?([^";]+)"?/);
  52. if (match) {
  53. filename = match[1];
  54. }
  55. }
  56. return r.blob().then(function (blob) {
  57. return { blob: blob, filename: filename };
  58. });
  59. })
  60. .then(function (res) {
  61. downloadBlobFile(res.blob, res.filename);
  62. alert("下载成功");
  63. })
  64. .catch(function (e) {
  65. console.error("download failed:", e);
  66. alert("下载失败: " + e.message);
  67. })
  68. .finally(function () {
  69. btn.disabled = false;
  70. btn.textContent = "下载";
  71. });
  72. }
  73. function restartAppInstallService(event) {
  74. if (!confirm("确定重启应该管理服务吗?")) {
  75. return;
  76. }
  77. var btn = event.currentTarget;
  78. btn.disabled = true;
  79. fetch("/api/app-install/restart", {
  80. method: "POST",
  81. })
  82. .then(function (r) {
  83. if (!r.ok) {
  84. return r.text().then(function (t) {
  85. throw new Error(t);
  86. });
  87. }
  88. alert("重启成功");
  89. })
  90. .catch(function (e) {
  91. console.error("restart failed:", e);
  92. alert("重启失败: " + e.message);
  93. })
  94. .finally(function () {
  95. btn.disabled = false;
  96. });
  97. }
  98. var appInsStatusTimer = null;
  99. var userAppOperating = false;
  100. function getAppInstallStatus() {
  101. if (userAppOperating || userAppUploading) {
  102. return;
  103. }
  104. fetch("/api/app-install/status")
  105. .then(function (r) {
  106. if (!r.ok) {
  107. throw new Error("HTTP " + r.status);
  108. }
  109. return r.json();
  110. })
  111. .then(function (data) {
  112. [
  113. "avar1",
  114. "avar2",
  115. "avar3",
  116. "avar4",
  117. "bvar1",
  118. "bvar2",
  119. "bvar3",
  120. "bvar4",
  121. "bvar5",
  122. "cvar1",
  123. "cvar2",
  124. "cvar3",
  125. "cvar4",
  126. "cvar5",
  127. ].forEach(function (id) {
  128. setText(id, data[id], "page6");
  129. });
  130. updateAppInstallButtons(Number(data.state));
  131. })
  132. .catch(function (e) {
  133. console.error("getAppInstallStatus() failed:", e);
  134. [
  135. "avar1",
  136. "avar2",
  137. "avar3",
  138. "avar4",
  139. "bvar1",
  140. "bvar2",
  141. "bvar3",
  142. "bvar4",
  143. "bvar5",
  144. "cvar1",
  145. "cvar2",
  146. "cvar3",
  147. "cvar4",
  148. "cvar5",
  149. ].forEach(function (id) {
  150. setText(id, null, "page6");
  151. });
  152. updateAppInstallButtons(-1);
  153. });
  154. getAppInstallLogLevel();
  155. }
  156. function startAppInstallStatusRefresh() {
  157. if (appInsStatusTimer) {
  158. return;
  159. }
  160. getAppInstallStatus();
  161. appInsStatusTimer = setInterval(function () {
  162. getAppInstallStatus();
  163. }, 5000);
  164. }
  165. function stopAppInstallStatusRefresh() {
  166. if (appInsStatusTimer) {
  167. clearInterval(appInsStatusTimer);
  168. appInsStatusTimer = null;
  169. }
  170. }
  171. function updateAppInstallButtons(state) {
  172. switch (state) {
  173. case 0: // 无安装包, 等待上传
  174. setBtnStatus("btn1", true, "page6");
  175. setBtnStatus("btn2", false, "page6");
  176. setBtnStatus("btn3", false, "page6");
  177. setBtnStatus("btn4", false, "page6");
  178. setBtnStatus("btn5", false, "page6");
  179. setBtnStatus("btn6", false, "page6");
  180. break;
  181. case 1: // 有安装包, 未安装时
  182. setBtnStatus("btn1", false, "page6");
  183. setBtnStatus("btn2", true, "page6");
  184. setBtnStatus("btn3", true, "page6");
  185. setBtnStatus("btn4", true, "page6");
  186. setBtnStatus("btn5", false, "page6");
  187. setBtnStatus("btn6", false, "page6");
  188. break;
  189. case 2: // 有安装包, 已安装时
  190. setBtnStatus("btn1", false, "page6");
  191. setBtnStatus("btn2", true, "page6");
  192. setBtnStatus("btn3", false, "page6");
  193. setBtnStatus("btn4", false, "page6");
  194. setBtnStatus("btn5", true, "page6");
  195. setBtnStatus("btn6", true, "page6");
  196. break;
  197. case 4: // 禁用所有, 特殊操作
  198. setBtnStatus("btn1", false, "page6");
  199. setBtnStatus("btn2", false, "page6");
  200. setBtnStatus("btn3", false, "page6");
  201. setBtnStatus("btn4", false, "page6");
  202. setBtnStatus("btn5", false, "page6");
  203. setBtnStatus("btn6", false, "page6");
  204. break;
  205. default:
  206. setBtnStatus("btn1", true, "page6");
  207. setBtnStatus("btn2", true, "page6");
  208. setBtnStatus("btn3", true, "page6");
  209. setBtnStatus("btn4", true, "page6");
  210. setBtnStatus("btn5", true, "page6");
  211. setBtnStatus("btn6", true, "page6");
  212. break;
  213. }
  214. }
  215. var userAppUploading = false;
  216. function onBtn1Click() {
  217. if (userAppUploading) {
  218. return;
  219. }
  220. document.getElementById("userAppPkg").click();
  221. }
  222. function uploadUserAppPkg(input) {
  223. var file = input.files[0];
  224. if (!file) {
  225. return;
  226. }
  227. if (!file.name.toLowerCase().endsWith(".tar.gz")) {
  228. alert("只允许上传 tar.gz 类型的文件");
  229. input.value = "";
  230. return;
  231. }
  232. userAppUploading = true;
  233. setBtnStatus("btn1", false, "page6");
  234. var formData = new FormData();
  235. formData.append("file", file);
  236. var xhr = new XMLHttpRequest();
  237. xhr.open("POST", "/api/app-install/uploadUserAppPkg", true);
  238. xhr.timeout = 600000; // 10分钟
  239. xhr.upload.onprogress = function (e) {
  240. if (!e.lengthComputable) {
  241. return;
  242. }
  243. var percent = Math.floor((e.loaded * 100) / e.total);
  244. if (percent >= 100) {
  245. setText("bvar5", "上传完成,正在处理安装包,请稍候...", "page6");
  246. } else {
  247. setText("bvar5", "正在上传 " + file.name + " (" + percent + "%)", "page6");
  248. }
  249. };
  250. xhr.onload = function () {
  251. if (xhr.status !== 200) {
  252. userAppUploading = false;
  253. input.value = "";
  254. setText("bvar5", "上传失败: " + xhr.responseText, "page6");
  255. setBtnStatus("btn1", true, "page6");
  256. return;
  257. }
  258. importUserAppPkg("/tmp/" + file.name).finally(function () {
  259. userAppUploading = false;
  260. input.value = "";
  261. setBtnStatus("btn1", true, "page6");
  262. });
  263. };
  264. xhr.onerror = function () {
  265. userAppUploading = false;
  266. input.value = "";
  267. setText("bvar5", "上传失败,请检查网络连接", "page6");
  268. setBtnStatus("btn1", true, "page6");
  269. };
  270. xhr.ontimeout = function () {
  271. userAppUploading = false;
  272. input.value = "";
  273. setText("bvar5", "上传超时,请稍后重新尝试", "page6");
  274. setBtnStatus("btn1", true, "page6");
  275. };
  276. xhr.send(formData);
  277. }
  278. function importUserAppPkg(file) {
  279. userAppOperating = true;
  280. stopAppInstallStatusRefresh();
  281. updateAppInstallButtons(4);
  282. setText("bvar5", "正在导入当前上传的安装包,请稍候...", "page6");
  283. return fetch("/api/app-install/importUserAppPkg", {
  284. method: "POST",
  285. headers: { "Content-Type": "application/json" },
  286. body: JSON.stringify({ file: file }),
  287. })
  288. .then(function (res) {
  289. if (!res.ok) {
  290. return res.text().then(function (t) {
  291. throw new Error(t);
  292. });
  293. }
  294. return res.json();
  295. })
  296. .then(function (data) {
  297. if (data.result !== "success") {
  298. throw new Error("返回结果异常");
  299. }
  300. return true;
  301. })
  302. .catch(function (err) {
  303. setText("bvar5", "导入过程中发生错误: " + err.message, "page6");
  304. return false;
  305. })
  306. .finally(function () {
  307. userAppOperating = false;
  308. startAppInstallStatusRefresh();
  309. });
  310. }
  311. function onBtn2Click() {
  312. window.location.href = "/api/app-install/downloadUserAppPkg";
  313. }
  314. function onBtn3Click() {
  315. if (!confirm("确定删除当前已上传的安装包吗?")) {
  316. return;
  317. }
  318. userAppOperating = true;
  319. stopAppInstallStatusRefresh();
  320. updateAppInstallButtons(4);
  321. setText("bvar5", "正在删除当前已上传的安装包,请稍候...", "page6");
  322. fetch("/api/app-install/removeUserAppPkg", {
  323. method: "POST",
  324. })
  325. .then(function (res) {
  326. if (!res.ok) {
  327. return res.text().then(function (t) {
  328. throw new Error(t);
  329. });
  330. }
  331. return res.json();
  332. })
  333. .then(function (data) {
  334. if (data.result !== "success") {
  335. throw new Error("返回结果异常");
  336. }
  337. })
  338. .catch(function (err) {
  339. setText("bvar5", "删除过程中发生错误: " + err.message, "page6");
  340. })
  341. .finally(function () {
  342. userAppOperating = false;
  343. startAppInstallStatusRefresh();
  344. });
  345. }
  346. function onBtn4Click() {
  347. userAppOperating = true;
  348. stopAppInstallStatusRefresh();
  349. updateAppInstallButtons(4);
  350. setText("bvar5", "正在使用当前安装包安装用户应用,请稍候...", "page6");
  351. fetch("/api/app-install/installUserApp", {
  352. method: "POST",
  353. })
  354. .then(function (res) {
  355. if (!res.ok) {
  356. return res.text().then(function (t) {
  357. throw new Error(t);
  358. });
  359. }
  360. return res.json();
  361. })
  362. .then(function (data) {
  363. if (data.result !== "success") {
  364. throw new Error("返回结果异常");
  365. }
  366. })
  367. .catch(function (err) {
  368. setText("bvar5", "安装过程中发生错误: " + err.message, "page6");
  369. })
  370. .finally(function () {
  371. userAppOperating = false;
  372. startAppInstallStatusRefresh();
  373. });
  374. }
  375. function onBtn5Click() {
  376. if (!confirm("确定卸载当前已经安装的用户应用吗?")) {
  377. return;
  378. }
  379. userAppOperating = true;
  380. stopAppInstallStatusRefresh();
  381. updateAppInstallButtons(4);
  382. setText("bvar5", "正在卸载当前已经安装的用户应用,请稍候...", "page6");
  383. fetch("/api/app-install/uninstallUserApp", {
  384. method: "POST",
  385. })
  386. .then(function (res) {
  387. if (!res.ok) {
  388. return res.text().then(function (t) {
  389. throw new Error(t);
  390. });
  391. }
  392. return res.json();
  393. })
  394. .then(function (data) {
  395. if (data.result !== "success") {
  396. throw new Error("返回结果异常");
  397. }
  398. })
  399. .catch(function (err) {
  400. setText("bvar5", "卸载过程中发生错误: " + err.message, "page6");
  401. })
  402. .finally(function () {
  403. userAppOperating = false;
  404. startAppInstallStatusRefresh();
  405. });
  406. }
  407. function onBtn6Click() {
  408. if (!confirm("确定重启当前已经安装的用户应用吗?")) {
  409. return;
  410. }
  411. setBtnStatus("btn6", false, "page6");
  412. fetch("/api/user-app/restart", {
  413. method: "POST",
  414. })
  415. .then(function (r) {
  416. if (!r.ok) {
  417. return r.text().then(function (t) {
  418. throw new Error(t);
  419. });
  420. }
  421. alert("重启成功");
  422. })
  423. .catch(function (e) {
  424. console.error("restart failed:", e);
  425. alert("重启失败: " + e.message);
  426. })
  427. .finally(function () {
  428. setBtnStatus("btn6", true, "page6");
  429. });
  430. }
  431. function initPage6() {
  432. startAppInstallStatusRefresh();
  433. connectLog("yfkj-app-install.service", "text1");
  434. }
  435. function exitPage6() {
  436. stopAppInstallStatusRefresh();
  437. disconnectLog();
  438. }