rentease-app/store/user.js

228 lines
4.3 KiB
JavaScript
Raw Normal View History

2026-04-20 06:23:11 +00:00
/**
* 用户状态管理
* 管理用户登录状态和信息
*/
import { storage } from '../utils/index.js'
import api from '../api/index.js'
// 状态
const state = {
token: storage.get('token') || null,
userInfo: storage.get('userInfo') || null,
tenantInfo: storage.get('tenantInfo') || null,
menus: storage.get('menus') || []
}
// 获取器
const getters = {
/**
* 是否已登录
*/
isLoggedIn: (state) => {
return !!state.token && !!state.userInfo
},
/**
* 获取用户信息
*/
userInfo: (state) => {
return state.userInfo
},
/**
* 获取租户信息
*/
tenantInfo: (state) => {
return state.tenantInfo
},
/**
* 获取菜单列表
*/
menus: (state) => {
return state.menus
},
/**
* 获取Token
*/
token: (state) => {
return state.token
},
/**
* 是否超级管理员
*/
isSuperAdmin: (state) => {
return state.userInfo?.userType === 'super_admin'
}
}
// 修改器
const mutations = {
/**
* 设置Token
*/
SET_TOKEN(state, token) {
state.token = token
storage.set('token', token)
},
/**
* 设置用户信息
*/
SET_USER_INFO(state, userInfo) {
state.userInfo = userInfo
storage.set('userInfo', userInfo)
},
/**
* 设置租户信息
*/
SET_TENANT_INFO(state, tenantInfo) {
state.tenantInfo = tenantInfo
storage.set('tenantInfo', tenantInfo)
},
/**
* 设置菜单
*/
SET_MENUS(state, menus) {
state.menus = menus
storage.set('menus', menus)
},
/**
* 清除所有状态
*/
CLEAR_ALL(state) {
state.token = null
state.userInfo = null
state.tenantInfo = null
state.menus = []
storage.remove('token')
storage.remove('userInfo')
storage.remove('tenantInfo')
storage.remove('menus')
}
}
// 动作
const actions = {
/**
* 用户登录
* @param {Object} context
* @param {Object} credentials - 登录凭证
*/
async login({ commit }, credentials) {
try {
const res = await api.auth.login(credentials)
const { token, userInfo, tenant, menus } = res.data
// 保存登录信息
commit('SET_TOKEN', token)
commit('SET_USER_INFO', userInfo)
commit('SET_TENANT_INFO', tenant)
commit('SET_MENUS', menus)
return res
} catch (error) {
throw error
}
},
/**
* 用户登出
* @param {Object} context
*/
async logout({ commit }) {
try {
// 调用登出接口
await api.auth.logout()
} catch (error) {
console.error('登出接口调用失败:', error)
} finally {
// 清除本地状态
commit('CLEAR_ALL')
}
},
/**
* 获取当前用户信息
* @param {Object} context
*/
async getCurrentUser({ commit }) {
try {
const res = await api.auth.getCurrentUser()
commit('SET_USER_INFO', res.data)
return res
} catch (error) {
throw error
}
},
/**
* 更新用户信息
* @param {Object} context
* @param {Object} userInfo - 用户信息
*/
updateUserInfo({ commit }, userInfo) {
commit('SET_USER_INFO', userInfo)
}
}
// 创建 Store简单实现不使用 Vuex
const userStore = {
state,
getters,
mutations,
actions
}
// 创建响应式状态
const createReactiveState = () => {
const reactiveState = { ...state }
return {
...userStore,
state: reactiveState,
// 便捷方法:登录
login(credentials) {
return this.actions.login({ commit: (mutation, payload) => {
mutations[mutation](reactiveState, payload)
}}, credentials)
},
// 便捷方法:登出
logout() {
return this.actions.logout({ commit: (mutation, payload) => {
mutations[mutation](reactiveState, payload)
}})
},
// 便捷方法:获取当前用户
getCurrentUser() {
return this.actions.getCurrentUser({ commit: (mutation, payload) => {
mutations[mutation](reactiveState, payload)
}})
},
// 便捷方法:清除状态
clearAll() {
mutations.CLEAR_ALL(reactiveState)
},
// 便捷方法:检查登录状态
checkLoginStatus() {
return !!reactiveState.token && !!reactiveState.userInfo
}
}
}
// 导出单例
export const userStoreInstance = createReactiveState()
export default userStoreInstance