Browse Source

Merge branch 'master' of http://10.12.10.70:3000/zhangliang/simulation-front

zhangliang2 3 năm trước cách đây
mục cha
commit
3ee3e2928a

+ 7 - 2
src/api/common.js

@@ -13,6 +13,7 @@ const uploadProcessBar = basePart + '/simulation/resource/common/minio/uploadPro
 const createMultipartUpload = basePart + '/simulation/resource/common/minio/createMultipartUpload'; // 分片上传-请求上传地址
 const createMultipartUpload = basePart + '/simulation/resource/common/minio/createMultipartUpload'; // 分片上传-请求上传地址
 const completeMultipartUpload = basePart + '/simulation/resource/common/minio/completeMultipartUpload'; // 分片上传-文件合并地址
 const completeMultipartUpload = basePart + '/simulation/resource/common/minio/completeMultipartUpload'; // 分片上传-文件合并地址
 
 
+const getMyMenuTree = '/simulation/resource/server/menu/getMyMenuTree';  //获取左侧菜单
 
 
 export default {
 export default {
     single,
     single,
@@ -27,8 +28,12 @@ export default {
     uploadProcessBar,
     uploadProcessBar,
 
 
     createMultipartUpload,
     createMultipartUpload,
-    completeMultipartUpload
+    completeMultipartUpload,
+
+    getMyMenuTree
 }
 }
 
 
 //10.15.12.74:7001/simulation/oauth/client/sign/single?code=1001&ticket=1001
 //10.15.12.74:7001/simulation/oauth/client/sign/single?code=1001&ticket=1001
-//10.12.10.74:7001/simulation/oauth/client/sign/single?code=1001&ticket=1001
+//10.12.10.70/simulation/oauth/client/sign/single?code=1002&ticket=1002
+//http://10.12.10.70/simulation/oauth/client/sign/entry?code=1002&ticket=1002
+//1002

+ 45 - 12
src/axios/filter.js

@@ -43,13 +43,19 @@ axios.defaults.headers.common['Authorization'] = ""; //请求token信息配置
 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //请求type设置
 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //请求type设置
 axios.defaults.timeout = 30000; //在超时前,所有请求都会等待30秒
 axios.defaults.timeout = 30000; //在超时前,所有请求都会等待30秒
 axios.defaults.withCredentials = true;
 axios.defaults.withCredentials = true;
+let isInvalid1 = false //用于控制登录信息过期后弹窗时间的截流,截流时间为5s
+let isInvalid2 = false
 
 
 // 添加请求拦截器
 // 添加请求拦截器
 axios.interceptors.request.use(function (config) {
 axios.interceptors.request.use(function (config) {
     // 在发送请求之前处理
     // 在发送请求之前处理
     // 判断token在前台session中是否存在
     // 判断token在前台session中是否存在
     config.headers.common['Authorization'] = localStorage.getItem('Authorization');
     config.headers.common['Authorization'] = localStorage.getItem('Authorization');
-    showFullScreenLoading();
+    if(config.noLoading===true){   //如果noLoading为true,不加载loading画面
+
+    }else{
+        showFullScreenLoading();
+    }
     return config;
     return config;
 }, function (error) {
 }, function (error) {
     // 对请求错误做处理
     // 对请求错误做处理
@@ -72,17 +78,28 @@ axios.interceptors.response.use(function (response) {
     return response;
     return response;
 }, function (error) {
 }, function (error) {
     tryHideFullScreenLoading();
     tryHideFullScreenLoading();
-    console.log('网络异常');
-    ElementUI.Message.error("网络异常");
-    return Promise.reject(error);
+    if(error.response.status == 401){  //token失效,弹框提示确认返回login
+        //ElementUI.Message.error("用户信息过期,请重新登录");
+        if(isInvalid1 == false){
+            isInvalid1 = true
+            ElementUI.MessageBox.alert('用户信息过期,请重新登陆','提示',{
+                confirmButtonText:'确定',
+                callback: action => {
+                    let loginUrl = window.location.origin + '/login'
+                    window.location.href = loginUrl
+                }
+            })
+            setTimeout(()=>{isInvalid1 = false}, 5000)
+        }
+        return Promise.reject(error);
+    }else{
+        ElementUI.Message.error("网络异常");
+        return Promise.reject(error);
+    }
 });
 });
 
 
 Vue.prototype.$axios = axios; //定义调用方式
 Vue.prototype.$axios = axios; //定义调用方式
 
 
-
-
-
-
 // 针对上传大文件
 // 针对上传大文件
 const instance = axios.create({
 const instance = axios.create({
     baseURL: '',
     baseURL: '',
@@ -120,10 +137,26 @@ instance.interceptors.response.use(function (response) {
     return response;
     return response;
 }, function (error) {
 }, function (error) {
     tryHideFullScreenLoading();
     tryHideFullScreenLoading();
-    console.log('网络异常');
-    ElementUI.Message.error("网络异常");
-    return Promise.reject(error);
+    if(error.response.status == 401){  //token失效,弹框提示确认返回login
+        if(isInvalid2 == false){
+            isInvalid2 = true
+            ElementUI.MessageBox.alert('用户信息过期,请重新登陆','提示',{
+                confirmButtonText:'确定',
+                callback: action => {
+                    let loginUrl = window.location.origin + '/login'
+                    window.location.href = loginUrl
+                }
+            })
+            setTimeout(()=>{isInvalid2 = false}, 5000)
+        }
+        return Promise.reject(error);
+    }else{
+        ElementUI.Message.error("网络异常");
+        return Promise.reject(error);
+    }
 });
 });
 
 
 Vue.use(VueAxios, instance);
 Vue.use(VueAxios, instance);
-Vue.prototype.$instance = instance; //定义调用方式
+Vue.prototype.$instance = instance; //定义调用方式
+
+//针对不需要loading画面的实例

+ 16 - 4
src/views/algorithmsLibrary/algorithmsLibraryList.vue

@@ -183,6 +183,12 @@ export default {
             }
             }
         },
         },
     },
     },
+    created(){
+        if(this.$route.query.activeName){
+            this.activeName = this.$route.query.activeName
+        }
+        this.$route.query.activeName = '2'
+    },
     methods: {
     methods: {
         doSearch() {
         doSearch() {
             if (this.activeName === "2") {
             if (this.activeName === "2") {
@@ -222,10 +228,16 @@ export default {
         addOne() {
         addOne() {
             if (this.activeName === "2") {
             if (this.activeName === "2") {
                 // 私有导入
                 // 私有导入
-                this.$router.push({ path: "/exportAlgorithms" });
+                this.$router.push({ 
+                    path: "/exportAlgorithms",
+                    query: {activeName: this.activeName}
+                });
             } else {
             } else {
                 // 私有仓库
                 // 私有仓库
-                this.$router.push({ path: "/gitAlgorithms" });
+                this.$router.push({ 
+                    path: "/gitAlgorithms",
+                    query: {activeName: this.activeName}
+                });
             }
             }
         },
         },
         editRow(row) {
         editRow(row) {
@@ -233,13 +245,13 @@ export default {
                 // 私有导入
                 // 私有导入
                 this.$router.push({
                 this.$router.push({
                     path: "/exportAlgorithms",
                     path: "/exportAlgorithms",
-                    query: { id: row.id, share: row.share },
+                    query: { id: row.id, share: row.share, activeName: this.activeName },
                 });
                 });
             } else {
             } else {
                 // 私有仓库
                 // 私有仓库
                 this.$router.push({
                 this.$router.push({
                     path: "/gitAlgorithms",
                     path: "/gitAlgorithms",
-                    query: { id: row.id, share: row.share },
+                    query: { id: row.id, share: row.share, activeName: this.activeName },
                 });
                 });
             }
             }
         },
         },

+ 4 - 1
src/views/algorithmsLibrary/exportAlgorithms.vue

@@ -160,7 +160,10 @@ export default {
             });
             });
         },
         },
         cancel() {
         cancel() {
-            this.$router.replace({ path: "/algorithmsLibraryList" });
+            this.$router.replace({ 
+                path: "/algorithmsLibraryList", 
+                query:{activeName: this.$route.query.activeName}
+            });
         },
         },
         onProgress() {
         onProgress() {
             this.$axios({
             this.$axios({

+ 4 - 1
src/views/algorithmsLibrary/gitAlgorithms.vue

@@ -195,7 +195,10 @@ export default {
             });
             });
         },
         },
         cancel(){
         cancel(){
-            this.$router.replace({ path: "/algorithmsLibraryList" });
+            this.$router.replace({ 
+                path: "/algorithmsLibraryList", 
+                query:{activeName: this.$route.query.activeName}
+            });
         }
         }
         /* typeChange(val) {
         /* typeChange(val) {
             if (val === "1") {
             if (val === "1") {

+ 23 - 2
src/views/index.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
     <div id="main" v-bind:class="{ fold: isFold }">
     <div id="main" v-bind:class="{ fold: isFold }">
-        <page-menu @menuFold="menuFold" ref="menu"></page-menu>
+        <page-menu @menuFold="menuFold" :menuItems="menuItems" ref="menu"></page-menu>
         <bread-crumb></bread-crumb>
         <bread-crumb></bread-crumb>
         <router-view class="mainBox" ref="curRouter"></router-view>
         <router-view class="mainBox" ref="curRouter"></router-view>
     </div>
     </div>
@@ -20,12 +20,26 @@ export default {
     data() {
     data() {
         return {
         return {
             isFold: false, // menu是否折叠
             isFold: false, // menu是否折叠
+            menuItems:[]
         };
         };
     },
     },
     methods: {
     methods: {
         menuFold(flag) {
         menuFold(flag) {
             this.isFold = flag;
             this.isFold = flag;
         },
         },
+        getMenuItems(){
+            this.$axios({
+                method: "POST",
+                url: this.$api.common.getMyMenuTree,
+                data:{}
+            }).then(res => {
+                if (res.code == 200 && res.info) {
+                    this.menuItems = res.info
+                }else{
+                    this.$message.error(res.message || '获取用户菜单失败')
+                }
+            })
+        },
     },
     },
     created() {
     created() {
         let { code, ticket } = this.$route.query;
         let { code, ticket } = this.$route.query;
@@ -40,16 +54,23 @@ export default {
                 if (res.code == 200 && !!res.info.access_token) {
                 if (res.code == 200 && !!res.info.access_token) {
                     localStorage.setItem(
                     localStorage.setItem(
                         "Authorization",
                         "Authorization",
-                        "Bearer " + res.info.access_token
+                        res.info.token_type + ' ' + res.info.access_token
                     );
                     );
+                    localStorage.setItem("refreshToken", res.info.refresh_token);
+                    localStorage.setItem("expiresTime", res.info.expires_time);
+
                     this.$nextTick(() => {
                     this.$nextTick(() => {
                         this.$refs.curRouter.init &&
                         this.$refs.curRouter.init &&
                             this.$refs.curRouter.init();
                             this.$refs.curRouter.init();
+
+                        this.getMenuItems()
                     });
                     });
                 } else {
                 } else {
                     this.$message.error(res.message || "网络异常");
                     this.$message.error(res.message || "网络异常");
                 }
                 }
             });
             });
+        }else{
+            this.getMenuItems()
         }
         }
     },
     },
 };
 };

+ 8 - 32
src/views/login.vue

@@ -80,25 +80,18 @@ export default {
                             );
                             );
                             localStorage.setItem("refreshToken", refreshToken);
                             localStorage.setItem("refreshToken", refreshToken);
                             localStorage.setItem("expiresTime", expiresTime);
                             localStorage.setItem("expiresTime", expiresTime);
+                            localStorage.setItem("username", this.form.username)
 
 
                             let tokenTimer = null;
                             let tokenTimer = null;
                             let toExpiresTime =
                             let toExpiresTime =
                                 new Date(expiresTime).getTime() -
                                 new Date(expiresTime).getTime() -
                                 new Date().getTime();
                                 new Date().getTime();
-
-                            // 过期时间前60秒即可发送获取新的token
-                            /*if (toExpiresTime > 60 * 1000) {
-                                tokenTimer = setTimeout(() => {
-                                    this.getRefreshToken();
-                                    clearTimeout(tokenTimer);
-                                    // }, toExpiresTime - 60 * 1000);
-                                }, 15 * 1000);
-                            } else {
-                                this.getRefreshToken();
+                            if (toExpiresTime < 5*60 * 1000) {
+                                this.getRefreshToken()
+                            }else{
+                                this.$router.push({ path: "/mainPage" });
                             }
                             }
-
-                            this.$message.success("登录成功");*/
-                            this.$router.push({ path: "/mainPage" });
+                            
                         } else {
                         } else {
                             this.$message.error(res.message || "登录失败");
                             this.$message.error(res.message || "登录失败");
                         }
                         }
@@ -124,25 +117,8 @@ export default {
                     localStorage.setItem("refreshToken", refreshToken);
                     localStorage.setItem("refreshToken", refreshToken);
                     localStorage.setItem("expiresTime", expiresTime);
                     localStorage.setItem("expiresTime", expiresTime);
 
 
-                    let tokenTimer = null;
-                    let toExpiresTime =
-                        new Date(expiresTime).getTime() - new Date().getTime();
-
-                    /*if (toExpiresTime > 60 * 1000) {
-                        tokenTimer = setTimeout(() => {
-                            this.i++;
-                            if (this.i >= 10) {
-                                clearTimeout(tokenTimer);
-                                return;
-                            }
-                            this.getRefreshToken();
-                            clearTimeout(tokenTimer);
-                            // }, toExpiresTime - 60 * 1000);
-                            // Bearer 59d5d321-f16c-4412-9177-7f7d1e9180aa
-                        }, 15 * 1000);
-                    } else {
-                        this.getRefreshToken();
-                    }*/
+                    this.$router.push({ path: "/mainPage" });
+                    
                 } else {
                 } else {
                     this.$message.error(res.message || "获取refresh_token失败");
                     this.$message.error(res.message || "获取refresh_token失败");
                 }
                 }

+ 8 - 0
src/views/mainPage.vue

@@ -373,6 +373,14 @@ export default {
     mounted() {
     mounted() {
         if (localStorage.getItem("Authorization")) {
         if (localStorage.getItem("Authorization")) {
             this.init();
             this.init();
+        }else{  //如果没有Authorization
+            /*this.$alert('用户信息过期,请重新登陆','提示',{
+                confirmButtonText:'确定',
+                callback: action => {
+                    let loginUrl = window.location.origin + '/login'
+                    window.location.href = loginUrl
+                }
+            })*/
         }
         }
     },
     },
 };
 };

+ 108 - 58
src/views/page/pageMenu.vue

@@ -14,11 +14,12 @@
                 >
                 >
                     <b class="my-icon-home is"></b>
                     <b class="my-icon-home is"></b>
                 </li>
                 </li>
+                <!--
                 <li
                 <li
                     @click="menuFoldHandle(1)"
                     @click="menuFoldHandle(1)"
                     v-bind:class="{ isOpened: opened === 'modelLibrary' }"
                     v-bind:class="{ isOpened: opened === 'modelLibrary' }"
                 >
                 >
-                    <b class="my-icon-menuA"></b>
+                    <b class="my-icon-model"></b>
                 </li>
                 </li>
                 <li
                 <li
                     @click="menuFoldHandle(1)"
                     @click="menuFoldHandle(1)"
@@ -38,18 +39,20 @@
                 >
                 >
                     <b class="my-icon-menuD"></b>
                     <b class="my-icon-menuD"></b>
                 </li>
                 </li>
-                <!-- <li
-                    @click="menuFoldHandle(1)"
-                    v-bind:class="{ isOpened: opened === 'systemManagement' }"
-                >
-                    <b class="my-icon-menuE"></b>
-                </li>
                 <li
                 <li
                     @click="menuFoldHandle(1)"
                     @click="menuFoldHandle(1)"
                     v-bind:class="{ isOpened: opened === 'systemManagement' }"
                     v-bind:class="{ isOpened: opened === 'systemManagement' }"
                 >
                 >
                     <b class="my-icon-menuF"></b>
                     <b class="my-icon-menuF"></b>
-                </li> -->
+                </li> 
+                -->
+                <li 
+                    v-for="(item, i) in menuItems" :key="i"
+                    @click="menuFoldHandle(1)"
+                    :class="{ isOpened: opened === item.id }"
+                >
+                    <b :class="item.icon"></b>
+                </li>
             </ul>
             </ul>
 
 
             <div class="menuList" v-show="!menuFold">
             <div class="menuList" v-show="!menuFold">
@@ -67,9 +70,11 @@
                         <i class="my-icon-home"></i>
                         <i class="my-icon-home"></i>
                         <span>首页</span>
                         <span>首页</span>
                     </el-menu-item>
                     </el-menu-item>
+                    
+                    <!--
                     <el-submenu :index="menus[1]">
                     <el-submenu :index="menus[1]">
                         <template slot="title">
                         <template slot="title">
-                            <i class="my-icon-menuA"></i>
+                            <i class="my-icon-model"></i>
                             <span>模型库</span>
                             <span>模型库</span>
                         </template>
                         </template>
                         <el-menu-item index="/sensorModel"
                         <el-menu-item index="/sensorModel"
@@ -84,7 +89,7 @@
                     </el-submenu>
                     </el-submenu>
                     <el-submenu :index="menus[2]">
                     <el-submenu :index="menus[2]">
                         <template slot="title">
                         <template slot="title">
-                            <i class="my-icon-menuB"></i>
+                            <i class="my-icon-algo"></i>
                             <span>算法库</span>
                             <span>算法库</span>
                         </template>
                         </template>
                         <el-menu-item index="/algorithmsLibraryList"
                         <el-menu-item index="/algorithmsLibraryList"
@@ -96,7 +101,7 @@
                     </el-submenu>
                     </el-submenu>
                     <el-submenu :index="menus[3]">
                     <el-submenu :index="menus[3]">
                         <template slot="title">
                         <template slot="title">
-                            <i class="my-icon-menuC"></i>
+                            <i class="my-icon-scene"></i>
                             <span>场景库</span>
                             <span>场景库</span>
                         </template>
                         </template>
                         <el-menu-item index="/naturalDrivingScenarioList"
                         <el-menu-item index="/naturalDrivingScenarioList"
@@ -119,16 +124,16 @@
                     </el-submenu>
                     </el-submenu>
                     <el-submenu :index="menus[4]">
                     <el-submenu :index="menus[4]">
                         <template slot="title">
                         <template slot="title">
-                            <i class="my-icon-menuD"></i>
+                            <i class="my-icon-work"></i>
                             <span>工作管理</span>
                             <span>工作管理</span>
                         </template>
                         </template>
                         <el-menu-item index="/manualRunProjectList"
                         <el-menu-item index="/manualRunProjectList"
                             >手动运行项目</el-menu-item
                             >手动运行项目</el-menu-item
                         >
                         >
                     </el-submenu>
                     </el-submenu>
-                    <!--<el-submenu index="systemManagement">
+                    <el-submenu :index="menus[5]">
                         <template slot="title">
                         <template slot="title">
-                            <i class="my-icon-menuF"></i>
+                            <i class="my-icon-system"></i>
                             <span>系统管理</span>
                             <span>系统管理</span>
                         </template>
                         </template>
                         <el-menu-item index="/accountManagement"
                         <el-menu-item index="/accountManagement"
@@ -137,9 +142,21 @@
                         <el-menu-item index="/parameterManagement"
                         <el-menu-item index="/parameterManagement"
                             >参数管理</el-menu-item
                             >参数管理</el-menu-item
                         >    
                         >    
-                        <el-menu-item index="clusteringManagement"
-                        >集群管理</el-menu-item>
-                    </el-submenu>-->
+                        <el-menu-item index="/clusteringManagement"
+                            >集群管理</el-menu-item>
+                    </el-submenu>
+                    -->
+
+                    <el-submenu v-for="(item, i) in menuItems" :index="item.id" :key="i">
+                        <template slot="title">
+                            <i :class="item.icon"></i>
+                            <span>{{item.name}}</span>  
+                        </template>
+                        <el-menu-item v-for="(item2, i2) in item.children" :index="item2.router" :key="i2">
+                            {{item2.name}}
+                        </el-menu-item>
+                    </el-submenu>
+
                 </el-menu>
                 </el-menu>
             </div>
             </div>
         </div>
         </div>
@@ -151,12 +168,18 @@ import { mapState } from "vuex";
 
 
 export default {
 export default {
     name: "pageMenu",
     name: "pageMenu",
+    props:{
+        menuItems:{
+            type: Array,
+            default(){return []}
+        }
+    },
     data() {
     data() {
         return {
         return {
             menuFold: false, // menu是否折叠
             menuFold: false, // menu是否折叠
             opened: false,
             opened: false,
             menus: [
             menus: [
-                "/mainPage",
+                "mainPage",
                 "modelLibrary",
                 "modelLibrary",
                 "algorithmsLibrary",
                 "algorithmsLibrary",
                 "sceneLibrary",
                 "sceneLibrary",
@@ -165,7 +188,7 @@ export default {
             activeMenu: "mainPage", // 当前menu
             activeMenu: "mainPage", // 当前menu
             expiresTime: '',
             expiresTime: '',
             toExpiresTime: '',
             toExpiresTime: '',
-            tokenTimer: undefined   
+            tokenTimer: undefined,
         };
         };
     },
     },
     computed: {
     computed: {
@@ -178,18 +201,27 @@ export default {
             this.$refs.menu.open(menuKind);
             this.$refs.menu.open(menuKind);
         }
         }
 
 
-        //设置一个定时器定时查看过期时间,如果距离过期时间小于5min,则发送refreshToken
-        /*
+        //设置一个定时器,定时在距离过期前5min,这个定时器会发送refreshToken请求
+        
         this.expiresTime = localStorage.getItem('expiresTime')
         this.expiresTime = localStorage.getItem('expiresTime')
-        this.toExpiresTime = new Date(this.expiresTime).getTime() - new Date().getTime();
-        if(this.toExpiresTime < 5*60*1000){
-            this.refreshToken()
-        }else{
-            setInterval(function(){
-                let that = this;
-                that.checkExpiresTime()
-            }, 5*60*1000)
-        }*/
+        if(this.expiresTime){
+            this.toExpiresTime = new Date(this.expiresTime).getTime() - new Date().getTime();
+            let that = this;
+            if(this.toExpiresTime < 5*60*1000){
+                this.refreshToken()
+            }else{
+                if(this.toExpiresTime < 24*60*60*1000){   //当过期时间小于一天时才会定时执行,否则会因为过期时间过大无法执行
+                    this.tokenTimer = setTimeout(function(){
+                        that.refreshToken()
+                    }, this.toExpiresTime - 5*60*1000)
+                }
+            }
+        }
+    },
+    watch:{
+        activeMenu(newV){
+            console.log(newV)
+        }
     },
     },
     methods: {
     methods: {
         menuFoldHandle(val) {
         menuFoldHandle(val) {
@@ -221,6 +253,7 @@ export default {
             this.$axios({
             this.$axios({
                 method: "post",
                 method: "post",
                 url: this.$api.common.refreshToken,
                 url: this.$api.common.refreshToken,
+                noLoading: true,
                 data: {
                 data: {
                     refreshToken: localStorage.getItem("refreshToken"),
                     refreshToken: localStorage.getItem("refreshToken"),
                 },
                 },
@@ -233,8 +266,25 @@ export default {
                     localStorage.setItem("Authorization", Authorization);
                     localStorage.setItem("Authorization", Authorization);
                     localStorage.setItem("refreshToken", refreshToken);
                     localStorage.setItem("refreshToken", refreshToken);
                     localStorage.setItem("expiresTime", expiresTime);
                     localStorage.setItem("expiresTime", expiresTime);
+                    
                     this.expiresTime = expiresTime
                     this.expiresTime = expiresTime
                     this.toExpiresTime = new Date(this.expiresTime).getTime() - new Date().getTime();
                     this.toExpiresTime = new Date(this.expiresTime).getTime() - new Date().getTime();
+                    clearTimeout(this.tokenTimer)
+                    if(this.toExpiresTime < 5*60*1000){
+                        //this.refreshToken()
+                    }else{
+                        if(this.toExpiresTime < 24*60*60*1000){  
+                            this.tokenTimer = setTimeout(function(){
+                                let that = this;
+                                that.refreshToken()
+                            }, this.toExpiresTime - 5*60*1000)
+                        }
+                    }
+                }else{
+                    if(res.code == 400){  //refreshToken请求返回400则跳回登录页
+                        let loginUrl = window.location.origin + '/login'
+                        window.location.href = loginUrl
+                    }
                 }
                 }
             })
             })
         }
         }
@@ -328,34 +378,6 @@ export default {
     }
     }
 }
 }
 
 
-.my-icon-home {
-    background: url("../../assets/common/image/menu/home.png") center no-repeat;
-}
-
-.my-icon-menuA {
-    background: url("../../assets/common/image/menu/menuA.png") center no-repeat;
-}
-
-.my-icon-menuB {
-    background: url("../../assets/common/image/menu/menuB.png") center no-repeat;
-}
-
-.my-icon-menuC {
-    background: url("../../assets/common/image/menu/menuC.png") center no-repeat;
-}
-
-.my-icon-menuD {
-    background: url("../../assets/common/image/menu/menuD.png") center no-repeat;
-}
-
-.my-icon-menuE {
-    background: url("../../assets/common/image/menu/menuE.png") center no-repeat;
-}
-
-.my-icon-menuF {
-    background: url("../../assets/common/image/menu/menuF.png") center no-repeat;
-}
-
 .menuFold {
 .menuFold {
     li {
     li {
         display: flex;
         display: flex;
@@ -452,4 +474,32 @@ export default {
         bottom: 30px;
         bottom: 30px;
     }
     }
 }
 }
+
+.my-icon-home {
+    background: url("../../assets/common/image/menu/home.png") center no-repeat;
+}
+
+.my-icon-model {
+    background: url("../../assets/common/image/menu/menuA.png") center no-repeat;
+}
+
+.my-icon-algo {
+    background: url("../../assets/common/image/menu/menuB.png") center no-repeat;
+}
+
+.my-icon-scene {
+    background: url("../../assets/common/image/menu/menuC.png") center no-repeat;
+}
+
+.my-icon-work {
+    background: url("../../assets/common/image/menu/menuD.png") center no-repeat;
+}
+
+.my-icon-menuE {
+    background: url("../../assets/common/image/menu/menuE.png") center no-repeat;
+}
+
+.my-icon-system {
+    background: url("../../assets/common/image/menu/menuF.png") center no-repeat;
+}
 </style>
 </style>

+ 2 - 2
src/views/systemManagement/clusteringManagement.vue

@@ -128,7 +128,7 @@ export default {
                     label: "到期时间",
                     label: "到期时间",
                     prop: "dateSimulationLicense",
                     prop: "dateSimulationLicense",
                     formatter:(data)=>{
                     formatter:(data)=>{
-                        return data.dateSimulationLicense.slice(0,10)
+                        return data.dateSimulationLicense?data.dateSimulationLicense.slice(0,10):''
                     }
                     }
                 },
                 },
                 {
                 {
@@ -139,7 +139,7 @@ export default {
                     label: "到期时间",
                     label: "到期时间",
                     prop: "dateDynamicLicense",
                     prop: "dateDynamicLicense",
                     formatter:(data)=>{
                     formatter:(data)=>{
-                        return data.dateDynamicLicense.slice(0,10)
+                        return data.dateDynamicLicense?data.dateDynamicLicense.slice(0,10):''
                     }
                     }
                 },
                 },
                 {
                 {