From 6065fd1f67462724e581cf0f2937b3f411c0dd27 Mon Sep 17 00:00:00 2001 From: caozehui <2427765068@qq.com> Date: Fri, 7 Feb 2025 10:39:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8Ctoken(=E6=9C=AA=E5=81=9A=E5=AE=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/index.ts | 6 ++++-- frontend/src/api/user/interface/user.ts | 1 + frontend/src/api/user/login/index.ts | 4 ++++ .../components/Header/components/Avatar.vue | 3 ++- frontend/src/routers/index.ts | 4 ++-- frontend/src/routers/modules/dynamicRouter.ts | 6 ++++-- frontend/src/stores/modules/user.ts | 16 ++++++++++------ .../src/views/login/components/LoginForm.vue | 3 ++- 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index ac7ea6f..75e4914 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -43,7 +43,8 @@ class RequestHttp { config.loading ?? (config.loading = true) config.loading && showFullScreenLoading() if (config.headers && typeof config.headers.set === 'function') { - config.headers.set('Authorization', 'Bearer ' + userStore.token) + config.headers.set('Authorization', 'Bearer ' + userStore.accessToken) + config.headers.set('Refresh-token', userStore.refreshToken) } return config }, @@ -63,7 +64,8 @@ class RequestHttp { tryHideFullScreenLoading() // 登陆失效 if (data.code == ResultEnum.OVERDUE) { - userStore.setToken('') + userStore.setAccessToken('') + userStore.setRefreshToken('') userStore.setUserInfo({ name: '' }) router.replace(LOGIN_URL) ElMessage.error(data.message) diff --git a/frontend/src/api/user/interface/user.ts b/frontend/src/api/user/interface/user.ts index 362ce4b..5ffd2d1 100644 --- a/frontend/src/api/user/interface/user.ts +++ b/frontend/src/api/user/interface/user.ts @@ -8,6 +8,7 @@ export namespace Login { } export interface ResLogin { accessToken: string; + refreshToken: string; userInfo:{ name: string; } diff --git a/frontend/src/api/user/login/index.ts b/frontend/src/api/user/login/index.ts index 70dad1f..0111540 100644 --- a/frontend/src/api/user/login/index.ts +++ b/frontend/src/api/user/login/index.ts @@ -30,3 +30,7 @@ export const getDictList = () =>{ return http.get('/dictData/dictDataCache') } +// token刷新 +export const refreshToken = () => { + return http.post(`${rePrefix}/refreshToken`, {},{ loading: false }) +} \ No newline at end of file diff --git a/frontend/src/layouts/components/Header/components/Avatar.vue b/frontend/src/layouts/components/Header/components/Avatar.vue index ba31263..459f66b 100644 --- a/frontend/src/layouts/components/Header/components/Avatar.vue +++ b/frontend/src/layouts/components/Header/components/Avatar.vue @@ -74,7 +74,8 @@ const logout = () => { // 1.执行退出登录接口 await logoutApi(); // 2.清除 Token - userStore.setToken(""); + userStore.setAccessToken(""); + userStore.setRefreshToken(""); userStore.setUserInfo({name: ""}); dictStore.setDictData([]); modeStore.setCurrentMode(''); diff --git a/frontend/src/routers/index.ts b/frontend/src/routers/index.ts index b4aa303..9e7f20e 100644 --- a/frontend/src/routers/index.ts +++ b/frontend/src/routers/index.ts @@ -52,7 +52,7 @@ router.beforeEach(async (to, from, next) => { // 3.判断是访问登陆页,有 Token 就在当前页面,没有 Token 重置路由到登陆页 if (to.path.toLocaleLowerCase() === LOGIN_URL) { - if (userStore.token) return next(from.fullPath) + if (userStore.accessToken) return next(from.fullPath) resetRouter() return next() } @@ -61,7 +61,7 @@ router.beforeEach(async (to, from, next) => { if (ROUTER_WHITE_LIST.includes(to.path)) return next() // 5.判断是否有 Token,没有重定向到 login 页面 - if (!userStore.token) return next({ path: LOGIN_URL, replace: true }) + if (!userStore.accessToken) return next({ path: LOGIN_URL, replace: true }) // 6.如果没有菜单列表,就重新请求菜单列表并添加动态路由 if (!authStore.authMenuListGet.length) { diff --git a/frontend/src/routers/modules/dynamicRouter.ts b/frontend/src/routers/modules/dynamicRouter.ts index b0025de..2aaa3c5 100644 --- a/frontend/src/routers/modules/dynamicRouter.ts +++ b/frontend/src/routers/modules/dynamicRouter.ts @@ -28,7 +28,8 @@ export const initDynamicRouter = async () => { type: "warning", duration: 3000 }); - userStore.setToken(""); + userStore.setAccessToken(""); + userStore.setRefreshToken(""); router.replace(LOGIN_URL); return Promise.reject("No permission"); } @@ -48,7 +49,8 @@ export const initDynamicRouter = async () => { }); } catch (error) { // 当按钮 || 菜单请求出错时,重定向到登陆页 - userStore.setToken(""); + userStore.setAccessToken(""); + userStore.setRefreshToken(""); router.replace(LOGIN_URL); return Promise.reject(error); } diff --git a/frontend/src/stores/modules/user.ts b/frontend/src/stores/modules/user.ts index dcf07ac..ddd9db3 100644 --- a/frontend/src/stores/modules/user.ts +++ b/frontend/src/stores/modules/user.ts @@ -1,19 +1,23 @@ -import { defineStore } from "pinia"; -import { UserState } from "@/stores/interface"; +import {defineStore} from "pinia"; +import {UserState} from "@/stores/interface"; import piniaPersistConfig from "@/stores/helper/persist"; -import { USER_STORE_KEY } from "@/stores/constant"; +import {USER_STORE_KEY} from "@/stores/constant"; export const useUserStore = defineStore({ id: USER_STORE_KEY, state: (): UserState => ({ - token: "", + accessToken: "", + refreshToken: "", userInfo: { name: "admin" }, }), getters: {}, actions: { // Set Token - setToken(token: string) { - this.token = token; + setAccessToken(accessToken: string) { + this.accessToken = accessToken; + }, + setRefreshToken(refreshToken: string) { + this.refreshToken = refreshToken; }, // Set setUserInfo setUserInfo(userInfo: UserState["userInfo"]) { diff --git a/frontend/src/views/login/components/LoginForm.vue b/frontend/src/views/login/components/LoginForm.vue index e0b1087..359d96a 100644 --- a/frontend/src/views/login/components/LoginForm.vue +++ b/frontend/src/views/login/components/LoginForm.vue @@ -103,7 +103,8 @@ const login = (formEl: FormInstance | undefined) => { ...loginForm, password: loginForm.password, }) - userStore.setToken(data.accessToken) + userStore.setAccessToken(data.accessToken) + userStore.setRefreshToken(data.refreshToken) userStore.setUserInfo(data.userInfo) const response = await getDictList() const dictData = response.data as unknown as Dict[]