|
@@ -1,132 +1,10 @@
|
|
-import { AxiosWrapper } from '@/utils/axios-wrapper'
|
|
|
|
-import { UserStore } from '@/store/user'
|
|
|
|
-import { cloneDeep, get, isArray, omit } from 'lodash-es'
|
|
|
|
|
|
+import { get } from 'lodash-es'
|
|
import NProgress from 'nprogress'
|
|
import NProgress from 'nprogress'
|
|
import 'nprogress/nprogress.css'
|
|
import 'nprogress/nprogress.css'
|
|
-import { ElMessageBox } from 'element-plus'
|
|
|
|
-import i18n from '@/lang'
|
|
|
|
-const whiteList = ['/redirect', '/login', '/401', '/404']
|
|
|
|
-NProgress.configure({ showSpinner: false }) // 进度条
|
|
|
|
-// 检查路由是否存在
|
|
|
|
-const hasNecessaryRoute = (to, router) => {
|
|
|
|
- // 将默认注册的路由平铺成一维数组
|
|
|
|
- const routesOneDimensional = toOneDimensional(router.getRoutes())
|
|
|
|
- return routesOneDimensional.find((f) => f.path === to.path)
|
|
|
|
-}
|
|
|
|
-// 获取用户信息,返回菜单
|
|
|
|
-const getUserMeta = async (token) => {
|
|
|
|
- const userStore = UserStore()
|
|
|
|
- const axios = new AxiosWrapper()
|
|
|
|
- const result = await axios.$get(`/token/tokenView`, null, {
|
|
|
|
- headers: {
|
|
|
|
- token: token
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- if (result.errcode === 0) {
|
|
|
|
- userStore.setUser(result.data)
|
|
|
|
- const resetMenusResult = resetMenus(result.data.menus)
|
|
|
|
- const storeMenus = toRaw(userStore.menus)
|
|
|
|
- if (storeMenus.length <= 0) {
|
|
|
|
- userStore.setMenus(resetMenusResult)
|
|
|
|
- }
|
|
|
|
- return { menus: result.data.menus, errcode: 0 }
|
|
|
|
- }
|
|
|
|
- return { errmsg: result.errmsg, errcode: result.errcode }
|
|
|
|
-}
|
|
|
|
-/**
|
|
|
|
- * 将路由数组一维化
|
|
|
|
- * @param {Array} routes 路由数组
|
|
|
|
- * @returns 一维路由数组
|
|
|
|
- */
|
|
|
|
-const toOneDimensional = (routes) => {
|
|
|
|
- const result = []
|
|
|
|
- for (const r of routes) {
|
|
|
|
- const { children = [], ...others } = r
|
|
|
|
- result.push(others)
|
|
|
|
- if (children.length > 0) result.push(...toOneDimensional(children))
|
|
|
|
- }
|
|
|
|
- return result
|
|
|
|
-}
|
|
|
|
-// 添加路由
|
|
|
|
-const addUserRoutes = async (menus, router) => {
|
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
|
- // 将用户菜单转换成普通对象
|
|
|
|
- const menuArr = toRaw(menus)
|
|
|
|
- // 将用户菜单平铺成一维数组,并将目录过滤出去.目录不需要注册,不是组件
|
|
|
|
- const menuOneDimensional = toOneDimensional(menuArr)
|
|
|
|
- // 将默认注册的路由平铺成一维数组
|
|
|
|
- const routesOneDimensional = toOneDimensional(router.getRoutes())
|
|
|
|
- routesRegister(menuOneDimensional, routesOneDimensional, router)
|
|
|
|
- resolve()
|
|
|
|
- })
|
|
|
|
-}
|
|
|
|
-/**
|
|
|
|
- * 注册路由
|
|
|
|
- * @param {Array} menus 一维数组菜单
|
|
|
|
- * @param {Array} defaultRoutes 默认路由一维数组
|
|
|
|
- * @param {*} router 路由实例
|
|
|
|
- */
|
|
|
|
-const routesRegister = (menus, defaultRoutes, router) => {
|
|
|
|
- // 默认注册位置
|
|
|
|
- const __def = 'Layout'
|
|
|
|
- const loadComponent = import.meta.glob('../views/**/*.vue')
|
|
|
|
- for (const route of menus) {
|
|
|
|
- const { type, route_name, path, component, parent_id } = route
|
|
|
|
- if (!path) {
|
|
|
|
- // console.log(route)
|
|
|
|
- }
|
|
|
|
- // 检查路由是否已存在,存在跳过
|
|
|
|
- const hasRoute = defaultRoutes.find((f) => f.path === path)
|
|
|
|
- if (hasRoute) continue
|
|
|
|
- if (type === '0') {
|
|
|
|
- // 目录, 默认使用 `/${路由名称}`
|
|
|
|
- const route = {
|
|
|
|
- path: `/${route_name}`,
|
|
|
|
- name: route_name,
|
|
|
|
- meta: { title: route_name, type }
|
|
|
|
- }
|
|
|
|
- router.addRoute(__def, route)
|
|
|
|
- } else if (type === '1' || type === '2') {
|
|
|
|
- // 菜单 或 子菜单
|
|
|
|
- const route = {
|
|
|
|
- path: path,
|
|
|
|
- name: route_name,
|
|
|
|
- meta: {
|
|
|
|
- title: route_name,
|
|
|
|
- type
|
|
|
|
- },
|
|
|
|
- component: loadComponent[`../views${component}.vue`]
|
|
|
|
- }
|
|
|
|
- if (parent_id) {
|
|
|
|
- const parent = menus.find((f) => f._id === parent_id)
|
|
|
|
- if (!parent) continue
|
|
|
|
- const pos = parent.route_name
|
|
|
|
- router.addRoute(pos, route)
|
|
|
|
- // try {
|
|
|
|
- // } catch (error) {
|
|
|
|
- // console.log(pos, route)
|
|
|
|
- // console.error(error)
|
|
|
|
- // }
|
|
|
|
- } else {
|
|
|
|
- router.addRoute(__def, route)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-const resetMenus = (menus) => {
|
|
|
|
- if (!isArray(menus) || menus.length <= 0) return []
|
|
|
|
- const cMenus = cloneDeep(menus)
|
|
|
|
- const result = []
|
|
|
|
- for (const m of cMenus) {
|
|
|
|
- const mid = omit(m, ['is_use', 'order_num', 'in_admin_frame'])
|
|
|
|
- const { children } = mid
|
|
|
|
- if (children) mid.children = resetMenus(children)
|
|
|
|
- result.push(mid)
|
|
|
|
- }
|
|
|
|
- return result
|
|
|
|
-}
|
|
|
|
|
|
+import { UserStore } from '@/store/user'
|
|
|
|
|
|
|
|
+const whiteList = ['/redirect', '/login', '/401', '/404', '/route/loading']
|
|
|
|
+NProgress.configure({ showSpinner: false }) // 进度条
|
|
const dontRedirectList = ['/login', '/', '/401', '/404']
|
|
const dontRedirectList = ['/login', '/', '/401', '/404']
|
|
|
|
|
|
// 注册前置守卫
|
|
// 注册前置守卫
|
|
@@ -139,84 +17,30 @@ export const registerBeforeRouter = async (router) => {
|
|
next()
|
|
next()
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- if (token) {
|
|
|
|
- NProgress.inc()
|
|
|
|
- if (to.path === '/login') next()
|
|
|
|
- NProgress.inc()
|
|
|
|
- try {
|
|
|
|
- const { menus, errcode, errmsg } = await getUserMeta(token)
|
|
|
|
- // 登录信息有问题
|
|
|
|
- if (errcode !== 0) {
|
|
|
|
- if (errcode.includes('FRAMEERROR_401')) {
|
|
|
|
- await ElMessageBox.alert(errmsg, i18n.global.t('common.user_confirm'), {
|
|
|
|
- confirmButtonText: i18n.global.t('common.re_login'),
|
|
|
|
- type: 'error'
|
|
|
|
- })
|
|
|
|
- const fp = from.path
|
|
|
|
- const noneed = dontRedirectList.includes(fp)
|
|
|
|
- if (noneed) next('/login')
|
|
|
|
- else next(`/login?redirect=${from.fullPath}`)
|
|
|
|
- return
|
|
|
|
- } else {
|
|
|
|
- await ElMessageBox.alert(errmsg, i18n.global.t('common.user_confirm'), {
|
|
|
|
- confirmButtonText: i18n.global.t('common.re_login'),
|
|
|
|
- type: 'error'
|
|
|
|
- })
|
|
|
|
- // location.reload()
|
|
|
|
- const fp = from.path
|
|
|
|
- const noneed = dontRedirectList.includes(fp)
|
|
|
|
- if (noneed) next('/login')
|
|
|
|
- else next(`/login?redirect=${from.fullPath}`)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // 菜单格式不正确
|
|
|
|
- if (!menus) {
|
|
|
|
- next('/401')
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- // 检查目的地路由是否注册
|
|
|
|
- const hasRoute = hasNecessaryRoute(to, router)
|
|
|
|
- NProgress.inc()
|
|
|
|
- if (hasRoute || to.meta.hidden) {
|
|
|
|
- // 注册了直接进入
|
|
|
|
- if (get(from, 'query.redirect')) {
|
|
|
|
- const redirect = get(from, 'query.redirect')
|
|
|
|
- from.query = {}
|
|
|
|
- next(redirect)
|
|
|
|
- return
|
|
|
|
- } else {
|
|
|
|
- next()
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- // 没注册就先注册再重定向进入直到进入为止
|
|
|
|
- await addUserRoutes(menus, router)
|
|
|
|
- NProgress.inc()
|
|
|
|
- if (get(from, 'query.redirect')) {
|
|
|
|
- const redirect = get(from, 'query.redirect')
|
|
|
|
- from.query = {}
|
|
|
|
- next(redirect)
|
|
|
|
- } else {
|
|
|
|
- await next(to)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // next({ ...to, replace: true })
|
|
|
|
- }
|
|
|
|
- } catch (error) {
|
|
|
|
- await ElMessageBox.alert(i18n.global.t('common.token_error'), i18n.global.t('common.user_confirm'), {
|
|
|
|
- confirmButtonText: i18n.global.t('common.re_login'),
|
|
|
|
- type: 'error'
|
|
|
|
- })
|
|
|
|
- const fp = from.path
|
|
|
|
- const noneed = dontRedirectList.includes(fp)
|
|
|
|
- if (noneed) next('/login')
|
|
|
|
- else next(`/login?redirect=${from.fullPath}`)
|
|
|
|
- }
|
|
|
|
|
|
+ if (!token) {
|
|
|
|
+ // 没有登录信息,返回login,并记录当前路由
|
|
|
|
+ console.log('no token & not in whiteList')
|
|
|
|
+ const redirectPath = to.fullPath
|
|
|
|
+ next({ path: '/login', query: { redirectPath } })
|
|
|
|
+ return
|
|
} else {
|
|
} else {
|
|
- const fp = from.path
|
|
|
|
- const noneed = dontRedirectList.includes(fp)
|
|
|
|
- if (noneed) next('/login')
|
|
|
|
- else next(`/login?redirect=${from.fullPath}`)
|
|
|
|
|
|
+ const userStore = UserStore()
|
|
|
|
+ const userMenus = toRaw(userStore.menus)
|
|
|
|
+ if (!userMenus || userMenus.length <= 0) {
|
|
|
|
+ console.log('has token but no menus')
|
|
|
|
+ // 没有菜单,说明路由没有注册,需要注册路由,记录当前去哪里再跳转至路由
|
|
|
|
+ let redirectPath = to.fullPath
|
|
|
|
+ next({ path: '/route/loading', query: { redirectPath } })
|
|
|
|
+ return
|
|
|
|
+ } else {
|
|
|
|
+ // 路由注册了,直接gogogo
|
|
|
|
+ // 检查有没有redirectPath
|
|
|
|
+ console.log('continue')
|
|
|
|
+ let redirectPath = get(to, 'query.redirectPath')
|
|
|
|
+ if (redirectPath) next(redirectPath)
|
|
|
|
+ next()
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|