import { useState } from 'react'; import { Button, Form, Input, Space, Popconfirm, message, Table, Modal, Tag, theme, } from 'antd'; import { PlusOutlined, SearchOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons'; import { getSetting, updateSetting, deleteSetting, } from '../../api/settings'; interface SettingEntry { key: string; value: string; } export default function SystemSettings() { const [entries, setEntries] = useState([]); const [searchKey, setSearchKey] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [editEntry, setEditEntry] = useState(null); const [form] = Form.useForm(); const { token } = theme.useToken(); const isDark = token.colorBgContainer === '#111827' || token.colorBgContainer === 'rgb(17, 24, 39)'; const handleSearch = async () => { if (!searchKey.trim()) { message.warning('请输入设置键名'); return; } try { const result = await getSetting(searchKey.trim()); const value = String(result.setting_value ?? ''); setEntries((prev) => { const exists = prev.findIndex((e) => e.key === searchKey.trim()); if (exists >= 0) { const updated = [...prev]; updated[exists] = { ...updated[exists], value }; return updated; } return [...prev, { key: searchKey.trim(), value }]; }); message.success('查询成功'); } catch (err: unknown) { const status = (err as { response?: { status?: number } })?.response?.status; if (status === 404) { message.info('该设置键不存在,可点击"添加设置"创建'); } else { message.error('查询失败'); } } }; const handleSave = async (values: { setting_key: string; setting_value: string }) => { const key = values.setting_key.trim(); const value = values.setting_value; try { try { JSON.parse(value); } catch { message.error('设置值必须是有效的 JSON 格式'); return; } await updateSetting(key, value); setEntries((prev) => { const exists = prev.findIndex((e) => e.key === key); if (exists >= 0) { const updated = [...prev]; updated[exists] = { key, value }; return updated; } return [...prev, { key, value }]; }); message.success('设置已保存'); closeModal(); } catch (err: unknown) { const errorMsg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message || '保存失败'; message.error(errorMsg); } }; const handleDelete = async (key: string) => { try { await deleteSetting(key); setEntries((prev) => prev.filter((e) => e.key !== key)); message.success('设置已删除'); } catch { message.error('删除失败'); } }; const openCreate = () => { setEditEntry(null); form.resetFields(); setModalOpen(true); }; const openEdit = (entry: SettingEntry) => { setEditEntry(entry); form.setFieldsValue({ setting_key: entry.key, setting_value: entry.value, }); setModalOpen(true); }; const closeModal = () => { setModalOpen(false); setEditEntry(null); form.resetFields(); }; const columns = [ { title: '键', dataIndex: 'key', key: 'key', width: 250, render: (v: string) => ( {v} ), }, { title: '值 (JSON)', dataIndex: 'value', key: 'value', ellipsis: true, render: (v: string) => ( {v} ), }, { title: '操作', key: 'actions', width: 120, render: (_: unknown, record: SettingEntry) => (
form.submit()} width={560} >
); }