feat: Add a new cleaner page for managing and automatically cleaning error S2A accounts, supported by new backend services for logging, authentication, and client operations.

This commit is contained in:
2026-02-02 03:27:33 +08:00
parent d05c19a8d5
commit daf4c68e4f
10 changed files with 704 additions and 506 deletions

View File

@@ -52,7 +52,7 @@ export default function Cleaner() {
}
}
// 加载清理日志
// 加载清理日志(仅显示 SUCCESS 级别)
const fetchCleanerLogs = useCallback(async (page = 1) => {
setLogLoading(true)
try {
@@ -60,6 +60,7 @@ export default function Cleaner() {
module: 'cleaner',
page: String(page),
page_size: String(logPageSize),
level: 'success', // 只显示 SUCCESS 日志
})
const res = await fetch(`/api/logs/query?${params}`)
const data = await res.json()
@@ -176,21 +177,6 @@ export default function Cleaner() {
}
}
// 日志级别样式
const levelColors: Record<string, string> = {
success: 'text-green-600 dark:text-green-400 bg-green-50 dark:bg-green-900/20',
error: 'text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20',
warning: 'text-yellow-600 dark:text-yellow-400 bg-yellow-50 dark:bg-yellow-900/20',
info: 'text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20',
}
const levelLabels: Record<string, string> = {
success: 'SUCCESS',
error: 'ERROR',
warning: 'WARN',
info: 'INFO',
}
if (loading) {
return (
<div className="flex items-center justify-center h-64">
@@ -389,8 +375,8 @@ export default function Cleaner() {
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2">
<ScrollText className="h-5 w-5 text-blue-500" />
<ScrollText className="h-5 w-5 text-green-500" />
</CardTitle>
<div className="flex items-center gap-2">
<span className="text-sm text-slate-500 dark:text-slate-400">
@@ -440,13 +426,14 @@ export default function Cleaner() {
) : logEntries.length === 0 ? (
<div className="text-center py-8 text-slate-400">
<ScrollText className="h-8 w-8 mx-auto mb-2 opacity-50" />
<p className="text-sm"></p>
<p className="text-sm"></p>
</div>
) : (
<div className="space-y-1">
{logEntries.map((log, i) => (
<div key={`${log.timestamp}-${i}`} className="flex items-start gap-3 text-sm py-2.5 border-b border-slate-100 dark:border-slate-800 last:border-0">
<span className="text-xs text-slate-400 flex-shrink-0 mt-0.5 font-mono whitespace-nowrap">
<div key={`${log.timestamp}-${i}`} className="flex items-center gap-3 text-sm py-2.5 border-b border-slate-100 dark:border-slate-800 last:border-0">
<CheckCircle className="h-4 w-4 text-green-500 flex-shrink-0" />
<span className="text-xs text-slate-400 flex-shrink-0 font-mono whitespace-nowrap">
{new Date(log.timestamp).toLocaleString('zh-CN', {
month: '2-digit',
day: '2-digit',
@@ -455,9 +442,6 @@ export default function Cleaner() {
second: '2-digit'
})}
</span>
<span className={`text-xs font-medium flex-shrink-0 mt-0.5 px-1.5 py-0.5 rounded ${levelColors[log.level] || 'text-slate-500 bg-slate-50 dark:bg-slate-800'}`}>
{levelLabels[log.level] || log.level?.toUpperCase()}
</span>
<span className="text-slate-700 dark:text-slate-300 break-all">
{log.message}
</span>