Files
Henry_Du 4ce4649aaf
Build VoiceHub FPK / build-fpk (push) Failing after 56m5s
Build and Push Docker Image / build-and-push (push) Canceled after 1h9m35s
初次提交
2026-09-06 08:19:02 +08:00

126 lines
3.2 KiB
TypeScript

import { computed } from 'vue'
import { useAuth } from './useAuth'
export const usePermissions = () => {
const auth = useAuth()
// 检查用户是否可以访问后台
const canAccessAdmin = computed(() => {
if (!auth.user.value) return false
const role = auth.user.value.role
return ['SONG_ADMIN', 'ADMIN', 'SUPER_ADMIN'].includes(role)
})
// 检查用户是否可以访问指定页面
const canAccessPage = (page: string): boolean => {
if (!auth.user.value) return false
const role = auth.user.value.role
// 超级管理员可以访问所有页面
if (role === 'SUPER_ADMIN') return true
// 管理员可以访问的页面
if (role === 'ADMIN') {
return ['overview', 'schedule', 'print', 'songs', 'users', 'data-analysis'].includes(page)
}
// 歌曲管理员可以访问的页面
if (role === 'SONG_ADMIN') {
return ['schedule', 'print', 'songs'].includes(page)
}
return false
}
// 获取用户可访问的页面列表
const getUserPages = computed(() => {
if (!auth.user.value) return []
const role = auth.user.value.role
switch (role) {
case 'SUPER_ADMIN':
return [
'overview',
'schedule',
'print',
'songs',
'users',
'notifications',
'smtp-config',
'playtimes',
'request-times',
'semesters',
'blacklist',
'site-config',
'database',
'api-keys'
]
case 'ADMIN':
return ['overview', 'schedule', 'print', 'songs', 'users', 'data-analysis']
case 'SONG_ADMIN':
return ['schedule', 'print', 'songs']
default:
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'].includes(role)
})
const isSongAdminOrAbove = computed(() => {
const role = auth.user.value?.role
return ['SONG_ADMIN', 'ADMIN', 'SUPER_ADMIN'].includes(role)
})
// 检查是否可以管理用户角色
const canManageUserRole = (targetRole: string): boolean => {
if (!auth.user.value) return false
// 只有超级管理员可以分配角色
if (auth.user.value.role === 'SUPER_ADMIN') {
return ['USER', 'SONG_ADMIN', 'ADMIN'].includes(targetRole)
}
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
}
}