Xing Jinwen | ff16b1e | 2025-06-05 00:29:26 +0800 | [diff] [blame^] | 1 | import { authApi } from '@/api/auth'
|
| 2 | import { ElMessage } from 'element-plus'
|
| 3 |
|
| 4 | const state = {
|
| 5 | // 登录状态
|
| 6 | isLoggedIn: false,
|
| 7 | // 用户信息
|
| 8 | userInfo: null,
|
| 9 | // Token信息
|
| 10 | token: null,
|
| 11 | // 登录加载状态
|
| 12 | loginLoading: false
|
| 13 | }
|
| 14 |
|
| 15 | const 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 |
|
| 30 | const 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 |
|
| 60 | const 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 |
|
| 204 | export default {
|
| 205 | namespaced: true,
|
| 206 | state,
|
| 207 | getters,
|
| 208 | mutations,
|
| 209 | actions
|
| 210 | } |