domovoy_bot/web/templates/export.html

97 lines
4.6 KiB
HTML
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.

{% extends "base.html" %}
{% block title %}Резервное копирование и экспорт - МКД ЛенКом 37{% endblock %}
{% block nav_export %}active{% endblock %}
{% block content %}
<div class="mb-3">
<h4 class="mb-1" style="font-size: 16px; font-weight: bold;">Резервное копирование и экспорт базы</h4>
<div class="small text-muted">Формирование дампов базы данных и синхронизация с локальным Git-сервером (Forgejo)</div>
</div>
<div class="row g-3">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header">
<i class="bi bi-file-earmark-arrow-up"></i> ЭКСПОРТ ДАННЫХ В JSON И GIT
</div>
<div class="card-body">
<p class="small text-muted mb-3">
Экспорт всех учетных записей жильцов, истории сообщений и настроек. Файл формируется в формате JSON и автоматически фиксируется коммитом в Git.
</p>
<button class="btn-unix btn-unix-primary w-100" onclick="exportJSON()">
<i class="bi bi-arrow-up-circle"></i> Запустить полный экспорт сейчас
</button>
<div id="exportResult" class="mt-3"></div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header">
<i class="bi bi-clock-history"></i> СТАТИСТИКА ВЫГРУЗОК
</div>
<div class="card-body">
<table class="table mb-3">
<tbody>
<tr>
<td style="font-weight: bold; width: 180px;">Всего выгрузок:</td>
<td><span class="badge-status badge-success">{{ export_stats.total }}</span></td>
</tr>
<tr>
<td style="font-weight: bold;">Последняя выгрузка:</td>
<td>{{ fmt_local(export_stats.last_date) if export_stats.last_date else 'Никогда' }}</td>
</tr>
<tr>
<td style="font-weight: bold;">Авторасписание:</td>
<td>Каждое воскресенье в 03:00 (cron)</td>
</tr>
</tbody>
</table>
<div class="small text-muted">
Архивы сохраняются локально в каталог <code>exports/</code> и отправляются в репозиторий на Synology NAS.
</div>
</div>
</div>
</div>
</div>
<script>
async function exportJSON() {
const resultDiv = document.getElementById('exportResult');
const btn = document.querySelector('button[onclick="exportJSON()"]');
resultDiv.innerHTML = '<div class="alert alert-info py-2 small"><div class="spinner-border spinner-border-sm me-2"></div>Сбор данных и отправка в Git...</div>';
btn.disabled = true;
try {
const response = await fetch('/api/export/json');
const data = await response.json();
if (response.ok && data.success) {
resultDiv.innerHTML = `
<div class="alert alert-success py-2 small">
<b>Успешно!</b><br>
Файл: <code>${data.filename}</code><br>
Сообщений: ${data.messages}<br>
Статус Git: ${data.git ? 'Синхронизировано в Forgejo' : 'Ошибка Git'}<br>
<div class="mt-2">
<a href="/exports/${data.filename}" class="btn-unix">
Скачать файл локально
</a>
</div>
</div>
`;
setTimeout(() => location.reload(), 10000);
} else {
resultDiv.innerHTML = `<div class="alert alert-danger py-2 small">Ошибка: ${data.error || 'Неизвестная ошибка'}</div>`;
}
} catch (error) {
resultDiv.innerHTML = `<div class="alert alert-danger py-2 small">Сетевая ошибка: ${error.message}</div>`;
} finally {
btn.disabled = false;
}
}
</script>
{% endblock %}