| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import React, { useEffect, useState, useMemo } from 'react'; |
| import { Card, Spin, Button, Modal } from '@douyinfe/semi-ui'; |
| import { API, showError, showSuccess, toBoolean } from '../../helpers'; |
| import SettingsAPIInfo from '../../pages/Setting/Dashboard/SettingsAPIInfo'; |
| import SettingsAnnouncements from '../../pages/Setting/Dashboard/SettingsAnnouncements'; |
| import SettingsFAQ from '../../pages/Setting/Dashboard/SettingsFAQ'; |
| import SettingsUptimeKuma from '../../pages/Setting/Dashboard/SettingsUptimeKuma'; |
| import SettingsDataDashboard from '../../pages/Setting/Dashboard/SettingsDataDashboard'; |
|
|
| const DashboardSetting = () => { |
| let [inputs, setInputs] = useState({ |
| 'console_setting.api_info': '', |
| 'console_setting.announcements': '', |
| 'console_setting.faq': '', |
| 'console_setting.uptime_kuma_groups': '', |
| 'console_setting.api_info_enabled': '', |
| 'console_setting.announcements_enabled': '', |
| 'console_setting.faq_enabled': '', |
| 'console_setting.uptime_kuma_enabled': '', |
|
|
| |
| ApiInfo: '', |
| Announcements: '', |
| FAQ: '', |
| UptimeKumaUrl: '', |
| UptimeKumaSlug: '', |
|
|
| |
| DataExportEnabled: false, |
| DataExportDefaultTime: 'hour', |
| DataExportInterval: 5, |
| }); |
|
|
| let [loading, setLoading] = useState(false); |
| const [showMigrateModal, setShowMigrateModal] = useState(false); |
|
|
| const getOptions = async () => { |
| const res = await API.get('/api/option/'); |
| const { success, message, data } = res.data; |
| if (success) { |
| let newInputs = {}; |
| data.forEach((item) => { |
| if (item.key in inputs) { |
| newInputs[item.key] = item.value; |
| } |
| if (item.key.endsWith('Enabled') && item.key === 'DataExportEnabled') { |
| newInputs[item.key] = toBoolean(item.value); |
| } |
| }); |
| setInputs(newInputs); |
| } else { |
| showError(message); |
| } |
| }; |
|
|
| async function onRefresh() { |
| try { |
| setLoading(true); |
| await getOptions(); |
| } catch (error) { |
| showError('刷新失败'); |
| console.error(error); |
| } finally { |
| setLoading(false); |
| } |
| } |
|
|
| useEffect(() => { |
| onRefresh(); |
| }, []); |
|
|
| |
| const hasLegacyData = useMemo(() => { |
| const legacyKeys = [ |
| 'ApiInfo', |
| 'Announcements', |
| 'FAQ', |
| 'UptimeKumaUrl', |
| 'UptimeKumaSlug', |
| ]; |
| return legacyKeys.some((k) => inputs[k]); |
| }, [inputs]); |
|
|
| useEffect(() => { |
| if (hasLegacyData) { |
| setShowMigrateModal(true); |
| } |
| }, [hasLegacyData]); |
|
|
| const handleMigrate = async () => { |
| try { |
| setLoading(true); |
| await API.post('/api/option/migrate_console_setting'); |
| showSuccess('旧配置迁移完成'); |
| await onRefresh(); |
| setShowMigrateModal(false); |
| } catch (err) { |
| console.error(err); |
| showError('迁移失败: ' + (err.message || '未知错误')); |
| } finally { |
| setLoading(false); |
| } |
| }; |
|
|
| return ( |
| <> |
| <Spin spinning={loading} size='large'> |
| {/* 用于迁移检测的旧键模态框,下个版本会删除 */} |
| <Modal |
| title='配置迁移确认' |
| visible={showMigrateModal} |
| onOk={handleMigrate} |
| onCancel={() => setShowMigrateModal(false)} |
| confirmLoading={loading} |
| okText='确认迁移' |
| cancelText='取消' |
| > |
| <p>检测到旧版本的配置数据,是否要迁移到新的配置格式?</p> |
| <p style={{ color: '#f57c00', marginTop: '10px' }}> |
| <strong>注意:</strong> |
| 迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。 |
| </p> |
| </Modal> |
| |
| {/* 数据看板设置 */} |
| <Card style={{ marginTop: '10px' }}> |
| <SettingsDataDashboard options={inputs} refresh={onRefresh} /> |
| </Card> |
| |
| {/* 系统公告管理 */} |
| <Card style={{ marginTop: '10px' }}> |
| <SettingsAnnouncements options={inputs} refresh={onRefresh} /> |
| </Card> |
| |
| {/* API信息管理 */} |
| <Card style={{ marginTop: '10px' }}> |
| <SettingsAPIInfo options={inputs} refresh={onRefresh} /> |
| </Card> |
| |
| {/* 常见问答管理 */} |
| <Card style={{ marginTop: '10px' }}> |
| <SettingsFAQ options={inputs} refresh={onRefresh} /> |
| </Card> |
| |
| {/* Uptime Kuma 监控设置 */} |
| <Card style={{ marginTop: '10px' }}> |
| <SettingsUptimeKuma options={inputs} refresh={onRefresh} /> |
| </Card> |
| </Spin> |
| </> |
| ); |
| }; |
|
|
| export default DashboardSetting; |
|
|