blob: d04e1023bb5ac26df05164bae803861f7f946ee6 [file] [log] [blame]
Raverafc93da2025-06-15 18:12:49 +08001// 认证相关的工具函数
2
3/**
4 * 获取当前用户的认证token
5 * @returns {string|null} 认证token,如果未登录则返回null
6 */
7export const getAuthToken = () => {
8 // 优先从localStorage获取(记住我的情况)
9 const localToken = localStorage.getItem('authToken');
10 if (localToken) {
11 return localToken;
12 }
13
14 // 然后从sessionStorage获取(不记住我的情况)
15 const sessionToken = sessionStorage.getItem('authToken');
16 return sessionToken;
17};
18
19/**
20 * 获取当前用户信息
21 * @returns {object|null} 用户信息,如果未登录则返回null
22 */
23export const getUserInfo = () => {
24 // 优先从localStorage获取
25 const localUserInfo = localStorage.getItem('userInfo');
26 if (localUserInfo) {
27 try {
28 return JSON.parse(localUserInfo);
29 } catch (error) {
30 console.error('解析localStorage中的用户信息失败:', error);
31 }
32 }
33
34 // 然后从sessionStorage获取
35 const sessionUserInfo = sessionStorage.getItem('userInfo');
36 if (sessionUserInfo) {
37 try {
38 return JSON.parse(sessionUserInfo);
39 } catch (error) {
40 console.error('解析sessionStorage中的用户信息失败:', error);
41 }
42 }
43
44 return null;
45};
46
47/**
48 * 检查用户是否已登录
49 * @returns {boolean} 是否已登录
50 */
51export const isLoggedIn = () => {
52 const token = getAuthToken();
53 return !!token;
54};
55
56/**
57 * 获取记住的登录信息
58 * @returns {object} 包含email, password, rememberMe的对象
59 */
60export const getRememberedLoginInfo = () => {
61 const email = localStorage.getItem('rememberedEmail') || '';
62 const password = localStorage.getItem('rememberedPassword') || '';
63 const rememberMe = localStorage.getItem('rememberMe') === 'true';
64
65 return {
66 email,
67 password,
68 rememberMe
69 };
70};
71
72/**
73 * 保存记住的登录信息
74 * @param {string} email 邮箱
75 * @param {string} password 密码
76 * @param {boolean} remember 是否记住
77 */
78export const saveRememberedLoginInfo = (email, password, remember) => {
79 if (remember) {
80 localStorage.setItem('rememberedEmail', email);
81 localStorage.setItem('rememberedPassword', password);
82 localStorage.setItem('rememberMe', 'true');
83 } else {
84 localStorage.removeItem('rememberedEmail');
85 localStorage.removeItem('rememberedPassword');
86 localStorage.removeItem('rememberMe');
87 }
88};
89
90/**
91 * 保存用户认证信息
92 * @param {string} token 认证token
93 * @param {object} userInfo 用户信息
94 * @param {boolean} remember 是否记住登录状态
95 */
96export const saveAuthInfo = (token, userInfo, remember = false) => {
97 if (remember) {
98 // 记住我:保存到localStorage
99 localStorage.setItem('authToken', token);
100 localStorage.setItem('userInfo', JSON.stringify(userInfo));
101
102 // 清除sessionStorage
103 sessionStorage.removeItem('authToken');
104 sessionStorage.removeItem('userInfo');
105 } else {
106 // 不记住我:保存到sessionStorage
107 sessionStorage.setItem('authToken', token);
108 sessionStorage.setItem('userInfo', JSON.stringify(userInfo));
109
110 // 清除localStorage中的认证信息(但保留记住的登录表单信息)
111 localStorage.removeItem('authToken');
112 localStorage.removeItem('userInfo');
113 }
114};
115
116/**
117 * 清除所有认证信息(退出登录)
118 * @param {boolean} clearRemembered 是否同时清除记住的登录信息
119 */
120export const clearAuthInfo = (clearRemembered = false) => {
121 // 清除认证token和用户信息
122 localStorage.removeItem('authToken');
123 localStorage.removeItem('userInfo');
124 sessionStorage.removeItem('authToken');
125 sessionStorage.removeItem('userInfo');
126
127 // 如果需要,清除记住的登录信息
128 if (clearRemembered) {
129 localStorage.removeItem('rememberedEmail');
130 localStorage.removeItem('rememberedPassword');
131 localStorage.removeItem('rememberMe');
132 }
133};
134
135/**
136 * 创建带认证头的fetch请求配置
137 * @param {object} options 原始fetch配置
138 * @returns {object} 带认证头的fetch配置
139 */
140export const createAuthenticatedRequest = (options = {}) => {
141 const token = getAuthToken();
142
143 if (!token) {
144 throw new Error('用户未登录');
145 }
146
147 return {
148 ...options,
149 headers: {
150 ...options.headers,
151 'Authorization': `Bearer ${token}`,
152 'Content-Type': 'application/json'
153 }
154 };
155};