20260819173221

This commit is contained in:
oneao committed 2026-08-19 17:32:25 +08:00
1 parent 1ffc8e1ac9
commit a0a4273f4c
326 files changed
+301646 -2314

No files matched your search

+25 -38
View File
@@ -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'] },
],
},
)
+19 -7
View File
@@ -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,
)