app.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // DOM 加载完成后执行,启动入口:初始化菜单、默认页面加载
  2. document.addEventListener("DOMContentLoaded", function () {
  3. var items = document.querySelectorAll(".menu-item");
  4. function setActive(name) {
  5. items.forEach(function (i) {
  6. i.classList.toggle("active", i.dataset.page === name);
  7. });
  8. }
  9. function bindMenu() {
  10. items.forEach(function (item) {
  11. item.addEventListener("click", function () {
  12. var page = item.dataset.page;
  13. setActive(page);
  14. loadPage(page);
  15. });
  16. });
  17. }
  18. bindMenu();
  19. setActive("page1");
  20. loadPage("page1");
  21. });
  22. function logout() {
  23. disconnectLog(); // 断开日志流连接, 避免在注销后, 日志流可能仍然占用PID资源
  24. window.location.href = "/api/auth/logout";
  25. }
  26. function setIMEI(imei) {
  27. var el = document.getElementById("imei-value");
  28. if (el) {
  29. el.textContent = imei;
  30. }
  31. }
  32. // IMEI 重试间隔: 失败时从 3s 起翻倍, 上限 60s。
  33. // 设备早期(IMEI 文件尚未生成)能快速补上, 若接口长期不可用也不会一直每 3 秒空转。
  34. var imeiRetryDelay = 3000;
  35. function fetchIMEI() {
  36. fetch("/api/device/imei")
  37. .then(function (res) {
  38. if (!res.ok) {
  39. throw new Error("http error");
  40. }
  41. return res.text();
  42. })
  43. .then(function (imei) {
  44. if (!imei || imei.trim() === "") {
  45. throw new Error("empty imei");
  46. }
  47. setIMEI(imei.trim());
  48. imeiRetryDelay = 3000; // 成功一次即复位, 后续偶发失败仍快速重试
  49. })
  50. .catch(function (e) {
  51. setTimeout(fetchIMEI, imeiRetryDelay);
  52. imeiRetryDelay = Math.min(imeiRetryDelay * 2, 60000);
  53. });
  54. }
  55. var sysTimeTimer = null;
  56. function startSysTime() {
  57. if (sysTimeTimer !== null) {
  58. return;
  59. }
  60. function update() {
  61. var el = document.getElementById("sys-time");
  62. if (!el) {
  63. return;
  64. }
  65. var now = new Date();
  66. var year = now.getFullYear();
  67. var month = String(now.getMonth() + 1).padStart(2, "0");
  68. var day = String(now.getDate()).padStart(2, "0");
  69. var hour = String(now.getHours()).padStart(2, "0");
  70. var min = String(now.getMinutes()).padStart(2, "0");
  71. var sec = String(now.getSeconds()).padStart(2, "0");
  72. el.textContent = year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec;
  73. }
  74. update();
  75. sysTimeTimer = setInterval(update, 1000);
  76. }
  77. document.addEventListener("DOMContentLoaded", function () {
  78. startSysTime();
  79. });
  80. function reboot() {
  81. if (!confirm("确定重启设备吗?")) return;
  82. fetch("/api/system/reboot", {
  83. method: "POST",
  84. })
  85. .then(function (r) {
  86. return r.json();
  87. })
  88. .then(function (d) {
  89. if (d.ok) {
  90. alert("设备正在重启...");
  91. setTimeout(logout, 1000);
  92. } else {
  93. alert("重启失败: " + d.error);
  94. }
  95. })
  96. .catch(function (e) {
  97. return alert("请求失败: " + e);
  98. });
  99. }
  100. function loadIMEI() {
  101. fetchIMEI();
  102. }
  103. loadIMEI();
  104. window.onload = function () {
  105. var mask = document.getElementById("loading-mask");
  106. if (mask) {
  107. mask.style.display = "none";
  108. }
  109. };