| import Vue from 'vue' | 
| import App from './App.vue' | 
| import router from './router' | 
| import store from './store' | 
| import ElementUI from 'element-ui' | 
| import './assets/style/element-variables.scss' | 
| import VueClipboard from 'vue-clipboard2' | 
| import directives from './directives' | 
| import filters from './filters' | 
| import plugins from './plugins' | 
| import { mapState, mapMutations } from 'vuex' | 
| import { fetchMenuTree } from './api/system/menu' | 
|   | 
| Vue.config.productionTip = false | 
| Vue.use(ElementUI, { | 
|   size: 'small' | 
| }) | 
| Vue.use(VueClipboard) | 
| Vue.use(directives) | 
| Vue.use(filters) | 
| Vue.use(plugins) | 
|   | 
| new Vue({ | 
|   data: { | 
|     loading: false | 
|   }, | 
|   router, | 
|   store, | 
|   computed: { | 
|     ...mapState(['userInfo', 'homePage']) | 
|   }, | 
|   watch: { | 
|     async userInfo () { | 
|       if (this.userInfo == null) { | 
|         return | 
|       } | 
|       await this.initRoutes() | 
|     } | 
|   }, | 
|   methods: { | 
|     ...mapMutations(['switchCollapseMenu', 'setHomePage']), | 
|     // 初始化本地配置 | 
|     initLocalConfig () { | 
|       // 菜单状态配置 | 
|       const menuStatus = window.localStorage.getItem('MENU_STATUS') | 
|       if (menuStatus != null) { | 
|         this.switchCollapseMenu(menuStatus === 'true') | 
|       } | 
|     }, | 
|     // 初始化路由 | 
|     async initRoutes () { | 
|       if (this.loading || this.userInfo == null) { | 
|         return | 
|       } | 
|       this.loading = true | 
|       // 重置菜单 | 
|       this.$store.commit('resetMenus') | 
|       // 获取菜单 | 
|       const storeMenus = this.$store.state.menuData.list | 
|       if (storeMenus.length > 0 && this.homePage == null) { | 
|         this.setHomePage(storeMenus[0]) | 
|       } | 
|       await fetchMenuTree({ type: 0 }) | 
|         .then(menus => { | 
|           // 添加菜单 | 
|           storeMenus.push.apply(storeMenus, menus) | 
|           // 添加路由 | 
|           this.__addRouters(storeMenus) | 
|           // 404 | 
|           router.addRoute({ | 
|             path: '*', | 
|             redirect: '/not-found' | 
|           }) | 
|           // 首页 | 
|           router.addRoute({ | 
|             name: 'index', | 
|             path: '/', | 
|             redirect: this.homePage.url | 
|           }) | 
|           // 路由加载完成后,如果访问的是/,跳转至动态识别的首页 | 
|           if (this.$route.path === '/') { | 
|             this.$router.push(this.homePage.url) | 
|           } | 
|         }) | 
|         .catch(e => { | 
|           throw e | 
|         }) | 
|         .finally(() => { | 
|           this.loading = false | 
|         }) | 
|     }, | 
|     // 新建路由 | 
|     __addRouters (routes, parents = []) { | 
|       if (routes == null || routes.length === 0) { | 
|         return | 
|       } | 
|       const rs = router.getRoutes() | 
|       for (const route of routes) { | 
|         const parentsDump = JSON.parse(JSON.stringify(parents)) | 
|         parentsDump.push(route) | 
|         if (route.url == null || route.url === '') { | 
|           this.__addRouters(route.children, parentsDump) | 
|           continue | 
|         } | 
|         if (rs.findIndex(r => r.path === route.url) > -1) { | 
|           this.__addRouters(route.children, parentsDump) | 
|           continue | 
|         } | 
|         if (this.homePage == null) { | 
|           this.setHomePage(route) | 
|         } | 
|         router.addRoute('layout', { | 
|           path: route.url, | 
|           name: route.label, | 
|           meta: { | 
|             title: route.label, | 
|             paths: [...parents.map(p => p.label), route.label] | 
|           }, | 
|           component: () => import('@/views' + route.url) | 
|         }) | 
|         this.__addRouters(route.children, parentsDump) | 
|       } | 
|     } | 
|   }, | 
|   async created () { | 
|     if (this.userInfo == null) { | 
|       return | 
|     } | 
|     await this.initRoutes() | 
|       .catch(() => {}) | 
|   }, | 
|   mounted () { | 
|     this.initLocalConfig() | 
|   }, | 
|   render: h => h(App) | 
| }).$mount('#app') |