Почти полностью рабочая версия

This commit is contained in:
2025-12-20 21:52:40 +03:00
parent 721f224c8e
commit 5396c3d0ff
8 changed files with 892 additions and 18 deletions
+416 -13
View File
@@ -1,27 +1,430 @@
{% extends "base.html" %}
{% block title %}Главная{% endblock %}
{% block title %}Главная - Панель управления{% endblock %}
{% block styles %}
<link href="/static/css/index.css" rel="stylesheet">
{% endblock %}
{% block content %}
<h3 class="mb-4">📊 Состояние системы</h3>
<!-- Заголовок -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h1 class="mb-1"><i class="bi bi-speedometer2 text-primary me-2"></i>Панель управления</h1>
<p class="text-muted mb-0">Мониторинг состояния системы и статистика</p>
</div>
<div class="badge bg-primary fs-6 px-3 py-2">
<i class="bi bi-server me-1"></i>Система
</div>
</div>
<div class="row mb-4">
<div class="col-md-4">
<div class="card">
<!-- Основная статистика -->
<div class="row g-4 mb-4">
<!-- Medods API -->
<div class="col-xl-4 col-lg-6">
<div class="card h-100">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-plug text-info me-2"></i>Medods API</h5>
{% if exitData.medodsApi %}
<span class="badge bg-info"><i class="bi bi-check-circle me-1"></i>Настроен</span>
{% else %}
<span class="badge bg-secondary"><i class="bi bi-x-circle me-1"></i>Не настроен</span>
{% endif %}
</div>
<div class="card-body">
<h6 class="card-title">Статус</h6>
<span class="badge bg-success">Работает</span>
{% if exitData.medodsApi %}
<div class="row g-3">
<div class="col-6">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.medodsApi.url %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">URL сервера</div>
<div class="fw-semibold">{% if exitData.medodsApi.url %}Настроен{% else %}Не
настроен{% endif %}</div>
</div>
</div>
</div>
<div class="col-6">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.medodsApi.apiKey %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">API ключ</div>
<div class="fw-semibold">{% if exitData.medodsApi.apiKey %}Настроен{% else %}Не
настроен{% endif %}</div>
</div>
</div>
</div>
</div>
<div class="row g-3">
<div class="col-12">
<div class="card bg-light">
<div class="card-body py-2">
<div class="row">
<div class="col-6">
<div class="small text-muted">Запросов к серверу</div>
<div class="fw-bold fs-5">{{ exitData.medodsApi.apiEndpointsCount or 0 }}
</div>
</div>
<div class="col-6">
<div class="small text-muted">Обновлено</div>
<div class="fw-semibold">{{ exitData.medodsApi.updated_at }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% else %}
<div class="text-center py-4">
<i class="bi bi-plug display-1 text-muted mb-3"></i>
<h5 class="text-muted">Medods API не настроен</h5>
<p class="text-muted mb-3">Настройте подключение для работы с API</p>
<a href="/medods" class="btn btn-outline-primary">
<i class="bi bi-arrow-right me-1"></i>Перейти к настройкам
</a>
</div>
{% endif %}
</div>
</div>
</div>
<!-- VK API -->
<div class="col-xl-4 col-lg-6">
<div class="card h-100">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-megaphone text-success me-2"></i>VK API</h5>
{% if exitData.vkApi %}
<span class="badge bg-success"><i class="bi bi-check-circle me-1"></i>Настроен</span>
{% else %}
<span class="badge bg-secondary"><i class="bi bi-x-circle me-1"></i>Не настроен</span>
{% endif %}
</div>
<div class="card-body">
{% if exitData.vkApi %}
<div class="row g-3">
<div class="col-4">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.vkApi.group_id %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">ID группы</div>
<div class="fw-semibold">{% if exitData.vkApi.group_id %}Настроен{% else %}Не
настроен{% endif %}</div>
</div>
</div>
</div>
<div class="col-4">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.vkApi.access_token %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">Токен</div>
<div class="fw-semibold">{% if exitData.vkApi.access_token %}Настроен{% else %}Не
настроен{% endif %}</div>
</div>
</div>
</div>
<div class="col-4">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.vkApi.base_photo_url %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">Базовое фото</div>
<div class="fw-semibold">{% if exitData.vkApi.base_photo_url %}Настроен{% else %}Не
настроен{% endif %}</div>
</div>
</div>
</div>
</div>
<div class="row g-3">
<div class="col-12">
<div class="card bg-light">
<div class="card-body py-2">
<div class="text-center">
<div class="small text-muted">Обновлено</div>
<div class="fw-bold fs-5">{{ exitData.vkApi.updated_at }}</div>
</div>
</div>
</div>
</div>
</div>
{% else %}
<div class="text-center py-4">
<i class="bi bi-megaphone display-1 text-muted mb-3"></i>
<h5 class="text-muted">VK API не настроен</h5>
<p class="text-muted mb-3">Настройте подключение для работы с VK</p>
<a href="/vk" class="btn btn-outline-success">
<i class="bi bi-arrow-right me-1"></i>Перейти к настройкам
</a>
</div>
{% endif %}
</div>
</div>
</div>
<!-- Планировщик публикаций -->
<div class="col-xl-4 col-lg-6">
<div class="card h-100">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-calendar-week text-warning me-2"></i>Планировщик</h5>
{% if exitData.vkPost and exitData.vkPost.scheduler %}
{% if exitData.vkPost.scheduler.scheduler %}
<span class="badge bg-success"><i class="bi bi-play-circle me-1"></i>Активен</span>
{% else %}
<span class="badge bg-secondary"><i class="bi bi-stop-circle me-1"></i>Неактивен</span>
{% endif %}
{% else %}
<span class="badge bg-secondary"><i class="bi bi-question-circle me-1"></i>Не настроен</span>
{% endif %}
</div>
<div class="card-body">
{% if exitData.vkPost %}
<div class="row g-3">
<div class="col-6">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.vkPost.static_text %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">Текст поста</div>
<div class="fw-semibold">{% if exitData.vkPost.static_text %}Настроен{% else %}Не
настроен{% endif %}</div>
</div>
</div>
</div>
<div class="col-6">
<div class="d-flex align-items-center mb-3">
<div
class="status-indicator {% if exitData.vkPost.scheduler.vk_publish_job %}status-online{% else %}status-offline{% endif %} me-2">
</div>
<div>
<div class="small text-muted">Автопубликация</div>
<div class="fw-semibold">{% if exitData.vkPost.scheduler.vk_publish_job %}Активна{% else
%}Неактивна{% endif %}
</div>
</div>
</div>
</div>
</div>
{% if exitData.vkPost.scheduler %}
<div class="card bg-light mb-3">
<div class="card-body py-2">
<div class="row">
<div class="col-6">
<div class="small text-muted">Обновлено</div>
<div class="fw-semibold">
{% if exitData.vkPost.updated_at %}
{{ exitData.vkPost.updated_at }}
{% else %}
Не опубликовано
{% endif %}
</div>
</div>
<div class="col-6">
<div class="small text-muted">Следующий запуск</div>
<div class="fw-semibold">
{% if exitData.vkPost.scheduler.next_run_time %}
{{ exitData.vkPost.scheduler.next_run_time }}
{% else %}
Не запланирован
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endif %}
<div class="row g-3">
<div class="col-12">
<div class="card bg-light">
<div class="card-body py-2">
<div class="row">
<div class="col-6">
<div class="small text-muted">Сотрудников в базе</div>
<div class="fw-bold fs-5">{{ exitData.vkPost.usersMedods or 0 }}</div>
</div>
<div class="col-6">
<div class="small text-muted">Сотрудников выбрано</div>
<div class="fw-bold fs-5">{{ exitData.vkPost.selected_users or 0 }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% else %}
<div class="text-center py-4">
<i class="bi bi-calendar-week display-1 text-muted mb-3"></i>
<h5 class="text-muted">Планировщик не настроен</h5>
<p class="text-muted mb-3">Настройте публикации для запуска планировщика</p>
<a href="/posts" class="btn btn-outline-warning">
<i class="bi bi-arrow-right me-1"></i>Перейти к публикациям
</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<h4>📜 Логи операций</h4>
<!-- Статистика и ссылки -->
<div class="row g-4 mb-4">
<!-- Быстрые действия -->
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header">
<h5 class="mb-0">
<i class="bi bi-tools text-primary me-2"></i>Переход к настройкам
</h5>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-md-4">
<a href="/medods"
class="btn btn-outline-info w-100 py-4 d-flex flex-column align-items-center justify-content-center">
<i class="bi bi-plug fs-1 mb-2"></i>
<span class="fw-semibold">Medods API</span>
<small class="text-muted text-center">Подключение</small>
</a>
</div>
<div class="card">
<div class="card-body">
<pre>
{{ logs or "Логи отсутствуют" }}
</pre>
<div class="col-md-4">
<a href="/vk"
class="btn btn-outline-success w-100 py-4 d-flex flex-column align-items-center justify-content-center">
<i class="bi bi-megaphone fs-1 mb-2"></i>
<span class="fw-semibold">VK API</span>
<small class="text-muted text-center">Настройки VK</small>
</a>
</div>
<div class="col-md-4">
<a href="/posts"
class="btn btn-outline-warning w-100 py-4 d-flex flex-column align-items-center justify-content-center">
<i class="bi bi-calendar-week fs-1 mb-2"></i>
<span class="fw-semibold">Публикации</span>
<small class="text-muted text-center">Управление</small>
</a>
</div>
</div>
</div>
</div>
</div>
<!-- Последний пост VK -->
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-send text-success me-2"></i>Последняя публикация</h5>
{% if exitData.vkPost and exitData.vkPost.post_link %}
<span class="badge bg-success"><i class="bi bi-check-circle me-1"></i>Опубликовано</span>
{% else %}
<span class="badge bg-secondary"><i class="bi bi-hourglass me-1"></i>Нет публикаций</span>
{% endif %}
</div>
<div class="card-body">
{% if exitData.vkPost and exitData.vkPost.post_link %}
<div class="alert alert-success">
<div class="d-flex">
<div class="me-3">
<i class="bi bi-check-circle-fill fs-4"></i>
</div>
<div>
<h6 class="alert-heading mb-1">Пост успешно опубликован</h6>
<p class="mb-2">Ссылка на публикацию в VK</p>
<a href="{{ exitData.vkPost.post_link }}" target="_blank"
class="btn btn-sm btn-outline-success">
<i class="bi bi-box-arrow-up-right me-1"></i>Открыть в VK
</a>
</div>
</div>
</div>
<div class="row g-3">
<div class="col-6">
<div class="card bg-light">
<div class="card-body py-2">
<div class="small text-muted">Время публикации</div>
<div class="fw-semibold">
{% if exitData.vkPost.publish_at %}
{{ exitData.vkPost.publish_at }}
{% else %}
Не указано
{% endif %}
</div>
</div>
</div>
</div>
<div class="col-6">
<div class="card bg-light">
<div class="card-body py-2">
<div class="small text-muted">Отображение имен</div>
<div class="fw-semibold">
{% if exitData.vkPost.full_name %}
Полные имена
{% else %}
Короткие имена
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% else %}
<div class="text-center py-4">
<i class="bi bi-send display-1 text-muted mb-3"></i>
<h5 class="text-muted">Нет публикаций</h5>
<p class="text-muted mb-3">Создайте и опубликуйте первый пост</p>
<a href="/posts" class="btn btn-success">
<i class="bi bi-plus-circle me-1"></i>Создать публикацию
</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<!-- Логи системы -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<div class="d-flex justify-content-left align-items-center">
<h5 class="mb-0"><i class="bi bi-journal-text text-dark me-2"></i>Логи операций</h5>
<span class="text-muted small ms-2 d-none" id="logs_description">(Последние 500 строк. Новые сверху)</span>
</div>
<div>
<button type="button" class="btn btn-sm btn-outline-secondary me-2" onclick="toggleLogs()">
<i class="bi bi-chevron-down"></i>
</button>
<button type="button" class="btn btn-sm btn-outline-primary" onclick="refreshLogs()">
<i class="bi bi-arrow-clockwise"></i>
</button>
</div>
</div>
<div class="card-body d-none" id="logsBody">
<div id="logsContainer" class="logs-container">
<pre class="logs-pre"></pre>
</div>
</div>
<div class="card-footer">
<div class="small text-muted">
<i class="bi bi-info-circle me-1"></i>
Последнее обновление: <span id="lastUpdateTime">{{ current_time or "Неизвестно" }}</span>
</div>
</div>
</div>
<!-- Контейнер для уведомлений -->
<div id="alertContainer" class="alert-fixed"></div>
{% endblock %}
{% block scripts %}
<script src="/static/js/index.js"></script>
{% endblock %}