From d181fd7da40d8528b32fe607b371c695c985ec76 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Wed, 4 Feb 2026 15:19:10 +0800 Subject: [PATCH] f --- src/composables/useApiFetch.js | 103 +++++++++++++++++++++------------ vite.config.js | 4 +- 2 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/composables/useApiFetch.js b/src/composables/useApiFetch.js index e3f8631..a801508 100644 --- a/src/composables/useApiFetch.js +++ b/src/composables/useApiFetch.js @@ -24,6 +24,35 @@ const safeJsonFetch = async (input, init) => { } }; +// 封禁用户:清理登录态并跳转登录页,保证用户能看到提示 +const USER_DISABLED_CODE = 100011; +function handleUserDisabled(msg) { + const message = msg || "您已被封禁"; + if (typeof showToast === "function") { + showToast({ message }); + } + localStorage.removeItem("token"); + localStorage.removeItem("refreshAfter"); + localStorage.removeItem("accessExpire"); + localStorage.removeItem("userInfo"); + localStorage.removeItem("agentInfo"); + try { + const userStore = useUserStore(); + const agentStore = useAgentStore(); + if (userStore?.resetUser) userStore.resetUser(); + if (agentStore?.resetAgent) agentStore.resetAgent(); + } catch (_) {} + // 先 replace 再 setTimeout 兜底,确保离开当前页并进入登录页 + if (typeof router !== "undefined" && router?.replace) { + router.replace("/login"); + } + setTimeout(() => { + if (typeof window !== "undefined" && !window.location.pathname.includes("login")) { + window.location.href = "/login"; + } + }, 300); +} + // 创建全局的 fetch 实例 const useApiFetch = createFetch({ baseUrl: "/api/v1", // 你的 API 基础路径 @@ -67,60 +96,58 @@ const useApiFetch = createFetch({ // 全局处理响应 if (response.status === 401) { - // 有错误文案时先弹出让用户看到 - if (msg) { - showToast({ message: msg }); - } + if (msg && typeof showToast === "function") showToast({ message: msg }); localStorage.removeItem("token"); - localStorage.removeItem('refreshAfter') - localStorage.removeItem('accessExpire') - router.replace("/login"); + localStorage.removeItem("refreshAfter"); + localStorage.removeItem("accessExpire"); + if (typeof router !== "undefined" && router?.replace) router.replace("/login"); } if (code !== undefined && code !== 200) { - if (code === 100009) { - if (msg) showToast({ message: msg }); - localStorage.removeItem('token') - localStorage.removeItem('refreshAfter') - localStorage.removeItem('accessExpire') - localStorage.removeItem('userInfo') - localStorage.removeItem('agentInfo') + const codeNum = Number(code); + if (codeNum === 100009) { + if (msg && typeof showToast === "function") showToast({ message: msg }); + localStorage.removeItem('token'); + localStorage.removeItem('refreshAfter'); + localStorage.removeItem('accessExpire'); + localStorage.removeItem('userInfo'); + localStorage.removeItem('agentInfo'); const userStore = useUserStore(); const agentStore = useAgentStore(); - userStore.resetUser() - agentStore.resetAgent() - location.reload() - } else if (code === 100011) { - // 封禁用户:弹出提示并清理登录状态 - showToast({ message: msg || '您已被封禁' }); - localStorage.removeItem('token') - localStorage.removeItem('refreshAfter') - localStorage.removeItem('accessExpire') - localStorage.removeItem('userInfo') - localStorage.removeItem('agentInfo') - const userStore = useUserStore(); - const agentStore = useAgentStore(); - userStore.resetUser() - agentStore.resetAgent() - router.replace("/login"); - } else if (code !== 200002 && code !== 200003 && code !== 200004) { - showToast({ message: msg || '请求失败,请稍后重试' }); + userStore.resetUser(); + agentStore.resetAgent(); + location.reload(); + } else if (codeNum === USER_DISABLED_CODE) { + handleUserDisabled(msg); + return { data, response }; + } else if (codeNum !== 200002 && codeNum !== 200003 && codeNum !== 200004) { + if (typeof showToast === "function") { + showToast({ message: msg || '请求失败,请稍后重试' }); + } } } return { data, response }; }, - async onFetchError({ error, response }) { + async onFetchError({ data, error, response }) { console.log("error", error); closeToast(); + // 尝试从响应 body 解析业务码(如封禁 100011),与 afterFetch 一致处理 + const code = data?.code ?? data?.errcode; + const msg = data?.msg ?? data?.errmsg ?? ""; + const codeNum = code !== undefined ? Number(code) : null; + if (codeNum === USER_DISABLED_CODE) { + handleUserDisabled(msg); + return { error }; + } const errMsg = typeof error === "string" ? error : (error?.message || "网络异常,请稍后重试"); if (response && response.status === 401) { - showToast({ message: errMsg }); + if (typeof showToast === "function") showToast({ message: msg || errMsg }); localStorage.removeItem("token"); - localStorage.removeItem('refreshAfter') - localStorage.removeItem('accessExpire') - router.replace("/login"); + localStorage.removeItem("refreshAfter"); + localStorage.removeItem("accessExpire"); + if (typeof router !== "undefined" && router?.replace) router.replace("/login"); } else { - showToast({ message: errMsg }); + if (typeof showToast === "function") showToast({ message: errMsg }); } return { error }; }, diff --git a/vite.config.js b/vite.config.js index e1c13e1..e477c40 100644 --- a/vite.config.js +++ b/vite.config.js @@ -15,8 +15,8 @@ export default defineConfig({ strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口 proxy: { "/api/v1": { - target: "http://127.0.0.1:8888", // 本地接口地址 - // target: "https://www.xingfucha.cn", // 本地接口地址 + // target: "http://127.0.0.1:8888", // 本地接口地址 + target: "https://www.xingfucha.cn", // 本地接口地址 changeOrigin: true, }, },