blob: 69efc6bf2cfab73ae9305a3769abfd4b43027e0f [file] [log] [blame]
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
}