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')
|