From f234ca6793d0bfb9a989cd5da0b2b792a9d504b8 Mon Sep 17 00:00:00 2001 From: dxc Date: Mon, 9 Feb 2026 10:59:36 +0800 Subject: [PATCH] (no commit message provided) Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) --- inventory-web/src/stores/user.ts | 68 ++++++++++++++---------------- inventory-web/src/utils/request.ts | 13 +++--- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/inventory-web/src/stores/user.ts b/inventory-web/src/stores/user.ts index 6ae5e8d..7724bac 100644 --- a/inventory-web/src/stores/user.ts +++ b/inventory-web/src/stores/user.ts @@ -11,46 +11,40 @@ export const useUserStore = defineStore('user', () => { // 2. Actions // 登录逻辑 const handleLogin = async (loginForm: any) => { - try { - const res = await login(loginForm) + const res = await login(loginForm) - // [调试日志] 查看实际返回的数据结构 - console.log('Login API Response:', res) + // [调试日志] 查看实际返回的数据结构 + console.log('Login API Response:', res) - // ============================================================ - // [关键修复] 兼容 Axios 拦截器的不同处理方式 - // 如果拦截器已经返回了 response.data,那么 res 本身就是数据对象 - // ============================================================ - const data = res.data || res + // ============================================================ + // [关键修复] 兼容 Axios 拦截器的不同处理方式 + // 如果拦截器已经返回了 response.data,那么 res 本身就是数据对象 + // ============================================================ + const data = res.data || res - // 安全检查:确保 data 存在且包含 access_token - if (!data || !data.access_token) { - console.error('Login Error: 响应数据中缺少 access_token', data) - return false - } - - // 更新 Pinia 状态 (内存) - token.value = data.access_token - - // 处理用户信息 (确保后端返回结构中有 user 字段) - if (data.user) { - role.value = data.user.role || 'user' // 默认给个 user 角色防止空 - username.value = data.user.username || '用户' - - // 持久化存储用户信息 - localStorage.setItem('role', role.value) - localStorage.setItem('username', username.value) - } - - // 持久化存储 Token - localStorage.setItem('token', data.access_token) - - return true // 返回 true 表示登录成功 - } catch (error) { - console.error('Login failed:', error) - // 返回 false 表示登录失败,Login 组件会据此停止跳转 - return false + // 安全检查:确保 data 存在且包含 access_token + if (!data || !data.access_token) { + console.error('Login Error: 响应数据中缺少 access_token', data) + throw new Error('登录失败: 响应数据异常') } + + // 更新 Pinia 状态 (内存) + token.value = data.access_token + + // 处理用户信息 (确保后端返回结构中有 user 字段) + if (data.user) { + role.value = data.user.role || 'user' // 默认给个 user 角色防止空 + username.value = data.user.username || '用户' + + // 持久化存储用户信息 + localStorage.setItem('role', role.value) + localStorage.setItem('username', username.value) + } + + // 持久化存储 Token + localStorage.setItem('token', data.access_token) + + return true // 返回 true 表示登录成功 } // 退出逻辑 @@ -80,4 +74,4 @@ export const useUserStore = defineStore('user', () => { logout, hasRole } -}) \ No newline at end of file +}) diff --git a/inventory-web/src/utils/request.ts b/inventory-web/src/utils/request.ts index 5b5c182..27c0087 100644 --- a/inventory-web/src/utils/request.ts +++ b/inventory-web/src/utils/request.ts @@ -57,10 +57,13 @@ service.interceptors.response.use( const data = error.response.data if (status === 401) { - message = '登录已过期,请重新登录' - // 这里可以触发登出逻辑 - localStorage.clear() - window.location.href = '/login' + // 对于登录接口的401错误,不执行登出重定向,仅提示错误 + if (error.config && !error.config.url.includes('/login')) { + message = '登录已过期,请重新登录' + localStorage.clear() + window.location.href = '/login' + } + // 如果是登录接口,message会被后面的data.msg覆盖 } else if (status === 403) { message = '权限不足' } else if (status === 404) { @@ -78,4 +81,4 @@ service.interceptors.response.use( } ) -export default service \ No newline at end of file +export default service