diff --git a/.env.development b/.env.development index d94137e..0e5f525 100644 --- a/.env.development +++ b/.env.development @@ -1,4 +1,4 @@ # 变量必须以 VITE_ 为前缀才能暴露给外部读取 NODE_ENV = 'development' VITE_APP_TITLE = '实验仿真' -VITE_APP_BASE_API = '//localhost:3100/jeecgboot' \ No newline at end of file +VITE_APP_BASE_API = '//localhost:16066/jeecg-boot' \ No newline at end of file diff --git a/src/api/user.ts b/src/api/user.ts index f9c9d9f..8df8add 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -27,7 +27,7 @@ export const sturegister = (data: any) => { export const logout = () => { return request({ url: '/sys/logout?_t=' + new Date().getTime(), - method: 'GET', + method: 'PUT', }) } // 获取用户信息 diff --git a/src/layout/spacePage.vue b/src/layout/spacePage.vue index 984bdd5..0efe89a 100644 --- a/src/layout/spacePage.vue +++ b/src/layout/spacePage.vue @@ -141,7 +141,7 @@ import { ElMessage } from "element-plus"; import { ref, onMounted } from "vue"; import { useRouter } from "vue-router"; -import settingStore from "@/store/modules/setting"; +import settingStore from "@/store/modules/setting";; const setting = settingStore(); import userStore from "@/store/modules/user"; import { getUserInfoService, userChangeService, logout } from "@/api/user"; @@ -283,10 +283,14 @@ const handleClose = () => { // 退出登录 const logoutEvent = async () => { - await logout(); - clearLocalStorage(); + await logout().then(res => { + console.log(res,'111'); + clearLocalStorage(); + user.token = '' router.push("/login"); + }) + }; diff --git a/src/permissions.ts b/src/permissions.ts index 02c14d1..571d1d2 100644 --- a/src/permissions.ts +++ b/src/permissions.ts @@ -1,40 +1,41 @@ import router from "./router"; -import userStore from "./store/modules/user"; -import { getToken } from "./utils/auth"; import pinia from "./store"; -import {clearLocalStorage } from '@/utils/auth' + +import userStore from "./store/modules/user"; +import { getToken, clearLocalStorage } from "@/utils/auth"; const store = userStore(pinia); -router.beforeEach((to: any, from: any, next: any) => { + +router.beforeEach(async (to:any, from:any, next:any) => { + const { token, userInfo, getUserInfo } = store; + if (to.path === "/login") { - if (store.token) { - next("/studyPage"); - } else { - next(); - } - // next(); - } else { - const token = getToken(); - if (token) { - console.log(store.userInfo); - - if (store.userInfo) { - next(); - } else { - store.getUserInfo().then(() => { - next(); - }) - .catch((error) => { - console.log(error); - - clearLocalStorage() - next("/login"); - }) - } - // next(); - } else { - next("/login"); - } + token ? next("/studyPage") : next(); + return; + } + + const authToken = getToken(); + + if (!authToken) { + return redirectToLogin(next); + } + + if (userInfo) { + return next(); + } + + try { + await getUserInfo(); + next(); + } catch (error) { + console.error("获取用户信息失败:", error); + redirectToLogin(next); } }); + +const redirectToLogin = (next: any) => { + clearLocalStorage(); + next("/login"); +}; + export default router; diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 6332d5e..eac39ae 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -32,9 +32,15 @@ const userStore = defineStore("userStore", { this.userInfo = null; }, async getUserInfo() { - const res:any = await getUserInfo(); - this.userInfo = res.result.userInfo; - console.log(res); + try { + const res:any = await getUserInfo(); + this.userInfo = res.result.userInfo; + console.log(res); + } catch (error) { + console.log(error); + + } + // this.userInfo = res.result; }, diff --git a/src/utils/request.ts b/src/utils/request.ts index e0db2b4..0505c8c 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -5,44 +5,71 @@ import { ElMessage } from "element-plus"; import { removeToken } from "@/utils/auth"; import userStore from "@/store/modules/user"; import router from "@/router"; + // 创建axios实例 const server = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, timeout: 30000, }); -// 创建请求拦截器 +// 获取用户状态 + +// 创建请求拦截器 server.interceptors.request.use((config) => { - const useuserStore = userStore(pinia); +const useUserStore = userStore(pinia); - config.headers.Authorization = useuserStore.token; - config.headers["x-access-token"] = useuserStore.token; + if (useUserStore.token) { + config.headers.Authorization = useUserStore.token; + config.headers["x-access-token"] = useUserStore.token; + } return config; }); + +// 处理错误的通用方法 +const handleAuthError = (message:string) => { +const useUserStore = userStore(pinia); + + ElMessage.error(message); + removeToken(); + useUserStore.token = ""; + router.push("/login"); +}; + // 创建相应拦截器 -server.interceptors.response.use((response) => { - console.log(response); - - if (response.data.code === 401) { - - ElMessage.error(response.data.message); - removeToken(); - router.push("/login"); - return Promise.reject(response); - } - if (response.data.code === 412) { - ElMessage.error(response.data.message); - removeToken(); - router.push("/login"); - return Promise.reject(response); - } - if (response.data.code != 200 && response.data.code != 0) { - ElMessage.error(response.data.message); - return Promise.reject(response); - } - return response.data; -}); +server.interceptors.response.use( + (response) => { + const { code, message } = response.data; -// 暴露axios实例 + switch (code) { + case 401: + case 412: + handleAuthError(message); + return Promise.reject(response); + case 200: + case 0: + return response.data; + default: + ElMessage.error(message); + return Promise.reject(response); + } + }, + (error) => { + if (error.response) { + const { status, data } = error.response; + + switch (status) { + case 401: + case 403: + case 500: + handleAuthError(data.message); + break; + default: + ElMessage.error(data.message || "请求出错,请稍后再试"); + } + } + + return Promise.reject(error); + } +); export default server;