import { useRoute } from 'vue-router'
|
import { storeToRefs } from 'pinia'
|
import { useUserStore } from '@/store/modules/user'
|
import { useAppMode } from '@/hooks/core/useAppMode'
|
|
function extractRouteAuthMarks(authList) {
|
if (!Array.isArray(authList)) {
|
return []
|
}
|
|
return authList
|
.map((item) => {
|
if (typeof item === 'string') {
|
return item
|
}
|
if (item && typeof item === 'object') {
|
return item.authMark || ''
|
}
|
return ''
|
})
|
.filter(Boolean)
|
}
|
|
function extractUserButtons(info) {
|
return Array.isArray(info?.buttons) ? info.buttons : []
|
}
|
|
const BUTTON_ACTION_MAP = {
|
query: 'list',
|
add: 'save',
|
edit: 'update',
|
delete: 'remove'
|
}
|
|
function resolveRouteResourceKey(routePath) {
|
const pathSegments = String(routePath || '')
|
.split('/')
|
.filter(Boolean)
|
|
const rawSegment = pathSegments[pathSegments.length - 1]
|
if (!rawSegment) {
|
return ''
|
}
|
|
return rawSegment.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())
|
}
|
|
function matchesBackendButton(requiredAuth, buttons, routePath) {
|
if (buttons.includes(requiredAuth)) {
|
return true
|
}
|
|
const action = BUTTON_ACTION_MAP[requiredAuth]
|
const resourceKey = resolveRouteResourceKey(routePath)
|
if (!action || !resourceKey) {
|
return false
|
}
|
|
return buttons.some(
|
(item) =>
|
typeof item === 'string' && item.includes(`:${resourceKey}:`) && item.endsWith(`:${action}`)
|
)
|
}
|
|
function hasAuthPermission(
|
requiredAuth,
|
{ authList = [], buttons = [], isBackendMode = false, routePath = '' } = {}
|
) {
|
const requiredList = Array.isArray(requiredAuth) ? requiredAuth : [requiredAuth]
|
|
if (!requiredList.length) {
|
return true
|
}
|
|
if (isBackendMode) {
|
return requiredList.some((item) => matchesBackendButton(item, buttons, routePath))
|
}
|
|
return requiredList.some((item) => authList.includes(item))
|
}
|
|
const useAuth = () => {
|
const userStore = useUserStore()
|
const route = useRoute()
|
const { isBackendMode } = useAppMode()
|
const { info } = storeToRefs(userStore)
|
const authList = computed(() => extractRouteAuthMarks(route.meta.authList))
|
const buttons = computed(() => extractUserButtons(info.value))
|
const hasAuth = (auth) => {
|
return hasAuthPermission(auth, {
|
authList: authList.value,
|
buttons: buttons.value,
|
isBackendMode: isBackendMode.value,
|
routePath: route.path
|
})
|
}
|
return {
|
hasAuth
|
}
|
}
|
export {
|
extractRouteAuthMarks,
|
extractUserButtons,
|
hasAuthPermission,
|
resolveRouteResourceKey,
|
useAuth
|
}
|