Files
boss_font/src/store/modules/user-store.ts
ddrwode 68882f94cf ha'ha
2026-03-06 16:35:38 +08:00

139 lines
3.3 KiB
TypeScript

import { store } from '@/store'
import type { UserInfo } from '@/api/system/user-api'
import { AuthStorage } from '@/utils/auth'
import { usePermissionStoreHook } from '@/store/modules/permission-store'
import { useDictStoreHook } from '@/store/modules/dict-store'
import { useTagsViewStore } from '@/store'
import { cleanupWebSocket } from '@/plugins/websocket'
import { UserGetInfo, userLogin } from '@/api/calibration/login'
export const useUserStore = defineStore('user', () => {
// 用户信息
const userInfo = ref<any>({})
// 记住我状态
const rememberMe = ref(AuthStorage.getRememberMe())
const permissionCharactersArr = ref<string[]>([])
const setPermissionCharactersArr = (arr: string[]) => {
permissionCharactersArr.value = arr
}
// 登录
function login(LoginFormData: any) {
return new Promise<void>((resolve, reject) => {
// 保存记住我状态和token
rememberMe.value = true
userLogin(LoginFormData)
.then((res: any) => {
AuthStorage.setTokens(res.data.token, res.data.token, rememberMe.value)
resolve()
})
.catch((error) => {
reject(error)
})
})
}
/**
* 获取用户信息
*
* @returns {UserInfo} 用户信息
*/
function getUserInfo() {
return new Promise<UserInfo>((resolve, reject) => {
UserGetInfo()
.then((res: any) => {
if (!res) {
reject('Verification failed, please Login again.')
return
}
setUserInfo(res.data)
resolve(res)
})
.catch((error) => {
reject(error)
})
})
}
const setUserInfo = (info: any) => {
userInfo.value = info
}
/**
* 登出
*/
function logout() {
return new Promise<void>((resolve) => {
// 重置所有系统状态
resetAllState()
resolve()
})
}
/**
* 重置所有系统状态
* 统一处理所有清理工作,包括用户凭证、路由、缓存等
*/
function resetAllState() {
// 1. 重置用户状态
resetUserState()
// 2. 重置其他模块状态
// 重置路由
usePermissionStoreHook().resetRouter()
// 清除字典缓存
useDictStoreHook().clearDictCache()
// 清除标签视图
useTagsViewStore().delAllViews()
// 3. 清理 WebSocket 连接
return Promise.resolve()
}
/**
* 重置用户状态
* 仅处理用户模块内的状态
*/
function resetUserState() {
// 清除用户凭证
AuthStorage.clearAuth()
// 重置用户信息
userInfo.value = {} as UserInfo
setPermissionCharactersArr([])
}
const checkPermission = (permission: string): boolean => {
if (userInfo.value?.permission_data.includes('*:*:*')) {
return true
}
return userInfo.value?.permission_data.includes(permission)
}
return {
userInfo,
rememberMe,
isLoggedIn: () => !!AuthStorage.getAccessToken(),
getUserInfo,
setUserInfo,
login,
logout,
resetAllState,
resetUserState,
permissionCharactersArr,
setPermissionCharactersArr,
checkPermission
}
})
/**
* 在组件外部使用UserStore的钩子函数
* @see https://pinia.vuejs.org/core-concepts/outside-component-usage.html
*/
export function useUserStoreHook() {
return useUserStore(store)
}