20260819173221
This commit is contained in:
1 parent
1ffc8e1ac9
commit
a0a4273f4c
326 files changed
+301646
-2314
No files matched your search
@@ -1,61 +1,48 @@
|
||||
import { computed, ref } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
const AUTH_STORAGE_KEY = 'fms-auth'
|
||||
const LAST_LOGIN_KEY = 'fms-last-login'
|
||||
|
||||
// 兼容旧版 sessionStorage 会话:将历史会话迁移到 localStorage
|
||||
try {
|
||||
const session = sessionStorage.getItem(AUTH_STORAGE_KEY)
|
||||
if (session && !localStorage.getItem(AUTH_STORAGE_KEY)) {
|
||||
localStorage.setItem(AUTH_STORAGE_KEY, session)
|
||||
}
|
||||
} catch {
|
||||
// Storage can be unavailable in restricted browser contexts.
|
||||
}
|
||||
|
||||
export const useAuthStore = defineStore(
|
||||
'auth',
|
||||
() => {
|
||||
const token = ref('')
|
||||
const orgId = ref('')
|
||||
const user = ref(null)
|
||||
const isAuthenticated = computed(() => Boolean(token.value))
|
||||
// —— 会话信息(凭证 + 会话期用户详情):退出登录时清空,持久化到 sessionStorage ——
|
||||
const loginInfo = ref({ token: '', user: null })
|
||||
// —— 用户信息(机构码 + 账号):跨会话长存,登录页回显用,退出登录刻意不清 ——
|
||||
const userInfo = ref({ orgId: '', account: '' })
|
||||
|
||||
const isAuthenticated = computed(() => Boolean(loginInfo.value.token))
|
||||
|
||||
function setSession(session, organizationId) {
|
||||
token.value = session.token ?? session.access_token ?? ''
|
||||
orgId.value = session.orgid ?? organizationId ?? ''
|
||||
user.value = session.user ?? session.user_info ?? null
|
||||
|
||||
// 单独保存最近登录信息,供登录页回填(与认证状态分离)
|
||||
try {
|
||||
const last = { orgId: orgId.value, account: user.value?.account ?? '' }
|
||||
localStorage.setItem(LAST_LOGIN_KEY, JSON.stringify(last))
|
||||
} catch {
|
||||
// Storage 不可用时静默忽略
|
||||
loginInfo.value = {
|
||||
token: session.token ?? session.access_token ?? '',
|
||||
user: session.user ?? session.user_info ?? null,
|
||||
}
|
||||
userInfo.value.orgId = session.orgid ?? organizationId ?? ''
|
||||
}
|
||||
|
||||
function clearSession() {
|
||||
token.value = ''
|
||||
orgId.value = ''
|
||||
user.value = null
|
||||
loginInfo.value = { token: '', user: null }
|
||||
// 故意不清 userInfo:机构码/账号是登录页回显数据,不属于会话
|
||||
}
|
||||
|
||||
function saveLastLogin(orgId, account) {
|
||||
userInfo.value = { orgId: orgId ?? '', account: account ?? '' }
|
||||
}
|
||||
|
||||
return {
|
||||
token,
|
||||
orgId,
|
||||
user,
|
||||
loginInfo,
|
||||
userInfo,
|
||||
isAuthenticated,
|
||||
setSession,
|
||||
clearSession,
|
||||
saveLastLogin,
|
||||
}
|
||||
},
|
||||
{
|
||||
persist: {
|
||||
key: AUTH_STORAGE_KEY,
|
||||
storage: localStorage,
|
||||
pick: ['token', 'orgId', 'user'],
|
||||
},
|
||||
persist: [
|
||||
// 会话凭证:关标签页/浏览器即失效
|
||||
{ key: 'fms-login', storage: sessionStorage, pick: ['loginInfo'] },
|
||||
// 用户信息(机构码/账号):跨会话保留,供登录页回显
|
||||
{ key: 'fms-user', storage: localStorage, pick: ['userInfo'] },
|
||||
],
|
||||
},
|
||||
)
|
||||
@@ -29,7 +29,7 @@ export const usePermissionStore = defineStore('permissions', () => {
|
||||
const powerSet = computed(() => new Set(powerCodes.value))
|
||||
const isG3soft = computed(() => {
|
||||
return (
|
||||
String(authStore.user?.account || '')
|
||||
String(authStore.loginInfo.user?.account || '')
|
||||
.trim()
|
||||
.toLowerCase() === 'g3soft'
|
||||
)
|
||||
@@ -39,8 +39,8 @@ export const usePermissionStore = defineStore('permissions', () => {
|
||||
* 加载权限数据;重复调用对同一主体去重,并发调用共享同一请求。
|
||||
*/
|
||||
async function load() {
|
||||
const userId = String(authStore.user?.id || '')
|
||||
const principalKey = `${String(authStore.orgId || '')}:${userId}`
|
||||
const userId = String(authStore.loginInfo.user?.id || '')
|
||||
const principalKey = `${String(authStore.userInfo.orgId || '')}:${userId}`
|
||||
|
||||
// 管理员提权:直接加载全部启用模块,不查授权表
|
||||
if (isG3soft.value) {
|
||||
@@ -153,9 +153,16 @@ export const usePermissionStore = defineStore('permissions', () => {
|
||||
}
|
||||
|
||||
function clear() {
|
||||
loadVersion++
|
||||
loadingPromise = null
|
||||
loadingPrincipalKey = ''
|
||||
// 仅当“正在进行中的请求属于别的主体”时才作废它(如切换账号),
|
||||
// 否则保留进行中请求、只清空已加载数据,交由后续 load 结果填充。
|
||||
// 这避免登录(setSession 后守卫立即 load)被自身的 watch(clear) 误作废,导致菜单空白。
|
||||
const userId = String(authStore.loginInfo.user?.id || '')
|
||||
const principalKey = `${String(authStore.userInfo.orgId || '')}:${userId}`
|
||||
if (loadingPrincipalKey && loadingPrincipalKey !== principalKey) {
|
||||
loadVersion++
|
||||
loadingPromise = null
|
||||
loadingPrincipalKey = ''
|
||||
}
|
||||
loadedPrincipalKey.value = ''
|
||||
modules.value = []
|
||||
grantedPageIds.value = []
|
||||
@@ -165,7 +172,12 @@ export const usePermissionStore = defineStore('permissions', () => {
|
||||
|
||||
// 登录主体变化(退出/切换账号)时清空权限缓存
|
||||
watch(
|
||||
() => [authStore.orgId, authStore.user?.id, authStore.user?.account, authStore.token],
|
||||
() => [
|
||||
authStore.userInfo.orgId,
|
||||
authStore.loginInfo.user?.id,
|
||||
authStore.loginInfo.user?.account,
|
||||
authStore.loginInfo.token,
|
||||
],
|
||||
clear,
|
||||
)
|
||||
|
||||
|
||||
Reference in new issue
Block a user