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(this.userInfo.type) 
 | 
        .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') 
 |