mirror of
https://github.com/XiaoDaiGua-Ray/ray-template.git
synced 2025-04-06 03:57:49 +08:00
97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
/**
|
|
*
|
|
* @author Ray <https://github.com/XiaoDaiGua-Ray>
|
|
*
|
|
* @date 2023-01-28
|
|
*
|
|
* @workspace ray-template
|
|
*
|
|
* @remark 今天也是元气满满撸代码的一天
|
|
*/
|
|
|
|
/**
|
|
*
|
|
* 路由守卫
|
|
* 进行路由鉴权操作
|
|
*
|
|
* 根据 meta role 与 BASIC_ROUTER 结合进行跳转路由鉴权操作
|
|
* 如果 meta role 为空则会默认认为全局可用
|
|
* 如果需要指定角色, 则添加该属性并且添加角色
|
|
* 当然, 你可以指定一个超级管理员角色, 默认获取全部路由
|
|
*/
|
|
|
|
import { getStorage } from '@/utils/cache'
|
|
import { APP_CATCH_KEY, ROOT_ROUTE } from '@/appConfig/appConfig'
|
|
import { redirectRouterToDashboard } from '@/router/helper/routerCopilot'
|
|
import { WHITE_ROUTES } from '@/appConfig/routerConfig'
|
|
import { validRole } from '@/router/helper/routerCopilot'
|
|
import { isValueType } from '@/utils/hook'
|
|
|
|
import type {
|
|
Router,
|
|
NavigationGuardNext,
|
|
RouteLocationNormalized,
|
|
} from 'vue-router'
|
|
import type { AppMenuOption } from '@/types/modules/app'
|
|
import type { AppRouteMeta } from '@/router/type'
|
|
|
|
/** 路由守卫 */
|
|
export const permissionRouter = (router: Router) => {
|
|
const { beforeEach } = router
|
|
|
|
const isToLogin = (
|
|
to: RouteLocationNormalized,
|
|
from: RouteLocationNormalized,
|
|
) => to.path === '/' || from.path === '/login'
|
|
|
|
beforeEach((to, from, next) => {
|
|
const token = getStorage<string>(APP_CATCH_KEY.token)
|
|
const catchRoutePath = getStorage<string>(
|
|
'menuKey',
|
|
'sessionStorage',
|
|
ROOT_ROUTE.path,
|
|
)
|
|
const { meta, name } = to
|
|
|
|
/** 是否含有 token */
|
|
if (token !== null) {
|
|
/** 是否在有 token 时去到登陆页 */
|
|
if (isToLogin(to, from)) {
|
|
redirectRouterToDashboard(true)
|
|
} else {
|
|
/** 是否为白名单 */
|
|
if (
|
|
!isValueType<symbol>(name, 'Symbol') &&
|
|
name &&
|
|
WHITE_ROUTES.includes(name)
|
|
) {
|
|
next()
|
|
} else {
|
|
/** 是否有权限 */
|
|
if (validRole(meta as AppRouteMeta)) {
|
|
/** 是否在有权限时去到登陆页 */
|
|
if (isToLogin(to, from)) {
|
|
/** 容错处理, 如果没有预设地址与获取到缓存地址, 则重定向到首页去 */
|
|
if (catchRoutePath) {
|
|
next(catchRoutePath)
|
|
} else {
|
|
redirectRouterToDashboard(true)
|
|
}
|
|
} else {
|
|
next()
|
|
}
|
|
} else {
|
|
redirectRouterToDashboard(true)
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (isToLogin(to, from)) {
|
|
next()
|
|
} else {
|
|
next('/')
|
|
}
|
|
}
|
|
})
|
|
}
|