/** * 定时任务管理组件 */ app.component('scheduler-page', { props: ['jobs'], emits: ['refresh'], setup(props, { emit }) { const { ref, reactive } = Vue; // 对话框状态 const dialogVisible = ref(false); const dialogTitle = ref('新建定时任务'); const editingId = ref(null); // 表单数据 const form = reactive({ name: '', agent_id: 'main', schedule: '', task: '', enabled: true }); // 预定义的调度表达式 const presets = [ { value: '@hourly', label: '每小时' }, { value: '@daily', label: '每天(0点)' }, { value: '@weekly', label: '每周一(0点)' }, { value: '@monthly', label: '每月1日(0点)' }, { value: '0 9 * * *', label: '每天上午9点' }, { value: '0 18 * * *', label: '每天下午6点' }, { value: '0 9 * * 1-5', label: '工作日上午9点' }, { value: '*/30 * * * *', label: '每30分钟' }, { value: '0 */2 * * *', label: '每2小时' } ]; // 打开新建对话框 function handleAdd() { editingId.value = null; dialogTitle.value = '新建定时任务'; Object.assign(form, { name: '', agent_id: 'main', schedule: '@daily', task: '', enabled: true }); dialogVisible.value = true; } // 打开编辑对话框 function handleEdit(job) { editingId.value = job.id; dialogTitle.value = '编辑定时任务'; Object.assign(form, { name: job.name, agent_id: job.agent_id || 'main', schedule: job.schedule, task: job.task, enabled: job.enabled !== false }); dialogVisible.value = true; } // 删除任务 async function handleDelete(job) { try { await ElementPlus.ElMessageBox.confirm( `确定要删除任务 "${job.name}" 吗?`, '删除确认', { type: 'warning' } ); await fetch(`/api/cron-jobs/${job.id}`, { method: 'DELETE' }); ElementPlus.ElMessage.success('删除成功'); emit('refresh'); } catch (e) { if (e !== 'cancel') { ElementPlus.ElMessage.error('删除失败: ' + e.message); } } } // 切换启用状态 async function handleToggle(job) { try { await fetch(`/api/cron-jobs/${job.id}/toggle`, { method: 'POST' }); emit('refresh'); } catch (e) { ElementPlus.ElMessage.error('操作失败: ' + e.message); } } // 立即执行 async function handleRun(job) { try { await fetch(`/api/cron-jobs/${job.id}/run`, { method: 'POST' }); ElementPlus.ElMessage.success('任务已触发执行'); } catch (e) { ElementPlus.ElMessage.error('执行失败: ' + e.message); } } // 保存任务 async function handleSave() { try { const data = { ...form }; if (editingId.value) { await fetch(`/api/cron-jobs/${editingId.value}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); } else { await fetch('/api/cron-jobs', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); } dialogVisible.value = false; ElementPlus.ElMessage.success('保存成功'); emit('refresh'); } catch (e) { ElementPlus.ElMessage.error('保存失败: ' + e.message); } } // 格式化时间 function formatTime(timestamp) { if (!timestamp) return '-'; return new Date(timestamp * 1000).toLocaleString('zh-CN'); } return { dialogVisible, dialogTitle, form, presets, handleAdd, handleEdit, handleDelete, handleToggle, handleRun, handleSave, formatTime }; }, template: `