From 6b1789421f5213526a03a4627f7a6e9a89341f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Sat, 31 Jan 2026 19:31:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20cron=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8=E6=96=B0=E5=A2=9E=E6=AF=8F=E5=88=86?= =?UTF-8?q?=E9=92=9F=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/common/CronSelector.vue | 33 +++++++++++++++++++--- web/src/views/task/CreateModal.vue | 2 +- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/web/src/components/common/CronSelector.vue b/web/src/components/common/CronSelector.vue index 716c58ea..c56541ca 100644 --- a/web/src/components/common/CronSelector.vue +++ b/web/src/components/common/CronSelector.vue @@ -52,6 +52,12 @@ const parseCron = (cron: string) => { const month = parts[3]! const weekday = parts[4]! + // 每分钟:* * * * * + if (minute === '*' && hour === '*' && day === '*' && month === '*' && weekday === '*') { + selectedOption.value = 'every-minute' + return + } + // 每 N 分钟:*/N * * * * if (minute.startsWith('*/') && hour === '*' && day === '*' && month === '*' && weekday === '*') { selectedOption.value = 'every-n-minutes' @@ -76,15 +82,29 @@ const parseCron = (cron: string) => { return } - // 每小时:M * * * * - if (hour === '*' && day === '*' && month === '*' && weekday === '*' && !minute.includes('/')) { + // 每小时:M * * * *(M 必须是具体数字,不能是 *) + if ( + minute !== '*' && + !minute.includes('/') && + hour === '*' && + day === '*' && + month === '*' && + weekday === '*' + ) { selectedOption.value = 'every-hour' formData.value.minute = parseInt(minute) || 0 return } - // 每天:M H * * * - if (day === '*' && month === '*' && weekday === '*' && !hour.includes('/')) { + // 每天:M H * * *(M 和 H 必须是具体数字) + if ( + minute !== '*' && + hour !== '*' && + !hour.includes('/') && + day === '*' && + month === '*' && + weekday === '*' + ) { selectedOption.value = 'every-day' formData.value.minute = parseInt(minute) || 0 formData.value.hour = parseInt(hour) || 0 @@ -126,6 +146,7 @@ const parseCron = (cron: string) => { // 周期选项 const options = [ + { label: $gettext('Every Minute'), value: 'every-minute' }, { label: $gettext('Every N Minutes'), value: 'every-n-minutes' }, { label: $gettext('Every N Hours'), value: 'every-n-hours' }, { label: $gettext('Every N Days'), value: 'every-n-days' }, @@ -159,6 +180,10 @@ const generateCron = (): string => { const { minute, hour, day, month, weekday, nMinutes, nHours, nDays, customCron } = formData.value switch (selectedOption.value) { + case 'every-minute': + // 每分钟:* * * * * + return '* * * * *' + case 'every-n-minutes': // 每 N 分钟:*/N * * * * return `*/${nMinutes} * * * *` diff --git a/web/src/views/task/CreateModal.vue b/web/src/views/task/CreateModal.vue index 006a3771..7ce53e40 100644 --- a/web/src/views/task/CreateModal.vue +++ b/web/src/views/task/CreateModal.vue @@ -23,7 +23,7 @@ const createModel = ref({ `#!/bin/bash\nexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH\n\n` + $gettext('# Enter your script content here') + `\n`, - time: '* * * * *' + time: '*/30 * * * *' }) const websites = ref([])