|
|
|
@ -3,11 +3,11 @@ |
|
|
|
* |
|
|
|
* |
|
|
|
* 需要鉴权的路由:!meta.noAuth |
|
|
|
* 需要鉴权的路由:!meta.noAuth |
|
|
|
* 左侧菜单显示:name && !hidden && meta.title |
|
|
|
* 左侧菜单显示:name && !hidden && meta.title |
|
|
|
* 左侧菜单排序:能显示 && sort,升序排列 |
|
|
|
* 左侧菜单排序:能在左侧菜单中显示 && sort,升序排列 |
|
|
|
* 左侧菜单不折叠只有一个children的路由:alwaysShow |
|
|
|
* 左侧菜单不折叠只有一个children的路由:alwaysShow |
|
|
|
* 面包屑显示:meta.title |
|
|
|
* 面包屑显示:meta.title || meta.dynamicTitle |
|
|
|
* 搜索选项显示:name && meta.title |
|
|
|
* 搜索选项显示:name && meta.title |
|
|
|
* tab栏显示:name && meta.title |
|
|
|
* tab栏显示:name && (meta.title || meta.dynamicTitle) |
|
|
|
* tab栏固定显示:meta.affix |
|
|
|
* tab栏固定显示:meta.affix |
|
|
|
* 页面不缓存:!name && !meta.isDetailPage || meta.noCache |
|
|
|
* 页面不缓存:!name && !meta.isDetailPage || meta.noCache |
|
|
|
* 打开iframe:meta.iframe,不会重复打开相同src的iframe |
|
|
|
* 打开iframe:meta.iframe,不会重复打开相同src的iframe |
|
|
|
@ -18,7 +18,7 @@ import store from "@/store" |
|
|
|
import NProgress from 'nprogress' |
|
|
|
import NProgress from 'nprogress' |
|
|
|
import {isUserExist} from "@/utils/storage" |
|
|
|
import {isUserExist} from "@/utils/storage" |
|
|
|
import {auth, needAuth} from "@/utils/auth" |
|
|
|
import {auth, needAuth} from "@/utils/auth" |
|
|
|
import {getPageTitle, transformWhiteList, metaExtend} from './util' |
|
|
|
import {setPageTitle, specifyRouteTitle, transformWhiteList, metaExtend} from './util' |
|
|
|
import {contextPath, routerMode} from '@/config' |
|
|
|
import {contextPath, routerMode} from '@/config' |
|
|
|
import constantRoutes from '@/router/constant' |
|
|
|
import constantRoutes from '@/router/constant' |
|
|
|
import authorityRoutes from '@/router/authority' |
|
|
|
import authorityRoutes from '@/router/authority' |
|
|
|
@ -27,13 +27,13 @@ Vue.use(Router) |
|
|
|
|
|
|
|
|
|
|
|
NProgress.configure({showSpinner: false}) |
|
|
|
NProgress.configure({showSpinner: false}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
metaExtend(constantRoutes) |
|
|
|
|
|
|
|
metaExtend(authorityRoutes) |
|
|
|
|
|
|
|
|
|
|
|
const endRoute = [{path: '*', redirect: '/404', hidden: true}] |
|
|
|
const endRoute = [{path: '*', redirect: '/404', hidden: true}] |
|
|
|
|
|
|
|
|
|
|
|
const whiteList = transformWhiteList(['/login', '/register', '/404', '/403']) |
|
|
|
const whiteList = transformWhiteList(['/login', '/register', '/404', '/403']) |
|
|
|
|
|
|
|
|
|
|
|
metaExtend(constantRoutes) |
|
|
|
|
|
|
|
metaExtend(authorityRoutes) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const router = new Router({ |
|
|
|
const router = new Router({ |
|
|
|
base: contextPath, |
|
|
|
base: contextPath, |
|
|
|
mode: routerMode, |
|
|
|
mode: routerMode, |
|
|
|
@ -45,29 +45,22 @@ router.beforeEach(async (to, from, next) => { |
|
|
|
//使用redirect进行跳转时不显示进度条
|
|
|
|
//使用redirect进行跳转时不显示进度条
|
|
|
|
!to.path.startsWith('/redirect') && NProgress.start() |
|
|
|
!to.path.startsWith('/redirect') && NProgress.start() |
|
|
|
|
|
|
|
|
|
|
|
//若是详情页之间的跳转,借助redirect避免组件复用
|
|
|
|
if (needExtraRedirect(to, from)) { |
|
|
|
const isToDetailPage = to.meta && to.meta.isDetailPage, |
|
|
|
//这里vue-router会报redirect错误,已在main.js中忽略
|
|
|
|
isFromDetailPage = from.meta && from.meta.isDetailPage |
|
|
|
return next(`/redirect${to.fullPath}`) |
|
|
|
if (isToDetailPage !== undefined && isToDetailPage === isFromDetailPage) { |
|
|
|
|
|
|
|
//这里vue-router会报redirect错误
|
|
|
|
|
|
|
|
return next({path: `/redirect${to.path}`, query: to.query}) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
document.title = getPageTitle(to) |
|
|
|
specifyRouteTitle(to, from) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setPageTitle(to) |
|
|
|
|
|
|
|
|
|
|
|
//白名单内不需要进行权限控制
|
|
|
|
//白名单内不需要进行权限控制
|
|
|
|
if (whiteList.some(reg => reg.test(to.path))) return next() |
|
|
|
if (whiteList.some(reg => reg.test(to.path))) return next() |
|
|
|
|
|
|
|
|
|
|
|
const isLogin = isUserExist() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//未登录时返回登录页
|
|
|
|
//未登录时返回登录页
|
|
|
|
if (!isLogin) return next({path: '/login', query: {redirect: to.fullPath}}) |
|
|
|
if (!isUserExist()) return next({path: '/login', query: {redirect: to.fullPath}}) |
|
|
|
|
|
|
|
|
|
|
|
//初始化菜单
|
|
|
|
await initMenuAndResource() |
|
|
|
await initMenu() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//已登录时访问登录页则跳转至首页
|
|
|
|
|
|
|
|
if (to.path === '/login') return next({path: '/'}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//页面不需要鉴权或有访问权限时通过
|
|
|
|
//页面不需要鉴权或有访问权限时通过
|
|
|
|
if (!needAuth(to) || auth(to.path)) { |
|
|
|
if (!needAuth(to) || auth(to.path)) { |
|
|
|
@ -76,13 +69,22 @@ router.beforeEach(async (to, from, next) => { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//用户无权限访问时的动作
|
|
|
|
//用户无权限访问时的动作
|
|
|
|
next({path: '/403'}) |
|
|
|
next('/403') |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
router.afterEach(() => NProgress.done()) |
|
|
|
router.afterEach(() => NProgress.done()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//判断是否需要一次额外的redirect跳转
|
|
|
|
|
|
|
|
function needExtraRedirect(to, from) { |
|
|
|
|
|
|
|
//若是详情页之间的跳转,借助redirect避免组件复用
|
|
|
|
|
|
|
|
const isToDetailPage = to.meta.isDetailPage, |
|
|
|
|
|
|
|
isFromDetailPage = from.meta.isDetailPage |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return isToDetailPage !== undefined && isToDetailPage === isFromDetailPage |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//初始化菜单和权限
|
|
|
|
//初始化菜单和权限
|
|
|
|
function initMenu() { |
|
|
|
function initMenuAndResource() { |
|
|
|
if (!store.state.resource.hasInitRoutes) { |
|
|
|
if (!store.state.resource.hasInitRoutes) { |
|
|
|
return store.dispatch('resource/init', store.state.user) |
|
|
|
return store.dispatch('resource/init', store.state.user) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -91,12 +93,11 @@ function initMenu() { |
|
|
|
|
|
|
|
|
|
|
|
//判断是否需要打开iframe
|
|
|
|
//判断是否需要打开iframe
|
|
|
|
function iframeControl(to, from) { |
|
|
|
function iframeControl(to, from) { |
|
|
|
const isRefresh = to.path === '/redirect' + from.path |
|
|
|
let iframe = to.meta.iframe |
|
|
|
let iframe = to.meta && to.meta.iframe |
|
|
|
|
|
|
|
const operate = iframe ? 'open' : 'close' |
|
|
|
const operate = iframe ? 'open' : 'close' |
|
|
|
|
|
|
|
if (to.path === `/redirect${from.path}`) { |
|
|
|
if (isRefresh) iframe = from.meta && from.meta.iframe |
|
|
|
iframe = from.meta.iframe |
|
|
|
|
|
|
|
} |
|
|
|
return store.dispatch(`iframe/${operate}`, iframe) |
|
|
|
return store.dispatch(`iframe/${operate}`, iframe) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|