| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| 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;
|
|
|