import Vue from 'vue' import VueRouter from 'vue-router' // 进度条 import NProgress from 'nprogress' import 'nprogress/nprogress.css' import store from '@/store/index' import util from '@/libs/util.js' // 路由数据 import routes from './routes' import { getMenu, handleAsideMenu, handleRouter, checkRouter } from '@/menu' import { request } from '@/api/service' // fix vue-router NavigationDuplicated const VueRouterPush = VueRouter.prototype.push VueRouter.prototype.push = function push (location) { return VueRouterPush.call(this, location).catch(err => err) } const VueRouterReplace = VueRouter.prototype.replace VueRouter.prototype.replace = function replace (location) { return VueRouterReplace.call(this, location).catch(err => err) } Vue.use(VueRouter) console.log(routes) // 导出路由 在 main.js 里使用 const router = new VueRouter({ routes }) /** * 路由拦截 * 权限验证 */ router.beforeEach(async (to, from, next) => { // 白名单 const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/clientRenew', '/oauth2'] // 确认已经加载多标签页数据 https://github.com/d2-projects/d2-admin/issues/201 await store.dispatch('d2admin/page/isLoaded') // 确认已经加载组件尺寸设置 https://github.com/d2-projects/d2-admin/issues/198 await store.dispatch('d2admin/size/isLoaded') // 进度条 NProgress.start() // 关闭搜索面板 store.commit('d2admin/search/set', false) // 验证当前路由所有的匹配中是否需要有登录验证的 // 这里暂时将cookie里是否存有token作为验证是否登录的条件 // 请根据自身业务需要修改 const token = util.cookies.get('token') if (token && token !== 'undefined') { if (!store.state.d2admin.user.info.name) { var res = await request({ url: '/api/system/user/user_info/', method: 'get', params: {} }) await store.dispatch('d2admin/user/set', res.data, { root: true }) await store.dispatch('d2admin/account/load') store.dispatch('d2admin/dept/load') store.dispatch('d2admin/settings/init') } if (!store.state.d2admin.menu || store.state.d2admin.menu.aside.length === 0) { // 动态添加路由 getMenu().then(ret => { // 校验路由是否有效 ret = checkRouter(ret) const { routes, frameOut } = handleRouter(ret) // 处理路由 得到每一级的路由设置 store.commit('d2admin/page/init', routes) routes.map((r) => { router.addRoute(r) }) frameOut.map((r) => { router.addRoute(r) router.options.routes.push(r) }) console.log('router', router, routes, frameOut) // routes.forEach(route => router.addRoute(route)) const menu = handleAsideMenu(ret) const aside = handleAsideMenu(ret.filter(value => value.visible === true)) store.commit('d2admin/menu/asideSet', aside) // 设置侧边栏菜单 store.commit('d2admin/search/init', menu) // 设置搜索 next({ path: to.fullPath, replace: true, params: to.params }) }) } else { const childrenPath = window.qiankunActiveRule || [] if (to.name) { // 有 name 属性,说明是主应用的路由 if (to.meta.openInNewWindow && !to.query.newWindow) { // 在新窗口中打开路由 const { href } = router.resolve({ path: to.path + '?newWindow=1' }) window.open(href, '_blank') // 取消当前导航 NProgress.done() next(false) } else { next() } } else if (childrenPath.some((item) => to.path.includes(item))) { next() } else { next({ name: '404' }) } } } else { // 没有登录的时候跳转到登录界面 // 携带上登陆成功之后需要跳转的页面完整路径 // https://github.com/d2-projects/d2-admin/issues/138 if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 next() } else { next({ name: 'login', query: { redirect: to.fullPath } }) NProgress.done() } } }) router.afterEach(to => { // 进度条 NProgress.done() // 多页控制 打开新的页面 store.dispatch('d2admin/page/open', to) // 更改标题 util.title(to.meta.title) }) export default router