Files
ave-cms/adminx/modules/Security/view/index.twig
T
2026-07-27 12:58:44 +03:00

26 lines
3.9 KiB
Twig

{% extends '@adminx/main.twig' %}
{% block title %}IP-блокировки{% endblock %}
{% block content %}
<nav class="breadcrumbs" aria-label="Хлебные крошки"><a href="{{ ADMINX_BASE }}/">Главная</a><i class="ti ti-chevron-right"></i><span>IP-блокировки</span></nav>
<div class="page-header"><div><h1>IP-блокировки</h1><p class="text-secondary">Ручные блокировки доступа и автоматическая защита частоты запросов</p></div></div>
<div class="security-layout">
{% if can_manage %}<section class="card security-form-card">
<div class="settings-section-head"><span class="icon-tile" style="--tile-bg:var(--red-100);--tile-fg:var(--red-600)"><i class="ti ti-shield-plus"></i></span><div><h2>Заблокировать адрес</h2><p>Текущий адрес: <span class="mono">{{ current_ip }}</span></p></div></div>
<form data-ip-block-form action="{{ ADMINX_BASE }}/security/ip-blocks" method="post">
<input type="hidden" name="_csrf" value="{{ csrf_token }}">
<label><span>IP-адрес</span><input class="input mono" name="ip" required placeholder="203.0.113.10"></label>
<label><span>Причина</span><input class="input" name="reason" maxlength="500" placeholder="Причина блокировки"></label>
<label><span>Срок</span><select class="select" name="hours"><option value="0">Бессрочно</option><option value="1">1 час</option><option value="24">24 часа</option><option value="168">7 дней</option><option value="720">30 дней</option></select></label>
<button class="btn btn-danger" type="submit"><i class="ti ti-ban"></i>Заблокировать</button>
</form>
</section>{% endif %}
<section class="security-list-section">
<div class="section-header"><div class="section-icon"><i class="ti ti-shield-lock"></i></div><div><div class="section-eyebrow">Безопасность</div><h2>Заблокированные IP</h2><p class="section-desc">Постоянные и ограниченные по времени блокировки.</p></div><div class="section-header-right"><form method="get" class="security-filter"><div class="input-wrap"><i class="ti ti-search"></i><input class="input" name="q" value="{{ q }}" placeholder="IP или причина"></div><button class="btn btn-secondary" type="submit"><i class="ti ti-filter"></i>Найти</button></form></div></div>
<div class="card security-table-card ax-list-card"><div class="ax-list-head"><div class="ax-list-title"><span class="icon-tile" style="--tile-bg:var(--red-100);--tile-fg:var(--red-600)"><i class="ti ti-shield-lock"></i></span><div><h2>Активные блокировки</h2><p class="text-secondary">Адреса, для которых ограничен доступ к сайту.</p></div></div><span class="badge badge-red">{{ rows|length }}</span></div><div class="table-responsive"><table class="table"><thead><tr><th>IP-адрес</th><th>Причина</th><th>Создано</th><th>Срок</th><th class="table-actions">Действия</th></tr></thead><tbody>
{% for row in rows %}<tr><td class="mono"><strong>{{ row.ip }}</strong></td><td>{{ row.reason ?: 'Без комментария' }}</td><td>{{ row.created_at|date('d.m.Y H:i') }}</td><td>{% if row.expires_at %}<span class="badge badge-amber">до {{ row.expires_at|date('d.m.Y H:i') }}</span>{% else %}<span class="badge badge-red">Бессрочно</span>{% endif %}</td><td class="table-actions">{% if can_manage %}<button class="btn btn-icon btn-danger-ghost" type="button" data-ip-unblock="{{ row.id }}" title="Разблокировать"><i class="ti ti-lock-open"></i></button>{% endif %}</td></tr>
{% else %}<tr><td colspan="5"><div class="empty-state"><i class="ti ti-shield-check"></i><p>Заблокированных адресов нет</p></div></td></tr>{% endfor %}
</tbody></table></div></div>
</section>
</div>
{% endblock %}