🐛 ИСПРАВЛЕНИЯ: • chat_monitor.py: message.system → hasattr проверка • База данных: добавлена колонка achievement_data • Удалена кнопка /settings из всех шаблонов • Настройки перенесены в /broadcast 📁 ФАЙЛЫ: • handlers/chat_monitor.py • web/templates/*.html (удалена /settings) • database: ALTER TABLE achievements Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
102 lines
4.7 KiB
HTML
102 lines
4.7 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Экспорт - Домовой Бот</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/bootstrap-icons@1.11.0/font/bootstrap-icons.css" rel="stylesheet">
|
||
<style>
|
||
.sidebar {
|
||
min-height: 100vh;
|
||
background: linear-gradient(180deg, #2c3e50 0%, #1a252f 100%);
|
||
}
|
||
.sidebar .nav-link { color: rgba(255,255,255,0.8); padding: 1rem; }
|
||
.sidebar .nav-link:hover, .sidebar .nav-link.active { color: white; background-color: rgba(255,255,255,0.1); }
|
||
.content { padding: 2rem; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-md-2 sidebar p-0">
|
||
<div class="p-3 text-white text-center">
|
||
<h4><i class="bi bi-house-door"></i> Домовой Бот</h4>
|
||
</div>
|
||
<nav class="nav flex-column">
|
||
<a class="nav-link" href="/"><i class="bi bi-speedometer2"></i> Дашборд</a>
|
||
<a class="nav-link" href="/users"><i class="bi bi-people"></i> Пользователи</a>
|
||
<a class="nav-link active" href="/export"><i class="bi bi-download"></i> Экспорт</a>
|
||
</nav>
|
||
</div>
|
||
|
||
<div class="col-md-10 content">
|
||
<h2 class="mb-4">Экспорт данных</h2>
|
||
|
||
<div class="row">
|
||
<div class="col-md-6">
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<i class="bi bi-file-earmark-json"></i> Экспорт в JSON
|
||
</div>
|
||
<div class="card-body">
|
||
<p>Экспортирует всех пользователей и сообщения в JSON формат.</p>
|
||
<button class="btn btn-primary" onclick="exportJSON()">
|
||
<i class="bi bi-download"></i> Экспортировать
|
||
</button>
|
||
<div id="exportResult" class="mt-3"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-md-6">
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<i class="bi bi-info-circle"></i> Информация
|
||
</div>
|
||
<div class="card-body">
|
||
<p>Экспорт включает:</p>
|
||
<ul>
|
||
<li>Всех пользователей</li>
|
||
<li>Все сообщения</li>
|
||
<li>Даты и время</li>
|
||
<li>Квартиры и телефоны</li>
|
||
</ul>
|
||
<p class="text-muted small">
|
||
Файл сохраняется в папке exports/
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||
<script>
|
||
async function exportJSON() {
|
||
const resultDiv = document.getElementById('exportResult');
|
||
resultDiv.innerHTML = '<div class="alert alert-info">Экспорт...</div>';
|
||
|
||
try {
|
||
const response = await fetch('/api/export/json');
|
||
const data = await response.json();
|
||
|
||
if (data.success) {
|
||
resultDiv.innerHTML = `
|
||
<div class="alert alert-success">
|
||
✅ Экспорт успешно!<br>
|
||
Файл: ${data.filepath}
|
||
</div>
|
||
`;
|
||
} else {
|
||
resultDiv.innerHTML = '<div class="alert alert-danger">Ошибка экспорта</div>';
|
||
}
|
||
} catch (error) {
|
||
resultDiv.innerHTML = `<div class="alert alert-danger">Ошибка: ${error.message}</div>`;
|
||
}
|
||
}
|
||
</script>
|
||
</body>
|
||
</html>
|