Spaces:
No application file
No application file
{% extends "base.html" %} | |
{% block title %}Личный кабинет{% endblock %} | |
{% block content %} | |
<div class="profile-container"> | |
<!-- User Info --> | |
<div class="profile-header"> | |
<div class="user-info"> | |
<div class="user-avatar"> | |
<img src="{{ url_for('static', filename='avatars/' ~ current_user.avatar) }}" alt="Avatar" | |
class="avatar-img"> | |
</div> | |
<div class="user-details"> | |
<h2>Логин: {{ current_user.username }}</h2> | |
<p>Почта: {{ current_user.email }}</p> | |
<a href="{{ url_for('edit_profile') }}" class="btn btn-primary edit-profile-btn"> | |
<i class="fas fa-user-edit"></i> Редактировать профиль | |
</a> | |
</div> | |
</div> | |
<div class="stats-cards"> | |
<div class="stat-card"> | |
<div class="stat-icon"><i class="fas fa-chart-bar"></i></div> | |
<div class="stat-content"> | |
<h3>Всего анализов</h3> | |
<p class="stat-value">{{ total_reports }}</p> | |
</div> | |
</div> | |
<div class="stat-card"> | |
<div class="stat-icon"><i class="fas fa-smile"></i></div> | |
<div class="stat-content"> | |
<h3>Преобладающая эмоция</h3> | |
<p class="stat-value">{{ emotion_map.get(most_common_emotion, most_common_emotion) }}</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Reports History --> | |
<div class="reports-section"> | |
<h3 class="section-title"><i class="fas fa-history"></i> История анализов</h3> | |
{% if reports %} | |
<div class="reports-list" id="reports-list"> | |
{% set page_size = 6 %} | |
{% set current_page = request.args.get('page', default='1') | int %} | |
{% set start_index = (current_page - 1) * page_size %} | |
{% set end_index = [start_index + page_size, reports|length] | min %} | |
{% for report in reports[start_index:end_index] %} | |
<div class="report-card"> | |
<div class="report-header"> | |
<span class="report-date"> | |
{{ report['created_at'] if report['created_at'] is string else report['created_at'].strftime('%d.%m.%Y %H:%M') }} | |
</span> | |
<span class="report-emotion {{ report['emotion'] }}"> | |
{{ emotion_map.get(report['emotion'], report['emotion']) }} | |
</span> | |
</div> | |
<div class="report-content"> | |
<p>{{ report['content'][:200] }}{% if report['content']|length > 200 %}...{% endif %}</p> | |
</div> | |
<div class="report-footer"> | |
<div class="confidence-meter"> | |
<div class="confidence-fill" style="width: {{ (report['confidence'] * 100)|round(1) }}%"></div> | |
</div> | |
<span class="confidence-value">{{ (report['confidence'] * 100)|round(1) }}%</span> | |
</div> | |
</div> | |
{% endfor %} | |
</div> | |
<!-- Пагинация --> | |
{% if reports|length > page_size %} | |
<div class="pagination"> | |
{% set total_pages = (reports|length / page_size)|round(0, 'ceil')|int %} | |
<!-- Кнопка "Назад" --> | |
<a href="?page={{ current_page - 1 }}" class="pagination-btn {% if current_page == 1 %}disabled{% endif %}">« | |
Назад</a> | |
<!-- Номера страниц --> | |
{% for i in range(1, total_pages + 1) %} | |
<a href="?page={{ i }}" class="pagination-btn {% if current_page == i %}active{% endif %}">{{ i }}</a> | |
{% endfor %} | |
<!-- Кнопка "Вперед" --> | |
<a href="?page={{ current_page + 1 }}" | |
class="pagination-btn {% if current_page >= total_pages %}disabled{% endif %}">Вперед »</a> | |
</div> | |
{% endif %} | |
{% else %} | |
<div class="empty-state"> | |
<i class="fas fa-comment-slash"></i> | |
<h4>У вас пока нет анализов</h4> | |
<p>Начните использовать систему на главной странице</p> | |
<a href="{{ url_for('index') }}" class="btn-primary"> | |
<i class="fas fa-arrow-right"></i> Перейти к анализу | |
</a> | |
</div> | |
{% endif %} | |
</div> | |
<!-- Telegram Analysis Section --> | |
<div class="telegram-analysis-section"> | |
<h3 class="section-title"><i class="fab fa-telegram"></i> Анализ Telegram чатов</h3> | |
<div class="chat-import-section"> | |
<form id="telegram-upload-form" enctype="multipart/form-data"> | |
<div class="file-upload"> | |
<label for="telegram-file" class="file-upload-btn"> | |
<i class="fas fa-file-import"></i> Выбрать файл чата | |
</label> | |
<input type="file" id="telegram-file" accept=".json" required/> | |
<div class="file-info" style="display: none;"> | |
<span id="selected-file-name">Файл не выбран</span> | |
<button type="button" id="clear-file" class="clear-file-btn"> | |
<i class="fas fa-times"></i> | |
</button> | |
</div> | |
<button type="submit" class="btn-primary mt-3"> | |
<i class="fas fa-chart-bar"></i> Анализировать | |
</button> | |
</div> | |
<p class="hint">Экспортируйте чат через Telegram Desktop (JSON format)</p> | |
</form> | |
</div> | |
<!-- Фильтры --> | |
<div class="chart-header"> | |
<h4><i class="fas fa-chart-line"></i> Изменение эмоционального фона</h4> | |
<div class="time-filter"> | |
<button class="time-btn active" data-range="week">Неделя</button> | |
<button class="time-btn" data-range="month">Месяц</button> | |
<button class="time-btn" data-range="year">Год</button> | |
<button class="time-btn" data-range="all">Все время</button> | |
</div> | |
<div class="user-filter"> | |
<label for="user-select" style="color: white;"><i class="fas fa-user-friends"></i> Участник:</label> | |
<select id="user-select" class="form-control"> | |
<option value="all">Все участники</option> | |
</select> | |
</div> | |
</div> | |
<!-- Блок автоматического анализа --> | |
<div id="analysis-summary" class="analysis-summary"> | |
<h4><i class="fas fa-lightbulb"></i> Автоматический анализ</h4> | |
<ul id="summary-content"></ul> | |
</div> | |
<!-- Основной график --> | |
<div class="chart-container" id="emotion-timeline"></div> | |
<!-- Тепловая карта --> | |
<div class="chart-container" id="calendar-heatmap"></div> | |
<!-- Дополнительная статистика --> | |
<div class="chart-row"> | |
<div class="chart-col"> | |
<h4><i class="fas fa-chart-pie"></i> Распределение эмоций</h4> | |
<div class="chart-container" id="emotion-distribution-pie"></div> | |
</div> | |
<div class="chart-col"> | |
<h4><i class="fas fa-percentage"></i> Статистика по эмоциям</h4> | |
<div class="emotion-stats" id="emotion-distribution"></div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Plotly --> | |
<script src="https://cdn.plot.ly/plotly-2.24.1.min.js "></script> | |
<!-- Main Script --> | |
<script src="{{ url_for('static', filename='script.js') }}"></script> | |
<!-- File upload handler --> | |
<script> | |
const telegramFileInput = document.getElementById('telegram-file'); | |
if (telegramFileInput) { | |
telegramFileInput.addEventListener('change', function(e) { | |
const fileName = e.target.files[0]?.name || 'Файл не выбран'; | |
const selectedFileName = document.getElementById('selected-file-name'); | |
const fileInfo = document.querySelector('.file-info'); | |
if (selectedFileName) { | |
selectedFileName.textContent = fileName; | |
} | |
if (fileInfo) { | |
fileInfo.style.display = 'flex'; | |
} | |
}); | |
} | |
</script> | |
<style> | |
.edit-profile-btn { | |
display: inline-flex; | |
align-items: center; | |
font-size: 0.85rem; | |
padding: 5px 10px; | |
border-radius: 5px; | |
} | |
.edit-profile-btn i { | |
font-size: 0.9rem; | |
margin-right: 6px; | |
} | |
.avatar-img { | |
width: 100px; | |
height: 100px; | |
border-radius: 10%; | |
object-fit: cover; | |
} | |
.detailed-analysis { | |
margin-top: 10px; | |
padding: 10px; | |
background: rgba(255,255,255,0.05); | |
border-radius: 8px; | |
} | |
.detailed-analysis-item { | |
display: flex; | |
justify-content: space-between; | |
margin-bottom: 5px; | |
} | |
.emotion-bar { | |
height: 8px; | |
background: rgba(255,255,255,0.1); | |
border-radius: 4px; | |
margin-top: 3px; | |
} | |
.emotion-fill { | |
height: 100%; | |
border-radius: 4px; | |
} | |
.advice-box { | |
margin-top: 10px; | |
padding: 10px; | |
background: rgba(74, 74, 232, 0.1); | |
border-left: 3px solid var(--primary-color); | |
font-style: italic; | |
} | |
.pagination { | |
display: flex; | |
justify-content: center; | |
gap: 8px; | |
margin-top: 20px; | |
flex-wrap: wrap; | |
} | |
.pagination-btn { | |
padding: 8px 12px; | |
border-radius: 4px; | |
background: #3c3c5a; | |
color: white; | |
text-decoration: none; | |
transition: 0.2s; | |
} | |
.pagination-btn:hover:not(.disabled):not(.active) { | |
background: #5a5a7e; | |
} | |
.pagination-btn.active { | |
background: #6c63ff; | |
font-weight: bold; | |
color: #fff; | |
} | |
.pagination-btn.disabled { | |
opacity: 0.5; | |
pointer-events: none; | |
} | |
/* В секции style в profile.html */ | |
.chat-controls { | |
margin: 15px 0; | |
display: flex; | |
gap: 10px; | |
} | |
.btn-danger { | |
background-color: #d63031; | |
color: white; | |
border: none; | |
padding: 8px 15px; | |
border-radius: 4px; | |
cursor: pointer; | |
transition: background-color 0.2s; | |
} | |
.btn-danger:hover { | |
background-color: #ff4757; | |
} | |
.report-emotion.anger { | |
color: #d63031; /* Красный для злости */ | |
} | |
.report-emotion.joy { | |
color: #00b894; /* Зеленый для радости */ | |
} | |
.report-emotion.sadness { | |
color: #0984e3; /* Синий для грусти */ | |
} | |
.report-emotion.surprise { | |
color: #fdcb6e; /* Желтый для удивления */ | |
} | |
.report-emotion.fear { | |
color: #a29bfe; /* Фиолетовый для страха */ | |
} | |
.report-emotion.neutral { | |
color: #636e72; /* Серый для нейтрального */ | |
} | |
.report-emotion.no_emotion { | |
color: #636e72; /* Серый цвет для нейтрального состояния */ | |
} | |
</style> | |
{% endblock %} |