From 1d04e86c082eed7fb4f8085a6411eab388e0a9a5 Mon Sep 17 00:00:00 2001 From: panda <1565636758@qq.com> Date: Thu, 8 May 2025 09:57:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E7=99=BB=E5=BD=95=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=9A=84=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=E5=9C=A8=E5=A4=A7=E7=A5=9Einori=5Flover=E7=9A=84=E6=8C=87?= =?UTF-8?q?=E5=AF=BC=E4=B8=8B=EF=BC=8C=E5=AE=9E=E7=8E=B0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/axios/service.ts | 39 ++++++------------------------------ src/router/index.ts | 40 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 src/router/index.ts diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index 87c9c15b4..f391151af 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -114,7 +114,7 @@ service.interceptors.response.use( isRefreshToken = true // 1. 如果获取不到刷新令牌,则只能执行登出操作 if (!getRefreshToken()) { - return handleAuthorized() + return handleAuthorized(t('sys.api.timeoutMessage')) } // 2. 进行刷新访问令牌 try { @@ -122,7 +122,7 @@ service.interceptors.response.use( const retData = (await refreshTokenRes).data if (retData.code === 1002000499) { //登录被踢下线的处理 by panda 25.04.23 - return handleOfflineAuthorized(retData.msg) + return handleAuthorized(retData.msg) } else { // 2.1 刷新成功,则回放队列的请求 + 当前请求 setToken((await refreshTokenRes).data.data) @@ -140,7 +140,7 @@ service.interceptors.response.use( cb() }) // 提示是否要登出。即不回放当前请求!不然会形成递归 - return handleAuthorized() + return handleAuthorized(t('sys.api.timeoutMessage')) } finally { requestList = [] isRefreshToken = false @@ -175,7 +175,7 @@ service.interceptors.response.use( if (msg === '无效的刷新令牌') { // hard coding:忽略这个提示,直接登出 console.log(msg) - return handleAuthorized() + return handleAuthorized(t('sys.api.timeoutMessage')) } else { ElNotification.error({ title: msg }) } @@ -204,11 +204,11 @@ const refreshToken = async () => { axios.defaults.headers.common['tenant-id'] = getTenantId() return await axios.post(base_url + '/system/auth/refresh-token?refreshToken=' + getRefreshToken()) } -const handleAuthorized = () => { +const handleAuthorized = (msg: any) => { const { t } = useI18n() if (!isRelogin.show) { isRelogin.show = true - ElMessageBox.confirm(t('sys.api.timeoutMessage'), t('common.confirmTitle'), { + ElMessageBox.confirm(msg, t('common.confirmTitle'), { showCancelButton: false, closeOnClickModal: false, showClose: false, @@ -226,31 +226,4 @@ const handleAuthorized = () => { } return Promise.reject(t('sys.api.timeoutMessage')) } -/** 账号被踢下线的处理 by panda 25.04.23 */ -const handleOfflineAuthorized = (msg: any) => { - const { t } = useI18n() - if (!isRelogin.show) { - // 如果已经到登录页面则不进行弹窗提示 - if (window.location.href.includes('login')) { - return - } - isRelogin.show = true - ElMessageBox.confirm(msg, t('common.confirmTitle'), { - showCancelButton: false, - closeOnClickModal: false, - showClose: false, - closeOnPressEscape: false, - confirmButtonText: '确定', - type: 'warning' - }).then(() => { - resetRouter() // 重置静态路由表 - deleteUserCache() // 删除用户缓存 - removeToken() - isRelogin.show = false - // 干掉token后再走一次路由让它过router.beforeEach的校验 - window.location.href = window.location.href - }) - } - return Promise.reject(msg) -} export { service } diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 000000000..50ad20c1c --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,40 @@ +import type { App } from 'vue' +import type { RouteRecordRaw } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router' + +// 自动导入modules目录下的所有静态路由,项目可以按模块分类增加路由文件 +// by panda & inori_lover 25.03.21 +const allRouters: RouteRecordRaw[] = Object.values<{ default: RouteRecordRaw[] }>( + import.meta.glob('./modules/*.ts', { eager: true }) +).reduce((acc, module) => { + // just ensure module.default is valid route define + if (Array.isArray(module?.default)) { + acc.push(...module.default) + } + + return acc +}, []) + +// 创建路由实例 +const router = createRouter({ + history: createWebHistory(import.meta.env.VITE_BASE_PATH), // createWebHashHistory URL带#,createWebHistory URL不带# + strict: true, + routes: allRouters, //自动导入的所有静态路由 by panda & inori_lover 25.03.21 + scrollBehavior: () => ({ left: 0, top: 0 }) +}) + +export const resetRouter = (): void => { + const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root'] + router.getRoutes().forEach((route) => { + const { name } = route + if (name && !resetWhiteNameList.includes(name as string)) { + router.hasRoute(name) && router.removeRoute(name) + } + }) +} + +export const setupRouter = (app: App) => { + app.use(router) +} + +export default router