Files
webman-buildadmin/web/src/router/index.ts

105 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { createRouter, createWebHashHistory } from 'vue-router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import staticRoutes from '/@/router/static'
import { adminBaseRoutePath } from '/@/router/static/adminBase'
import { loading } from '/@/utils/loading'
import langAutoLoadMap from '/@/lang/autoload'
import { mergeMessage } from '/@/lang/index'
import { useConfig } from '/@/stores/config'
import { useAdminInfo } from '/@/stores/adminInfo'
import { isAdminApp } from '/@/utils/common'
import { uniq } from 'lodash-es'
const router = createRouter({
history: createWebHashHistory(),
routes: staticRoutes,
})
router.beforeEach((to, from, next) => {
// 后台路由鉴权:未登录时访问 /admin 或 /admin/*(除 /admin/login则跳转登录页
const isAdminRoute = to.path === adminBaseRoutePath || to.path.startsWith(adminBaseRoutePath + '/')
const isAdminLogin = to.path === adminBaseRoutePath + '/login'
if (isAdminRoute && !isAdminLogin) {
const adminInfo = useAdminInfo()
if (!adminInfo.token) {
next({ name: 'adminLogin' })
return
}
}
NProgress.configure({ showSpinner: false })
NProgress.start()
if (!window.existLoading) {
loading.show()
window.existLoading = true
}
// 按需动态加载页面的语言包-start
let loadPath: string[] = []
const toCamelPath = (path: string): string => {
return path
.split('/')
.map((seg) => seg.replace(/_([a-z])/g, (_m, c: string) => c.toUpperCase()))
.join('/')
}
const config = useConfig()
if (to.path in langAutoLoadMap) {
loadPath.push(...langAutoLoadMap[to.path as keyof typeof langAutoLoadMap])
}
let prefix = ''
if (isAdminApp(to.fullPath)) {
prefix = './backend/' + config.lang.defaultLang
// 去除 path 中的 /admin
const adminPath = to.path.slice(to.path.indexOf(adminBaseRoutePath) + adminBaseRoutePath.length)
if (adminPath) {
loadPath.push(prefix + adminPath + '.ts')
loadPath.push(prefix + toCamelPath(adminPath) + '.ts')
}
} else {
prefix = './frontend/' + config.lang.defaultLang
loadPath.push(prefix + to.path + '.ts')
}
// 根据路由 name 加载的语言包
if (to.name) {
const routeName = to.name.toString()
loadPath.push(prefix + '/' + routeName + '.ts')
loadPath.push(prefix + '/' + toCamelPath(routeName) + '.ts')
}
if (!window.loadLangHandle.publicMessageLoaded) window.loadLangHandle.publicMessageLoaded = []
const publicMessagePath = prefix + '.ts'
if (!window.loadLangHandle.publicMessageLoaded.includes(publicMessagePath)) {
loadPath.push(publicMessagePath)
window.loadLangHandle.publicMessageLoaded.push(publicMessagePath)
}
// 去重
loadPath = uniq(loadPath)
for (const key in loadPath) {
loadPath[key] = loadPath[key].replaceAll('${lang}', config.lang.defaultLang)
if (loadPath[key] in window.loadLangHandle) {
window.loadLangHandle[loadPath[key]]().then((res: { default: anyObj }) => {
const pathName = loadPath[key].slice(loadPath[key].lastIndexOf(prefix) + (prefix.length + 1), loadPath[key].lastIndexOf('.'))
mergeMessage(res.default, pathName)
})
}
}
// 动态加载语言包-end
next()
})
// 路由加载后
router.afterEach(() => {
if (window.existLoading) {
loading.hide()
}
NProgress.done()
})
export default router