From 4b020126346ba24c3087806758c6e6863f101363 Mon Sep 17 00:00:00 2001 From: wangziqi Date: Mon, 6 Jul 2026 14:43:13 +0800 Subject: [PATCH] feat: classroom status filter + export button + menu (departments/notifications) --- apps/admin/src/layouts/MainLayout.tsx | 3 ++ apps/admin/src/pages/Classrooms/index.tsx | 14 +++++---- docker-compose.yml | 38 ++++++++++++++++++++++- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/apps/admin/src/layouts/MainLayout.tsx b/apps/admin/src/layouts/MainLayout.tsx index b944de11..cf8a8de1 100644 --- a/apps/admin/src/layouts/MainLayout.tsx +++ b/apps/admin/src/layouts/MainLayout.tsx @@ -24,6 +24,7 @@ import { KeyOutlined, CheckCircleOutlined, LaptopOutlined, + BellOutlined, } from '@ant-design/icons'; import { usePermission } from '../hooks/usePermission'; import NotificationBell from '../components/NotificationBell'; @@ -107,6 +108,8 @@ const allMenuItems: MenuItemType[] = [ label: '系统管理', permission: 'log:view', children: [ + { key: '/departments', icon: , label: '校区/部门', permission: 'department:view' }, + { key: '/notifications', icon: , label: '通知中心', permission: 'notification:view' }, { key: '/operation-logs', icon: , label: '操作日志', permission: 'log:view' }, { key: '/roles', icon: , label: '角色管理', permission: 'role:view' }, { key: '/permissions', icon: , label: '权限一览', permission: 'role:view' }, diff --git a/apps/admin/src/pages/Classrooms/index.tsx b/apps/admin/src/pages/Classrooms/index.tsx index 731a6b92..68ec10db 100644 --- a/apps/admin/src/pages/Classrooms/index.tsx +++ b/apps/admin/src/pages/Classrooms/index.tsx @@ -52,14 +52,14 @@ const ClassroomsPage: React.FC = () => { const [showArchived, setShowArchived] = useState(false); const [form] = Form.useForm(); const [searchText, setSearchText] = useState(''); + const [filterStatus, setFilterStatus] = useState(undefined); const filteredData = useMemo(() => { - if (!searchText) return data; - const s = searchText.toLowerCase(); - return data.filter( - (d: any) => d.name?.toLowerCase().includes(s) || d.building?.toLowerCase().includes(s), - ); - }, [data, searchText]); + let result = data; + if (searchText) { const s = searchText.toLowerCase(); result = result.filter((d: Record) => (typeof d.name === 'string' && d.name.toLowerCase().includes(s)) || (typeof d.building === 'string' && d.building.toLowerCase().includes(s))); } + if (filterStatus) result = result.filter((d: Record) => d.status === filterStatus); + return result; + }, [data, searchText, filterStatus]); const fetchData = async () => { setLoading(true); @@ -223,6 +223,7 @@ const ClassroomsPage: React.FC = () => { if (!e.target.value) setSearchText(''); }} /> +