初次提交
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
import fs from 'fs'
|
||||
import path from 'path'
|
||||
|
||||
// 获取角色配置文件路径
|
||||
const getRolesFilePath = () => {
|
||||
return path.resolve(process.cwd(), 'server', 'config', 'roles.json')
|
||||
}
|
||||
|
||||
// 获取当前角色配置
|
||||
export let ROLES = {}
|
||||
try {
|
||||
const filePath = getRolesFilePath()
|
||||
if (fs.existsSync(filePath)) {
|
||||
const data = fs.readFileSync(filePath, 'utf-8')
|
||||
ROLES = JSON.parse(data)
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to load roles.json:', err)
|
||||
}
|
||||
|
||||
// 确保角色对象存在
|
||||
if (!ROLES.USER) {
|
||||
ROLES = {
|
||||
USER: { displayName: '学生(普通用户)', pages: [], canAccessAdmin: false },
|
||||
SONG_ADMIN: { displayName: '工作人员', pages: ['schedule', 'songs', 'print'], canAccessAdmin: true },
|
||||
VICE_MINISTER: { displayName: '副部', pages: ['overview', 'schedule', 'songs', 'print', 'users'], canAccessAdmin: true },
|
||||
ADMIN: { displayName: '部长', pages: ['overview', 'schedule', 'songs', 'print', 'users', 'data-analysis', 'notifications', 'playtimes', 'semesters'], canAccessAdmin: true },
|
||||
RESIDENT: { displayName: '常驻', pages: ['schedule', 'songs', 'print'], canAccessAdmin: true },
|
||||
SUPER_ADMIN: { displayName: '技术运维', pages: ['overview', 'workflow-tutorial', 'schedule', 'songs', 'print', 'users', 'roles', 'blacklist', 'api-keys', 'notifications', 'smtp-config', 'playtimes', 'request-times', 'semesters', 'settings', 'site-config', 'database', 'data-analysis'], canAccessAdmin: true }
|
||||
}
|
||||
}
|
||||
|
||||
// 保存角色配置
|
||||
export function saveRolesConfig(newRoles) {
|
||||
try {
|
||||
ROLES = newRoles
|
||||
const filePath = getRolesFilePath()
|
||||
const dir = path.dirname(filePath)
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true })
|
||||
}
|
||||
fs.writeFileSync(filePath, JSON.stringify(ROLES, null, 2), 'utf-8')
|
||||
return true
|
||||
} catch (err) {
|
||||
console.error('Failed to save roles.json:', err)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// 检查用户是否可以访问后台
|
||||
function canAccessAdmin(user) {
|
||||
if (!user || !user.role) return false
|
||||
|
||||
const roleConfig = ROLES[user.role]
|
||||
if (!roleConfig) return false
|
||||
|
||||
return roleConfig.canAccessAdmin
|
||||
}
|
||||
|
||||
// 检查用户是否可以访问指定页面
|
||||
function canAccessPage(user, page) {
|
||||
if (!user || !user.role) return false
|
||||
|
||||
// 超级管理员可以访问所有页面
|
||||
if (user.role === 'SUPER_ADMIN') return true
|
||||
|
||||
const roleConfig = ROLES[user.role]
|
||||
if (!roleConfig) return false
|
||||
|
||||
return roleConfig.pages.includes(page)
|
||||
}
|
||||
|
||||
// 获取用户可访问的页面列表
|
||||
function getUserPages(user) {
|
||||
if (!user || !user.role) return []
|
||||
|
||||
const roleConfig = ROLES[user.role]
|
||||
if (!roleConfig) return []
|
||||
|
||||
return roleConfig.pages
|
||||
}
|
||||
|
||||
// 获取角色信息
|
||||
function getRoleInfo(roleName) {
|
||||
return ROLES[roleName] || null
|
||||
}
|
||||
|
||||
// 检查用户是否可以管理其他用户角色
|
||||
function canManageUserRole(currentUser, targetRole) {
|
||||
if (!currentUser || !currentUser.role) return false
|
||||
|
||||
// 只有超级管理员可以分配角色
|
||||
if (currentUser.role === 'SUPER_ADMIN') {
|
||||
// 超级管理员可以分配除自己以外的所有角色
|
||||
return Object.keys(ROLES).includes(targetRole) && targetRole !== 'SUPER_ADMIN'
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// 导出所有函数和常量
|
||||
export { canAccessAdmin, canAccessPage, getUserPages, getRoleInfo, canManageUserRole }
|
||||
Reference in New Issue
Block a user