47c7f17c90
— RPU v2: бюджет удачи, потолок (ceiling), комбек после проигрышей, hot/cold анализ, интеграция с promo-фазами — Bank API: mock-банк для карты (депозит/вывод с балансом 1000₽) — Promo-сервис: автогенерация промокодов каждый час, типы (card_to_site, luck_boost, ceiling_boost, free_case, reset_streak) — Promo-фазы: LUCKY/NEUTRAL/UNLUCKY, переключение каждые 1-6ч — Admin: история транзакций (user_history), управление промокодами, управление promo-фазами, API фильтров/коллекций, RPU info — Database: WAL mode, новые поля RPU v2, TransactionLog, карточный баланс, статистики (streaks, ceiling, budget) — Frontend: /deposit, /promo/activate, /withdraw, /card-balance, /online-count, /rpu-info, lifespan вместо startup event — UI: user_history.html, улучшения профиля, кейсов, навигации — Cases: обновление cases.json (1892 строки новых данных) — Achievements: кэш коллекций, оптимизация is_custom проверок — Sounds: дополнительные звуковые эффекты — Upgrade: интеграция с RPU (множители, streaks) — .gitignore: исключены .db, .bak, __pycache__
107 lines
4.2 KiB
HTML
107 lines
4.2 KiB
HTML
{% extends "admin/base.html" %}
|
|
{% block title %}Пользователи — Админ-панель{% endblock %}
|
|
{% block nav_users %}active{% endblock %}
|
|
{% block page_title %}👥 Пользователи{% endblock %}
|
|
{% block top_actions %}
|
|
<div class="search-form a-flex">
|
|
<input type="text" id="userSearch" class="a-input a-input-sm" placeholder="Поиск по имени..." value="{{ search or '' }}">
|
|
<button class="a-btn a-btn-primary" onclick="searchUsers()">🔍 Найти</button>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
{% if users %}
|
|
<div class="a-table-wrap">
|
|
<table class="a-table">
|
|
<thead>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Имя</th>
|
|
<th>Баланс</th>
|
|
<th>Статус</th>
|
|
<th>Кейсов</th>
|
|
<th>Контрактов</th>
|
|
<th>Предметов</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for u in users %}
|
|
<tr>
|
|
<td>{{ u.id }}</td>
|
|
<td>
|
|
<a href="/admin/user/{{ u.id }}" style="color:#f59e0b;text-decoration:none;font-weight:500">
|
|
{{ u.username }}
|
|
</a>
|
|
</td>
|
|
<td>{{ u.balance|money }} ₽</td>
|
|
<td>
|
|
{% if u.is_admin %}<span class="a-badge a-badge-admin">Админ</span>{% endif %}
|
|
{% if u.is_banned %}<span class="a-badge a-badge-banned">Забанен</span>{% endif %}
|
|
{% if not u.is_admin and not u.is_banned %}<span class="a-badge a-badge-user">Игрок</span>{% endif %}
|
|
</td>
|
|
<td>{{ u.case_openings }}</td>
|
|
<td>{{ u.contracts }}</td>
|
|
<td>{{ u.inventory_count }}</td>
|
|
<td class="td-actions">
|
|
<a href="/admin/user/{{ u.id }}" class="a-btn a-btn-sm">✏️</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="a-table-card-view">
|
|
{% for u in users %}
|
|
<div class="a-table-card">
|
|
<div class="tc-row">
|
|
<span class="tc-label">ID</span>
|
|
<span class="tc-value">{{ u.id }}</span>
|
|
</div>
|
|
<div class="tc-row">
|
|
<span class="tc-label">Имя</span>
|
|
<span class="tc-value"><a href="/admin/user/{{ u.id }}" style="color:#f59e0b;text-decoration:none;font-weight:500">{{ u.username }}</a></span>
|
|
</div>
|
|
<div class="tc-row">
|
|
<span class="tc-label">Баланс</span>
|
|
<span class="tc-value">{{ u.balance|money }} ₽</span>
|
|
</div>
|
|
<div class="tc-row">
|
|
<span class="tc-label">Статус</span>
|
|
<span class="tc-value">
|
|
{% if u.is_admin %}<span class="a-badge a-badge-admin">Админ</span>{% endif %}
|
|
{% if u.is_banned %}<span class="a-badge a-badge-banned">Забанен</span>{% endif %}
|
|
{% if not u.is_admin and not u.is_banned %}<span class="a-badge a-badge-user">Игрок</span>{% endif %}
|
|
</span>
|
|
</div>
|
|
<div class="tc-row">
|
|
<span class="tc-label">Кейсов / Контр / Предм</span>
|
|
<span class="tc-value">{{ u.case_openings }} / {{ u.contracts }} / {{ u.inventory_count }}</span>
|
|
</div>
|
|
<div class="tc-actions">
|
|
<a href="/admin/user/{{ u.id }}" class="a-btn a-btn-sm">✏️ Редактировать</a>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="a-empty">
|
|
<div class="a-empty-icon">📭</div>
|
|
<h3>Пользователи не найдены</h3>
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
<script>
|
|
function searchUsers() {
|
|
const q = document.getElementById('userSearch').value.trim();
|
|
window.location.href = '/admin/users' + (q ? '?search=' + encodeURIComponent(q) : '');
|
|
}
|
|
document.getElementById('userSearch').addEventListener('keydown', e => {
|
|
if (e.key === 'Enter') searchUsers();
|
|
});
|
|
</script>
|
|
{% endblock %}
|