blob: 69efc6bf2cfab73ae9305a3769abfd4b43027e0f [file] [log] [blame]
Xing Jinwenff16b1e2025-06-05 00:29:26 +08001import { authApi } from '@/api/auth'
2import { ElMessage } from 'element-plus'
3
4const state = {
5 // 登录状态
6 isLoggedIn: false,
7 // 用户信息
8 userInfo: null,
9 // Token信息
10 token: null,
11 // 登录加载状态
12 loginLoading: false
13}
14
15const getters = {
16 // 是否已登录
17 isAuthenticated: state => state.isLoggedIn,
18 // 获取用户信息
19 userInfo: state => state.userInfo,
20 // 获取用户名
21 username: state => state.userInfo?.user?.username || '',
22 // 获取用户头像
23 avatar: state => state.userInfo?.user?.avatar || '',
24 // 获取用户组信息
25 userGroup: state => state.userInfo?.user?.group || null,
26 // 登录加载状态
27 loginLoading: state => state.loginLoading
28}
29
30const mutations = {
31 // 设置登录状态
32 SET_LOGIN_STATUS(state, status) {
33 state.isLoggedIn = status
34 },
35
36 // 设置用户信息
37 SET_USER_INFO(state, userInfo) {
38 state.userInfo = userInfo
39 },
40
41 // 设置Token
42 SET_TOKEN(state, token) {
43 state.token = token
44 },
45
46 // 设置登录加载状态
47 SET_LOGIN_LOADING(state, loading) {
48 state.loginLoading = loading
49 },
50
51 // 清除用户数据
52 CLEAR_USER_DATA(state) {
53 state.isLoggedIn = false
54 state.userInfo = null
55 state.token = null
56 state.loginLoading = false
57 }
58}
59
60const actions = {
61 // 用户登录
62 async login({ commit }, loginData) {
63 try {
64 commit('SET_LOGIN_LOADING', true)
65
66 const response = await authApi.login(loginData)
67
68 if (response) {
69 // 保存Token
70 const tokenInfo = response.token
71 if (tokenInfo && tokenInfo.tokenValue) {
72 localStorage.setItem('token', tokenInfo.tokenValue)
73 localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo))
74 commit('SET_TOKEN', tokenInfo)
75 }
76
77 // 保存用户信息
78 localStorage.setItem('userInfo', JSON.stringify(response))
79 localStorage.setItem('isLoggedIn', 'true')
80
81 commit('SET_USER_INFO', response)
82 commit('SET_LOGIN_STATUS', true)
83
84 ElMessage.success('登录成功!')
85 return response
86 }
87 } catch (error) {
88 console.error('登录失败:', error)
89 throw error
90 } finally {
91 commit('SET_LOGIN_LOADING', false)
92 }
93 },
94
95 // 用户注册
96 async register({ commit }, registerData) {
97 try {
98 commit('SET_LOGIN_LOADING', true)
99
100 const response = await authApi.register(registerData)
101
102 if (response) {
103 // 注册成功后自动登录
104 const tokenInfo = response.token
105 if (tokenInfo && tokenInfo.tokenValue) {
106 localStorage.setItem('token', tokenInfo.tokenValue)
107 localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo))
108 commit('SET_TOKEN', tokenInfo)
109 }
110
111 localStorage.setItem('userInfo', JSON.stringify(response))
112 localStorage.setItem('isLoggedIn', 'true')
113
114 commit('SET_USER_INFO', response)
115 commit('SET_LOGIN_STATUS', true)
116
117 ElMessage.success('注册成功!')
118 return response
119 }
120 } catch (error) {
121 console.error('注册失败:', error)
122 throw error
123 } finally {
124 commit('SET_LOGIN_LOADING', false)
125 }
126 },
127
128 // 用户登出
129 async logout({ commit }) {
130 try {
131 await authApi.logout()
132 } catch (error) {
133 console.error('登出请求失败:', error)
134 // 即使登出请求失败,也要清除本地数据
135 } finally {
136 // 清除本地存储
137 localStorage.removeItem('token')
138 localStorage.removeItem('tokenInfo')
139 localStorage.removeItem('userInfo')
140 localStorage.removeItem('isLoggedIn')
141
142 // 清除状态
143 commit('CLEAR_USER_DATA')
144
145 ElMessage.success('已退出登录')
146 }
147 },
148
149 // 检查登录状态
150 async checkLoginStatus({ commit }) {
151 try {
152 const response = await authApi.getStatus()
153
154 if (response && response.isLoggedIn && response.user) {
155 // 更新用户信息
156 localStorage.setItem('userInfo', JSON.stringify(response.user))
157 localStorage.setItem('isLoggedIn', 'true')
158
159 commit('SET_USER_INFO', response.user)
160 commit('SET_LOGIN_STATUS', true)
161
162 return true
163 } else {
164 // 登录状态无效,清除本地数据
165 commit('CLEAR_USER_DATA')
166 localStorage.removeItem('token')
167 localStorage.removeItem('tokenInfo')
168 localStorage.removeItem('userInfo')
169 localStorage.removeItem('isLoggedIn')
170
171 return false
172 }
173 } catch (error) {
174 console.error('检查登录状态失败:', error)
175 commit('CLEAR_USER_DATA')
176 return false
177 }
178 },
179
180 // 从本地存储恢复登录状态
181 restoreLoginState({ commit }) {
182 const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
183 const userInfo = localStorage.getItem('userInfo')
184 const tokenInfo = localStorage.getItem('tokenInfo')
185
186 if (isLoggedIn && userInfo) {
187 try {
188 const parsedUserInfo = JSON.parse(userInfo)
189 const parsedTokenInfo = tokenInfo ? JSON.parse(tokenInfo) : null
190
191 commit('SET_USER_INFO', parsedUserInfo)
192 commit('SET_TOKEN', parsedTokenInfo)
193 commit('SET_LOGIN_STATUS', true)
194
195 console.log('✅ 已从本地存储恢复登录状态')
196 } catch (error) {
197 console.error('❌ 恢复登录状态失败:', error)
198 commit('CLEAR_USER_DATA')
199 }
200 }
201 }
202}
203
204export default {
205 namespaced: true,
206 state,
207 getters,
208 mutations,
209 actions
210}