From 278532cdad6e3587394a7cb520f26a99d6a996d9 Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Mon, 27 Jul 2026 16:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=BD=95=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/api/backend/index.ts | 3 ++- web/src/utils/axios.ts | 6 +----- web/src/views/backend/login.vue | 20 ++++++++++++++++++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/web/src/api/backend/index.ts b/web/src/api/backend/index.ts index 4b78ca2..4bf7902 100644 --- a/web/src/api/backend/index.ts +++ b/web/src/api/backend/index.ts @@ -12,11 +12,12 @@ export function index() { }) } -export function login(method: 'get' | 'post', params: object = {}) { +export function login(method: 'get' | 'post', params: object = {}, axiosConfig: Record = {}) { return createAxios({ url: url + 'login', data: params, method: method, + ...axiosConfig, }) } diff --git a/web/src/utils/axios.ts b/web/src/utils/axios.ts index 76ad2f2..c6a12c5 100644 --- a/web/src/utils/axios.ts +++ b/web/src/utils/axios.ts @@ -288,11 +288,7 @@ function redirectToLoginIfNeedLoginFromHttp303(error: any): boolean { const adminInfo = useAdminInfo() const userInfo = useUserInfo() if (router.currentRoute.value.name === loginRouteName) { - if (isAdminAppFlag) { - adminInfo.removeToken() - } else { - userInfo.removeToken() - } + // 已在登录页:仅吞掉 303,勿清 token(避免 login GET 与 login POST 并发时清掉刚登录成功的 token) return true } window.authRedirecting = true diff --git a/web/src/views/backend/login.vue b/web/src/views/backend/login.vue index 234c634..e196684 100644 --- a/web/src/views/backend/login.vue +++ b/web/src/views/backend/login.vue @@ -174,6 +174,14 @@ import { fullUrl } from '/@/utils/common' import { adminBaseRoutePath } from '/@/router/static/adminBase' import type { FormItemRule } from 'element-plus' let timer: number +let loginPrefetchController: AbortController | null = null + +const abortLoginPrefetch = () => { + if (loginPrefetchController) { + loginPrefetchController.abort() + loginPrefetchController = null + } +} const config = useConfig() const adminInfo = useAdminInfo() @@ -253,9 +261,10 @@ const navigateAfterLogin = (userInfo: anyObj) => { if (!userInfo?.token) { return } + abortLoginPrefetch() adminInfo.dataFill(userInfo, false) nextTick(() => { - router.push({ path: adminBaseRoutePath }) + router.replace({ path: adminBaseRoutePath }) }) } @@ -264,17 +273,23 @@ onMounted(() => { pageBubble.init() }, 1000) - login('get') + abortLoginPrefetch() + loginPrefetchController = new AbortController() + login('get', {}, { signal: loginPrefetchController.signal }) .then((res) => { state.showCaptcha = res.data.captcha nextTick(() => focusInput()) }) .catch((err) => { + if (err?.code === 'ERR_CANCELED' || err?.message === 'canceled') { + return + } console.log(err) }) }) onBeforeUnmount(() => { + abortLoginPrefetch() clearTimeout(timer) pageBubble.removeListeners() }) @@ -292,6 +307,7 @@ const onSubmitPre = () => { } const onSubmit = (captchaInfo = '') => { + abortLoginPrefetch() state.submitLoading = true form.captchaInfo = captchaInfo login('post', form)