UnisKB/ui/src/router/chat/index.ts

137 lines
3.4 KiB
TypeScript

import { hasPermission } from '@/utils/permission/index'
import NProgress from 'nprogress'
import {
createRouter,
createWebHistory,
type NavigationGuardNext,
type RouteLocationNormalized,
type RouteRecordRaw,
type RouteRecordName,
} from 'vue-router'
import useStore from '@/stores'
import { routes } from '@/router/chat/routes'
NProgress.configure({ showSpinner: false, speed: 500, minimum: 0.3 })
const router = createRouter({
history: createWebHistory(window.MaxKB?.prefix ? window.MaxKB?.prefix : import.meta.env.BASE_URL),
routes: routes,
})
// 路由前置拦截器
router.beforeEach(
async (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
NProgress.start()
if (to.path === '/404') {
next()
return
}
const { chatUser } = useStore()
if (['login', 'chat'].includes(to.name ? to.name.toString() : '')) {
chatUser.setAccessToken(to.params.accessToken.toString())
} else {
next({
path: '/404',
})
return
}
let authentication = false
try {
authentication = await chatUser.isAuthentication()
} catch (e: any) {
next({
path: '/404',
})
return
}
const p_token = to.query.token
if (p_token) {
chatUser.setToken(p_token as string)
}
const token = chatUser.getToken()
if (authentication) {
if (!token && to.name != 'login') {
next({
name: 'login',
params: {
accessToken: to.params.accessToken,
},
})
return
} else {
if (to.name == 'login') {
next()
return
} else {
try {
await chatUser.applicationProfile()
await chatUser.getChatUserProfile()
} catch (e: any) {
if (e.response?.status === 401) {
next({
name: 'login',
params: {
accessToken: to.params.accessToken,
},
})
}
return
}
if (p_token) {
next({ ...to, query: {} })
} else {
next()
}
return
}
}
} else {
await chatUser.anonymousAuthentication()
}
if (!chatUser.application) {
try {
await chatUser.applicationProfile()
} catch (e: any) {
if (e.response?.status === 401) {
next({
name: 'login',
params: {
accessToken: to.params.accessToken,
},
})
}
return
}
}
next()
},
)
router.afterEach(() => {
NProgress.done()
})
export const getChildRouteListByPathAndName = (path: any, name?: RouteRecordName | any) => {
return getChildRouteList(routes, path, name)
}
export const getChildRouteList: (
routeList: Array<RouteRecordRaw>,
path: string,
name?: RouteRecordName | null | undefined,
) => Array<RouteRecordRaw> = (routeList, path, name) => {
for (let index = 0; index < routeList.length; index++) {
const route = routeList[index]
if (name === route.name && path === route.path) {
return route.children || []
}
if (route.children && route.children.length > 0) {
const result = getChildRouteList(route.children, path, name)
if (result && result?.length > 0) {
return result
}
}
}
return []
}
export default router