139 lines
3.3 KiB
TypeScript
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)
|
|
}
|