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 { ElementTiptapPlugin } from 'element-tiptap'
|
import 'element-tiptap/lib/index.css'
|
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'
|
import preventReClick from '@/directives/directive'
|
import Treeselect from '@riophae/vue-treeselect'
|
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
|
Vue.component('treeselect', Treeselect)
|
|
Vue.use(preventReClick)
|
Vue.config.productionTip = false
|
Vue.use(ElementUI, {
|
size: 'small'
|
})
|
Vue.use(ElementTiptapPlugin, {
|
lang: 'zh'
|
})
|
Vue.use(VueClipboard)
|
Vue.use(directives)
|
Vue.use(filters)
|
Vue.use(plugins)
|
|
new Vue({
|
data: {
|
loading: false
|
},
|
router,
|
store,
|
computed: {
|
...mapState(['userInfo', 'homePage','topMenuCurrent','menuData'])
|
},
|
watch: {
|
async userInfo () {
|
if (this.userInfo == null) {
|
return
|
}
|
await this.initRoutes()
|
},
|
async topMenuCurrent () {
|
if (this.topMenuCurrent == null) {
|
return
|
}
|
await this.chagneRoutes()
|
}
|
},
|
methods: {
|
...mapMutations(['switchCollapseMenu', 'setHomePage', 'setTopMenuCurrent', 'setTopMenuCurrent','cleartagsview']),
|
// 初始化本地配置
|
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
|
const storeTopMenus = this.$store.state.topMenuList.list
|
if (storeMenus.length > 0 && this.homePage == null) {
|
this.setHomePage(storeMenus[0])
|
}
|
await fetchMenuTree()
|
.then(allmenus => {
|
// 添加菜单
|
var topList = allmenus.filter(item => {
|
return item.type === 1
|
})
|
storeTopMenus.push.apply(storeTopMenus, topList)
|
var topCurrent = null
|
var tlist =[]
|
topList.forEach(item => {
|
if (item.linkType === 0 ) {
|
if (topCurrent == null) {
|
topCurrent = item
|
}
|
tlist.push(...item.children)
|
}
|
})
|
this.setTopMenuCurrent(topCurrent)
|
// console.log(topList)
|
// var menus = []
|
// topList.forEach(item => {
|
// console.log(topCurrent.id, item.id)
|
// if (item.id == this.topMenuCurrent.id) {
|
// menus = item.children
|
// }
|
// })
|
console.log('menus', this.menuData.list)
|
storeMenus.push.apply(storeMenus, this.menuData.list)
|
// 添加路由
|
this.__addRouters(tlist)
|
// 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
|
})
|
},
|
async chagneRoutes () {
|
// 重置菜单
|
this.cleartagsview('/index')
|
console.log('menus', this.menuData.list)
|
// 添加路由
|
// this.__addRouters(this.menuData.list)
|
if(this.topMenuCurrent.homeUrl){
|
await this.$router.push({path: this.topMenuCurrent.homeUrl, query: {}})
|
}
|
},
|
// 新建路由
|
__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')
|