#
Junjie
2026-01-15 a2eb2511f620956dbb5d36742f1d0ffda034f090
src/main/webapp/views/index.html
@@ -1,11 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>浙江中扬 - 自动化立体仓库 - WCS</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <link rel="stylesheet" href="../static/layui/css/layui.css" media="all">
  <link rel="stylesheet" href="../static/css/admin.css?v=318" media="all">
  <link rel="stylesheet" href="../static/css/loader.css" media="all">
@@ -13,6 +15,7 @@
    .layui-logo img {
      width: 25px;
    }
    .layui-logo cite {
      font-size: 18px;
      font-weight: 400;
@@ -21,35 +24,49 @@
    /* 弹窗样式 */
    .popup {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(0,0,0,0.5);
        display: none;
        justify-content: center;
        align-items: center;
        z-index: 9999;
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      display: none;
      justify-content: center;
      align-items: center;
      z-index: 9999;
    }
    .popup-content {
        background-color: #fff;
        padding: 20px;
        border-radius: 5px;
        box-shadow: 0px 0px 20px rgba(0,0,0,0.3);
        text-align: center;
      background-color: #fff;
      padding: 20px;
      border-radius: 5px;
      box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
      text-align: center;
    }
    /* AI助手抽屉动画 */
    @keyframes slideInRight {
      from { transform: translate3d(100%, 0, 0); opacity: 0; }
      to { transform: translate3d(0, 0, 0); opacity: 1; }
      from {
        transform: translate3d(100%, 0, 0);
        opacity: 0;
      }
      to {
        transform: translate3d(0, 0, 0);
        opacity: 1;
      }
    }
    @keyframes slideOutRight {
      from { transform: translate3d(0, 0, 0); opacity: 1; }
      to { transform: translate3d(100%, 0, 0); opacity: 0; }
      from {
        transform: translate3d(0, 0, 0);
        opacity: 1;
      }
      to {
        transform: translate3d(100%, 0, 0);
        opacity: 0;
      }
    }
    .ai-drawer-layer {
@@ -64,6 +81,7 @@
    }
  </style>
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
  <!-- 头部 -->
@@ -84,10 +102,11 @@
      </li>
    </ul>
    <ul class="layui-nav layui-layout-right">
<!--      <li class="layui-nav-item" lay-unselect>-->
<!--        <a ew-event="note" title="便签"><i class="layui-icon layui-icon-note"></i></a>-->
<!--      </li>-->
      <li class="layui-nav-item" lay-unselect id="fakeShow" style="display: none;user-select: none;margin-right: 10px;">
      <!--      <li class="layui-nav-item" lay-unselect>-->
      <!--        <a ew-event="note" title="便签"><i class="layui-icon layui-icon-note"></i></a>-->
      <!--      </li>-->
      <li class="layui-nav-item" lay-unselect id="fakeShow"
          style="display: none;user-select: none;margin-right: 10px;">
        <div style="color: red;" id="fakeShowText">仿真模拟运行中</div>
      </li>
      <li class="layui-nav-item" lay-unselect id="licenseShow" style="display: none;user-select: none;">
@@ -125,7 +144,7 @@
  <!-- 底部 -->
  <div class="layui-footer layui-text">
    copyright © 2026 浙江中扬立库技术有限公司 all rights reserved.
    <span class="pull-right">Version 1.0.0</span>
    <span class="pull-right" id="system-version">Version loading...</span>
  </div>
</div>
@@ -137,11 +156,13 @@
<!-- 弹窗内容 -->
<div class="popup" id="popup">
    <div class="popup-content">
        <h2 style="font-size: 28px;margin-bottom: 10px;">许可证即将过期</h2>
        <div id="popup-text" style="font-size: 28px;color: red"></div>
        <button style="background-color: #007bff;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;cursor: pointer;font-size: 16px;" onclick="hidePopup()">关闭</button>
    </div>
  <div class="popup-content">
    <h2 style="font-size: 28px;margin-bottom: 10px;">许可证即将过期</h2>
    <div id="popup-text" style="font-size: 28px;color: red"></div>
    <button
            style="background-color: #007bff;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;cursor: pointer;font-size: 16px;"
            onclick="hidePopup()">关闭</button>
  </div>
</div>
<!-- 右下角SVG动画 -->
@@ -153,7 +174,33 @@
<script type="text/javascript" src="../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../static/js/common.js"></script>
<script>
  console.log('%c 中扬立库平台 %c 1.0.0','background-color:rgb(53,73,94);color: #fff;border-radius:2px 0 0 2px;padding:2px 4px;','background-color:rgb(25,190,107);color: #fff;border-radius:0 2px 2px 0;padding:2px 4px;font: 9pt "Apercu Regular", Georgia, "Times New Roman", Times, serif;');
  // 版本信息变量
  var systemVersion = '...';
  var systemVersionType = '';
  // 加载系统版本信息
  function loadSystemVersion() {
    $.ajax({
      url: baseUrl + "/openapi/getSystemVersion",
      headers: { 'token': localStorage.getItem('token') },
      method: 'GET',
      success: function (res) {
        if (res.code === 200) {
          systemVersion = res.data.version;
          systemVersionType = res.data.versionType;
          var versionTypeLabel = systemVersionType === 'stable' ? '' : ' (' + systemVersionType + ')';
          var versionTypeColor = systemVersionType === 'stable' ? 'rgb(25,190,107)' : 'rgb(245,166,35)';
          // 更新页脚版本显示
          $('#system-version').html('Version ' + systemVersion + '<span style="margin-left:5px;padding:1px 6px;font-size:12px;border-radius:3px;background-color:' + versionTypeColor + ';color:#fff;">' + systemVersionType + '</span>');
          // 控制台输出版本信息
          console.log('%c 中扬立库平台 %c ' + systemVersion + ' %c ' + systemVersionType + ' ', 'background-color:rgb(53,73,94);color: #fff;border-radius:2px 0 0 2px;padding:2px 4px;', 'background-color:rgb(25,190,107);color: #fff;padding:2px 4px;font: 9pt "Apercu Regular", Georgia, "Times New Roman", Times, serif;', 'background-color:' + versionTypeColor + ';color: #fff;border-radius:0 2px 2px 0;padding:2px 4px;font: 9pt "Apercu Regular", Georgia, "Times New Roman", Times, serif;');
        }
      }
    });
  }
  $(function () {
    // 注入AI助手图标
    $('#ai-assistant-btn').html(getAiIconHtml(60, 60));
@@ -161,30 +208,33 @@
    if ("" === localStorage.getItem('token')) {
      top.location.href = baseUrl + "/login";
    }
    // 加载版本信息
    loadSystemVersion();
  });
  // 显示弹窗
  function showPopup(res) {
      document.getElementById('popup').style.display = 'block';
      // 获取弹出窗口内容的容器元素
      var popupText = document.getElementById('popup-text');
      // 假设后台返回的字符串为 responseString
      if (res!==""){
          // 获取当前日期
          const currentDate = new Date();
          // 创建新日期对象并添加天数
          const newDate = new Date();
          newDate.setDate(currentDate.getDate() + res + 1);
          // 将字符串设置为弹窗内容的文本
          popupText.textContent = "许可证将于" + new Intl.DateTimeFormat('zh-CN').format(newDate) + "过期,剩余有效期:" + res + "天!";
      }else {
          document.getElementById('popup').style.display = 'none';
      }
    document.getElementById('popup').style.display = 'block';
    // 获取弹出窗口内容的容器元素
    var popupText = document.getElementById('popup-text');
    // 假设后台返回的字符串为 responseString
    if (res !== "") {
      // 获取当前日期
      const currentDate = new Date();
      // 创建新日期对象并添加天数
      const newDate = new Date();
      newDate.setDate(currentDate.getDate() + res + 1);
      // 将字符串设置为弹窗内容的文本
      popupText.textContent = "许可证将于" + new Intl.DateTimeFormat('zh-CN').format(newDate) + "过期,剩余有效期:" + res + "天!";
    } else {
      document.getElementById('popup').style.display = 'none';
    }
  }
  // 隐藏弹窗
  function hidePopup() {
      document.getElementById('popup').style.display = 'none';
    document.getElementById('popup').style.display = 'none';
  }
  layui.config({
@@ -212,11 +262,11 @@
    function checkFakeStatus() {
      $.ajax({
        url: baseUrl + "/openapi/getFakeSystemRunStatus",
        headers: {'token': localStorage.getItem('token')},
        headers: { 'token': localStorage.getItem('token') },
        method: 'GET',
        success: function (res) {
          if (res.code === 200) {
            if(res.data.isFake) {
            if (res.data.isFake) {
              $("#fakeShow").show()
              let running = res.data.running
              if (running) {
@@ -228,14 +278,14 @@
              if (!fakeStatusInterval) {
                fakeStatusInterval = setInterval(checkFakeStatus, 1000);
              }
            }else {
            } else {
              $("#fakeShow").hide()
              if (fakeStatusInterval) {
                clearInterval(fakeStatusInterval);
                fakeStatusInterval = null;
              }
            }
          }else {
          } else {
            top.location.href = baseUrl + "/login";
          }
        }
@@ -249,14 +299,14 @@
          layer.close(index);
          $.ajax({
            url: baseUrl + "/openapi/stopFakeSystem",
            headers: {'token': localStorage.getItem('token')},
            headers: { 'token': localStorage.getItem('token') },
            method: 'POST',
            success: function (res) {
              if (res.code === 200) {
                layer.msg("仿真模拟已停止", {icon: 1});
                layer.msg("仿真模拟已停止", { icon: 1 });
                $("#fakeShowText").text("仿真模拟未运行")
              } else {
                layer.msg(res.msg, {icon: 2});
                layer.msg(res.msg, { icon: 2 });
              }
            }
          });
@@ -266,14 +316,14 @@
          layer.close(index);
          $.ajax({
            url: baseUrl + "/openapi/startFakeSystem",
            headers: {'token': localStorage.getItem('token')},
            headers: { 'token': localStorage.getItem('token') },
            method: 'POST',
            success: function (res) {
              if (res.code === 200) {
                layer.msg("仿真模拟已启动", {icon: 1});
                layer.msg("仿真模拟已启动", { icon: 1 });
                $("#fakeShowText").text("仿真模拟运行中")
              } else {
                layer.msg(res.msg, {icon: 2});
                layer.msg(res.msg, { icon: 2 });
              }
            }
          });
@@ -283,7 +333,7 @@
    $.ajax({
      url: baseUrl + "/menu/auth",
      headers: {'token': localStorage.getItem('token')},
      headers: { 'token': localStorage.getItem('token') },
      method: 'POST',
      // async: false,
      success: function (res) {
@@ -298,14 +348,14 @@
        } else if (res.code === 403) {
          top.location.href = baseUrl + "/login";
        } else {
          layer.msg(res.msg, {icon: 2});
          layer.msg(res.msg, { icon: 2 });
        }
      }
    });
    $.ajax({
      url: baseUrl + "/license/getLicenseDays",
      headers: {'token': localStorage.getItem('token')},
      headers: { 'token': localStorage.getItem('token') },
      method: 'POST',
      success: function (res) {
        if (res.code == 200) {
@@ -316,9 +366,13 @@
          }
          if (days <= 15) {
             showPopup(days)
            showPopup(days)
          }
        }else {
          if (days < 0) {
            top.location.href = baseUrl + "/login";
          }
        } else {
          top.location.href = baseUrl + "/login";
        }
      }
@@ -326,13 +380,13 @@
    // 默认加载主页
    index.loadHome({
      menuPath: baseUrl+'/views/watch/console.html',
      menuPath: baseUrl + '/views/watch/console.html',
      menuName: '<i class="layui-icon layui-icon-home"></i>'
    });
    $('#username').text(localStorage.getItem('username'));
    $(document).on('click','#logout', function () {
    $(document).on('click', '#logout', function () {
      window.location.href = "login.html";
      localStorage.removeItem('token');
      localStorage.removeItem('username');
@@ -348,66 +402,66 @@
    var aiLayerIndex = null;
    // AI助手图标悬浮提示
    $('#ai-assistant-btn').on('mouseenter', function(){
        this.index = layer.tips('AI助手', this, {
            tips: [1, '#333'], // 上方显示,深色背景
            time: -1 // 不自动关闭
        });
    }).on('mouseleave', function(){
        layer.close(this.index);
    $('#ai-assistant-btn').on('mouseenter', function () {
      this.index = layer.tips('AI助手', this, {
        tips: [1, '#333'], // 上方显示,深色背景
        time: -1 // 不自动关闭
      });
    }).on('mouseleave', function () {
      layer.close(this.index);
    }).on('click', function () {
        // 如果已经打开过且未销毁,直接显示
        if (aiLayerIndex !== null && $('#layui-layer' + aiLayerIndex).length > 0) {
            var $layero = $('#layui-layer' + aiLayerIndex);
            var $shade = $('#layui-layer-shade' + aiLayerIndex);
      // 如果已经打开过且未销毁,直接显示
      if (aiLayerIndex !== null && $('#layui-layer' + aiLayerIndex).length > 0) {
        var $layero = $('#layui-layer' + aiLayerIndex);
        var $shade = $('#layui-layer-shade' + aiLayerIndex);
            // 显示并重置状态
            $shade.show().css('opacity', 0.1);
            $layero.show();
            // 重新触发进入动画
            $layero.removeClass('ai-drawer-layer-close');
            $layero.removeClass('ai-drawer-layer');
            void $layero.get(0).offsetWidth; // 触发重绘
            $layero.addClass('ai-drawer-layer');
            return;
        // 显示并重置状态
        $shade.show().css('opacity', 0.1);
        $layero.show();
        // 重新触发进入动画
        $layero.removeClass('ai-drawer-layer-close');
        $layero.removeClass('ai-drawer-layer');
        void $layero.get(0).offsetWidth; // 触发重绘
        $layero.addClass('ai-drawer-layer');
        return;
      }
      layer.open({
        type: 2,
        title: false, // 隐藏默认标题栏,更简洁
        closeBtn: 0, // 隐藏关闭按钮,点击遮罩关闭
        shadeClose: false, // 改为手动控制关闭,以便播放动画
        shade: 0.1,
        area: ['600px', '100%'],
        offset: 'r', // 右侧悬浮
        anim: -1, // 禁用默认动画,使用CSS动画
        isOutAnim: false,
        skin: 'ai-drawer-layer', // 自定义皮肤
        content: 'ai/diagnosis.html',
        success: function (layero, index) {
          aiLayerIndex = index; // 记录索引
          // 背景模糊效果
          var shadeId = layero.attr('id').replace('layui-layer', 'layui-layer-shade');
          var $shade = $('#' + shadeId);
          $shade.css({
            'backdrop-filter': 'blur(3px)',
            'transition': 'opacity 0.8s'
          });
          // 点击遮罩关闭(带动画)
          $shade.on('click', function () {
            layero.addClass('ai-drawer-layer-close');
            $shade.css('opacity', 0);
            setTimeout(function () {
              // layer.close(index); // 不销毁,改为隐藏
              layero.hide();
              $shade.hide();
            }, 400);
          });
        }
        layer.open({
            type: 2,
            title: false, // 隐藏默认标题栏,更简洁
            closeBtn: 0, // 隐藏关闭按钮,点击遮罩关闭
            shadeClose: false, // 改为手动控制关闭,以便播放动画
            shade: 0.1,
            area: ['600px', '100%'],
            offset: 'r', // 右侧悬浮
            anim: -1, // 禁用默认动画,使用CSS动画
            isOutAnim: false,
            skin: 'ai-drawer-layer', // 自定义皮肤
            content: 'ai/diagnosis.html',
            success: function(layero, index){
                aiLayerIndex = index; // 记录索引
                // 背景模糊效果
                var shadeId = layero.attr('id').replace('layui-layer', 'layui-layer-shade');
                var $shade = $('#' + shadeId);
                $shade.css({
                    'backdrop-filter': 'blur(3px)',
                    'transition': 'opacity 0.8s'
                });
                // 点击遮罩关闭(带动画)
                $shade.on('click', function() {
                    layero.addClass('ai-drawer-layer-close');
                    $shade.css('opacity', 0);
                    setTimeout(function(){
                        // layer.close(index); // 不销毁,改为隐藏
                        layero.hide();
                        $shade.hide();
                    }, 400);
                });
            }
        });
      });
    });
  });
@@ -425,6 +479,5 @@
  {{/each}}
</script>
</body>
</html>
</html>