优化构架

This commit is contained in:
2026-08-03 18:49:18 +08:00
parent 1241d11c01
commit 44c33a6280
133 changed files with 651 additions and 603 deletions
+27
View File
@@ -0,0 +1,27 @@
import { createPinia, setActivePinia } from 'pinia'
import { beforeEach, describe, expect, it } from 'vitest'
import { useAccessPreviewStore } from '@/core/access/accessPreview'
import { useAuthStore } from '@/core/auth/auth'
describe('server access store', () => {
beforeEach(() => setActivePinia(createPinia()))
it('uses only the authenticated permission snapshot', () => {
const auth = useAuthStore()
auth.token = 'token'
auth.permissions = ['platform:warehouse:list']
const access = useAccessPreviewStore()
access.initializeAfterLogin()
expect(access.can('platform:warehouse:list')).toBe(true)
expect(access.can('platform:user:list')).toBe(false)
expect(access.firstAccessiblePath).toBe('/warehouses')
})
it('exposes no permissions when the server snapshot is empty', () => {
const access = useAccessPreviewStore()
expect(access.permissionCodes.size).toBe(0)
expect(access.filteredNavigation).toHaveLength(0)
expect(access.firstAccessiblePath).toBeNull()
})
})
+40
View File
@@ -0,0 +1,40 @@
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import {
adminNavigation,
filterAdminNavigation,
getFirstNavigationLeaf,
} from '@/core/navigation/adminNavigation'
import { useAuthStore } from '@/core/auth/auth'
export const useAccessPreviewStore = defineStore('access-preview', () => {
const auth = useAuthStore()
const initialized = ref(false)
const permissionCodes = computed<ReadonlySet<string>>(() => auth.permissionCodes)
const permissionSignature = computed(() => [...permissionCodes.value].sort().join('|'))
const filteredNavigation = computed(() => filterAdminNavigation(adminNavigation, permissionCodes.value))
const firstAccessiblePath = computed(() => getFirstNavigationLeaf(filteredNavigation.value)?.path ?? null)
function initializeAfterLogin() {
initialized.value = auth.isAuthenticated
}
function can(permissionCode: string): boolean {
return permissionCodes.value.has(permissionCode)
}
function reset() {
initialized.value = false
}
return {
initialized,
permissionCodes,
permissionSignature,
filteredNavigation,
firstAccessiblePath,
initializeAfterLogin,
can,
reset,
}
})