import intl from 'react-intl-universal'; import React, { useState, useEffect, useRef } from 'react'; import { Button, InputNumber, Form, Radio, message, Input, Upload, Modal, Select, Checkbox, } from 'antd'; import * as DarkReader from '@umijs/ssr-darkreader'; import config from '@/utils/config'; import { request } from '@/utils/http'; import CheckUpdate from './checkUpdate'; import { SharedContext } from '@/layouts'; import { saveAs } from 'file-saver'; import './index.less'; import { UploadOutlined } from '@ant-design/icons'; import Countdown from 'antd/lib/statistic/Countdown'; import useProgress from './progress'; import pick from 'lodash/pick'; import { disableBody } from '@/utils'; import { TIMEZONES } from '@/utils/const'; const dataMap = { 'log-remove-frequency': 'logRemoveFrequency', 'cron-concurrency': 'cronConcurrency', timezone: 'timezone', }; const exportModules = [ { value: 'base', label: intl.get('基础数据'), disabled: true }, { value: 'config', label: intl.get('配置文件') }, { value: 'scripts', label: intl.get('脚本文件') }, { value: 'log', label: intl.get('日志文件') }, { value: 'deps', label: intl.get('依赖文件') }, { value: 'syslog', label: intl.get('系统日志') }, { value: 'dep_cache', label: intl.get('依赖缓存') }, { value: 'raw', label: intl.get('远程脚本缓存') }, { value: 'repo', label: intl.get('远程仓库缓存') }, { value: 'ssh.d', label: intl.get('SSH 文件缓存') }, ]; const Other = ({ systemInfo, reloadTheme, }: Pick) => { const defaultTheme = localStorage.getItem('qinglong_dark_theme') || 'auto'; const [systemConfig, setSystemConfig] = useState<{ logRemoveFrequency?: number | null; cronConcurrency?: number | null; timezone?: string | null; }>(); const [form] = Form.useForm(); const [exportLoading, setExportLoading] = useState(false); const showUploadProgress = useProgress(intl.get('上传')); const showDownloadProgress = useProgress(intl.get('下载')); const [visible, setVisible] = useState(false); const [selectedModules, setSelectedModules] = useState(['base']); const { enable: enableDarkMode, disable: disableDarkMode, exportGeneratedCSS: collectCSS, setFetchMethod, auto: followSystemColorScheme, } = DarkReader || {}; const themeChange = (e: any) => { const _theme = e.target.value; localStorage.setItem('qinglong_dark_theme', e.target.value); setFetchMethod(fetch); if (_theme === 'dark') { enableDarkMode({}); } else if (_theme === 'light') { disableDarkMode(); } else { followSystemColorScheme({}); } reloadTheme(); }; const handleLangChange = (v: string) => { localStorage.setItem('lang', v); setTimeout(() => { window.location.reload(); }, 500); }; const getSystemConfig = () => { request .get(`${config.apiPrefix}system/config`) .then(({ code, data }) => { if (code === 200 && data.info) { setSystemConfig(data.info); } }) .catch((error: any) => { console.log(error); }); }; const updateSystemConfig = (path: keyof typeof dataMap) => { request .put( `${config.apiPrefix}system/config/${path}`, pick(systemConfig, dataMap[path]), ) .then(({ code, data }) => { if (code === 200) { message.success(intl.get('更新成功')); } }) .catch((error: any) => { console.log(error); }); }; const exportData = () => { setExportLoading(true); request .put( `${config.apiPrefix}system/data/export`, { type: selectedModules }, { responseType: 'blob', timeout: 86400000, onDownloadProgress: (e) => { if (e.progress) { showDownloadProgress(parseFloat((e.progress * 100).toFixed(1))); } }, }, ) .then((res) => { saveAs(res, 'data.tgz'); }) .catch((error: any) => { console.log(error); }) .finally(() => { setExportLoading(false); setVisible(false); }); }; const showReloadModal = () => { Modal.confirm({ width: 600, maskClosable: false, title: intl.get('确认重启'), centered: true, content: ( <>
{intl.get('备份数据上传成功,确认覆盖数据')}
{intl.get('如果恢复失败,可进入容器执行')} ql reload data
), okText: intl.get('重启'), onOk() { request .put(`${config.apiPrefix}update/data`) .then(() => { message.success({ content: ( {intl.get('系统将在')} {intl.get('秒后自动刷新')} ), duration: 30, }); disableBody(); setTimeout(() => { window.location.reload(); }, 30000); }) .catch((error: any) => { console.log(error); }); }, }); }; useEffect(() => { getSystemConfig(); }, []); return ( <>
{intl.get('亮色')} {intl.get('暗色')} {intl.get('跟随系统')} { setSystemConfig({ ...systemConfig, logRemoveFrequency: value }); }} /> { setSystemConfig({ ...systemConfig, cronConcurrency: value }); }} /> { if (event?.percent) { showUploadProgress( Math.min(parseFloat(event?.percent.toFixed(1)), 99), ); } if (file.status === 'done') { showUploadProgress(100); showReloadModal(); } if (file.status === 'error') { message.error('上传失败'); } }} name="data" headers={{ Authorization: `Bearer ${localStorage.getItem(config.authKey)}`, }} >
setVisible(false)} okText={intl.get('开始备份')} cancelText={intl.get('取消')} okButtonProps={{ loading: exportLoading }} // 绑定加载状态到按钮 > { setSelectedModules(v as string[]); }} style={{ width: '100%', display: 'flex', flexWrap: 'wrap', gap: '8px 16px', }} > {exportModules.map((module) => ( {module.label} ))} ); }; export default Other;