114 lines
3.2 KiB
TypeScript
114 lines
3.2 KiB
TypeScript
import { computed, ref } from 'vue'
|
|
import { useAuth } from './useAuth'
|
|
|
|
export const rolesConfig = ref(null)
|
|
|
|
export const fetchRolesConfig = async () => {
|
|
if (rolesConfig.value) return
|
|
try {
|
|
const data = await $fetch('/api/roles')
|
|
rolesConfig.value = data
|
|
} catch (err) {
|
|
console.error('Failed to fetch roles config', err)
|
|
}
|
|
}
|
|
|
|
export const usePermissions = () => {
|
|
const auth = useAuth()
|
|
|
|
// 检查用户是否可以访问后台
|
|
const canAccessAdmin = computed(() => {
|
|
if (!auth.user.value || !auth.user.value.role) return false
|
|
const role = auth.user.value.role
|
|
if (rolesConfig.value && rolesConfig.value[role]) {
|
|
return rolesConfig.value[role].canAccessAdmin
|
|
}
|
|
// Fallback if config not loaded
|
|
return ['SONG_ADMIN', 'ADMIN', 'SUPER_ADMIN', 'STAFF', 'VICE_MINISTER', 'MINISTER', 'RESIDENT'].includes(role)
|
|
})
|
|
|
|
// 检查用户是否可以访问指定页面
|
|
const canAccessPage = (page: string): boolean => {
|
|
if (!auth.user.value || !auth.user.value.role) return false
|
|
const role = auth.user.value.role
|
|
|
|
// 超级管理员可以访问所有页面 (作为兜底保护)
|
|
if (role === 'SUPER_ADMIN') return true
|
|
|
|
if (rolesConfig.value && rolesConfig.value[role]) {
|
|
return rolesConfig.value[role].pages.includes(page)
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// 获取用户可访问的页面列表
|
|
const getUserPages = computed(() => {
|
|
if (!auth.user.value || !auth.user.value.role) return []
|
|
const role = auth.user.value.role
|
|
|
|
if (rolesConfig.value && rolesConfig.value[role]) {
|
|
return rolesConfig.value[role].pages
|
|
}
|
|
|
|
return []
|
|
})
|
|
|
|
// 角色检查
|
|
const isUser = computed(() => auth.user.value?.role === 'USER')
|
|
const isSongAdmin = computed(() => auth.user.value?.role === 'SONG_ADMIN')
|
|
const isAdmin = computed(() => auth.user.value?.role === 'ADMIN')
|
|
const isSuperAdmin = computed(() => auth.user.value?.role === 'SUPER_ADMIN')
|
|
|
|
// 权限组合检查 (为了兼容性保留,但最好根据实际权限判断)
|
|
const isAdminOrAbove = computed(() => {
|
|
const role = auth.user.value?.role
|
|
return ['ADMIN', 'SUPER_ADMIN', 'VICE_MINISTER', 'MINISTER'].includes(role)
|
|
})
|
|
|
|
const isSongAdminOrAbove = computed(() => {
|
|
const role = auth.user.value?.role
|
|
return ['SONG_ADMIN', 'ADMIN', 'SUPER_ADMIN', 'STAFF', 'VICE_MINISTER', 'MINISTER', 'RESIDENT'].includes(role)
|
|
})
|
|
|
|
// 检查是否可以管理用户角色
|
|
const canManageUserRole = (targetRole: string): boolean => {
|
|
if (!auth.user.value) return false
|
|
|
|
// 只有超级管理员可以分配角色
|
|
if (auth.user.value.role === 'SUPER_ADMIN') {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// 检查是否可以打印排期
|
|
const canPrintSchedule = computed(() => {
|
|
if (!auth.user.value) return false
|
|
const role = auth.user.value.role
|
|
return ['SONG_ADMIN', 'ADMIN', 'SUPER_ADMIN'].includes(role)
|
|
})
|
|
|
|
return {
|
|
// 页面访问权限
|
|
canAccessAdmin,
|
|
canAccessPage,
|
|
getUserPages,
|
|
|
|
// 角色检查
|
|
isUser,
|
|
isSongAdmin,
|
|
isAdmin,
|
|
isSuperAdmin,
|
|
isAdminOrAbove,
|
|
isSongAdminOrAbove,
|
|
|
|
// 功能权限
|
|
canPrintSchedule,
|
|
|
|
// 用户管理权限
|
|
canManageUserRole
|
|
}
|
|
}
|