feat: согласие на cookies — блокировка входа и регистрации

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-17 11:32:08 +03:00
parent 14e0e875f1
commit bda73e1662
13 changed files with 222 additions and 4 deletions
+24
View File
@@ -0,0 +1,24 @@
<%- include('partials/layout-start') %>
<article class="legal-page card">
<h1>Политика использования cookies</h1>
<h2>Что такое cookies</h2>
<p>Cookies — небольшие файлы, которые сайт сохраняет в браузере для корректной работы сервиса.</p>
<h2>Какие cookies мы используем</h2>
<ul>
<li><strong>cookie_consent</strong> — запоминает ваш выбор (принятие политики), срок до 1 года.</li>
<li><strong>connect.sid</strong> — сессия: корзина, вход в аккаунт, безопасность. Удаляется после выхода или по истечении срока.</li>
</ul>
<h2>Без согласия</h2>
<p>Вы можете просматривать каталог. Вход, регистрация и личный кабинет недоступны до нажатия «Принимаю».</p>
<h2>Управление</h2>
<p>Вы можете удалить cookies в настройках браузера. После этого потребуется снова принять политику и войти в аккаунт.</p>
<p><a href="/">← На главную</a></p>
</article>
<%- include('partials/layout-end') %>
+15
View File
@@ -0,0 +1,15 @@
<%- include('partials/layout-start', { returnTo: returnTo }) %>
<div class="cookies-required">
<h1>Согласие на cookies</h1>
<p>Для этой страницы (вход, регистрация, личный кабинет) необходимо принять использование cookies.</p>
<p class="muted">Мы сохраняем только технические cookies для сессии и безопасности.</p>
<form action="/cookies/accept" method="post" class="cookie-banner__actions" style="margin-top:1rem">
<input type="hidden" name="return_to" value="<%= returnTo %>">
<button type="submit" class="btn btn--primary btn--lg">Принимаю cookies</button>
<a href="/" class="btn btn--ghost">На главную</a>
</form>
<p style="margin-top:1rem"><a href="/cookies/policy">Политика cookies</a></p>
</div>
<%- include('partials/layout-end') %>
+18
View File
@@ -0,0 +1,18 @@
<% if (!cookieConsent) { %>
<div class="cookie-banner" role="dialog" aria-labelledby="cookie-banner-title" aria-live="polite">
<div class="cookie-banner__inner container">
<div class="cookie-banner__text">
<p id="cookie-banner-title"><strong>Мы используем cookies</strong></p>
<p class="muted">
Для входа, регистрации и личного кабинета нужны технические cookies (сессия).
Продолжая без согласия, каталог доступен; авторизация и регистрация — нет.
<a href="/cookies/policy">Подробнее</a>
</p>
</div>
<form action="/cookies/accept" method="post" class="cookie-banner__actions">
<input type="hidden" name="return_to" value="<%= typeof returnTo !== 'undefined' ? returnTo : '/' %>">
<button type="submit" class="btn btn--primary">Принимаю</button>
</form>
</div>
</div>
<% } %>
+2 -1
View File
@@ -1,8 +1,9 @@
</main>
<footer class="footer">
<div class="container">
<p>&copy; <%= new Date().getFullYear() %> Shop — локальный интернет-магазин на Node.js + SQLite</p>
<p>&copy; <%= new Date().getFullYear() %> Shop · <a href="/cookies/policy">Cookies</a></p>
</div>
</footer>
<%- include('cookie-banner') %>
</body>
</html>
+4 -1
View File
@@ -30,9 +30,12 @@
<form action="/logout" method="post" class="inline-form">
<button type="submit" class="btn btn--ghost btn--sm">Выйти</button>
</form>
<% } else { %>
<% } else if (cookieConsent) { %>
<a href="/login" class="nav__link">Вход</a>
<a href="/register" class="btn btn--primary btn--sm">Регистрация</a>
<% } else { %>
<span class="nav__link nav__link--disabled" title="Примите cookies">Вход</span>
<span class="nav__link nav__link--disabled" title="Примите cookies">Регистрация</span>
<% } %>
</nav>
</div>