import { useEffect, useState } from 'react' import toast from 'react-hot-toast' import { Clock, Play } from 'lucide-react' import { schedulerAPI, type JobStatus } from '../api/scheduler' export function SchedulerPage() { const [jobs, setJobs] = useState([]) const [running, setRunning] = useState('') const refresh = () => schedulerAPI.status().then(setJobs) useEffect(() => { refresh().catch(() => undefined) const id = window.setInterval(refresh, 5_000) return () => window.clearInterval(id) }, []) const runNow = async (name: string) => { setRunning(name) try { await schedulerAPI.run(name) toast.success(`${name} 已运行`) await refresh() } catch (err: unknown) { const msg = (err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? '运行失败' toast.error(msg) } finally { setRunning('') } } return (

定时任务

后端周期性任务(媒体库扫描、转码缓存清理、回收站自动清理),每 5 秒刷新状态。

{jobs.map((j) => ( ))}
任务 间隔 上次运行 错误 操作
{j.name} {j.interval} {j.last_run && new Date(j.last_run).getFullYear() > 2000 ? new Date(j.last_run).toLocaleString() : '尚未运行'} {j.last_err || '—'}
) }