import { useEffect, useMemo, useState } from 'react' import { Typography, Card, List, Button, Checkbox, Select, Space, message, Modal, Form, Input, Switch, Divider, Empty, Tag } from 'antd' import { PlusOutlined, SaveOutlined, CrownOutlined, ToolOutlined } from '@ant-design/icons' import { roleApi, RoleItem, PermissionItem } from '../../api/system' export default function RolesPage() { const [roles, setRoles] = useState([]) const [permissions, setPermissions] = useState([]) const [selected, setSelected] = useState(null) const [checked, setChecked] = useState([]) const [dataScope, setDataScope] = useState('all') const [agentAutoExecute, setAgentAutoExecute] = useState(false) const [saving, setSaving] = useState(false) const [createOpen, setCreateOpen] = useState(false) const [createForm] = Form.useForm() const menuPerms = useMemo(() => permissions.filter((p) => p.resource === 'menu'), [permissions]) const toolPerms = useMemo(() => permissions.filter((p) => p.resource === 'agent_tool'), [permissions]) const loadRoles = async (keepSelected = true) => { const res: any = await roleApi.list() const data: RoleItem[] = res.data || [] setRoles(data) if (!keepSelected) return if (selected) { const updated = data.find((r) => r.id === selected.id) if (updated) selectRole(updated) } } useEffect(() => { loadRoles(false) roleApi.permissions().then((res: any) => setPermissions(res.data || [])) }, []) const selectRole = (r: RoleItem) => { setSelected(r) setChecked(r.permissionIds || []) setDataScope(r.dataScope || 'all') setAgentAutoExecute(!!r.agentAutoExecute) } const save = async () => { if (!selected) return setSaving(true) try { await roleApi.update(selected.id, { name: selected.name, description: selected.description, dataScope, agentAutoExecute, permissionIds: checked, }) message.success('配置已保存') await loadRoles() } catch { /* ignore */ } setSaving(false) } const createRole = async () => { const values = await createForm.validateFields() const res: any = await roleApi.create({ ...values, dataScope: 'all', agentAutoExecute: false, permissionIds: [] }) message.success('角色已创建') setCreateOpen(false) createForm.resetFields() await loadRoles(false) selectRole(res.data) } const menuChecked = menuPerms.every((p) => checked.includes(p.id)) const toolChecked = toolPerms.every((p) => checked.includes(p.id)) const toggleAll = (list: PermissionItem[], allChecked: boolean) => { const ids = list.map((p) => p.id) setChecked((prev) => allChecked ? prev.filter((id) => !ids.includes(id)) : Array.from(new Set([...prev, ...ids]))) } return (
角色权限配置
( selectRole(r)} style={{ cursor: 'pointer', padding: '8px 12px', borderRadius: 6, background: selected?.id === r.id ? '#e6f4ff' : undefined, }} > } title={r.name} description={r.description} /> )} /> {!selected ? ( ) : (
数据权限范围
) }