228 lines
4.3 KiB
JavaScript
228 lines
4.3 KiB
JavaScript
|
|
/**
|
|||
|
|
* 用户状态管理
|
|||
|
|
* 管理用户登录状态和信息
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
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
|