Administrator 8117958bd6 feat: add user center with RBAC, OAuth2 multi-mode and collapsible sidebar
- Add user management with roles and permissions (RBAC)
- Implement OAuth2 service provider supporting 4 grant types:
  authorization_code, password, client_credentials, refresh_token
- Add JWT authentication with 7-day expiry
- Add admin API for users, roles and OAuth clients management
- Add CLI tool for user management (scripts/user-cli.js)
- Add collapsible sidebar layout with login dialog
- Add user management page and OAuth client management page
- Add server middleware for auth token verification
- Add seed script for initial data (admin/admin123)
2026-03-19 17:19:57 +08:00

129 lines
3.2 KiB
TypeScript

export const PERMISSIONS = {
USER_CREATE: 'user:create',
USER_READ: 'user:read',
USER_UPDATE: 'user:update',
USER_DELETE: 'user:delete',
EVENT_CREATE: 'event:create',
EVENT_READ: 'event:read',
EVENT_UPDATE: 'event:update',
EVENT_DELETE: 'event:delete',
RESULT_CREATE: 'result:create',
RESULT_READ: 'result:read',
RESULT_UPDATE: 'result:update',
RESULT_DELETE: 'result:delete',
TEAM_CREATE: 'team:create',
TEAM_READ: 'team:read',
TEAM_UPDATE: 'team:update',
TEAM_DELETE: 'team:delete',
ADMIN_ACCESS: 'admin:access',
ROLE_MANAGE: 'role:manage',
OAUTH_CLIENT_CREATE: 'oauth:client:create',
OAUTH_CLIENT_READ: 'oauth:client:read',
OAUTH_CLIENT_UPDATE: 'oauth:client:update',
OAUTH_CLIENT_DELETE: 'oauth:client:delete'
} as const
export const DEFAULT_ROLES = {
admin: {
name: 'admin',
description: '系统管理员',
permissions: Object.values(PERMISSIONS),
isSystem: true
},
user: {
name: 'user',
description: '普通用户',
permissions: [
PERMISSIONS.EVENT_READ,
PERMISSIONS.RESULT_READ,
PERMISSIONS.TEAM_READ
],
isSystem: true
},
guest: {
name: 'guest',
description: '访客',
permissions: [
PERMISSIONS.EVENT_READ
],
isSystem: true
}
}
export function hasPermission(userPermissions: string[], requiredPermission: string): boolean {
if (userPermissions.includes(PERMISSIONS.ADMIN_ACCESS)) {
return true
}
return userPermissions.includes(requiredPermission)
}
export function hasAnyPermission(userPermissions: string[], requiredPermissions: string[]): boolean {
if (userPermissions.includes(PERMISSIONS.ADMIN_ACCESS)) {
return true
}
return requiredPermissions.some(p => userPermissions.includes(p))
}
export function hasAllPermissions(userPermissions: string[], requiredPermissions: string[]): boolean {
if (userPermissions.includes(PERMISSIONS.ADMIN_ACCESS)) {
return true
}
return requiredPermissions.every(p => userPermissions.includes(p))
}
export function getPermissionGroups(): Record<string, { name: string; permissions: string[] }> {
return {
user: {
name: '用户管理',
permissions: [
PERMISSIONS.USER_CREATE,
PERMISSIONS.USER_READ,
PERMISSIONS.USER_UPDATE,
PERMISSIONS.USER_DELETE
]
},
event: {
name: '比赛管理',
permissions: [
PERMISSIONS.EVENT_CREATE,
PERMISSIONS.EVENT_READ,
PERMISSIONS.EVENT_UPDATE,
PERMISSIONS.EVENT_DELETE
]
},
result: {
name: '成绩管理',
permissions: [
PERMISSIONS.RESULT_CREATE,
PERMISSIONS.RESULT_READ,
PERMISSIONS.RESULT_UPDATE,
PERMISSIONS.RESULT_DELETE
]
},
team: {
name: '队伍管理',
permissions: [
PERMISSIONS.TEAM_CREATE,
PERMISSIONS.TEAM_READ,
PERMISSIONS.TEAM_UPDATE,
PERMISSIONS.TEAM_DELETE
]
},
system: {
name: '系统管理',
permissions: [
PERMISSIONS.ADMIN_ACCESS,
PERMISSIONS.ROLE_MANAGE,
PERMISSIONS.OAUTH_CLIENT_CREATE,
PERMISSIONS.OAUTH_CLIENT_READ,
PERMISSIONS.OAUTH_CLIENT_UPDATE,
PERMISSIONS.OAUTH_CLIENT_DELETE
]
}
}
}