import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Plus, Shield, Edit, Eye } from 'lucide-react'; import { userApi } from '@/services/api'; import type { Role } from '@/types'; interface SystemRolesTabProps { selectedRole: Role | null; setSelectedRole: (role: Role | null) => void; } // 将后端角色数据规范化为前端 Role 类型 // Logan.Li function normalizeRole(raw: any): Role { return { id: String(raw.id ?? ''), name: raw.name ?? '', code: raw.code ?? '', description: raw.description ?? '', // 后端可能不返回 permissions/createdAt,给予默认值以避免渲染崩溃 permissions: Array.isArray(raw.permissions) ? raw.permissions : [], createdAt: raw.createdAt ?? raw.created_at ?? '', }; } export function SystemRolesTab({ selectedRole, setSelectedRole }: SystemRolesTabProps) { const [roles, setRoles] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; (async () => { setLoading(true); try { const resp = await userApi.getRoles(); if (cancelled) return; const list = resp?.list ?? []; setRoles(list.map(normalizeRole)); } catch (err) { if (!cancelled) setRoles([]); } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, []); return ( <>
{loading ? (
) : roles.length === 0 ? (

暂无角色数据

) : (
{roles.map((role) => (
{role.name} {role.code}

{role.description}

{role.permissions.slice(0, 5).map((permission) => ( {permission} ))} {role.permissions.length > 5 && ( +{role.permissions.length - 5} )}
))}
)} ); }