fix: 接入用户与权限后端接口

This commit is contained in:
xy
2026-09-03 12:18:57 +08:00
parent e43a118dee
commit 48e5293509
19 changed files with 1982 additions and 375 deletions
+47
View File
@@ -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,
}