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