whychdw
2021-09-08 d875f00dc2103a659704e5671c8692b23f525bf6
提交内容
5个文件已添加
7个文件已修改
2582 ■■■■■ 已修改文件
src/App.vue 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/tools/getPageMenu.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/FlexLayout.vue 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/alarmMager/alarm-dispatch.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/alarmMager/components/admin-view.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/alarmMager/components/alarm-bill-type.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/alarmMager/components/maintncer-view.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/alarmMager/components/wait-dispatch-alarm.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/home.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login.vue 1040 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/routes.js 1068 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -1,69 +1,79 @@
<template>
  <div id="app" class='el-science-blue'>
  <div id="app" class="el-science-blue" :class="getClass">
    <router-view ref="routerView"></router-view>
  </div>
</template>
<script>
  let link;
  export default {
    name: 'App',
    data() {
let link;
export default {
  name: "App",
  data() {
    return {
      fullScreen: false,
    };
  },
  watch: {
    "$store.state.ukey.connect"(isConnet) {
      this.$store.dispatch("ukey/checkIsIn", isConnet);
    },
    "$store.state.ukey.isIn"(isIn) {
      this.$store.dispatch("ukey/changeId", isIn);
    },
    "$store.state.theme.activeSkin"(val) {
      if (val == "science-blue") {
        link.href = "./theme/science-blue.css";
      } else if (val == "science-green") {
        link.href = "./theme/science-green.css";
      } else if (val == "science-black") {
        link.href = "./theme/science-black.css";
      }
      let iframes = this.$refs.routerView.$el.getElementsByTagName("iframe");
      for (let i = 0; i < iframes.length; i++) {
        iframes[i].contentDocument.getElementById("theme").href = link.href;
      }
    },
  },
  mounted() {
    // 启动ukey监控
    this.$store.dispatch("ukey/load", true);
    require("./assets/css/m-elementui.css");
    this.appenCss();
    require("./assets/css/basic.css");
    require("./assets/css/common.css");
  },
  methods: {
    appenCss() {
      link = document.createElement("link");
      link.type = "text/css";
      link.id = "theme";
      link.rel = "stylesheet";
      if (this.$store.state.theme.activeSkin == "science-blue") {
        link.href = "./theme/science-blue.css";
      } else if (this.$store.state.theme.activeSkin == "science-green") {
        link.href = "./theme/science-green.css";
      } else if (this.$store.state.theme.activeSkin == "science-black") {
        link.href = "./theme/science-black.css";
      }
      document.getElementsByTagName("head")[0].appendChild(link);
    },
  },
  computed: {
    getClass() {
      return {
        fullScreen: false,
      }
        "no-bg": this.$route.path == "/home" ? false : true,
      };
    },
    watch: {
      "$store.state.ukey.connect"(isConnet) {
        this.$store.dispatch("ukey/checkIsIn", isConnet);
      },
      "$store.state.ukey.isIn"(isIn) {
        this.$store.dispatch('ukey/changeId', isIn);
      },
      "$store.state.theme.activeSkin"(val) {
        if (val == 'science-blue') {
          link.href = './theme/science-blue.css';
        } else if (val == 'science-green') {
          link.href = './theme/science-green.css';
        } else if (val == 'science-black') {
          link.href = './theme/science-black.css';
        }
        let iframes = this.$refs.routerView.$el.getElementsByTagName("iframe");
        for (let i = 0; i < iframes.length; i++) {
          iframes[i].contentDocument.getElementById("theme").href = link.href;
        }
      }
    },
    mounted() {
      // 启动ukey监控
      this.$store.dispatch('ukey/load', true);
      require('./assets/css/m-elementui.css');
      this.appenCss();
      require('./assets/css/basic.css');
      require('./assets/css/common.css');
    },
    methods: {
      appenCss() {
        link = document.createElement('link');
        link.type = 'text/css';
        link.id = "theme";
        link.rel = 'stylesheet';
        if (this.$store.state.theme.activeSkin == 'science-blue') {
          link.href = './theme/science-blue.css';
        } else if (this.$store.state.theme.activeSkin == 'science-green') {
          link.href = './theme/science-green.css';
        } else if (this.$store.state.theme.activeSkin == 'science-black') {
          link.href = './theme/science-black.css';
        }
        document.getElementsByTagName("head")[0].appendChild(link);
      },
    }
  }
  },
};
</script>
<style>
  #app {
    box-sizing: border-box;
    height: 100vh;
  }
</style>
#app {
  box-sizing: border-box;
  height: 100vh;
}
#app.no-bg {
  background-image: none;
}
</style>
src/assets/js/tools/getPageMenu.js
@@ -290,6 +290,17 @@
            level: 1,
            childrens: [
                {
                    label: "告警派单管理",
                    name: "alarmDispatch",
                    src: "#/alarmDispatch",
                    closable: true,
                    id: 4012,
                    menuId: 4,
                    enableduse: true,
                    ord: 12,
                    level: 2,
                },
                {
                    label: "电源实时告警",
                    name: "powerRealtimeInfo",
                    src: "#/powerRealtimeInfo",
@@ -422,7 +433,7 @@
                    ord: 11,
                    level: 2,
                }
                // 最大ord=11
                // 最大ord=12
            ]
        },
        {
src/components/FlexLayout.vue
@@ -1,78 +1,79 @@
<template>
    <div
        class="flex-layout" :class=getRootClass :style="getRootStyle"
        v-loading="loading"
        element-loading-text="拼命加载中"
        element-loading-spinner="el-icon-loading"
        element-loading-background="rgba(0, 0, 0, 0.2)">
        <div class="flex-layout-header">
            <slot name="header"></slot>
        </div>
        <div class="flex-layout-body" :class="{'no-bg': noBg}">
            <slot></slot>
        </div>
        <div class="flex-layout-footer">
            <slot name="footer"></slot>
        </div>
  <div
    class="flex-layout"
    :class="getRootClass"
    :style="getRootStyle"
    v-loading="loading"
    element-loading-text="拼命加载中"
    element-loading-spinner="el-icon-loading"
    element-loading-background="rgba(0, 0, 0, 0.2)"
  >
    <div class="flex-layout-header">
      <slot name="header"></slot>
    </div>
    <div class="flex-layout-body" :class="{ 'no-bg': noBg }">
      <slot></slot>
    </div>
    <div class="flex-layout-footer">
      <slot name="footer"></slot>
    </div>
  </div>
</template>
<script>
export default {
    props: {
        direction: {
            type: String,
            default: '',
        },
        height: {
            type: String,
            default: "100%",
        },
        noBg: {
            type: Boolean,
            default: false
        },
        loading: {
            type: Boolean,
            default: false,
        }
  props: {
    direction: {
      type: String,
      default: "",
    },
    computed: {
        getRootClass: function() {
            return {
               'direction-row':  this.direction == 'row'?true: false
            };
        },
        getRootStyle: function() {
            return {
                'height': this.height,
            }
        },
    }
}
    height: {
      type: String,
      default: "100%",
    },
    noBg: {
      type: Boolean,
      default: false,
    },
    loading: {
      type: Boolean,
      default: false,
    },
  },
  computed: {
    getRootClass: function() {
      return {
        "direction-row": this.direction == "row" ? true : false,
      };
    },
    getRootStyle: function() {
      return {
        height: this.height,
      };
    },
  },
};
</script>
<style scoped>
.flex-layout {
    display: flex;
    flex-direction: column;
    height: 100%;
  display: flex;
  flex-direction: column;
  height: 100%;
}
.flex-layout.direction-row {
    flex-direction: row;
  flex-direction: row;
}
.flex-layout.full-ht {
    height: 100%;
  height: 100%;
}
.flex-layout-body {
    flex: 1;
    overflow-x: hidden;
    overflow-y: auto;
  flex: 1;
  overflow-x: hidden;
  overflow-y: auto;
}
.flex-layout-body.no-bg {
    background-color: #05227200;
  background-color: #05227200;
}
</style>
src/pages/alarmMager/alarm-dispatch.vue
New file
@@ -0,0 +1,27 @@
<template>
  <content-box class="page-root" title="派单管理">
    <admin-view v-if="userPower"></admin-view>
    <maintncer-view v-else></maintncer-view>
  </content-box>
</template>
<script>
import ContentBox from "@/components/ContentBox";
import AdminView from "./components/admin-view.vue";
import maintncerView from "@/pages/alarmMager/components/maintncer-view.vue";
export default {
  components: {
    ContentBox,
    AdminView,
    maintncerView,
  },
  data() {
    let userPower = sessionStorage.getItem("userPower");
    return {
      userPower: 1,
    };
  },
};
</script>
<style scoped></style>
src/pages/alarmMager/components/admin-view.vue
New file
@@ -0,0 +1,59 @@
<template>
  <el-tabs v-model="acTabs" tab-position="left" style="height: 100%;">
    <el-tab-pane label="待派发">
      <alarm-bill-type></alarm-bill-type>
    </el-tab-pane>
    <el-tab-pane label="已派发"></el-tab-pane>
    <el-tab-pane label="待审核"></el-tab-pane>
    <el-tab-pane label="已完成"></el-tab-pane>
  </el-tabs>
</template>
<script>
import alarmBillType from "@/pages/alarmMager/components/alarm-bill-type";
export default {
  components: {
    alarmBillType,
  },
  data() {
    return {
      acTabs: 0,
      waitHandOut: {
        data: [],
        page: {
          pageSize: 10,
          pageCurr: 0,
        },
      },
      handOuted: {
        data: [],
        page: {
          pageSize: 10,
          pageCurr: 0,
        },
      },
      waitVerity: {
        data: [],
        page: {
          pageSize: 10,
          pageCurr: 0,
        },
      },
      finishedInfo: {
        data: [],
        page: {
          pageSize: 10,
          pageCurr: 0,
        },
      },
    };
  },
  methods: {
    searchData() {},
  },
  mounted() {},
  beforeDestroy() {},
};
</script>
<style scoped></style>
src/pages/alarmMager/components/alarm-bill-type.vue
New file
@@ -0,0 +1,81 @@
<template>
  <flex-layout no-bg>
    <div class="flex-page-content">
      <el-table stripe size="small" :data="data" height="100%">
        <el-table-column
          prop="UDepartment"
          align="center"
          label="维护区"
        ></el-table-column>
        <el-table-column
          prop="UDepartment"
          align="center"
          label="维护区"
        ></el-table-column>
        <el-table-column
          prop="UDepartment"
          align="center"
          label="维护区"
        ></el-table-column>
        <el-table-column
          prop="UDepartment"
          align="center"
          label="维护区"
        ></el-table-column>
        <el-table-column
          prop="UDepartment"
          align="center"
          label="维护区"
        ></el-table-column>
      </el-table>
    </div>
    <div class="flex-page-footer" slot="footer">
      <el-pagination
        size="mini"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="page.pageCurr"
        :page-sizes="[10, 20, 30, 50, 100]"
        :page-size="page.pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="totalNum"
      ></el-pagination>
    </div>
  </flex-layout>
</template>
<script>
export default {
  props: {
    note: {
      type: Number,
      default: 1,
    },
  },
  data() {
    return {
      data: [],
      page: {
        pageSize: 10,
        pageCurr: 0,
      },
      totalNum: 0,
    };
  },
  methods: {
    queryData() {},
    // 显示条数改变时
    handleSizeChange(val) {
      this.page.pageSize = val;
      this.queryData();
    },
    // 翻页
    handleCurrentChange(val) {
      this.page.pageCurr = val;
      this.queryData();
    },
  },
};
</script>
<style scoped></style>
src/pages/alarmMager/components/maintncer-view.vue
New file
@@ -0,0 +1,18 @@
<template>
  <el-tabs v-model="acTabs" tab-position="left" style="height: 100%;">
    <el-tab-pane label="全部"> </el-tab-pane>
    <el-tab-pane label="待处理"> </el-tab-pane>
    <el-tab-pane label="处理中"> </el-tab-pane>
    <el-tab-pane label="已完成"> </el-tab-pane>
  </el-tabs>
</template>
<script>
export default {
  data() {
    return {};
  },
};
</script>
<style scoped></style>
src/pages/alarmMager/components/wait-dispatch-alarm.vue
New file
@@ -0,0 +1,21 @@
<template>
  <el-table stripe size="small" :data="data" height="100%">
    <el-table-column
      prop="battGroupId"
      align="center"
      label="电池组ID"
    ></el-table-column>
  </el-table>
</template>
<script>
export default {
  data() {
    return {
      data: [],
    };
  },
};
</script>
<style scoped></style>
src/pages/home.vue
@@ -1,5 +1,5 @@
<template>
  <flex-layout class="page-home">
  <flex-layout class="page-home" no-bg>
    <page-header
      slot="header"
      :class="{ 'show-drawer': drawer }"
src/pages/login.vue
@@ -1,579 +1,659 @@
<template>
    <div class="login-wrapper">
        <div class="login_container">
            <div class="sliderCon">
                <div class="logo">
                    <img :src="logoUrl" class="logoImg">
                    {{ platformName }}
                </div>
                <img src="../assets/images/login-img.png" class="picImg">
            </div>
            <div class="login_box">
                <div class="title">用户登录</div>
                <!--  登录表单区 -->
                <el-form label-width="0px" class="login_from" :model="loginForm" ref="loginFormRef">
                    <!-- 用户名 -->
                    <el-form-item prop="username">
                        <el-input class="input" v-model="loginForm.username" prefix-icon="el-icon-user"
                                  @keyup.enter.native.stop="onSubmit"></el-input>
                    </el-form-item>
                    <!-- 密码 -->
                    <el-form-item prop="password">
                        <el-input class="input" v-model="loginForm.password" prefix-icon="el-icon-lock" type="password"
                                  @keyup.enter.native.stop="onSubmit"></el-input>
                    </el-form-item>
                    <el-form-item class="btns">
                        <el-button :loading="loading" type="primary" @click="onSubmit" class="loginBtn">登录</el-button>
                    </el-form-item>
                    <el-form-item v-if="!register">
                        <a href="javascript:;" @click="license.show = true"
                           class="regBtn">平台注册</a>
                    </el-form-item>
                    <el-form-item v-else>
                        <a href="javascript:;" class="regBtn">已激活</a>
                    </el-form-item>
                </el-form>
            </div>
            <!-- license弹框输入面板 -->
            <el-dialog
                title="平台注册提示" width="600px"
                :visible.sync="license.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <add-license v-if="license.show" :visible.sync="license.show"></add-license>
            </el-dialog>
            <!-- 人脸登陆 -->
            <el-dialog
                title="人脸登陆" width="480px"
                :visible.sync="face.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <face-login v-if="face.show" :visible.sync="face.show" @success="checkServeLicense"></face-login>
            </el-dialog>
            <!-- 功能描述 -->
            <el-dialog
                title="配置清单" width="960px"
                :visible.sync="config.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <config-info></config-info>
            </el-dialog>
            <!--  uKey的验证 -->
            <el-dialog
                title="uKey绑定" width="750px"
                :visible.sync="uKey.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <ukey-bind v-if="uKey.show" :visible.sync="uKey.show"></ukey-bind>
            </el-dialog>
            <div class="tools-container">
                <div class="tools-item" :class="uKeyState" v-if="$CFG.uKey.value" @click="uKey.show=true">
                    <span class="iconfont el-icon-CombinedShape"></span>
                </div>
                <div class="tools-item" v-if="$CFG.face.value" @click="face.show=true">
                    <span class="iconfont el-icon-renlianshibie"></span>
                </div>
                <div class="tools-item" @click="config.show=true">
                    <span class="iconfont el-icon-peizhi"></span>
                </div>
            </div>
  <div class="login-wrapper">
    <div class="login_container">
      <div class="sliderCon">
        <div class="logo">
          <img :src="logoUrl" class="logoImg" />
          {{ platformName }}
        </div>
        <div class="copy-right" v-if="copyRight.value">
            {{copyRight.data}}
        <img src="../assets/images/login-img.png" class="picImg" />
      </div>
      <div class="login_box">
        <div class="title">用户登录</div>
        <!--  登录表单区 -->
        <el-form
          label-width="0px"
          class="login_from"
          :model="loginForm"
          ref="loginFormRef"
        >
          <!-- 用户名 -->
          <el-form-item prop="username">
            <el-input
              class="input"
              v-model="loginForm.username"
              prefix-icon="el-icon-user"
              @keyup.enter.native.stop="onSubmit"
            ></el-input>
          </el-form-item>
          <!-- 密码 -->
          <el-form-item prop="password">
            <el-input
              class="input"
              v-model="loginForm.password"
              prefix-icon="el-icon-lock"
              type="password"
              @keyup.enter.native.stop="onSubmit"
            ></el-input>
          </el-form-item>
          <el-form-item class="btns">
            <el-button
              :loading="loading"
              type="primary"
              @click="onSubmit"
              class="loginBtn"
              >登录</el-button
            >
          </el-form-item>
          <el-form-item v-if="!register">
            <a href="javascript:;" @click="license.show = true" class="regBtn"
              >平台注册</a
            >
          </el-form-item>
          <el-form-item v-else>
            <a href="javascript:;" class="regBtn">已激活</a>
          </el-form-item>
        </el-form>
      </div>
      <!-- license弹框输入面板 -->
      <el-dialog
        title="平台注册提示"
        width="600px"
        :visible.sync="license.show"
        :close-on-click-modal="false"
        top="0"
        class="dialog-center"
        :modal-append-to-body="false"
      >
        <add-license
          v-if="license.show"
          :visible.sync="license.show"
        ></add-license>
      </el-dialog>
      <!-- 人脸登陆 -->
      <el-dialog
        title="人脸登陆"
        width="480px"
        :visible.sync="face.show"
        :close-on-click-modal="false"
        top="0"
        class="dialog-center"
        :modal-append-to-body="false"
      >
        <face-login
          v-if="face.show"
          :visible.sync="face.show"
          @success="checkServeLicense"
        ></face-login>
      </el-dialog>
      <!-- 功能描述 -->
      <el-dialog
        title="配置清单"
        width="960px"
        :visible.sync="config.show"
        :close-on-click-modal="false"
        top="0"
        class="dialog-center"
        :modal-append-to-body="false"
      >
        <config-info></config-info>
      </el-dialog>
      <!--  uKey的验证 -->
      <el-dialog
        title="uKey绑定"
        width="750px"
        :visible.sync="uKey.show"
        :close-on-click-modal="false"
        top="0"
        class="dialog-center"
        :modal-append-to-body="false"
      >
        <ukey-bind v-if="uKey.show" :visible.sync="uKey.show"></ukey-bind>
      </el-dialog>
      <div class="tools-container">
        <div
          class="tools-item"
          :class="uKeyState"
          v-if="$CFG.uKey.value"
          @click="uKey.show = true"
        >
          <span class="iconfont el-icon-CombinedShape"></span>
        </div>
        <div
          class="tools-item"
          v-if="$CFG.face.value"
          @click="face.show = true"
        >
          <span class="iconfont el-icon-renlianshibie"></span>
        </div>
        <div class="tools-item" @click="config.show = true">
          <span class="iconfont el-icon-peizhi"></span>
        </div>
      </div>
    </div>
    <div class="copy-right" v-if="copyRight.value">
      {{ copyRight.data }}
    </div>
  </div>
</template>
<script>
import AddLicense from "@/pages/AddLicense";
import FaceLogin from '@/components/face/FaceLogin';
import FaceLogin from "@/components/face/FaceLogin";
import {
    login,
    initDBPool,
    checkLoginSession, uKeyLogin, getRandomFromServer, loginSignVerity
  login,
  initDBPool,
  checkLoginSession,
  uKeyLogin,
  getRandomFromServer,
  loginSignVerity,
} from "@/assets/js/api";
import ConfigInfo from "@/pages/configInfo";
import UkeyBind from "@/components/UKeyBind";
import nfdw from '@/assets/images/nfdw-log.png';
import gjdw from '@/assets/images/gjdw-log.png';
import gjdx from '@/assets/images/gjdx-log.png';
import qwh from '@/assets/images/qwh-logo.png';
import yuanchange from '@/assets/images/yuanchang_logo2.png';
import nfdw from "@/assets/images/nfdw-log.png";
import gjdw from "@/assets/images/gjdw-log.png";
import gjdx from "@/assets/images/gjdx-log.png";
import qwh from "@/assets/images/qwh-logo.png";
import yuanchange from "@/assets/images/yuanchang_logo2.png";
import platform from "@/assets/js/config";
import SoftUKey from "@/assets/js/tools/SoftUKey";
import SoftKey3W from "@/assets/js/Syunew3";
export default {
    components: {
        UkeyBind,
        ConfigInfo,
        AddLicense,
        FaceLogin
    },
    data() {
        return {
            register: false,
            loading: false,
            labelPosition: "right" /*  登录表单 */,
            formLabelAlign: {
                name: "",
                region: "",
                type: ""
            },
            /* 登录表单el-form 的 数据绑定 */
            loginForm: {
                username: "",
                password: ""
            },
            license: {
                show: false
            },
            face: {
                show: false
            },
            config: {
                show: false
            },
            uKey: {
                show: false,
            },
            platformName: "",
            logoConfig: platform.logo,
            copyRight: platform.copyRight,
            softUKey: new SoftUKey(SoftKey3W)
        };
    },
    created() {
        this.searchPlatformName();
    },
    methods: {
        /* 初始化连接池  检测后台session*/
        async woData() {
            const [pool, sessions] = await Promise.all([initDBPool, checkLoginSession])
            /*   console.log('pool',pool);
  components: {
    UkeyBind,
    ConfigInfo,
    AddLicense,
    FaceLogin,
  },
  data() {
    return {
      register: false,
      loading: false,
      labelPosition: "right" /*  登录表单 */,
      formLabelAlign: {
        name: "",
        region: "",
        type: "",
      },
      /* 登录表单el-form 的 数据绑定 */
      loginForm: {
        username: "",
        password: "",
      },
      license: {
        show: false,
      },
      face: {
        show: false,
      },
      config: {
        show: false,
      },
      uKey: {
        show: false,
      },
      platformName: "",
      logoConfig: platform.logo,
      copyRight: platform.copyRight,
      softUKey: new SoftUKey(SoftKey3W),
    };
  },
  created() {
    this.searchPlatformName();
  },
  methods: {
    /* 初始化连接池  检测后台session*/
    async woData() {
      const [pool, sessions] = await Promise.all([
        initDBPool,
        checkLoginSession,
      ]);
      /*   console.log('pool',pool);
                console.log('sessions',sessions); */
        },
        onSubmit() {
            if (!this.register && process.env.NODE_ENV != "dev") {
                this.$layer.msg("平台未注册,请先注册平台!");
                return;
            }
            if (this.loading) {
                return;
            }
    },
    onSubmit() {
      if (!this.register && process.env.NODE_ENV != "dev") {
        this.$layer.msg("平台未注册,请先注册平台!");
        return;
      }
      if (this.loading) {
        return;
      }
            if (this.$CFG.uKey.value) {
                this.uKeyLogin();
            } else {
                this.normalLogin();
            }
        },
        normalLogin() {
            // 校验用户
            if (this.loginForm.username && this.loginForm.password) {
                // 开启等待框
                this.loading = true;
                login(this.loginForm.username, this.loginForm.password).then(res => {
                    // 对结果进行处理
                    this.handleLogin(res);
                }).catch(error => {
                    // 关闭等待
                    this.loading = false;
                    console.log(error);
                    this.$message.error("网络异常");
                });
            } else {
                this.$message.error("用户名或密码不能为空");
            }
        },
        getRandomFromServer() {
            getRandomFromServer().then(res=>{
                let rs = JSON.parse(res.data.result);
                if(rs.code == 1) {
                    let randomNumber = rs.data;
                    this.softUKey.getSign(randomNumber, this.checkUKeySign);
                }else {
                    this.$message.error("服务器连接异常!");
                }
            }).catch(error=>{
                this.$message.error("服务器连接异常!");
            });
        },
        checkUKeySign(result) {
            let reg = new RegExp("&", "g");
            result.inPath = result.inPath.replace(reg, "%26");
            result.inPath = result.inPath.replace(/\\/g, "huodongwei");
            loginSignVerity(result).then(res=>{
                let rs = JSON.parse(res.data.result);
                if(rs.code == 1) {
                    this.uKeyLogin();
                }else {
                    this.$message.error("UKey签名校验失败!");
                }
            }).catch(error=>{
                this.$message.error("服务器连接异常!");
            });
        },
        uKeyLogin() {
            //
            if (!this.$store.state.ukey.connect) {
                this.$message.error("请先安装uKey客户端服务");
                return;
            }
            if (!this.$store.state.ukey.isIn) {
                this.$message.warning("请先插入uKey");
                return;
            }
            // 校验用户
            if (this.loginForm.username && this.loginForm.password) {
                // 开启等待框
                this.loading = true;
                uKeyLogin(this.loginForm.username, this.loginForm.password, this.$store.state.ukey.id).then(res => {
                    // 对结果进行处理
                    this.handleLogin(res);
                }).catch(error => {
                    // 关闭等待
                    this.loading = false;
                    console.log(error);
                    this.$message.error("网络异常");
                });
            } else {
                this.$message.error("用户名或密码不能为空");
            }
        },
        handleLogin(res) {
      if (this.$CFG.uKey.value) {
        this.uKeyLogin();
      } else {
        this.normalLogin();
      }
    },
    normalLogin() {
      // 校验用户
      if (this.loginForm.username && this.loginForm.password) {
        // 开启等待框
        this.loading = true;
        login(this.loginForm.username, this.loginForm.password)
          .then((res) => {
            // 对结果进行处理
            this.handleLogin(res);
          })
          .catch((error) => {
            // 关闭等待
            this.loading = false;
            let rs = JSON.parse(res.data.result);
            if (rs.code == 1) {
                this.$message.success("登录成功");
                sessionStorage.setItem('username', this.loginForm.username);
                sessionStorage.setItem('userId', rs.data);
                // 自动登录无法返回登录页
                if (this.$store.state.user.autoLogin) {
                    this.$router.replace("/home");
                } else {
                    this.$router.push("/home");
                }
                // 设置用户的权限
                this.$store.dispatch('user/getPermits');
            } else {
                this.$message.error(rs.msg);
            }
        },
        checkServeLicense() {
            // 校验服务器是否注册
            this.$apis.license.checkServeLicense().then(res => {
                let rs = JSON.parse(res.data.result);
                if (rs.code == 1) {
                    this.register = true;
                } else {
                    this.$layer.msg("平台未注册!请先注册。");
                    this.license.show = true;
                    this.register = false;
                }
            }).catch(error => {
                console.log(error);
            });
        },
        autoLogin() {     // 自动登录
            this.$apis.login.checkReferer().then(res => {
                let rs = JSON.parse(res.data.result);
                console.log(rs);
                if (rs) {
                    this.$store.dispatch('user/changeAutoLogin', 1);
                    this.loginForm.username = "zhdl";
                    this.loginForm.password = "123456";
                    this.normalLogin();
                }
            }).catch(error => {
            });
            // let pattern = /(localhost)|(www\.sw-ht\.com)/;
            // let where = document.referrer;
            // if(pattern.test(where)) {
            //   this.$store.dispatch('user/changeAutoLogin', 1);
            //   this.loginForm.username = "zhdl";
            //   this.loginForm.password = "123456";
            //   this.normalLogin();
            // }else {
            //   this.$store.dispatch('user/changeAutoLogin', 0);
            // }
        },
        searchPlatformName() {
            this.$apis.pageSetting.realTime.searchName().then(res=>{
                let rs = JSON.parse(res.data.result);
                if(rs.code == 1) {
                    let data = rs.data[0];
                    this.platformName = data.param;
                }else {
                    this.platformName = "蓄电池后台监控管理平台";
                }
                sessionStorage.setItem('platformName', this.platformName);
            }).catch(error=>{
                this.platformName = "蓄电池后台监控管理平台";
                sessionStorage.setItem('platformName', this.platformName);
            });
        }
            console.log(error);
            this.$message.error("网络异常");
          });
      } else {
        this.$message.error("用户名或密码不能为空");
      }
    },
    computed: {
        uKeyState() {
            let state = -1;
            let uKey = this.$store.state.ukey;
            let cls = "state-error";
            // 设置uKey的状态
            if (uKey.connect) {
                if (uKey.isIn) {
                    state = 1;
                } else {
                    state = 0;
                }
            } else {
                state = -1;
            }
            // 根据状态确定uKey图表的颜色
            switch (state) {
                case 0:
                    cls = "state-default";
                    break;
                case 1:
                    cls = "";
                    break;
                default:
                    cls = "state-error";
                    break;
            }
            return cls;
        },
        logoUrl() {
            let logoConfig = this.logoConfig;
            let image = yuanchange;
            if(!logoConfig.value) {
                return image;
            }
            switch (logoConfig.fileName) {
                case "nfdw":
                    image = nfdw
                    break;
                case "gjdx":
                    image = gjdx;
                    break;
                case 'qwh':
                    image = qwh;
                    break;
                case 'gjdw':
                    image = gjdw;
                    break;
            }
            return image;
        }
    getRandomFromServer() {
      getRandomFromServer()
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          if (rs.code == 1) {
            let randomNumber = rs.data;
            this.softUKey.getSign(randomNumber, this.checkUKeySign);
          } else {
            this.$message.error("服务器连接异常!");
          }
        })
        .catch((error) => {
          this.$message.error("服务器连接异常!");
        });
    },
    mounted() {
        // 初始化user的信息
        this.$store.commit('user/init');
        // 初始化登录状态
        sessionStorage.setItem('username', "");
        this.checkServeLicense();
    checkUKeySign(result) {
      let reg = new RegExp("&", "g");
      result.inPath = result.inPath.replace(reg, "%26");
      result.inPath = result.inPath.replace(/\\/g, "huodongwei");
      loginSignVerity(result)
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          if (rs.code == 1) {
            this.uKeyLogin();
          } else {
            this.$message.error("UKey签名校验失败!");
          }
        })
        .catch((error) => {
          this.$message.error("服务器连接异常!");
        });
    },
    uKeyLogin() {
      //
      if (!this.$store.state.ukey.connect) {
        this.$message.error("请先安装uKey客户端服务");
        return;
      }
      if (!this.$store.state.ukey.isIn) {
        this.$message.warning("请先插入uKey");
        return;
      }
        // 自动登录
        this.autoLogin();
    }
      // 校验用户
      if (this.loginForm.username && this.loginForm.password) {
        // 开启等待框
        this.loading = true;
        uKeyLogin(
          this.loginForm.username,
          this.loginForm.password,
          this.$store.state.ukey.id
        )
          .then((res) => {
            // 对结果进行处理
            this.handleLogin(res);
          })
          .catch((error) => {
            // 关闭等待
            this.loading = false;
            console.log(error);
            this.$message.error("网络异常");
          });
      } else {
        this.$message.error("用户名或密码不能为空");
      }
    },
    handleLogin(res) {
      // 关闭等待
      this.loading = false;
      let rs = JSON.parse(res.data.result);
      if (rs.code == 1) {
        this.$message.success("登录成功");
        sessionStorage.setItem("username", this.loginForm.username);
        sessionStorage.setItem("userId", rs.data);
        sessionStorage.setItem("userPower", rs.data2);
        // 自动登录无法返回登录页
        if (this.$store.state.user.autoLogin) {
          this.$router.replace("/home");
        } else {
          this.$router.push("/home");
        }
        // 设置用户的权限
        this.$store.dispatch("user/getPermits");
      } else {
        this.$message.error(rs.msg);
      }
    },
    checkServeLicense() {
      // 校验服务器是否注册
      this.$apis.license
        .checkServeLicense()
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          if (rs.code == 1) {
            this.register = true;
          } else {
            this.$layer.msg("平台未注册!请先注册。");
            this.license.show = true;
            this.register = false;
          }
        })
        .catch((error) => {
          console.log(error);
        });
    },
    autoLogin() {
      // 自动登录
      this.$apis.login
        .checkReferer()
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          console.log(rs);
          if (rs) {
            this.$store.dispatch("user/changeAutoLogin", 1);
            this.loginForm.username = "zhdl";
            this.loginForm.password = "123456";
            this.normalLogin();
          }
        })
        .catch((error) => {});
      // let pattern = /(localhost)|(www\.sw-ht\.com)/;
      // let where = document.referrer;
      // if(pattern.test(where)) {
      //   this.$store.dispatch('user/changeAutoLogin', 1);
      //   this.loginForm.username = "zhdl";
      //   this.loginForm.password = "123456";
      //   this.normalLogin();
      // }else {
      //   this.$store.dispatch('user/changeAutoLogin', 0);
      // }
    },
    searchPlatformName() {
      this.$apis.pageSetting.realTime
        .searchName()
        .then((res) => {
          let rs = JSON.parse(res.data.result);
          if (rs.code == 1) {
            let data = rs.data[0];
            this.platformName = data.param;
          } else {
            this.platformName = "蓄电池后台监控管理平台";
          }
          sessionStorage.setItem("platformName", this.platformName);
        })
        .catch((error) => {
          this.platformName = "蓄电池后台监控管理平台";
          sessionStorage.setItem("platformName", this.platformName);
        });
    },
  },
  computed: {
    uKeyState() {
      let state = -1;
      let uKey = this.$store.state.ukey;
      let cls = "state-error";
      // 设置uKey的状态
      if (uKey.connect) {
        if (uKey.isIn) {
          state = 1;
        } else {
          state = 0;
        }
      } else {
        state = -1;
      }
      // 根据状态确定uKey图表的颜色
      switch (state) {
        case 0:
          cls = "state-default";
          break;
        case 1:
          cls = "";
          break;
        default:
          cls = "state-error";
          break;
      }
      return cls;
    },
    logoUrl() {
      let logoConfig = this.logoConfig;
      let image = yuanchange;
      if (!logoConfig.value) {
        return image;
      }
      switch (logoConfig.fileName) {
        case "nfdw":
          image = nfdw;
          break;
        case "gjdx":
          image = gjdx;
          break;
        case "qwh":
          image = qwh;
          break;
        case "gjdw":
          image = gjdw;
          break;
      }
      return image;
    },
  },
  mounted() {
    // 初始化user的信息
    this.$store.commit("user/init");
    // 初始化登录状态
    sessionStorage.setItem("username", "");
    this.checkServeLicense();
    // 自动登录
    this.autoLogin();
  },
};
</script>
<style>
.login_from .el-input__inner {
    height: 48px;
    line-height: 48px;
  height: 48px;
  line-height: 48px;
}
.el-science-blue .login_from .el-input.is-disabled .el-input__inner, .el-science-blue .login_from .el-input__inner {
    background-color: transparent;
    border-color: #e4e4e4;
    color: #868686;
.el-science-blue .login_from .el-input.is-disabled .el-input__inner,
.el-science-blue .login_from .el-input__inner {
  background-color: transparent;
  border-color: #e4e4e4;
  color: #868686;
}
.el-science-blue .login_from .el-input__prefix, .el-input__suffix, .el-science-blue .login_from .el-select .el-input .el-select__caret {
    color: #007fe1;
.el-science-blue .login_from .el-input__prefix,
.el-input__suffix,
.el-science-blue .login_from .el-select .el-input .el-select__caret {
  color: #007fe1;
}
</style>
<style lang="less" scoped>
.login-wrapper {
    position: relative;
    width: 100%;
    height: 100%;
  position: relative;
  width: 100%;
  height: 100%;
}
/* 登录大盒子背景 */
.login_container {
    width: 100%;
    height: 100%;
    background: url(../assets/images/login-bg.jpg) 0 0 no-repeat;
    background-size: 100% 100%;
    display: flex;
    justify-content: space-around;
    align-items: center;
  width: 100%;
  height: 100%;
  background: url(../assets/images/login-bg.jpg) 0 0 no-repeat;
  background-size: 100% 100%;
  display: flex;
  justify-content: space-around;
  align-items: center;
}
.tools-container {
    position: absolute;
    bottom: 0;
    right: 0;
    background-color: #FFFFFF;
  position: absolute;
  bottom: 0;
  right: 0;
  background-color: #ffffff;
}
.tools-container .tools-item {
    padding: 8px;
    cursor: pointer;
  padding: 8px;
  cursor: pointer;
}
.tools-container .tools-item:hover {
    background-color: #e4e4e4;
  background-color: #e4e4e4;
}
.tools-container .iconfont {
    font-size: 22px;
    color: #0080ff;
  font-size: 22px;
  color: #0080ff;
}
.tools-container .state-default .iconfont {
    color: #808080;
  color: #808080;
}
.tools-container .state-error .iconfont {
    color: #ff0000;
  color: #ff0000;
}
.sliderCon {
    margin-top: -6vh;
  margin-top: -6vh;
    .logo {
        display: flex;
        align-items: center;
        font-size: 48px;
        color: #007fe1;
        font-weight: bold;
  .logo {
    display: flex;
    align-items: center;
    font-size: 48px;
    color: #007fe1;
    font-weight: bold;
        .logoImg {
            height: 50px;
            margin-right: 14px;
        }
    .logoImg {
      height: 50px;
      margin-right: 14px;
    }
  }
    .picImg {
        width: 580px;
        margin-top: 12vh;
    }
  .picImg {
    width: 580px;
    margin-top: 12vh;
  }
}
/* 登录框 */
.login_box {
    width: 430px;
    height: 400px;
  width: 430px;
  height: 400px;
  background-color: #fff;
  border-radius: 3px;
  padding: 40px 60px;
  box-sizing: border-box;
  position: relative;
  z-index: 2;
  .title {
    font-size: 20px;
    color: #007fe1;
    font-weight: bold;
    margin-bottom: 30px;
  }
  /* v图片的盒子 */
  .avatar {
    height: 130px;
    width: 130px;
    border: 1px solid #eee;
    border-radius: 50%;
    /* 边框圆角 */
    padding: 10px;
    box-shadow: 0 0 10px #ddd;
    position: absolute;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: #fff;
    border-radius: 3px;
    padding: 40px 60px;
    box-sizing: border-box;
    position: relative;
    z-index: 2;
    /* v图片 */
    .title {
        font-size: 20px;
        color: #007fe1;
        font-weight: bold;
        margin-bottom: 30px;
    img {
      width: 130px;
      height: 130px;
      border-radius: 50%;
      background-color: #eeeeee;
    }
    /* v图片的盒子 */
    .avatar {
        height: 130px;
        width: 130px;
        border: 1px solid #eee;
        border-radius: 50%;
        /* 边框圆角 */
        padding: 10px;
        box-shadow: 0 0 10px #ddd;
        position: absolute;
        left: 50%;
        transform: translate(-50%, -50%);
        background-color: #fff;
        /* v图片 */
        img {
            width: 130px;
            height: 130px;
            border-radius: 50%;
            background-color: #eeeeee;
        }
    }
  }
}
.login_box::after {
    content: "";
    display: block;
    width: 446px;
    height: 416px;
    position: absolute;
    top: -8px;
    left: -8px;
    background: rgba(255, 255, 255, 0.4);
    z-index: -1;
  content: "";
  display: block;
  width: 446px;
  height: 416px;
  position: absolute;
  top: -8px;
  left: -8px;
  background: rgba(255, 255, 255, 0.4);
  z-index: -1;
}
/* 登录按钮 */
.btns {
    text-align: center;
  text-align: center;
}
.loginBtn {
    width: 100%;
    display: block;
    text-align: center;
    height: 48px;
    margin-top: 10px;
  width: 100%;
  display: block;
  text-align: center;
  height: 48px;
  margin-top: 10px;
}
.regBtn {
    color: #007fe1;
    margin-right: 10px;
  color: #007fe1;
  margin-right: 10px;
}
@media screen and (max-width: 1680px) {
    .sliderCon .logo {
        font-size: 40px;
    }
  .sliderCon .logo {
    font-size: 40px;
  }
    .sliderCon .picImg {
        width: 480px;
    }
  .sliderCon .picImg {
    width: 480px;
  }
    .login_box {
        width: 400px;
        height: 360px;
    }
  .login_box {
    width: 400px;
    height: 360px;
  }
    .login_box::after {
        width: 416px;
        height: 376px;
    }
  .login_box::after {
    width: 416px;
    height: 376px;
  }
}
</style>
<style scoped>
.copy-right {
    position: absolute;
    width: 100%;
    text-align: center;
    bottom: 16px;
    z-index: 999;
    font-size: 12px;
  position: absolute;
  width: 100%;
  text-align: center;
  bottom: 16px;
  z-index: 999;
  font-size: 12px;
}
</style>
src/router/index.js
@@ -8,20 +8,20 @@
    routes
});
router.beforeEach((to, from, next)=>{
router.beforeEach((to, from, next) => {
    // 存储当前显示页面的名称
    let pageName = to.name?to.name: '';
    let pageName = to.name ? to.name : '';
    sessionStorage.setItem('acTabs', pageName);
    if(to.name != 'login' && !sessionStorage.getItem('username')) {
    if (to.name != 'login' && !sessionStorage.getItem('username')) {
        next('\login');
    }else {
    } else {
        next();
    }
});
const routerPush = VueRouter.prototype.push
const routerPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
    return routerPush.call(this, location).catch(error=> error)
}
    return routerPush.call(this, location).catch(error => error)
};
export default router;
src/router/routes.js
@@ -3,544 +3,550 @@
    redirect: '/login'
},
    {
        path: '/login',
        name: 'login',
        meta: {},
        component: (resolve) => require(['@/pages/login.vue'], resolve)
{
    path: '/login',
    name: 'login',
    meta: {},
    component: (resolve) => require(['@/pages/login.vue'], resolve)
},
// 测试页面
{
    path: '/wxTest',
    name: 'wxTest',
    meta: {},
    component: (resolve) => require(['@/pages/wxTest.vue'], resolve)
},
{
    path: '/home',
    meta: {},
    component: (resolve) => require(['../pages/home.vue'], resolve)
},
{
    path: '/index',
    name: 'index',
    meta: {},
    component: (resolve) => require(['../pages/index.vue'], resolve)
},
{
    path: '/screen',
    name: 'screen',
    meta: {},
    component: (resolve) => require(['../pages/screen.vue'], resolve)
},
{
    path: "/three-home",
    name: "threeHome",
    meta: {
        name: "3D站点"
    },
    // 测试页面
    {
        path: '/wxTest',
        name: 'wxTest',
        meta: {},
        component: (resolve) => require(['@/pages/wxTest.vue'], resolve)
    },
    {
        path: '/home',
        meta: {},
        component: (resolve) => require(['../pages/home.vue'], resolve)
    },
    {
        path: '/index',
        name: 'index',
        meta: {},
        component: (resolve) => require(['../pages/index.vue'], resolve)
    },
    {
        path: '/screen',
        name: 'screen',
        meta: {},
        component: (resolve) => require(['../pages/screen.vue'], resolve)
    },
    {
        path: "/three-home",
        name: "threeHome",
        meta: {
            name: "3D站点"
    component: (resolve) => require(['../pages/dataTest/threeHome.vue'], resolve)
},
{
    path: '/moving-ring-system/',
    name: 'movingRingSystem',
    meta: {},
    component: (resolve) => require(['../pages/dataTest/movingRingSystem/index.vue'], resolve),
    children: [
        {
            path: 'real-time/:BattGroupId',
            name: 'movingRingSysteRrealTime',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/realTime.vue'], resolve)
        },
        component: (resolve) => require(['../pages/dataTest/threeHome.vue'], resolve)
    },
    {
        path: '/moving-ring-system/',
        name: 'movingRingSystem',
        meta: {},
        component: (resolve) => require(['../pages/dataTest/movingRingSystem/index.vue'], resolve),
        children: [
            {
                path: 'real-time/:BattGroupId',
                name: 'movingRingSysteRrealTime',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/realTime.vue'], resolve)
            },
            {
                path: 'real-time/:BattGroupId/:powerDeviceId',
                name: 'movingRingSysteRrealTime',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/realTimeForShanXi.vue'], resolve)
            },
            {
                path: 'real-time-aio/:BattGroupId',
                name: 'movingRingSysteRrealTime',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/realTimeAio.vue'], resolve)
            },
            {
                path: 'power-box/:powerDeviceId',
                name: 'powerBox',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/movingRingSystem/powerBox.vue'], resolve)
            },
            {
                path: 'ele-info/:powerDeviceId',
                name: 'movingRingSystemEleInfo',
                meta: {},
                component: (resolve) => require(['../pages/dataMager/realTimeData.vue'], resolve)
            },
            {
                path: 'isolating-device/:powerDeviceId',
                name: 'movingRingSystemIsolating',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/movingRingSystem/isolatingDevice.vue'], resolve)
            },
            {
                path: 'charger-status/:powerDeviceId',
                name: 'movingRingSystemCharger',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/movingRingSystem/chargerStatus.vue'], resolve)
            },
            {
                path: 'air/:powerDeviceId',
                name: 'movingRingAir',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/movingRingSystem/airCooditioner.vue'], resolve)
            },
            {
                path: 'lithium-battery/:BattGroupId',
                name: 'movingRingLithiumBattery',
                meta: {},
                component: (resolve) => require(['../pages/dataTest/movingRingSystem/lithiumBattery.vue'], resolve)
        {
            path: 'real-time/:BattGroupId/:powerDeviceId',
            name: 'movingRingSysteRrealTime',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/realTimeForShanXi.vue'], resolve)
        },
        {
            path: 'real-time-aio/:BattGroupId',
            name: 'movingRingSysteRrealTime',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/realTimeAio.vue'], resolve)
        },
        {
            path: 'power-box/:powerDeviceId',
            name: 'powerBox',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/movingRingSystem/powerBox.vue'], resolve)
        },
        {
            path: 'ele-info/:powerDeviceId',
            name: 'movingRingSystemEleInfo',
            meta: {},
            component: (resolve) => require(['../pages/dataMager/realTimeData.vue'], resolve)
        },
        {
            path: 'isolating-device/:powerDeviceId',
            name: 'movingRingSystemIsolating',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/movingRingSystem/isolatingDevice.vue'], resolve)
        },
        {
            path: 'charger-status/:powerDeviceId',
            name: 'movingRingSystemCharger',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/movingRingSystem/chargerStatus.vue'], resolve)
        },
        {
            path: 'air/:powerDeviceId',
            name: 'movingRingAir',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/movingRingSystem/airCooditioner.vue'], resolve)
        },
        {
            path: 'lithium-battery/:BattGroupId',
            name: 'movingRingLithiumBattery',
            meta: {},
            component: (resolve) => require(['../pages/dataTest/movingRingSystem/lithiumBattery.vue'], resolve)
        },
        {
            path: '404',
            name: '',
            meta: {
                crumb: 'NotFound'
            },
            {
                path: '404',
                name: '',
                meta: {
                    crumb: 'NotFound'
                },
                component: (resolve) => require(['@/pages/404/index.vue'], resolve)
            component: (resolve) => require(['@/pages/404/index.vue'], resolve)
        },
    ],
},
{
    path: '/real-time',
    name: 'realTime',
    meta: {},
    component: (resolve) => require(['../pages/dataTest/realTime.vue'], resolve)
},
{
    path: '/history',
    meta: {},
    component: (resolve) => require(['../pages/dataTest/history.vue'], resolve)
},
{
    path: '/history-aio',
    meta: {
        name: '一体机导入记录'
    },
    component: (resolve) => require(['../pages/dataTest/historyAio.vue'], resolve)
},
{
    path: '/test',
    meat: {},
    component: (resolve) => require(['../pages/dataTest/CircuitDiagram.vue'], resolve)
},
{
    path: '/dataMager/battGroupMager',
    meta: {
        name: '电池信息配置'
    },
    component: (resolve) => require(['../pages/dataMager/battGroupMager.vue'], resolve)
},
{
    path: '/dataMager/powerMager',
    meta: {
        name: '电源信息配置'
    },
    component: (resolve) => require(['../pages/dataMager/powerMager.vue'], resolve)
},
{
    path: '/dataMager/homeAddressInfoManage',
    meta: {
        name: '机房位置信息配置'
    },
    component: (resolve) => require(['../pages/dataMager/homeAddressInfoManage.vue'], resolve)
},
{
    path: '/dataMager/produceTotal',
    name: 'produceTotal',
    meta: {
        name: '电池信息统计分析'
    },
    component: (resolve) => require(['../pages/dataMager/produceTotal.vue'], resolve)
},
{
    path: '/faceManager/userFaceManager',
    name: 'userFaceManager',
    meta: {
        name: '用户人脸管理'
    },
    component: (resolve) => require(['../pages/faceManager/userFaceManager.vue'], resolve)
},
{
    path: '/dataMager/realTimeData.vue',
    name: 'realTimeData',
    meta: {
        name: '实时监测数据'
    },
    component: (resolve) => require(['../pages/dataMager/realTimeData.vue'], resolve)
},
{
    path: '/dataMager/threadMager',
    name: 'threadMager',
    meta: {
        name: '线程信息管理'
    },
    component: (resolve) => require(['../pages/dataMager/threadMager.vue'], resolve)
},
{
    path: '/dataAdmian',
    /* 电池充放电数据管理 */
    meta: {},
    component: (resolve) => require(['../pages/dataMager/dataAdmian.vue'], resolve)
},
{
    path: '/internalTest',
    /*内阻测试 */
    meta: {},
    component: (resolve) => require(['../pages/dataMager/internalTest.vue'], resolve)
},
{
    path: '/dischargeTest',
    /* 电池放电测试 */
    meta: {},
    component: (resolve) => require(['../pages/dataMager/dischargeTest.vue'], resolve)
},
{
    path: '/dataMager/historyInfo',
    /* 历史数据管理 */
    meta: {
        title: '历史数据管理'
    },
    component: (resolve) => require(['../pages/dataMager/historyInfoMager.vue'], resolve)
},
{
    path: '/batteryMager',
    /* 电池关注管理 */
    meta: {},
    component: (resolve) => require(['../pages/dataMager/batteryMager.vue'], resolve)
},
{
    path: '/device-work-state',
    name: 'deviceWorkState',
    meta: {
        title: '设备工作状态',
    },
    component: (resolve) => require(['../pages/reportStatistics/deviceWorkState'], resolve)
},
{
    path: '/scrap-battery',
    name: 'scrapBattery',
    meta: {
        title: '报废电池信息管理',
    },
    component: (resolve) => require(['../pages/dataMager/scrapBattery.vue'], resolve)
},
{
    path: '/repair-battery',
    name: 'repairBattery',
    meta: {
        title: '备件电池信息管理',
    },
    component: (resolve) => require(['../pages/dataMager/repairBattery.vue'], resolve)
},
{
    path: '/dataMager/eventTotalPage',
    meta: {
        title: '事件总表',
    },
    component: (resolve) => require(['../pages/dataMager/eventTotalPage.vue'], resolve)
},
{
    path: '/dataMager/btsStatus',
    name: 'btsStatusTest',
    meta: {
        title: '核容测试设备',
    },
    component: (resolve) => require(['../pages/dataMager/btsStatus.vue'], resolve)
},
{
    path: '/dataMager/powercut',
    meta: {
        title: '机房停电查询',
    },
    component: (resolve) => require(['../pages/dataMager/powercut.vue'], resolve)
},
{
    path: '/batteryrHistoryquery',
    /* 电池告警历史查询 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/batteryrHistoryquery.vue'], resolve)
},
{
    name: 'batteryrTimequery',
    path: '/batteryrTimequery',
    /* 电池告警实时查询 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/batteryrTimequery.vue'], resolve)
},
{
    name: 'alarmDispatch',
    path: '/alarmDispatch',
    meta: {},
    component: (resolve) => require(['../pages/alarmMager//alarm-dispatch.vue'], resolve)
},
{
    name: 'powerRealtimeInfo',
    path: '/powerRealtimeInfo',
    /* 电源实时信息告警 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/powerRealtimeInfo.vue'], resolve)
},
{
    name: 'powerHistoryInfo',
    path: '/powerHistoryInfo',
    /* 电源历史信息告警 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/powerHistoryInfo.vue'], resolve)
},
{
    name: 'powerBoxAlarm',
    path: '/powerBoxAlarm',
    /* 配电柜实时告警 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/powerBoxAlarm.vue'], resolve)
},
{
    name: 'powerBoxHistoryAlarm',
    path: '/powerBoxHistoryAlarm',
    /* 配电柜历史告警 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/powerBoxHistoryAlarm.vue'], resolve)
},
{
    name: 'hfSwitch',
    path: '/hfSwitch',
    /* 高频开关配电柜遥测量 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/hfSwitch.vue'], resolve)
},
{
    name: 'GGDmeasure',
    path: '/GGDmeasure',
    /* 交流配电柜遥测量 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/GGDmeasure.vue'], resolve)
},
{
    name: 'powerAlarmTimeout',
    path: '/powerAlarmTimeout',
    /* 通信电源超时告警 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/powerAlarmTimeout.vue'], resolve)
},
{
    path: '/deviceHistoryquery',
    /* 设备告警历史查询 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/deviceHistoryquery.vue'], resolve)
},
{
    path: '/deviceTimequery',
    /* 设备告警实时查询 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/deviceTimequery.vue'], resolve)
},
{
    path: '/batterypaSetting',
    /* 电池告警参数设置 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/batterypaSetting.vue'], resolve)
},
{
    path: '/dataMager/theFaultSites',
    meta: {
        title: '故障站点',
    },
    component: (resolve) => require(['../pages/dataMager/theFaultSites.vue'], resolve)
},
{
    path: '/dataMager/theStatusManager',
    meta: {
        title: '故障站点管理',
    },
    component: (resolve) => require(['../pages/dataMager/theStatusManager.vue'], resolve)
},
{
    path: '/devicepaSetting',
    /* 设备告警参数设置 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/devicepaSetting.vue'], resolve)
},
{
    path: '/powerCabinetSetting',
    /* 配电柜告警规则 */
    meta: {},
    component: (resolve) => require(['../pages/alarmMager/powerCabinetSetting.vue'], resolve)
},
{
    path: '/pageSetting/realTime',
    meta: {
        title: '实时监测页面配置',
    },
    component: (resolve) => require(['../pages/pageSetting/realTime.vue'], resolve)
},
{
    path: '/jobManage/planManage',
    meta: {
        title: '放电计划管理'
    },
    component: (resolve) => require(['../pages/jobManage/planManage.vue'], resolve)
},
{
    path: '/jobManage/btsUpgrade',
    meta: {
        title: 'bts设备升级'
    },
    component: (resolve) => require(['../pages/jobManage/btsUpgrade.vue'], resolve)
},
{
    path: '/jobManage/addplan1',
    meta: {
        title: '放电计划'
    },
    component: (resolve) => require(['../pages/jobManage/params/addplan1.vue'], resolve)
},
{
    path: '/reportStatistics/eleAnalyse',
    meta: {
        title: '电池组统计分析查询'
    },
    component: (resolve) => require(['../pages/reportStatistics/eleAnalyse.vue'], resolve)
},
{
    path: '/reportStatistics/eleMonomer',
    meta: {
        title: '电池单体统计分析查询'
    },
    component: (resolve) => require(['../pages/reportStatistics/eleMonomer.vue'], resolve)
},
{
    path: '/reportStatistics/eleAssess',
    meta: {
        title: '蓄电池组后评估'
    },
    component: (resolve) => require(['../pages/reportStatistics/eleAssess.vue'], resolve)
},
{
    path: '/reportStatistics/taskplan',
    meta: {
        title: '落后单体查询'
    },
    component: (resolve) => require(['../pages/reportStatistics/taskplan.vue'], resolve)
},
{
    path: '/reportStatistics/elestatus',
    meta: {
        title: '电池实时状态查询'
    },
    component: (resolve) => require(['../pages/reportStatistics/elestatus.vue'], resolve)
},
{
    path: '/reportStatistics/endure',
    meta: {
        title: '电池续航能力历史查询'
    },
    component: (resolve) => require(['../pages/reportStatistics/endure.vue'], resolve)
},
{
    path: '/userMager/userInfo',
    meta: {
        title: '用户信息管理',
    },
    component: (resolve) => require(['../pages/userMager/userInfo.vue'], resolve)
},
{
    path: '/userMager/powerMager',
    meta: {
        title: '权限管理',
    },
    component: (resolve) => require(['../pages/userMager/powerMager.vue'], resolve)
},
{
    path: '/userMager/baojiMager',
    meta: {
        title: '包机组管理',
    },
    component: (resolve) => require(['../pages/userMager/baojiMager.vue'], resolve)
},
{
    path: '/userMager/operationRecord',
    meta: {
        title: '操作记录管理',
    },
    component: (resolve) => require(['../pages/userMager/operationRecord.vue'], resolve)
},
{
    path: '/userMager/groupManage',
    meta: {
        title: '班组管理',
    },
    component: (resolve) => require(['../pages/userMager/groupManage.vue'], resolve)
},
{
    path: '/pageSetting/chartMapSetting',
    meta: {
        title: '地图配置',
    },
    component: (resolve) => require(['../pages/pageSetting/chartMapSetting'], resolve)
},
{
    path: '/pageSetting/threeHomeSetting',
    meta: {
        title: '3D机房配置',
    },
    component: (resolve) => require(['../pages/pageSetting/threeHomeSetting'], resolve)
},
{
    path: '/dataTest/standardLine',
    meta: {
        title: '标准曲线',
    },
    component: (resolve) => require(['../pages/dataTest/standardLine.vue'], resolve)
},
{
    path: '/reportStatistics/powerReport',
    meta: {
        title: '通信电源报表',
    },
    component: (resolve) => require(['../pages/reportStatistics/powerReport.vue'], resolve)
},
{
    path: '/test/',
    meta: {
        title: '测试模块',
    },
    component: resolve => require(['../pages/test/index.vue'], resolve),
    children: [
        {
            path: 'lineMarkPoint',
            meta: {
                title: '测试折线图模块极值点',
            },
        ],
    },
    {
        path: '/real-time',
        name: 'realTime',
        meta: {},
        component: (resolve) => require(['../pages/dataTest/realTime.vue'], resolve)
    },
    {
        path: '/history',
        meta: {},
        component: (resolve) => require(['../pages/dataTest/history.vue'], resolve)
    },
    {
        path: '/history-aio',
        meta: {
            name: '一体机导入记录'
            component: resolve => require(['../pages/test/lineMarkPoint.vue'], resolve),
        },
        component: (resolve) => require(['../pages/dataTest/historyAio.vue'], resolve)
    },
    {
        path: '/test',
        meat: {},
        component: (resolve) => require(['../pages/dataTest/CircuitDiagram.vue'], resolve)
    },
    {
        path: '/dataMager/battGroupMager',
        meta: {
            name: '电池信息配置'
        },
        component: (resolve) => require(['../pages/dataMager/battGroupMager.vue'], resolve)
    },
    {
        path: '/dataMager/powerMager',
        meta: {
            name: '电源信息配置'
        },
        component: (resolve) => require(['../pages/dataMager/powerMager.vue'], resolve)
    },
    {
        path: '/dataMager/homeAddressInfoManage',
        meta: {
            name: '机房位置信息配置'
        },
        component: (resolve) => require(['../pages/dataMager/homeAddressInfoManage.vue'], resolve)
    },
    {
        path: '/dataMager/produceTotal',
        name: 'produceTotal',
        meta: {
            name: '电池信息统计分析'
        },
        component: (resolve) => require(['../pages/dataMager/produceTotal.vue'], resolve)
    },
    {
        path: '/faceManager/userFaceManager',
        name: 'userFaceManager',
        meta: {
            name: '用户人脸管理'
        },
        component: (resolve) => require(['../pages/faceManager/userFaceManager.vue'], resolve)
    },
    {
        path: '/dataMager/realTimeData.vue',
        name: 'realTimeData',
        meta: {
            name: '实时监测数据'
        },
        component: (resolve) => require(['../pages/dataMager/realTimeData.vue'], resolve)
    },
    {
        path: '/dataMager/threadMager',
        name: 'threadMager',
        meta: {
            name: '线程信息管理'
        },
        component: (resolve) => require(['../pages/dataMager/threadMager.vue'], resolve)
    },
    {
        path: '/dataAdmian',
        /* 电池充放电数据管理 */
        meta: {},
        component: (resolve) => require(['../pages/dataMager/dataAdmian.vue'], resolve)
    },
    {
        path: '/internalTest',
        /*内阻测试 */
        meta: {},
        component: (resolve) => require(['../pages/dataMager/internalTest.vue'], resolve)
    },
    {
        path: '/dischargeTest',
        /* 电池放电测试 */
        meta: {},
        component: (resolve) => require(['../pages/dataMager/dischargeTest.vue'], resolve)
    },
    {
        path: '/dataMager/historyInfo',
        /* 历史数据管理 */
        meta: {
            title: '历史数据管理'
        },
        component: (resolve) => require(['../pages/dataMager/historyInfoMager.vue'], resolve)
    },
    {
        path: '/batteryMager',
        /* 电池关注管理 */
        meta: {},
        component: (resolve) => require(['../pages/dataMager/batteryMager.vue'], resolve)
    },
    {
        path: '/device-work-state',
        name: 'deviceWorkState',
        meta: {
            title: '设备工作状态',
        },
        component: (resolve) => require(['../pages/reportStatistics/deviceWorkState'], resolve)
    },
    {
        path: '/scrap-battery',
        name: 'scrapBattery',
        meta: {
            title: '报废电池信息管理',
        },
        component: (resolve) => require(['../pages/dataMager/scrapBattery.vue'], resolve)
    },
    {
        path: '/repair-battery',
        name: 'repairBattery',
        meta: {
            title: '备件电池信息管理',
        },
        component: (resolve) => require(['../pages/dataMager/repairBattery.vue'], resolve)
    },
    {
        path: '/dataMager/eventTotalPage',
        meta: {
            title: '事件总表',
        },
        component: (resolve) => require(['../pages/dataMager/eventTotalPage.vue'], resolve)
    },
    {
        path: '/dataMager/btsStatus',
        name: 'btsStatusTest',
        meta: {
            title: '核容测试设备',
        },
        component: (resolve) => require(['../pages/dataMager/btsStatus.vue'], resolve)
    },
    {
        path: '/dataMager/powercut',
        meta: {
            title: '机房停电查询',
        },
        component: (resolve) => require(['../pages/dataMager/powercut.vue'], resolve)
    },
    {
        path: '/batteryrHistoryquery',
        /* 电池告警历史查询 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/batteryrHistoryquery.vue'], resolve)
    },
    {
        name: 'batteryrTimequery',
        path: '/batteryrTimequery',
        /* 电池告警实时查询 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/batteryrTimequery.vue'], resolve)
    },
    {
        name: 'powerRealtimeInfo',
        path: '/powerRealtimeInfo',
        /* 电源实时信息告警 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/powerRealtimeInfo.vue'], resolve)
    },
    {
        name: 'powerHistoryInfo',
        path: '/powerHistoryInfo',
        /* 电源历史信息告警 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/powerHistoryInfo.vue'], resolve)
    },
    {
        name: 'powerBoxAlarm',
        path: '/powerBoxAlarm',
        /* 配电柜实时告警 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/powerBoxAlarm.vue'], resolve)
    },
    {
        name: 'powerBoxHistoryAlarm',
        path: '/powerBoxHistoryAlarm',
        /* 配电柜历史告警 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/powerBoxHistoryAlarm.vue'], resolve)
    },
    {
        name: 'hfSwitch',
        path: '/hfSwitch',
        /* 高频开关配电柜遥测量 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/hfSwitch.vue'], resolve)
    },
    {
        name: 'GGDmeasure',
        path: '/GGDmeasure',
        /* 交流配电柜遥测量 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/GGDmeasure.vue'], resolve)
    },
    {
        name: 'powerAlarmTimeout',
        path: '/powerAlarmTimeout',
        /* 通信电源超时告警 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/powerAlarmTimeout.vue'], resolve)
    },
    {
        path: '/deviceHistoryquery',
        /* 设备告警历史查询 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/deviceHistoryquery.vue'], resolve)
    },
    {
        path: '/deviceTimequery',
        /* 设备告警实时查询 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/deviceTimequery.vue'], resolve)
    },
    {
        path: '/batterypaSetting',
        /* 电池告警参数设置 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/batterypaSetting.vue'], resolve)
    },
    {
        path: '/dataMager/theFaultSites',
        meta: {
            title: '故障站点',
        },
        component: (resolve) => require(['../pages/dataMager/theFaultSites.vue'], resolve)
    },
    {
        path: '/dataMager/theStatusManager',
        meta: {
            title: '故障站点管理',
        },
        component: (resolve) => require(['../pages/dataMager/theStatusManager.vue'], resolve)
    },
    {
        path: '/devicepaSetting',
        /* 设备告警参数设置 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/devicepaSetting.vue'], resolve)
    },
    {
        path: '/powerCabinetSetting',
        /* 配电柜告警规则 */
        meta: {},
        component: (resolve) => require(['../pages/alarmMager/powerCabinetSetting.vue'], resolve)
    },
    {
        path: '/pageSetting/realTime',
        meta: {
            title: '实时监测页面配置',
        },
        component: (resolve) => require(['../pages/pageSetting/realTime.vue'], resolve)
    },
    {
        path: '/jobManage/planManage',
        meta: {
            title: '放电计划管理'
        },
        component: (resolve) => require(['../pages/jobManage/planManage.vue'], resolve)
    },
    {
        path: '/jobManage/btsUpgrade',
        meta: {
            title: 'bts设备升级'
        },
        component: (resolve) => require(['../pages/jobManage/btsUpgrade.vue'], resolve)
    },
    {
        path: '/jobManage/addplan1',
        meta: {
            title: '放电计划'
        },
        component: (resolve) => require(['../pages/jobManage/params/addplan1.vue'], resolve)
    },
    {
        path: '/reportStatistics/eleAnalyse',
        meta: {
            title: '电池组统计分析查询'
        },
        component: (resolve) => require(['../pages/reportStatistics/eleAnalyse.vue'], resolve)
    },
    {
        path: '/reportStatistics/eleMonomer',
        meta: {
            title: '电池单体统计分析查询'
        },
        component: (resolve) => require(['../pages/reportStatistics/eleMonomer.vue'], resolve)
    },
    {
        path: '/reportStatistics/eleAssess',
        meta: {
            title: '蓄电池组后评估'
        },
        component: (resolve) => require(['../pages/reportStatistics/eleAssess.vue'], resolve)
    },
    {
        path: '/reportStatistics/taskplan',
        meta: {
            title: '落后单体查询'
        },
        component: (resolve) => require(['../pages/reportStatistics/taskplan.vue'], resolve)
    },
    {
        path: '/reportStatistics/elestatus',
        meta: {
            title: '电池实时状态查询'
        },
        component: (resolve) => require(['../pages/reportStatistics/elestatus.vue'], resolve)
    },
    {
        path: '/reportStatistics/endure',
        meta: {
            title: '电池续航能力历史查询'
        },
        component: (resolve) => require(['../pages/reportStatistics/endure.vue'], resolve)
    },
    {
        path: '/userMager/userInfo',
        meta: {
            title: '用户信息管理',
        },
        component: (resolve) => require(['../pages/userMager/userInfo.vue'], resolve)
    },
    {
        path: '/userMager/powerMager',
        meta: {
            title: '权限管理',
        },
        component: (resolve) => require(['../pages/userMager/powerMager.vue'], resolve)
    },
    {
        path: '/userMager/baojiMager',
        meta: {
            title: '包机组管理',
        },
        component: (resolve) => require(['../pages/userMager/baojiMager.vue'], resolve)
    },
    {
        path: '/userMager/operationRecord',
        meta: {
            title: '操作记录管理',
        },
        component: (resolve) => require(['../pages/userMager/operationRecord.vue'], resolve)
    },
    {
        path: '/userMager/groupManage',
        meta: {
            title: '班组管理',
        },
        component: (resolve) => require(['../pages/userMager/groupManage.vue'], resolve)
    },
    {
        path: '/pageSetting/chartMapSetting',
        meta: {
            title: '地图配置',
        },
        component: (resolve) => require(['../pages/pageSetting/chartMapSetting'], resolve)
    },
    {
        path: '/pageSetting/threeHomeSetting',
        meta: {
            title: '3D机房配置',
        },
        component: (resolve) => require(['../pages/pageSetting/threeHomeSetting'], resolve)
    },
    {
        path: '/dataTest/standardLine',
        meta: {
            title: '标准曲线',
        },
        component: (resolve) => require(['../pages/dataTest/standardLine.vue'], resolve)
    },
    {
        path: '/reportStatistics/powerReport',
        meta: {
            title: '通信电源报表',
        },
        component: (resolve) => require(['../pages/reportStatistics/powerReport.vue'], resolve)
    },
    {
        path: '/test/',
        meta: {
            title: '测试模块',
        },
        component: resolve => require(['../pages/test/index.vue'], resolve),
        children: [
            {
                path: 'lineMarkPoint',
                meta: {
                    title: '测试折线图模块极值点',
                },
                component: resolve => require(['../pages/test/lineMarkPoint.vue'], resolve),
        {
            path: 'ipInput',
            meta: {
                title: 'IP地址修改',
            },
            {
                path: 'ipInput',
                meta: {
                    title: 'IP地址修改',
                },
                component: resolve => require(['../pages/test/ipInput.vue'], resolve),
            },
            {
                path: 'weather',
                meta: {
                    title: '天气',
                },
                component: resolve => require(['../pages/test/weather.vue'], resolve),
            }
        ]
    },
    {
        path: '*',
        name: '',
        meta: {
            crumb: 'NotFound'
            component: resolve => require(['../pages/test/ipInput.vue'], resolve),
        },
        component: (resolve) => require(['@/pages/404/index.vue'], resolve)
        {
            path: 'weather',
            meta: {
                title: '天气',
            },
            component: resolve => require(['../pages/test/weather.vue'], resolve),
        }
    ]
},
{
    path: '*',
    name: '',
    meta: {
        crumb: 'NotFound'
    },
    component: (resolve) => require(['@/pages/404/index.vue'], resolve)
},
];