fix: 接入用户与权限后端接口
This commit is contained in:
@@ -21,16 +21,32 @@ export const useLoginStore = defineStore('login', () => {
|
||||
const token = ref(storedSession?.token ?? '')
|
||||
const expiresAt = ref(storedSession?.expiresAt ?? '')
|
||||
const user = ref<AuthenticatedUser | null>(storedSession?.user ?? null)
|
||||
const currentUserReady = ref(false)
|
||||
let currentUserRequest: Promise<AuthenticatedUser> | null = null
|
||||
|
||||
const isLoggedIn = computed(() => Boolean(token.value))
|
||||
const userName = computed(() => user.value?.displayName || user.value?.username || '医护用户')
|
||||
const department = computed(() => getUserContext(user.value))
|
||||
|
||||
function hasPermission(required: string | string[]) {
|
||||
const requiredPermissions = Array.isArray(required) ? required : [required]
|
||||
|
||||
if (!requiredPermissions.length) {
|
||||
return true
|
||||
}
|
||||
|
||||
const permissions = user.value?.permissions ?? []
|
||||
return requiredPermissions.every(
|
||||
(permission) => permissions.includes(permission) || permissions.includes('*'),
|
||||
)
|
||||
}
|
||||
|
||||
function setSession(session: LoginResponse) {
|
||||
saveAuthSession(session)
|
||||
token.value = session.token
|
||||
expiresAt.value = session.expiresAt
|
||||
user.value = session.user
|
||||
currentUserReady.value = false
|
||||
}
|
||||
|
||||
function setCurrentUser(nextUser: AuthenticatedUser) {
|
||||
@@ -50,6 +66,8 @@ export const useLoginStore = defineStore('login', () => {
|
||||
token.value = ''
|
||||
expiresAt.value = ''
|
||||
user.value = null
|
||||
currentUserReady.value = false
|
||||
currentUserRequest = null
|
||||
}
|
||||
|
||||
async function login(payload: LoginRequest) {
|
||||
@@ -64,6 +82,33 @@ export const useLoginStore = defineStore('login', () => {
|
||||
return currentUser
|
||||
}
|
||||
|
||||
async function ensureCurrentUser() {
|
||||
if (!token.value) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (currentUserReady.value && user.value) {
|
||||
return user.value
|
||||
}
|
||||
|
||||
if (!currentUserRequest) {
|
||||
currentUserRequest = refreshCurrentUser()
|
||||
.then((currentUser) => {
|
||||
currentUserReady.value = true
|
||||
return currentUser
|
||||
})
|
||||
.catch((error: unknown) => {
|
||||
currentUserReady.value = false
|
||||
throw error
|
||||
})
|
||||
.finally(() => {
|
||||
currentUserRequest = null
|
||||
})
|
||||
}
|
||||
|
||||
return currentUserRequest
|
||||
}
|
||||
|
||||
async function logout() {
|
||||
try {
|
||||
await logoutRequest()
|
||||
@@ -81,6 +126,8 @@ export const useLoginStore = defineStore('login', () => {
|
||||
department,
|
||||
login,
|
||||
refreshCurrentUser,
|
||||
ensureCurrentUser,
|
||||
hasPermission,
|
||||
logout,
|
||||
clearSession,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user