mirror of
https://gitee.com/niucloud-team/niucloud.git
synced 2026-01-26 04:28:10 +00:00
175 lines
6.2 KiB
TypeScript
175 lines
6.2 KiB
TypeScript
import { createRouter, createWebHistory, RouteLocationRaw, RouteLocationNormalizedLoaded } from 'vue-router'
|
|
import NProgress from 'nprogress'
|
|
import 'nprogress/nprogress.css'
|
|
import { STATIC_ROUTES, NO_LOGIN_ROUTES, ROOT_ROUTER, ADMIN_ROUTE, HOME_ROUTE, SITE_ROUTE, findFirstValidRoute } from './routers'
|
|
import { language } from '@/lang'
|
|
import useSystemStore from '@/stores/modules/system'
|
|
import useUserStore from '@/stores/modules/user'
|
|
import { setWindowTitle, getAppType, urlToRouteRaw } from '@/utils/common'
|
|
import storage from '@/utils/storage'
|
|
|
|
// 加载插件中定义的router
|
|
const ADDON_ROUTE = []
|
|
const addonRoutes = import.meta.globEager('@/addon/**/router/index.ts')
|
|
for (const key in addonRoutes) {
|
|
const addon = addonRoutes[key]
|
|
addon.ROUTE && ADDON_ROUTE.push(...addon.ROUTE)
|
|
addon.NO_LOGIN_ROUTES && NO_LOGIN_ROUTES.push(...addon.NO_LOGIN_ROUTES)
|
|
}
|
|
|
|
const router = createRouter({
|
|
history: createWebHistory(import.meta.env.BASE_URL),
|
|
routes: [ADMIN_ROUTE, HOME_ROUTE, SITE_ROUTE, ...STATIC_ROUTES, ...ADDON_ROUTE]
|
|
})
|
|
|
|
/**
|
|
* 重写push方法
|
|
*/
|
|
const originPush = router.push
|
|
router.push = (to: RouteLocationRaw) => {
|
|
const route = typeof to == 'string' ? urlToRouteRaw(to) : to
|
|
if (route.path) {
|
|
const paths = route.path.split('/').filter((item: string) => { return item })
|
|
route.path = ['admin', 'site', 'home'].indexOf(paths[0]) == -1 ? `/${getAppType()}${route.path}` : route.path
|
|
}
|
|
return originPush(route)
|
|
}
|
|
|
|
/**
|
|
* 重写resolve方法
|
|
*/
|
|
const originResolve = router.resolve
|
|
router.resolve = (to: RouteLocationRaw, currentLocation?: RouteLocationNormalizedLoaded) => {
|
|
const route = typeof to == 'string' ? urlToRouteRaw(to) : to
|
|
if (route.path) {
|
|
const paths = route.path.split('/').filter((item: string) => { return item })
|
|
route.path = ['admin', 'site', 'home'].indexOf(paths[0]) == -1 ? `/${getAppType()}${route.path}` : route.path
|
|
}
|
|
return originResolve(route, currentLocation)
|
|
}
|
|
|
|
// 全局前置守卫
|
|
router.beforeEach(async (to, from, next) => {
|
|
NProgress.configure({ showSpinner: false })
|
|
NProgress.start()
|
|
|
|
to.redirectedFrom && (to.query = to.redirectedFrom.query)
|
|
|
|
const userStore = useUserStore()
|
|
const systemStore = useSystemStore()
|
|
const appType = getAppType()
|
|
|
|
let title: string = to.meta.title ?? ''
|
|
|
|
if (!userStore.siteInfo && appType != 'home') {
|
|
await userStore.getSiteInfo()
|
|
}
|
|
|
|
// 加载语言包
|
|
await language.loadLocaleMessages(to.meta.addon || '', (to.meta.view || to.path), systemStore.lang);
|
|
|
|
let matched: any = to.matched;
|
|
if (matched && matched.length && matched[0].path != '/:pathMatch(.*)*') {
|
|
matched = matched[0].path;
|
|
} else {
|
|
matched = appType
|
|
}
|
|
|
|
const loginPath = to.path == '/' ? '/admin/login' : `/${matched == '/admin' ? 'admin' : 'site'}/login`
|
|
|
|
if (appType != 'site' || to.path === loginPath) {
|
|
title += systemStore.website.site_name ? ('-' + systemStore.website.site_name) : ''
|
|
} else {
|
|
title += userStore.siteInfo && userStore.siteInfo.site_name ? ('-' + userStore.siteInfo.site_name) : ''
|
|
}
|
|
|
|
// 设置网站标题
|
|
setWindowTitle(title)
|
|
|
|
// 判断是否需登录
|
|
if (NO_LOGIN_ROUTES.includes(to.path)) {
|
|
next()
|
|
} else if (userStore.token) {
|
|
// 如果已加载路由
|
|
if (userStore.routers.length) {
|
|
if (to.path === loginPath) {
|
|
next(`/${getAppType()}`)
|
|
} else {
|
|
next()
|
|
}
|
|
} else {
|
|
try {
|
|
if (!userStore.siteInfo || userStore.siteInfo.site_id == undefined) {
|
|
if (to.path === '/home/index') {
|
|
next()
|
|
} else {
|
|
next({ path: '/home/index', replace: true })
|
|
}
|
|
} else {
|
|
await userStore.getAuthMenus()
|
|
|
|
// 设置首页路由
|
|
let firstRoute: symbol | string | undefined = findFirstValidRoute(userStore.routers)
|
|
if (getAppType() != 'admin') {
|
|
for (let i = 0; i < userStore.siteInfo?.apps.length; i++) {
|
|
const item = userStore.siteInfo?.apps[i]
|
|
if (userStore.addonIndexRoute[item.key]) {
|
|
firstRoute = userStore.addonIndexRoute[item.key]
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
ROOT_ROUTER.redirect = { name: firstRoute }
|
|
router.addRoute(ROOT_ROUTER)
|
|
|
|
// 设置应用首页路由
|
|
if (getAppType() == 'admin') {
|
|
ADMIN_ROUTE.children[0].redirect = { name: firstRoute }
|
|
router.addRoute(ADMIN_ROUTE)
|
|
} else {
|
|
SITE_ROUTE.children[0].redirect = { name: firstRoute }
|
|
router.addRoute(SITE_ROUTE)
|
|
}
|
|
|
|
// 添加动态路由
|
|
userStore.routers.forEach(route => {
|
|
if (!route.children) {
|
|
if (route.meta.app == 'admin') {
|
|
router.addRoute(ADMIN_ROUTE.children[0].name, route)
|
|
} else {
|
|
router.addRoute(SITE_ROUTE.children[0].name, route)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 动态添加可访问路由表
|
|
if (route.meta.app == 'admin') {
|
|
router.addRoute(ADMIN_ROUTE.name, route)
|
|
} else {
|
|
router.addRoute(SITE_ROUTE.name, route)
|
|
}
|
|
})
|
|
next(to)
|
|
}
|
|
|
|
} catch (err) {
|
|
next({ path: loginPath, query: { redirect: to.fullPath } })
|
|
}
|
|
}
|
|
} else {
|
|
if (to.path === loginPath) {
|
|
next()
|
|
} else {
|
|
next({ path: loginPath, query: { redirect: to.fullPath } })
|
|
}
|
|
}
|
|
})
|
|
|
|
// 全局后置钩子
|
|
router.afterEach(() => {
|
|
NProgress.done()
|
|
})
|
|
|
|
export default router
|