diff --git a/frontend/src/admin/pages/Settings.tsx b/frontend/src/admin/pages/Settings.tsx index e22ff62..6800bb5 100644 --- a/frontend/src/admin/pages/Settings.tsx +++ b/frontend/src/admin/pages/Settings.tsx @@ -54,6 +54,8 @@ export default function SettingsPage() { // 定时任务 const [schedules, setSchedules] = useState([]) const [schedulesLoading, setSchedulesLoading] = useState(true) + const [scheduleNotice, setScheduleNotice] = useState<{ ok: boolean; text: string } | null>(null) + const [scheduleBusyId, setScheduleBusyId] = useState(null) // ── 数据加载 ── const loadSettings = useCallback(async () => { @@ -132,6 +134,48 @@ export default function SettingsPage() { } } + // ── 定时任务操作 ── + const handleToggleSchedule = async (s: ScheduleItem) => { + setScheduleBusyId(s.id) + setScheduleNotice(null) + try { + await updateSchedule(s.id, { enabled: !s.enabled }) + setScheduleNotice({ ok: true, text: `已${!s.enabled ? '启用' : '禁用'}任务「${s.id}」` }) + setSchedules(prev => prev.map(x => x.id === s.id ? { ...x, enabled: !x.enabled } : x)) + } catch { + setScheduleNotice({ ok: false, text: '操作失败' }) + } finally { + setScheduleBusyId(null) + } + } + + const handleRunSchedule = async (s: ScheduleItem) => { + setScheduleBusyId(s.id) + setScheduleNotice(null) + try { + await runScheduleNow(s.id) + setScheduleNotice({ ok: true, text: `任务「${s.id}」已启动,请在日志页查看进度` }) + } catch { + setScheduleNotice({ ok: false, text: '启动失败' }) + } finally { + setScheduleBusyId(null) + } + } + + const handleDeleteSchedule = async (s: ScheduleItem) => { + setScheduleBusyId(s.id) + setScheduleNotice(null) + try { + await deleteSchedule(s.id) + setScheduleNotice({ ok: true, text: `已删除任务「${s.id}」` }) + setSchedules(prev => prev.filter(x => x.id !== s.id)) + } catch { + setScheduleNotice({ ok: false, text: '删除失败' }) + } finally { + setScheduleBusyId(null) + } + } + const detectLLMModels = useCallback(async (): Promise => { const r = await fetchLLMModels() if (!r.ok) throw new Error(r.detail) @@ -390,6 +434,11 @@ export default function SettingsPage() { } /> + {scheduleNotice && ( +
+ setScheduleNotice(null)} /> +
+ )} {schedulesLoading ? ( ) : schedules.length === 0 ? ( @@ -414,22 +463,25 @@ export default function SettingsPage() {