| import { authApi } from '@/api/auth' | |
| import { ElMessage } from 'element-plus' | |
| const state = { | |
| // 登录状态 | |
| isLoggedIn: false, | |
| // 用户信息 | |
| userInfo: null, | |
| // Token信息 | |
| token: null, | |
| // 登录加载状态 | |
| loginLoading: false | |
| } | |
| const getters = { | |
| // 是否已登录 | |
| isAuthenticated: state => state.isLoggedIn, | |
| // 获取用户信息 | |
| userInfo: state => state.userInfo, | |
| // 获取用户名 | |
| username: state => state.userInfo?.user?.username || '', | |
| // 获取用户头像 | |
| avatar: state => state.userInfo?.user?.avatar || '', | |
| // 获取用户组信息 | |
| userGroup: state => state.userInfo?.user?.group || null, | |
| // 登录加载状态 | |
| loginLoading: state => state.loginLoading | |
| } | |
| const mutations = { | |
| // 设置登录状态 | |
| SET_LOGIN_STATUS(state, status) { | |
| state.isLoggedIn = status | |
| }, | |
| // 设置用户信息 | |
| SET_USER_INFO(state, userInfo) { | |
| state.userInfo = userInfo | |
| }, | |
| // 设置Token | |
| SET_TOKEN(state, token) { | |
| state.token = token | |
| }, | |
| // 设置登录加载状态 | |
| SET_LOGIN_LOADING(state, loading) { | |
| state.loginLoading = loading | |
| }, | |
| // 清除用户数据 | |
| CLEAR_USER_DATA(state) { | |
| state.isLoggedIn = false | |
| state.userInfo = null | |
| state.token = null | |
| state.loginLoading = false | |
| } | |
| } | |
| const actions = { | |
| // 用户登录 | |
| async login({ commit }, loginData) { | |
| try { | |
| commit('SET_LOGIN_LOADING', true) | |
| const response = await authApi.login(loginData) | |
| if (response) { | |
| // 保存Token | |
| const tokenInfo = response.token | |
| if (tokenInfo && tokenInfo.tokenValue) { | |
| localStorage.setItem('token', tokenInfo.tokenValue) | |
| localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo)) | |
| commit('SET_TOKEN', tokenInfo) | |
| } | |
| // 保存用户信息 | |
| localStorage.setItem('userInfo', JSON.stringify(response)) | |
| localStorage.setItem('isLoggedIn', 'true') | |
| commit('SET_USER_INFO', response) | |
| commit('SET_LOGIN_STATUS', true) | |
| ElMessage.success('登录成功!') | |
| return response | |
| } | |
| } catch (error) { | |
| console.error('登录失败:', error) | |
| throw error | |
| } finally { | |
| commit('SET_LOGIN_LOADING', false) | |
| } | |
| }, | |
| // 用户注册 | |
| async register({ commit }, registerData) { | |
| try { | |
| commit('SET_LOGIN_LOADING', true) | |
| const response = await authApi.register(registerData) | |
| if (response) { | |
| // 注册成功后自动登录 | |
| const tokenInfo = response.token | |
| if (tokenInfo && tokenInfo.tokenValue) { | |
| localStorage.setItem('token', tokenInfo.tokenValue) | |
| localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo)) | |
| commit('SET_TOKEN', tokenInfo) | |
| } | |
| localStorage.setItem('userInfo', JSON.stringify(response)) | |
| localStorage.setItem('isLoggedIn', 'true') | |
| commit('SET_USER_INFO', response) | |
| commit('SET_LOGIN_STATUS', true) | |
| ElMessage.success('注册成功!') | |
| return response | |
| } | |
| } catch (error) { | |
| console.error('注册失败:', error) | |
| throw error | |
| } finally { | |
| commit('SET_LOGIN_LOADING', false) | |
| } | |
| }, | |
| // 用户登出 | |
| async logout({ commit }) { | |
| try { | |
| await authApi.logout() | |
| } catch (error) { | |
| console.error('登出请求失败:', error) | |
| // 即使登出请求失败,也要清除本地数据 | |
| } finally { | |
| // 清除本地存储 | |
| localStorage.removeItem('token') | |
| localStorage.removeItem('tokenInfo') | |
| localStorage.removeItem('userInfo') | |
| localStorage.removeItem('isLoggedIn') | |
| // 清除状态 | |
| commit('CLEAR_USER_DATA') | |
| ElMessage.success('已退出登录') | |
| } | |
| }, | |
| // 检查登录状态 | |
| async checkLoginStatus({ commit }) { | |
| try { | |
| const response = await authApi.getStatus() | |
| if (response && response.isLoggedIn && response.user) { | |
| // 更新用户信息 | |
| localStorage.setItem('userInfo', JSON.stringify(response.user)) | |
| localStorage.setItem('isLoggedIn', 'true') | |
| commit('SET_USER_INFO', response.user) | |
| commit('SET_LOGIN_STATUS', true) | |
| return true | |
| } else { | |
| // 登录状态无效,清除本地数据 | |
| commit('CLEAR_USER_DATA') | |
| localStorage.removeItem('token') | |
| localStorage.removeItem('tokenInfo') | |
| localStorage.removeItem('userInfo') | |
| localStorage.removeItem('isLoggedIn') | |
| return false | |
| } | |
| } catch (error) { | |
| console.error('检查登录状态失败:', error) | |
| commit('CLEAR_USER_DATA') | |
| return false | |
| } | |
| }, | |
| // 从本地存储恢复登录状态 | |
| restoreLoginState({ commit }) { | |
| const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true' | |
| const userInfo = localStorage.getItem('userInfo') | |
| const tokenInfo = localStorage.getItem('tokenInfo') | |
| if (isLoggedIn && userInfo) { | |
| try { | |
| const parsedUserInfo = JSON.parse(userInfo) | |
| const parsedTokenInfo = tokenInfo ? JSON.parse(tokenInfo) : null | |
| commit('SET_USER_INFO', parsedUserInfo) | |
| commit('SET_TOKEN', parsedTokenInfo) | |
| commit('SET_LOGIN_STATUS', true) | |
| console.log('✅ 已从本地存储恢复登录状态') | |
| } catch (error) { | |
| console.error('❌ 恢复登录状态失败:', error) | |
| commit('CLEAR_USER_DATA') | |
| } | |
| } | |
| } | |
| } | |
| export default { | |
| namespaced: true, | |
| state, | |
| getters, | |
| mutations, | |
| actions | |
| } |