feat: интерактивный установщик install.sh (Docker / Ubuntu, админ, БД)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-17 13:57:54 +03:00
parent dedef454c8
commit db4bc9bfe1
28 changed files with 1069 additions and 22 deletions
+69
View File
@@ -0,0 +1,69 @@
<%- include('../partials/layout-start') %>
<div class="admin-header">
<h1>Промокоды и скидки</h1>
<nav class="admin-nav">
<a href="/admin" class="admin-nav__link">Обзор</a>
<a href="/admin/orders" class="admin-nav__link">Заказы</a>
<a href="/admin/users" class="admin-nav__link">Пользователи</a>
<a href="/admin/products" class="admin-nav__link">Товары</a>
<a href="/admin/promo-codes" class="admin-nav__link admin-nav__link--active">Промокоды</a>
<a href="/admin/reservations" class="admin-nav__link">Бронирования</a>
<a href="/" class="admin-nav__link">В магазин</a>
</nav>
</div>
<% if (created) { %><p class="alert alert--success">Промокод создан</p><% } %>
<section class="card account-section--narrow" style="margin-bottom:1.5rem">
<h2>Новый промокод</h2>
<form action="/admin/promo-codes" method="post" class="form">
<label class="label">Код <input type="text" name="code" class="input" required placeholder="SUMMER20"></label>
<label class="label">Описание <input type="text" name="description" class="input" placeholder="Летняя скидка"></label>
<label class="label">Тип скидки
<select name="discount_type" class="input">
<option value="percent">Процент %</option>
<option value="fixed">Фиксированная (₽)</option>
</select>
</label>
<label class="label">Значение (10 = 10% или 500 ₽) <input type="number" name="discount_value" class="input" min="1" required></label>
<label class="label">Действует дней <input type="number" name="valid_days" class="input" value="30" min="1"></label>
<label class="label">Мин. сумма заказа (₽) <input type="number" name="min_order_rub" class="input" value="0" min="0"></label>
<label class="label">Лимит использований (пусто = без лимита) <input type="number" name="max_uses" class="input" min="1"></label>
<button type="submit" class="btn btn--primary">Создать</button>
</form>
</section>
<table class="cart-table">
<thead>
<tr>
<th>Код</th>
<th>Скидка</th>
<th>До</th>
<th>Использовано</th>
<th>Статус</th>
<th></th>
</tr>
</thead>
<tbody>
<% promos.forEach(p => { %>
<tr>
<td><strong><%= p.code %></strong><br><span class="muted"><%= p.description %></span></td>
<td>
<% if (p.discount_type === 'percent') { %><%= p.discount_value %>%<% } else { %><%= formatPrice(p.discount_value) %><% } %>
<% if (p.min_order_cents > 0) { %><br><span class="muted">от <%= formatPrice(p.min_order_cents) %></span><% } %>
</td>
<td><%= new Date(p.expires_at).toLocaleString('ru-RU') %></td>
<td><%= p.use_count %><% if (p.max_uses) { %> / <%= p.max_uses %><% } %></td>
<td><%= p.active ? 'Активен' : 'Выкл.' %></td>
<td>
<form action="/admin/promo-codes/<%= p.id %>/toggle" method="post">
<button type="submit" class="btn btn--ghost btn--sm"><%= p.active ? 'Выключить' : 'Включить' %></button>
</form>
</td>
</tr>
<% }) %>
</tbody>
</table>
<%- include('../partials/layout-end') %>