import axiosInstance from '../api/axiosConfig'; import router from '../router'; // 引入 Vue Router 实例 import { justLoggedIn } from './authSessionState'; // Import the flag const USER_INFO_URL = '/user'; // 获取用户信息的API端点 const TEMP_PRIVILEGE_URL = '/user/temp_privilege'; // 获取用户临时权限的API端点 /** * 从 sessionStorage 中安全地读取和解析用户信息。 * @returns {Object|null} 用户信息对象或null。 */ export const getStoredUser = () => { const storedUser = sessionStorage.getItem('currentUser'); if (storedUser) { try { return JSON.parse(storedUser); } catch (e) { console.error('Error parsing stored user info:', e); return null; } } return null; }; /** * 检查Token是否存在且(理论上)是否在有效期内。 * 服务端 /user接口会验证实际有效期。 * @returns {boolean} 如果存在token则返回true,否则false。 */ export const hasValidToken = () => { const token = localStorage.getItem('access_token'); // 简单的存在性检查,实际有效期由 /user 接口判断 return !!token; }; /** * 获取当前用户信息。 * 如果Token无效或过期,API会返回401,响应拦截器将处理清除token。 * @returns {Promise} 用户信息对象或null(如果未登录或获取失败)。 */ export const getUserInfo = async () => { if (!hasValidToken()) { throw new Error('No valid token found'); } try { const response = await axiosInstance.get(USER_INFO_URL); const user = response.data; try { const tempResp = await axiosInstance.get(TEMP_PRIVILEGE_URL); if (tempResp.data) { if (tempResp.data.temp_privilege !== undefined) { user.temp_privilege = tempResp.data.temp_privilege; } else if (typeof tempResp.data.privilege === 'string') { // 后端返回字段名为 privilege user.temp_privilege = tempResp.data.privilege; } } } catch (e) { // 若临时权限接口失败,仅记录错误,不影响主流程 console.error('Failed to fetch temp privilege:', e); } // 将合并后的用户信息存入 sessionStorage sessionStorage.setItem('currentUser', JSON.stringify(user)); return user; } catch (error) { // 清除可能存在的无效用户信息 sessionStorage.removeItem('currentUser'); throw error; } }; /** * 处理用户登出。 * 仅清除本地存储的认证信息。 */ export const logoutUser = () => { // 不再是 async,因为它不执行异步导航 // console.log('jwt.js: logoutUser called. Clearing local storage.'); localStorage.removeItem('access_token'); localStorage.removeItem('user_id'); sessionStorage.removeItem('currentUser'); // 同时清除sessionStorage中的用户信息 // 导航将由调用者(如路由守卫)处理 }; /** * 登录成功后调用,存储token和用户信息,并处理重定向。 * @param {string} accessToken - 从登录API获取的访问令牌。 * @param {string} userId - 用户ID。 */ export const loginSuccess = (accessToken, userId) => { // 清除可能存在的旧数据 // localStorage.removeItem('access_token'); // localStorage.removeItem('user_id'); // sessionStorage.removeItem('currentUser'); // 存储新的认证信息 localStorage.setItem('access_token', accessToken); if (userId) { localStorage.setItem('user_id', userId); } // 设置登录标志 justLoggedIn.value = true; // 获取重定向路径,优先使用查询参数中的redirect,否则跳转到首页 const currentRoute = router.currentRoute.value; const redirectPath = currentRoute.query.redirect || '/'; // 使用replace而不是push,避免在历史记录中留下登录页面 router.replace(redirectPath); };