feat: Implement system configuration page for site settings and proxy management, and add team registration functionality.
This commit is contained in:
@@ -45,7 +45,7 @@ export default function Config() {
|
||||
setSiteName(data.data.site_name || 'Codex Pool')
|
||||
setDefaultProxy(data.data.default_proxy || '')
|
||||
setTeamRegProxy(data.data.team_reg_proxy || '')
|
||||
// 恢复代理测试状态
|
||||
// 恢复全局代理测试状态
|
||||
const testStatus = data.data.proxy_test_status
|
||||
if (testStatus === 'success' || testStatus === 'error') {
|
||||
setProxyStatus(testStatus)
|
||||
@@ -53,6 +53,14 @@ export default function Config() {
|
||||
if (data.data.proxy_test_ip) {
|
||||
setProxyOriginIP(data.data.proxy_test_ip)
|
||||
}
|
||||
// 恢复注册代理测试状态
|
||||
const teamRegTestStatus = data.data.team_reg_proxy_test_status
|
||||
if (teamRegTestStatus === 'success' || teamRegTestStatus === 'error') {
|
||||
setTeamRegProxyStatus(teamRegTestStatus)
|
||||
}
|
||||
if (data.data.team_reg_proxy_test_ip) {
|
||||
setTeamRegProxyIP(data.data.team_reg_proxy_test_ip)
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch config:', error)
|
||||
@@ -122,7 +130,7 @@ export default function Config() {
|
||||
const res = await fetch('/api/proxy/test', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ proxy_url: defaultProxy }),
|
||||
body: JSON.stringify({ proxy_url: defaultProxy, proxy_type: 'default' }),
|
||||
})
|
||||
const data = await res.json()
|
||||
if (data.code === 0 && data.data?.connected) {
|
||||
@@ -177,7 +185,7 @@ export default function Config() {
|
||||
const res = await fetch('/api/proxy/test', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ proxy_url: teamRegProxy }),
|
||||
body: JSON.stringify({ proxy_url: teamRegProxy, proxy_type: 'team_reg' }),
|
||||
})
|
||||
const data = await res.json()
|
||||
if (data.code === 0 && data.data?.connected) {
|
||||
|
||||
@@ -68,9 +68,9 @@ export default function TeamReg() {
|
||||
loadProxyConfig()
|
||||
}, [loadProxyConfig])
|
||||
|
||||
// 获取状态
|
||||
const fetchStatus = useCallback(async () => {
|
||||
setLoading(true)
|
||||
// 获取状态(silent=true 时不显示加载状态)
|
||||
const fetchStatus = useCallback(async (silent = false) => {
|
||||
if (!silent) setLoading(true)
|
||||
try {
|
||||
const res = await fetch('/api/team-reg/status')
|
||||
if (res.ok) {
|
||||
@@ -80,16 +80,16 @@ export default function TeamReg() {
|
||||
} catch (e) {
|
||||
console.error('获取状态失败:', e)
|
||||
}
|
||||
setLoading(false)
|
||||
if (!silent) setLoading(false)
|
||||
}, [])
|
||||
|
||||
// 初始化和轮询
|
||||
useEffect(() => {
|
||||
fetchStatus()
|
||||
|
||||
// 如果正在运行,每秒刷新状态
|
||||
// 如果正在运行,每秒刷新状态(静默模式)
|
||||
const interval = setInterval(() => {
|
||||
fetchStatus()
|
||||
fetchStatus(true)
|
||||
}, 1000)
|
||||
|
||||
return () => clearInterval(interval)
|
||||
@@ -202,7 +202,7 @@ export default function TeamReg() {
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={fetchStatus}
|
||||
onClick={() => fetchStatus()}
|
||||
disabled={loading}
|
||||
icon={<RefreshCw className={`h-4 w-4 ${loading ? 'animate-spin' : ''}`} />}
|
||||
>
|
||||
@@ -414,13 +414,13 @@ export default function TeamReg() {
|
||||
</Card>
|
||||
|
||||
{/* 实时日志 */}
|
||||
<Card className="glass-card lg:col-span-2">
|
||||
<Card className="glass-card lg:col-span-2 flex flex-col">
|
||||
<CardHeader>
|
||||
<CardTitle className="flex items-center gap-2">
|
||||
<Terminal className="h-5 w-5 text-green-500" />
|
||||
实时日志
|
||||
</CardTitle>
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="flex items-center gap-3">
|
||||
<label className="flex items-center gap-2 text-sm text-slate-500">
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -433,12 +433,25 @@ export default function TeamReg() {
|
||||
<span className="text-xs text-slate-400">
|
||||
{logs.length} 条日志
|
||||
</span>
|
||||
<button
|
||||
onClick={async () => {
|
||||
try {
|
||||
await fetch('/api/team-reg/clear-logs', { method: 'POST' })
|
||||
fetchStatus(true)
|
||||
} catch (e) {
|
||||
console.error('清除日志失败:', e)
|
||||
}
|
||||
}}
|
||||
className="text-xs px-2 py-1 rounded bg-slate-700 hover:bg-slate-600 text-slate-300 transition-colors"
|
||||
>
|
||||
🗑️ 清除
|
||||
</button>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardContent className="flex-1 flex flex-col">
|
||||
<div
|
||||
ref={logsContainerRef}
|
||||
className="h-[500px] overflow-y-auto bg-slate-900 rounded-lg p-4 font-mono text-sm"
|
||||
className="min-h-[400px] flex-1 overflow-y-auto bg-slate-900 rounded-lg p-4 font-mono text-sm"
|
||||
>
|
||||
{logs.length === 0 ? (
|
||||
<div className="flex items-center justify-center h-full text-slate-500">
|
||||
|
||||
Reference in New Issue
Block a user