import { useState, useEffect } from 'react' import { Table, Button, Modal, Form, Input, InputNumber, Select, Tag, Space, message, Popconfirm, Card, Row, Col } from 'antd' import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons' import type { ColumnsType } from 'antd/es/table' import { dictApi } from '@/api/dict' import type { DictType, DictData, CreateDictTypeRequest, CreateDictDataRequest, UpdateDictTypeRequest, UpdateDictDataRequest } from '@/api/dict' export default function DictManagement() { const [dictTypes, setDictTypes] = useState([]) const [dictData, setDictData] = useState([]) const [selectedType, setSelectedType] = useState('') const [loading, setLoading] = useState(false) const [typeModalOpen, setTypeModalOpen] = useState(false) const [dataModalOpen, setDataModalOpen] = useState(false) const [editingType, setEditingType] = useState(null) const [editingData, setEditingData] = useState(null) const [typeForm] = Form.useForm() const [dataForm] = Form.useForm() useEffect(() => { loadDictTypes() }, []) async function loadDictTypes() { try { const res = await dictApi.getTypes(); setDictTypes(Array.isArray(res) ? res : []) } catch { /* ignored */ } } async function loadDictData(dictType: string) { setLoading(true) try { const res = await dictApi.getDataByType(dictType); setDictData(Array.isArray(res) ? res : []) } catch { /* ignored */ } finally { setLoading(false) } } function handleSelectType(type: string) { setSelectedType(type); loadDictData(type) } async function handleTypeSubmit() { try { const values = await typeForm.validateFields() if (editingType) { await dictApi.updateType(editingType.id, values as UpdateDictTypeRequest); message.success('更新成功') } else { await dictApi.createType(values as CreateDictTypeRequest); message.success('创建成功') } setTypeModalOpen(false); loadDictTypes() } catch { /* ignored */ } } async function handleDataSubmit() { try { const values = await dataForm.validateFields() if (editingData) { await dictApi.updateData(editingData.id, { ...values, dictType: selectedType } as UpdateDictDataRequest); message.success('更新成功') } else { await dictApi.createData({ ...values, dictType: selectedType } as CreateDictDataRequest); message.success('创建成功') } setDataModalOpen(false); loadDictData(selectedType) } catch { /* ignored */ } } const typeColumns: ColumnsType = [ { title: '字典名称', dataIndex: 'dictName', key: 'dictName' }, { title: '字典类型', dataIndex: 'dictType', key: 'dictType', render: (v: string) => handleSelectType(v)}>{v} }, { title: '状态', dataIndex: 'status', key: 'status', render: (v: number) => {v === 1 ? '正常' : '停用'} }, { title: '操作', key: 'action', render: (_, record) => ( }> rowKey="id" columns={typeColumns} dataSource={dictTypes} pagination={false} size="small" /> } onClick={() => { setEditingData(null); dataForm.resetFields(); setDataModalOpen(true) }}>新增 : null}> {selectedType ? rowKey="id" columns={dataColumns} dataSource={dictData} loading={loading} pagination={false} size="small" /> :

请选择左侧字典类型

}
setTypeModalOpen(false)} destroyOnHidden>