Add admin panel: visit counter, product editor, screenshots upload

This commit is contained in:
shop
2026-06-25 16:59:21 +03:00
parent 6322aee714
commit 08727a1995
21 changed files with 1209 additions and 67 deletions
@@ -9,58 +9,77 @@
<link rel="stylesheet" href="/static/css/admin.css">
</head>
<body class="admin-body">
<header class="admin-header">
<div class="container admin-header__inner">
<a href="/admin/" class="logo">
<span class="logo__icon"></span>
<span class="logo__text">Shop Admin</span>
</a>
<div class="admin-header__user">
<span>{{.Email}}</span>
<form method="POST" action="/admin/logout">
<button type="submit" class="btn btn--ghost btn--sm">Выйти</button>
</form>
</div>
</div>
</header>
{{template "admin_nav" .}}
<main class="admin-main container">
<h1 class="admin-page-title">Панель управления</h1>
<div class="admin-stats">
<div class="admin-stat">
<span class="admin-stat__value">{{.ProductCount}}</span>
<span class="admin-stat__label">Товаров в каталоге</span>
<div class="admin-stat admin-stat--highlight">
<span class="admin-stat__value">{{.TotalVisits}}</span>
<span class="admin-stat__label">Всего посещений главной</span>
</div>
<div class="admin-stat admin-stat--highlight">
<span class="admin-stat__value">{{.TodayVisits}}</span>
<span class="admin-stat__label">Сегодня</span>
</div>
<div class="admin-stat">
<span class="admin-stat__value">{{len .Categories}}</span>
<span class="admin-stat__value">{{.ProductCount}}</span>
<span class="admin-stat__label">Товаров</span>
</div>
<div class="admin-stat">
<span class="admin-stat__value">{{.CategoryCount}}</span>
<span class="admin-stat__label">Категорий</span>
</div>
</div>
{{if .Categories}}
<div class="admin-actions">
<a href="/admin/products/new" class="btn btn--primary">+ Добавить товар</a>
<a href="/admin/products" class="btn btn--outline">Все товары</a>
<a href="/" class="btn btn--ghost" target="_blank">Открыть магазин ↗</a>
</div>
{{if .Products}}
<section class="admin-section">
<h2 class="admin-section__title">Категории</h2>
<h2 class="admin-section__title">Последние товары</h2>
<table class="admin-table">
<thead>
<tr>
<th>Фото</th>
<th>Название</th>
<th>Товаров</th>
<th>Категория</th>
<th>Цена</th>
<th>Статус</th>
<th></th>
</tr>
</thead>
<tbody>
{{range .Categories}}
{{range .Products}}
<tr>
<td>
{{if .ImageURL}}
<img src="{{.ImageURL}}" alt="" class="admin-thumb">
{{else}}
<span class="admin-thumb admin-thumb--empty"></span>
{{end}}
</td>
<td>{{.Name}}</td>
<td>{{.Count}}</td>
<td>{{.Category}}</td>
<td>{{printf "%.0f" .Price}} ₽</td>
<td>
{{if .IsActive}}
<span class="admin-badge admin-badge--ok">Активен</span>
{{else}}
<span class="admin-badge admin-badge--off">Скрыт</span>
{{end}}
</td>
<td><a href="/admin/products/{{.ID}}/edit" class="link">Изменить</a></td>
</tr>
{{end}}
</tbody>
</table>
</section>
{{end}}
<p class="admin-hint">Администратор создаётся автоматически из переменных <code>ADMIN_EMAIL</code> и <code>ADMIN_PASSWORD</code> в <code>.env</code>.</p>
</main>
</body>
</html>