+ {/* Header */}
+
+
+
+
+ 定期清理
+
+
自动清理 S2A 号池中的错误账号
+
+
+ }
+ >
+ 刷新
+
+ : }
+ >
+ {savingClean ? '保存中...' : '保存设置'}
+
+
+
+
+ {/* Message */}
+ {message && (
+
+ {message.type === 'success' ? (
+
+ ) : (
+
+ )}
+ {message.text}
+
+ )}
+
+ {/* Status Cards */}
+
+ {/* 清理状态 */}
+
+
+
+
+
清理服务
+
+ {cleanEnabled ? '已启用' : '已禁用'}
+
+
+
+ {cleanEnabled ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ {/* 清理间隔 */}
+
+
+
+
+
清理间隔
+
+ {formatInterval(cleanInterval)}
+
+
+
+
+
+
+
+
+
+ {/* 上次清理 */}
+
+
+
+
+
上次清理
+
+ {status ? formatLastCleanTime(status.last_clean_time) : '从未执行'}
+
+
+
+
+
+
+
+
+
+
+ {/* 清理设置 */}
+
+
+
+
+ 清理设置
+
+
+
+
+
+ {/* 清理间隔选择 */}
+
+
+
+
+ 每隔指定时间自动清理 S2A 中的错误账号
+
+
+
+ {/* 手动清理 */}
+
+
+
:
}
+ className="w-full h-12 text-red-500 hover:text-red-600 border-red-300 hover:border-red-400 dark:border-red-800 dark:hover:border-red-600"
+ >
+ {cleaning ? '清理中...' : '立即清理所有错误账号'}
+
+
+ 立即执行一次清理操作,删除所有错误账号
+
+
+
+
+
+
+ {/* 说明信息 */}
+
+
+
+
+
+
功能说明
+
+ - 定期清理功能会自动删除 S2A 号池中状态为"error"的账号
+ - 清理操作是不可逆的,删除的账号无法恢复
+ - 建议设置合理的清理间隔,避免过于频繁的清理操作
+ - 清理日志可在"号池监控"页面的实时日志中查看
+ - 启用后需要点击"保存设置"才会生效
+
+
+
+
+
+
+ )
+}
diff --git a/frontend/src/pages/Config.tsx b/frontend/src/pages/Config.tsx
index 0da38fc..6c63a32 100644
--- a/frontend/src/pages/Config.tsx
+++ b/frontend/src/pages/Config.tsx
@@ -1,3 +1,4 @@
+import { useState, useEffect } from 'react'
import { Link } from 'react-router-dom'
import {
Server,
@@ -6,13 +7,59 @@ import {
Settings,
RefreshCw,
CheckCircle,
- XCircle
+ XCircle,
+ Save,
+ Loader2,
+ Globe
} from 'lucide-react'
-import { Card, CardContent, Button } from '../components/common'
+import { Card, CardHeader, CardTitle, CardContent, Button, Input } from '../components/common'
import { useConfig } from '../hooks/useConfig'
export default function Config() {
const { config, isConnected, refreshConfig } = useConfig()
+ const [siteName, setSiteName] = useState('')
+ const [saving, setSaving] = useState(false)
+ const [message, setMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null)
+
+ // 加载站点名称配置
+ useEffect(() => {
+ const fetchSiteName = async () => {
+ try {
+ const res = await fetch('/api/config')
+ const data = await res.json()
+ if (data.code === 0 && data.data) {
+ setSiteName(data.data.site_name || 'Codex Pool')
+ }
+ } catch (error) {
+ console.error('Failed to fetch site name:', error)
+ }
+ }
+ fetchSiteName()
+ }, [])
+
+ // 保存站点名称
+ const handleSaveSiteName = async () => {
+ setSaving(true)
+ setMessage(null)
+ try {
+ const res = await fetch('/api/config', {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ site_name: siteName }),
+ })
+ const data = await res.json()
+ if (data.code === 0) {
+ setMessage({ type: 'success', text: '站点名称已保存' })
+ refreshConfig()
+ } else {
+ setMessage({ type: 'error', text: data.message || '保存失败' })
+ }
+ } catch {
+ setMessage({ type: 'error', text: '网络错误' })
+ } finally {
+ setSaving(false)
+ }
+ }
const configItems = [
{
@@ -82,6 +129,58 @@ export default function Config() {
))}
+ {/* Site Settings */}
+