109 lines
3.8 KiB
Vue
109 lines
3.8 KiB
Vue
<template>
|
||
<SettingsItem label="Режим работы планировщика">
|
||
<template #default>
|
||
<SelectButton
|
||
v-model="settings.items.cron.mode"
|
||
:options="cronModes"
|
||
optionLabel="label"
|
||
optionValue="value"
|
||
:allowEmpty="false"
|
||
/>
|
||
</template>
|
||
<template #help>
|
||
<div v-if="settings.items.cron.mode === 'disabled'" class="tw:text-red-600 tw:font-bold">
|
||
Все фоновые задачи отключены.
|
||
</div>
|
||
<div v-else>
|
||
Рекомендуемый режим. Использует системный планировщик задач Linux.
|
||
</div>
|
||
|
||
<div class="tw:mt-2">
|
||
<p>
|
||
<strong>Системный CRON (рекомендуется):</strong> Стабильное выполнение задач по расписанию, независимо от
|
||
посещаемости сайта. Добавьте команду в CRON для автоматического выполнения каждые 5 минут.
|
||
</p>
|
||
<p>
|
||
<strong>Выключено:</strong> Все фоновые задачи отключены. Планировщик не будет выполнять никаких задач.
|
||
</p>
|
||
</div>
|
||
</template>
|
||
</SettingsItem>
|
||
|
||
<SettingsItem label="Последний запуск CRON">
|
||
<template #default>
|
||
<div v-if="lastRunDate" class="tw:text-green-600 tw:font-bold tw:py-2">
|
||
{{ lastRunDate }}
|
||
</div>
|
||
<div v-else class="tw:text-gray-500 tw:py-2">
|
||
Еще не запускался
|
||
</div>
|
||
</template>
|
||
<template #help>
|
||
Время последнего успешного выполнения планировщика задач.
|
||
</template>
|
||
</SettingsItem>
|
||
|
||
<SettingsItem
|
||
v-if="settings.items.cron.mode === 'system'"
|
||
label="Команда для CRON"
|
||
>
|
||
<template #default>
|
||
<InputGroup>
|
||
<Button icon="fa fa-copy" severity="secondary" @click="copyToClipboard(cronCommand)"/>
|
||
<InputText readonly :model-value="cronCommand" class="tw:w-full"/>
|
||
</InputGroup>
|
||
</template>
|
||
<template #help>
|
||
Добавьте эту строку в конфигурацию CRON на вашем сервере (обычно `crontab -e`), чтобы запускать планировщик каждые
|
||
5 минут.
|
||
</template>
|
||
</SettingsItem>
|
||
</template>
|
||
|
||
<script setup>
|
||
import {computed} from 'vue';
|
||
import {useSettingsStore} from "@/stores/settings.js";
|
||
import SettingsItem from "@/components/SettingsItem.vue";
|
||
import SelectButton from "primevue/selectbutton";
|
||
import InputText from "primevue/inputtext";
|
||
import Button from "primevue/button";
|
||
import InputGroup from 'primevue/inputgroup';
|
||
import {toastBus} from "@/utils/toastHelper.js";
|
||
|
||
const settings = useSettingsStore();
|
||
|
||
const cronModes = [
|
||
{value: 'system', label: 'Системный CRON (Linux)'},
|
||
{value: 'disabled', label: 'Выключено'},
|
||
];
|
||
|
||
const cronCommand = computed(() => {
|
||
const cliPath = settings.items.cron?.cli_path;
|
||
|
||
return cliPath
|
||
? `*/5 * * * * php ${cliPath} schedule:run`
|
||
: 'Путь не определен. Проверьте конфигурацию модуля.';
|
||
});
|
||
|
||
const lastRunDate = computed(() => settings.items.cron?.last_run);
|
||
|
||
async function copyToClipboard(text) {
|
||
try {
|
||
await navigator.clipboard.writeText(text);
|
||
toastBus.emit('show', {
|
||
severity: 'success',
|
||
summary: 'Скопировано',
|
||
detail: 'Команда скопирована в буфер обмена',
|
||
life: 2000,
|
||
});
|
||
} catch (err) {
|
||
toastBus.emit('show', {
|
||
severity: 'error',
|
||
summary: 'Ошибка',
|
||
detail: 'Не удалось скопировать текст',
|
||
life: 2000,
|
||
});
|
||
}
|
||
}
|
||
</script>
|