/
zimaaadev
/
Parser
Обзор
Документация
Войти
/
zimaaadev
/
Parser
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
admin/templates/base.html
175 строк
8 KB
zimaaa
Добавил страницу Logs - отображение логов в админке
11 дек 2025, 21:12
11 дек 2025, 21:12
6f30592
Код
Авторство
О чём код?
<!-- templates/base.html --> <!DOCTYPE html> <html lang="ru" class="{{ request.cookies.get('theme', 'light') }}"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %} — Realty Monitor</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <style> .dark { background: #121212; color: #e0e0e0; } .dark .card { background: #1e1e1e; color: #e0e0e0; } .dark .form-control, .dark .form-select { background: #333; color: #fff; border: 1px solid #555; } </style> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-primary mb-4"> <div class="container-fluid"> <a class="navbar-brand" href="{{ url_for('index') }}">PropertyParams</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav me-auto"> <li class="nav-item"><a class="nav-link {% if request.endpoint == 'index' %}active{% endif %}" href="{{ url_for('index') }}">Главная</a></li> <li class="nav-item"><a class="nav-link {% if request.endpoint == 'map_view' %}active{% endif %}" href="{{ url_for('map_view') }}">Карта</a></li> <li class="nav-item"><a class="nav-link {% if request.endpoint == 'stats' %}active{% endif %}" href="{{ url_for('stats') }}">Статистика</a></li> <li class="nav-item"><a class="nav-link {% if request.endpoint == 'manual_locations' %}active{% endif %}" href="{{ url_for('manual_locations') }}">Локации</a></li> <li class="nav-item"><a class="nav-link {% if request.endpoint == 'logs' %}active{% endif %}" href="{{ url_for('logs') }}">Консоль логи</a></li> <li class="nav-item"><a class="nav-link {% if request.endpoint == 'edit_env' %}active{% endif %}" href="{{ url_for('edit_env') }}">Настройки</a></li> </ul> <div class="d-flex align-items-center"> <button onclick="setTheme('light')" class="btn btn-sm btn-light me-2">☀️</button> <button onclick="setTheme('dark')" class="btn btn-sm btn-outline-light me-2">🌙</button> <form action="{{ url_for('logout') }}" method="POST"> <button type="submit" class="btn btn-outline-light btn-sm">Выйти</button> </form> </div> </div> </div> </nav> <div class="container"> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %} <div class="alert alert-{{ 'danger' if category == 'danger' else 'warning' if category == 'warning' else 'info' if category == 'info' else 'success' }} alert-dismissible fade show" role="alert"> {{ message }} <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> {% endfor %} {% endif %} {% endwith %} {% block content %}{% endblock %} </div> <footer class="text-center"> <p>Админка запущена в <span id="local-time"></span></p> <!-- DATABASE_PATH больше не выводится --> </footer> <div class="position-fixed bottom-0 end-0 m-3"> <button id="theme-toggle" class="btn btn-sm btn-secondary" title="Сменить тему"> <i class="fas fa-moon"></i> </button> </div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script> document.addEventListener("DOMContentLoaded", function () { const theme = document.documentElement.getAttribute("data-theme") || "light"; updateThemeIcon(theme); function updateTime() { const now = new Date(); document.getElementById("local-time").textContent = now.toLocaleString(); } updateTime(); setInterval(updateTime, 1000); document.getElementById("theme-toggle").addEventListener("click", function () { const newTheme = theme === "light" ? "dark" : "light"; fetch(`/set-theme/${newTheme}`, { method: "POST" }) .then(() => window.location.reload()); }); function updateThemeIcon(theme) { const icon = document.querySelector("#theme-toggle i"); icon.className = theme === "light" ? "fas fa-moon" : "fas fa-sun"; } }); </script> <!-- Модальное окно --> <div id="updateModal" style="display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8);" onclick="closeUpdateModal()"> <div style="background: #111; margin: 10% auto; padding: 20px; width: 80%; max-width: 800px; border: 1px solid #0f0; border-radius: 10px; color: #0f0;" onclick="event.stopPropagation()"> <h3>🔄 Обновить систему из Git</h3> <div style="margin-bottom: 15px;"> <label>Ветка:</label> <input id="gitBranch" type="text" value="main" style="width: 100%; padding: 8px; margin-top: 5px; background: #222; color: #0f0; border: 1px solid #0f0; border-radius: 4px;"> </div> <div style="margin-bottom: 15px;"> <label>Логин (опционально):</label> <input id="gitUser" type="text" style="width: 100%; padding: 8px; margin-top: 5px; background: #222; color: #ddd; border: 1px solid #0f0; border-radius: 4px;"> </div> <div style="margin-bottom: 15px;"> <label>Пароль / Токен (опционально):</label> <input id="gitPass" type="password" style="width: 100%; padding: 8px; margin-top: 5px; background: #222; color: #ddd; border: 1px solid #0f0; border-radius: 4px;"> </div> <button onclick="startUpdate()" class="btn btn-success" style="width: 100%; padding: 10px; font-size: 16px;">🚀 Выполнить обновление</button> <pre id="updateOutput" style="height: 250px; overflow-y: auto; background: #000; padding: 10px; border-radius: 5px; margin-top: 20px; display: none;"></pre> <div style="text-align: right; margin-top: 10px;"> <button onclick="closeUpdateModal()" class="btn btn-secondary">Закрыть</button> </div> </div> </div> <script> function showUpdateModal() { document.getElementById('updateModal').style.display = 'block'; document.getElementById('updateOutput').style.display = 'none'; document.getElementById('gitBranch').value = 'main'; // сброс } function closeUpdateModal() { document.getElementById('updateModal').style.display = 'none'; } function startUpdate() { const branch = document.getElementById('gitBranch').value.trim() || 'main'; const user = document.getElementById('gitUser').value.trim(); const pass = document.getElementById('gitPass').value.trim(); const output = document.getElementById('updateOutput'); output.style.display = 'block'; output.style.color = '#0f0'; output.textContent = '🔄 Выполняется обновление...\n'; const data = { branch, username: user, password: pass }; fetch('/api/update', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(response => response.json()) .then(data => { output.textContent += data.output; if (!data.success) { output.style.color = '#f00'; } }) .catch(err => { output.textContent += '❌ Ошибка: ' + err; output.style.color = '#f00'; }); } </script> {% block scripts %} {% endblock %} </body> </html>