提交
This commit is contained in:
1 parent
5c6ace1dd3
commit
8be55c08e9
32 files changed
+18546
-4422
No files matched your search
@@ -0,0 +1,66 @@
|
||||
import { ref } from 'vue'
|
||||
import { fetchGetMenuCodes } from '@/api/auth'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
|
||||
const PRICE_LETTER_PERM_MAP: Record<string, string> = {
|
||||
list: 'crm:priceLetter:list',
|
||||
add: 'crm:priceLetter:add',
|
||||
edit: 'crm:priceLetter:edit',
|
||||
query: 'crm:priceLetter:query',
|
||||
print: 'crm:priceLetter:print',
|
||||
void: 'crm:priceLetter:void'
|
||||
}
|
||||
|
||||
let cachedCodes: Set<string> | null = null
|
||||
let cachedAll = false
|
||||
let loadingPromise: Promise<void> | null = null
|
||||
|
||||
function isSuperAdmin(userStore: ReturnType<typeof useUserStore>) {
|
||||
const roles = userStore.info?.roles || []
|
||||
return userStore.info?.role === 'super_admin' || roles.includes('super_admin')
|
||||
}
|
||||
|
||||
export function usePriceLetterPerm() {
|
||||
const userStore = useUserStore()
|
||||
const ready = ref(cachedAll || !!cachedCodes)
|
||||
|
||||
async function loadPerms() {
|
||||
if (cachedAll || cachedCodes) {
|
||||
ready.value = true
|
||||
return
|
||||
}
|
||||
if (isSuperAdmin(userStore)) {
|
||||
cachedAll = true
|
||||
ready.value = true
|
||||
return
|
||||
}
|
||||
if (!loadingPromise) {
|
||||
loadingPromise = fetchGetMenuCodes()
|
||||
.then((res) => {
|
||||
if (res?.all || res?.isSuperAdmin) {
|
||||
cachedAll = true
|
||||
cachedCodes = null
|
||||
} else {
|
||||
cachedCodes = new Set(res?.menuCodes || [])
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
cachedCodes = new Set()
|
||||
})
|
||||
.finally(() => {
|
||||
ready.value = true
|
||||
loadingPromise = null
|
||||
})
|
||||
}
|
||||
await loadingPromise
|
||||
}
|
||||
|
||||
function hasPriceLetterPerm(action: keyof typeof PRICE_LETTER_PERM_MAP | string) {
|
||||
if (cachedAll || isSuperAdmin(userStore)) return true
|
||||
const code = PRICE_LETTER_PERM_MAP[action] || String(action)
|
||||
if (!cachedCodes) return true
|
||||
return cachedCodes.has(code) || cachedCodes.has('crm:priceLetter:list')
|
||||
}
|
||||
|
||||
return { ready, loadPerms, hasPriceLetterPerm }
|
||||
}
|
||||
Reference in new issue
Block a user