import React, { useState, useEffect, useCallback } from 'react'; import { Input, Button, Table, message, Modal, Popconfirm } from 'antd'; import { ExclamationCircleOutlined, SettingOutlined, PlusOutlined } from '@ant-design/icons'; import { request } from '@umijs/max'; import type { ColumnsType } from 'antd/es/table'; import styles from '../index.less'; interface GradeRecord { id: string; name: string; createTime: string; graduated?: boolean; } interface GradeManageProps { onBack: () => void; } const GradeManage: React.FC = ({ onBack }) => { const [filterName, setFilterName] = useState(''); const [list, setList] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [loading, setLoading] = useState(false); // 新增/编辑弹窗 const [modalVisible, setModalVisible] = useState(false); const [modalLoading, setModalLoading] = useState(false); const [editingRecord, setEditingRecord] = useState(null); const [gradeName, setGradeName] = useState(''); const fetchList = useCallback(async () => { setLoading(true); try { const params: Record = { page, pageSize }; if (filterName) params.name = filterName; const res = await request('/api/admin/grade', { params }); if (res.code === 0) { setList(res.data.list); setTotal(res.data.total); } } catch { message.error('获取数据失败'); } finally { setLoading(false); } }, [page, pageSize, filterName]); useEffect(() => { fetchList(); }, [fetchList]); const handleSearch = () => { setPage(1); fetchList(); }; const handleReset = () => { setFilterName(''); setPage(1); }; const handleOpenAdd = () => { setEditingRecord(null); setGradeName(''); setModalVisible(true); }; const handleOpenEdit = (record: GradeRecord) => { setEditingRecord(record); setGradeName(record.name); setModalVisible(true); }; const handleModalSubmit = async () => { if (!gradeName.trim()) { message.warning('请输入年级名称'); return; } setModalLoading(true); try { const url = editingRecord ? '/api/admin/grade/edit' : '/api/admin/grade/add'; const data = editingRecord ? { id: editingRecord.id, name: gradeName } : { name: gradeName }; const res = await request(url, { method: 'POST', data }); if (res.code === 0) { message.success(editingRecord ? '编辑成功' : '新增成功'); setModalVisible(false); fetchList(); } else { message.error(res.message); } } catch { message.error('操作失败'); } finally { setModalLoading(false); } }; const handleGraduateConfirm = async (record: GradeRecord) => { const res = await request('/api/admin/grade/graduate', { method: 'POST', data: { id: record.id }, }); if (res.code === 0) { message.success('转毕业成功'); fetchList(); } else { message.error(res.message); } }; const handleRestoreConfirm = async (record: GradeRecord) => { const res = await request('/api/admin/grade/restore', { method: 'POST', data: { id: record.id }, }); if (res.code === 0) { message.success('还原成功'); fetchList(); } else { message.error(res.message); } }; const columns: ColumnsType = [ { title: '年级名称', dataIndex: 'name', key: 'name' }, { title: '创建时间', dataIndex: 'createTime', key: 'createTime' }, { title: '操作', key: 'action', width: 160, render: (_, record) => ( handleOpenEdit(record)}>编辑 | {record.graduated ? ( handleRestoreConfirm(record)} okText="确定" cancelText="取消" overlayStyle={{ maxWidth: 200 }} > 还原 ) : ( handleGraduateConfirm(record)} okText="确定" cancelText="取消" icon={} overlayStyle={{ maxWidth: 200 }} > 转毕业 )} ), }, ]; return (

年级管理

{/* 筛选区域 */}
年级 setFilterName(e.target.value)} allowClear />
{/* 分割线 */}
{/* 操作按钮栏 */}
列表设置
{/* 数据表格 */}
columns={columns} dataSource={list} rowKey="id" loading={loading} pagination={{ current: page, pageSize, total, showTotal: (t) => `共${t}条`, showSizeChanger: true, showQuickJumper: true, pageSizeOptions: ['10', '20', '50', '100'], onChange: (p, ps) => { setPage(p); setPageSize(ps); }, }} size="middle" />
{/* 新增/编辑年级弹窗 */} setModalVisible(false)} footer={null} width={400} centered className={styles.addModal} destroyOnClose >
setGradeName(e.target.value)} />
); }; export default GradeManage;