Files
dafuweng-saiadmin6.x/saiadmin-artd/src/utils/router.ts

134 lines
4.6 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.
/**
* 路由工具函数
*
* 提供路由相关的工具函数
*
* @module utils/router
*/
import { RouteLocationNormalized, RouteRecordRaw } from 'vue-router'
import AppConfig from '@/config'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import i18n, { $t } from '@/locales'
/**
* 路径到菜单 i18n key 的映射
* 当后端返回的菜单名为中文或非 i18n key 时,根据 path 仍可显示多语言
*/
export const MAP_PATH_TO_MENU_I18N_KEY: Record<string, string> = {
'/dashboard': 'menus.dashboard.title',
'/dashboard/console': 'menus.dashboard.console',
'/dashboard/user-center': 'menus.userCenter.title',
'/system': 'menus.system.title',
'/system/user': 'menus.system.user',
'/system/role': 'menus.system.role',
'/system/user-center': 'menus.system.userCenter',
'/system/menu': 'menus.system.menu',
'/system/dept': 'menus.system.dept',
'/system/post': 'menus.system.post',
'/system/config': 'menus.system.config',
'/safeguard': 'menus.safeguard.title',
'/safeguard/dict': 'menus.safeguard.dict',
'/safeguard/server': 'menus.safeguard.server',
'/safeguard/oper-log': 'menus.safeguard.operLog',
'/safeguard/login-log': 'menus.safeguard.loginLog',
'/safeguard/email-log': 'menus.safeguard.emailLog',
'/safeguard/database': 'menus.safeguard.database',
'/safeguard/cache': 'menus.safeguard.cache',
'/safeguard/attachment': 'menus.safeguard.attachment',
'/tool': 'menus.tool.title',
'/tool/crontab': 'menus.tool.crontab',
'/tool/code': 'menus.tool.code',
'/dice': 'menus.dice.title',
'/dice/lottery_pool_config': 'menus.dice.lotteryPoolConfig',
'/dice/lottery_pool_config/index': 'menus.dice.lotteryPoolConfig',
'/dice/ante_config': 'menus.dice.anteConfig',
'/dice/ante_config/index': 'menus.dice.anteConfig',
'/dice/player': 'menus.dice.player',
'/dice/player/index': 'menus.dice.player',
'/dice/player_wallet_record': 'menus.dice.playerWalletRecord',
'/dice/player_wallet_record/index': 'menus.dice.playerWalletRecord',
'/dice/play_record': 'menus.dice.playRecord',
'/dice/play_record/index': 'menus.dice.playRecord',
'/dice/player_ticket_record': 'menus.dice.playerTicketRecord',
'/dice/player_ticket_record/index': 'menus.dice.playerTicketRecord',
'/dice/reward_config': 'menus.dice.rewardConfig',
'/dice/reward_config/index': 'menus.dice.rewardConfig',
'/dice/reward': 'menus.dice.reward',
'/dice/reward/index': 'menus.dice.reward',
'/dice/reward_config_record': 'menus.dice.rewardConfigRecord',
'/dice/reward_config_record/index': 'menus.dice.rewardConfigRecord',
'/dice/play_record_test': 'menus.dice.playRecordTest',
'/dice/play_record_test/index': 'menus.dice.playRecordTest',
'/dice/config': 'menus.dice.config',
'/dice/config/index': 'menus.dice.config',
'/result/success': 'menus.result.success',
'/result/fail': 'menus.result.fail',
'/exception/403': 'menus.exception.forbidden',
'/exception/404': 'menus.exception.notFound',
'/exception/500': 'menus.exception.serverError'
}
/** 扩展的路由配置类型 */
export type AppRouteRecordRaw = RouteRecordRaw & {
hidden?: boolean
}
/** 顶部进度条配置 */
export const configureNProgress = () => {
NProgress.configure({
easing: 'ease',
speed: 600,
showSpinner: false,
parent: 'body'
})
}
/**
* 设置页面标题,根据路由元信息和系统信息拼接标题
* @param to 当前路由对象
*/
export const setPageTitle = (to: RouteLocationNormalized): void => {
const { title } = to.meta
if (title) {
setTimeout(() => {
document.title = `${formatMenuTitle(String(title), to.path)} - ${AppConfig.systemInfo.name}`
}, 150)
}
}
/**
* 根据路径获取对应的菜单 i18n key若有
*/
export const getMenuI18nKeyByPath = (path: string): string | undefined => {
if (!path) return undefined
const normalized = path.replace(/\?.*$/, '').replace(/#.*$/, '').replace(/\/$/, '') || '/'
return MAP_PATH_TO_MENU_I18N_KEY[normalized]
}
/**
* 格式化菜单标题
* @param title 菜单标题,可以是 i18n 的 key如 menus.dashboard.title也可以是中文等纯文本
* @param path 可选,当前菜单路由 path当 title 非 i18n key 时,用 path 查表得到 key 再翻译,以实现多语言切换
* @returns 格式化后的菜单标题
*/
export const formatMenuTitle = (title: string, path?: string): string => {
if (!title) return ''
if (title.startsWith('menus.')) {
if (i18n.global.te(title)) {
return $t(title)
}
return title.split('.').pop() || title
}
if (path) {
const i18nKey = getMenuI18nKeyByPath(path)
if (i18nKey && i18n.global.te(i18nKey)) {
return $t(i18nKey)
}
}
return title
}