From c9dc8e9b6c7f190c238bcf201b0c7f9a7c002165 Mon Sep 17 00:00:00 2001 From: Lxq <19852720163@163.com> Date: Thu, 7 May 2026 11:37:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rc_autoplc_front/src/utils/request.ts | 16 +++- rc_autoplc_front/src/views/Login.vue | 94 +++++++++---------- rc_autoplc_front/src/views/devparam/index.vue | 68 +++++++++----- rc_autoplc_front/src/views/goods/index.vue | 14 ++- 4 files changed, 122 insertions(+), 70 deletions(-) diff --git a/rc_autoplc_front/src/utils/request.ts b/rc_autoplc_front/src/utils/request.ts index f8a18d3..ab58ed7 100644 --- a/rc_autoplc_front/src/utils/request.ts +++ b/rc_autoplc_front/src/utils/request.ts @@ -15,6 +15,7 @@ const TokenManager = { setToken(token: string) { const authStore = useAuthStore() authStore.setToken(token) + isAuthExpired = false // 同时设置默认请求头 request.defaults.headers.common['Authorization'] = `Bearer ${token}` }, @@ -45,15 +46,23 @@ TokenManager.initToken() // 登录过期提示防重复标志 let isLoginExpiredShown = false +let isAuthExpired = false + +const isAuthExpiredRequest = (url: string) => { + if (!isAuthExpired) return false + if (!url) return true + return !url.includes('/user/login') && !url.includes('/user/register') +} // 处理登录过期(防重复提示) const handleLoginExpired = () => { if (!isLoginExpiredShown) { isLoginExpiredShown = true + isAuthExpired = true // 清除token TokenManager.removeToken() // 显示提示消息 - ElMessage.error('登录已过期,请重新登录') + ElMessage.error('用户信息过期,请重新登录') // 跳转到登录页 router.replace('/login').finally(() => { // 延迟重置标志位,确保跳转完成后再允许下次提示 @@ -149,6 +158,11 @@ request.interceptors.response.use( return Promise.reject(error) } + // 如果是认证过期后的后续请求,静默处理业务错误,避免弹出部门加载失败等页面提示 + if (isAuthExpiredRequest(url) && errorMsg) { + return Promise.reject(error) + } + // 网络错误或其他错误 ElMessage.error(errorMsg) return Promise.reject(error) diff --git a/rc_autoplc_front/src/views/Login.vue b/rc_autoplc_front/src/views/Login.vue index f927ac0..24793e7 100644 --- a/rc_autoplc_front/src/views/Login.vue +++ b/rc_autoplc_front/src/views/Login.vue @@ -12,7 +12,7 @@ :rules="loginRules" class="login-form" label-width="0" - @keyup.enter="handleLogin" + @submit.prevent="handleLogin" > @@ -33,7 +34,7 @@ :prefix-icon="Lock" show-password clearable - @keyup.enter="handleLogin" + @keydown.enter.prevent="handleLogin" /> @@ -191,54 +192,53 @@ const registerRules: FormRules = { // 处理登录 const handleLogin = async () => { - if (!loginFormRef.value) return - - await loginFormRef.value.validate(async (valid) => { - if (valid) { - loginLoading.value = true - try { - const response: any = await userlogin(loginForm.username, loginForm.password) - const loginData = response?.data ?? response - const token = loginData?.token || response?.token || loginData - const permissions = Array.isArray(loginData?.permissions) - ? loginData.permissions - : Array.isArray(response?.permissions) - ? response.permissions - : [] - const roles = Array.isArray(loginData?.roles) - ? loginData.roles - : Array.isArray(response?.roles) - ? response.roles - : [] - const userInfo = typeof loginData === 'object' ? loginData : { token } + if (!loginFormRef.value || loginLoading.value) return - if (token) { - authStore.setToken(token) - authStore.setUserInfo({ - ...userInfo, - username: userInfo.username || loginForm.username, - token, - roles, - permissions, - }) - authStore.setPermissions(permissions) - localStorage.setItem('username', userInfo.username || loginForm.username) - localStorage.setItem('token', token) - localStorage.setItem('permissions', JSON.stringify(permissions)) + const valid = await loginFormRef.value.validate().catch(() => false) + if (!valid) return - ElMessage.success(response?.message || '登录成功') - router.push('/home') - } else { - ElMessage.error(response?.message || '登录失败,未获取到令牌') - } - } catch (error: any) { - // 错误提示已在全局响应拦截中处理,这里不重复弹出 - console.warn('login error:', error) - } finally { - loginLoading.value = false - } + loginLoading.value = true + try { + const response: any = await userlogin(loginForm.username, loginForm.password) + const loginData = response?.data ?? response + const token = loginData?.token || response?.token || loginData + const permissions = Array.isArray(loginData?.permissions) + ? loginData.permissions + : Array.isArray(response?.permissions) + ? response.permissions + : [] + const roles = Array.isArray(loginData?.roles) + ? loginData.roles + : Array.isArray(response?.roles) + ? response.roles + : [] + const userInfo = typeof loginData === 'object' ? loginData : { token } + + if (token) { + authStore.setToken(token) + authStore.setUserInfo({ + ...userInfo, + username: userInfo.username || loginForm.username, + token, + roles, + permissions, + }) + authStore.setPermissions(permissions) + localStorage.setItem('username', userInfo.username || loginForm.username) + localStorage.setItem('token', token) + localStorage.setItem('permissions', JSON.stringify(permissions)) + + ElMessage.success('登录成功') + router.push('/home') + } else { + ElMessage.error(response?.message || '登录失败,未获取到令牌') } - }) + } catch (error: any) { + // 错误提示已在全局响应拦截中处理,这里不重复弹出 + console.warn('login error:', error) + } finally { + loginLoading.value = false + } } // 处理注册 diff --git a/rc_autoplc_front/src/views/devparam/index.vue b/rc_autoplc_front/src/views/devparam/index.vue index 7d18884..4566a6c 100644 --- a/rc_autoplc_front/src/views/devparam/index.vue +++ b/rc_autoplc_front/src/views/devparam/index.vue @@ -86,25 +86,31 @@ @@ -236,12 +242,13 @@ /> 配置 + 配置 @@ -259,11 +266,13 @@ /> 配置 + 配置 @@ -371,10 +380,11 @@