import React, { useEffect } from 'react'; import { Button,Space, Form, Input, Select, message, Modal, Card, Spin, Typography, Switch, Tabs, Alert, InputNumber } from 'antd'; import { ReloadOutlined, SaveOutlined, } from '@ant-design/icons'; import { useQuery, useMutation, useQueryClient, } from '@tanstack/react-query'; import dayjs from 'dayjs'; import weekday from 'dayjs/plugin/weekday'; import localeData from 'dayjs/plugin/localeData'; import 'dayjs/locale/zh-cn'; import type { SystemSetting, SystemSettingValue } from '../share/types.ts'; import { SystemSettingGroup, SystemSettingKey, AllowedFileType } from '../share/types.ts'; import { SystemAPI } from './api/index.ts'; import { useTheme } from './hooks_sys.tsx'; import { Uploader } from './components_uploader.tsx'; // 配置 dayjs 插件 dayjs.extend(weekday); dayjs.extend(localeData); // 设置 dayjs 语言 dayjs.locale('zh-cn'); const { Title } = Typography; // 分组标题映射 const GROUP_TITLES: Record = { [SystemSettingGroup.BASIC]: '基础设置', [SystemSettingGroup.FEATURE]: '功能设置', [SystemSettingGroup.UPLOAD]: '上传设置', [SystemSettingGroup.NOTIFICATION]: '通知设置' }; // 分组描述映射 const GROUP_DESCRIPTIONS: Record = { [SystemSettingGroup.BASIC]: '配置站点的基本信息', [SystemSettingGroup.FEATURE]: '配置系统功能的开启状态', [SystemSettingGroup.UPLOAD]: '配置文件上传相关的参数', [SystemSettingGroup.NOTIFICATION]: '配置系统通知的触发条件' }; export const SettingsPage = () => { const [form] = Form.useForm(); const queryClient = useQueryClient(); const { isDark } = useTheme(); // 获取系统设置 const { data: settingsData, isLoading: isLoadingSettings } = useQuery({ queryKey: ['systemSettings'], queryFn: SystemAPI.getSettings, }); // 更新系统设置 const updateSettingsMutation = useMutation({ mutationFn: (values: Partial[]) => SystemAPI.updateSettings(values), onSuccess: () => { message.success('基础设置已更新'); queryClient.invalidateQueries({ queryKey: ['systemSettings'] }); }, onError: (error) => { message.error('更新基础设置失败'); console.error('更新基础设置失败:', error); }, }); // 重置系统设置 const resetSettingsMutation = useMutation({ mutationFn: SystemAPI.resetSettings, onSuccess: () => { message.success('基础设置已重置'); queryClient.invalidateQueries({ queryKey: ['systemSettings'] }); }, onError: (error) => { message.error('重置基础设置失败'); console.error('重置基础设置失败:', error); }, }); // 初始化表单数据 useEffect(() => { if (settingsData) { const formValues = settingsData.reduce((acc: Record, group) => { group.settings.forEach(setting => { // 根据值的类型进行转换 let value = setting.value; if (typeof value === 'string') { if (value === 'true' || value === 'false') { value = value === 'true'; } else if (!isNaN(Number(value)) && !value.includes('.')) { value = parseInt(value, 10); } else if (setting.key === SystemSettingKey.ALLOWED_FILE_TYPES) { value = (value ? (value as string).split(',') : []) as unknown as string; } } acc[setting.key] = value; }); return acc; }, {}); form.setFieldsValue(formValues); } }, [settingsData, form]); // 处理表单提交 const handleSubmit = async (values: Record) => { const settings = Object.entries(values).map(([key, value]) => ({ key: key as typeof SystemSettingKey[keyof typeof SystemSettingKey], value: String(value), group: key.startsWith('SITE_') ? SystemSettingGroup.BASIC : key.startsWith('ENABLE_') || key.includes('LOGIN_') || key.includes('SESSION_') ? SystemSettingGroup.FEATURE : key.includes('UPLOAD_') || key.includes('FILE_') || key.includes('IMAGE_') ? SystemSettingGroup.UPLOAD : SystemSettingGroup.NOTIFICATION })); updateSettingsMutation.mutate(settings); }; // 处理重置 const handleReset = () => { Modal.confirm({ title: '确认重置', content: '确定要将所有设置重置为默认值吗?此操作不可恢复。', okText: '确认', cancelText: '取消', onOk: () => { resetSettingsMutation.mutate(); }, }); }; // 根据设置类型渲染不同的输入控件 const renderSettingInput = (setting: SystemSetting) => { const value = setting.value; if (typeof value === 'boolean' || value === 'true' || value === 'false') { return ; } if (setting.key === SystemSettingKey.ALLOWED_FILE_TYPES) { return ; }; return (
系统设置 } extra={ } > ({ key: group, label: String(GROUP_TITLES[group]), children: (
{settingsData ?.find(g => g.name === group) ?.settings.map(setting => ( {renderSettingInput(setting)} ))}
) }))} />
); };