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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user