Files
interview-demo-code/frontend/admin/src/views/CronView.vue

109 lines
3.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>