import { useEffect, useState } from 'react'; import { Alert, Button, Card, Col, Form, Input, InputNumber, Row, Select, Space, Spin, Switch, Tabs, Typography, message, theme } from 'antd'; import { CheckCircleOutlined, MailOutlined, ReloadOutlined, SaveOutlined, SendOutlined, SettingOutlined } from '@ant-design/icons'; import { authApi, settingsApi } from '../services/api'; import type { SystemSMTPSettings, SystemSMTPSettingsUpdate, User } from '../types'; const { Title, Text, Paragraph } = Typography; const { Option } = Select; const qqDefaults: Pick = { smtp_provider: 'qq', smtp_host: 'smtp.qq.com', smtp_port: 465, smtp_use_ssl: true, smtp_use_tls: false, }; export default function SystemSettingsPage() { const { token } = theme.useToken(); const [form] = Form.useForm(); const [currentUser, setCurrentUser] = useState(null); const [initialLoading, setInitialLoading] = useState(true); const [saving, setSaving] = useState(false); const [testing, setTesting] = useState(false); const [testTargetEmail, setTestTargetEmail] = useState(''); const pageBackground = `linear-gradient(180deg, ${token.colorBgLayout} 0%, ${token.colorFillSecondary} 100%)`; const headerBackground = `linear-gradient(135deg, ${token.colorPrimary} 0%, ${token.colorPrimaryHover} 100%)`; const footerSafeOffset = 88; const loadData = async () => { setInitialLoading(true); try { const [user, smtpSettings] = await Promise.all([ authApi.getCurrentUser(), settingsApi.getSystemSMTPSettings(), ]); setCurrentUser(user); form.setFieldsValue(smtpSettings); } catch (error) { console.error('加载系统设置失败:', error); message.error('加载系统设置失败'); } finally { setInitialLoading(false); } }; useEffect(() => { loadData(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleProviderChange = (value: string) => { if (value === 'qq') { form.setFieldsValue(qqDefaults); } }; const handleSave = async (values: SystemSMTPSettingsUpdate) => { setSaving(true); try { const payload = values.smtp_provider === 'qq' ? { ...values, ...qqDefaults, smtp_username: values.smtp_username, smtp_password: values.smtp_password, smtp_from_email: values.smtp_from_email, smtp_from_name: values.smtp_from_name, email_auth_enabled: values.email_auth_enabled, email_register_enabled: values.email_register_enabled, verification_code_ttl_minutes: values.verification_code_ttl_minutes, verification_resend_interval_seconds: values.verification_resend_interval_seconds, } : values; const result = await settingsApi.updateSystemSMTPSettings(payload); form.setFieldsValue(result); message.success('系统 SMTP 设置已保存'); } catch (error) { console.error('保存系统设置失败:', error); message.error('保存系统设置失败'); } finally { setSaving(false); } }; const handleTest = async () => { const toEmail = testTargetEmail.trim(); if (!toEmail) { message.warning('请先填写测试目标邮箱'); return; } setTesting(true); try { const result = await settingsApi.testSystemSMTPSettings({ to_email: toEmail }); if (result.success) { message.success(result.message); } else { message.error(result.message || 'SMTP 测试失败'); } } catch (error) { console.error('测试 SMTP 配置失败:', error); message.error('测试 SMTP 配置失败'); } finally { setTesting(false); } }; if (initialLoading) { return (
); } if (!currentUser?.is_admin) { return (
); } return (
系统设置 仅管理员可见,用于维护 SMTP 发信能力与邮箱注册相关系统参数。
SMTP 配置 ), children: (
setTestTargetEmail(e.target.value)} placeholder="请输入测试目标邮箱,如 123456@qq.com" /> } message="建议使用 QQ 默认配置" description={先保存 SMTP 配置,再填写测试目标邮箱,点击“发送测试邮件”后由后端通过 SMTP 实际发信。} />
), }, ]} />
); }