ДВИЖОК (Engine) — Ядро магазина
Версия: 1.0.0
Дата: 2025-12-06
Принцип
Движок = минимальное ядро, которое нельзя отключить.
Всё остальное — модули или внешние сервисы.
1. КАТАЛОГ
Функции
| Функция |
Описание |
Best Practice |
| Категории |
2 уровня (категория → подкатегория) |
Плоская структура, max 2 уровня для UX |
| Товары |
CRUD, статусы, сортировка |
Черновик → Активен → Архив |
| Атрибуты |
Характеристики товаров |
Типизированные (число, строка, список) |
| Варианты |
Размер, цвет, комплектация |
SKU на каждый вариант |
| Цены |
Базовая, скидка, старая |
Отдельная сущность для мультивалюты |
| Остатки |
Количество на складе |
Резервирование при заказе |
| Медиа |
Фото, видео |
Отдельное хранилище (S3/CDN) |
Лучшие практики
- Slug — ЧПУ для категорий и товаров (
/category/product)
- SKU — уникальный код товара/варианта
- Soft delete — не удалять, а архивировать
- Версионирование — история изменений цен/остатков
Структура данных
Category
├── id, slug, name, parent_id
├── image, description
├── position, status
└── seo (title, description)
Product
├── id, slug, name, category_id
├── price, old_price, cost
├── stock, sku, status
├── description, short_description
├── attributes[], variants[]
├── images[], videos[]
└── seo (title, description, keywords)
2. КОРЗИНА
Функции
| Функция |
Описание |
Best Practice |
| Добавление |
Товар + количество |
Проверка остатков |
| Изменение |
+/- количество |
Min 1, max = остаток |
| Удаление |
Убрать товар |
Confirm не нужен |
| Сохранение |
Персистентность |
Cookie + DB (для авторизованных) |
| Слияние |
При авторизации |
Объединить гостевую + сохранённую |
| Пересчёт |
Итого, скидки |
При каждом изменении |
Лучшие практики
- Гостевая корзина — хранить в cookie/localStorage (30 дней)
- Авторизованная — синхронизация с сервером
- Проверка актуальности — при открытии проверять цены/остатки
- Резервирование — опционально, на этапе checkout
API
POST /cart/add {product_id, variant_id, qty}
PATCH /cart/update {item_id, qty}
DELETE /cart/remove {item_id}
GET /cart → {items[], total, discount}
POST /cart/merge (при авторизации)
3. ЗАКАЗ
Функции
| Функция |
Описание |
Best Practice |
| Создание |
Из корзины |
Одна транзакция |
| Статусы |
Жизненный цикл |
Конечный автомат |
| История |
Лог изменений |
Кто, когда, что |
| Уведомления |
Email/SMS/Push |
При смене статуса |
| Отмена |
Возврат остатков |
Только до отправки |
Статусы заказа
new → confirmed → paid → processing → shipped → delivered → completed
↓ ↓
cancelled returned
Лучшие практики
- Номер заказа — понятный формат (2025-001234)
- Атомарность — заказ создаётся целиком или не создаётся
- Идемпотентность — защита от дублей
- Аудит — полная история изменений
Структура данных
Order
├── id, number, user_id (nullable)
├── status, created_at, updated_at
├── items[] {product, variant, price, qty}
├── shipping {method, address, cost, tracking}
├── payment {method, status, transaction_id}
├── totals {subtotal, shipping, discount, total}
├── customer {name, phone, email}
└── history[] {status, date, comment, user}
4. ПОЛЬЗОВАТЕЛИ
Функции
| Функция |
Описание |
Best Practice |
| Регистрация |
Создание аккаунта |
Минимум полей (телефон/email) |
| Авторизация |
Вход в систему |
Множественные методы |
| Профиль |
Данные пользователя |
Редактирование |
| Адреса |
Сохранённые адреса |
Множественные |
| История |
Заказы, просмотры |
Полная история |
| Сессии |
Активные устройства |
Управление |
Методы авторизации
| Метод |
Реализация |
Приоритет |
| Телефон + SMS |
Код 4-6 цифр |
#1 (основной) |
| Телефон + звонок |
Последние 4 цифры |
#2 (резерв) |
| VK ID |
OAuth 2.0 |
#3 |
| Яндекс ID |
OAuth 2.0 |
#4 |
| Госуслуги (ЕСИА) |
OAuth 2.0 + сертификат |
#5 (доверие) |
| Google |
OAuth 2.0 |
#6 |
| Email + пароль |
Classic |
#7 (legacy) |
Лучшие практики
- Phone-first — телефон как основной идентификатор
- Passwordless — SMS/звонок вместо пароля
- Гостевой checkout — покупка без регистрации
- Merge accounts — объединение при конфликте
- GDPR/152-ФЗ — согласие на обработку данных
Структура данных
User
├── id, phone (unique), email
├── name, created_at
├── addresses[] {title, address, city, zip, default}
├── oauth_connections[] {provider, provider_id}
└── settings {notifications, language}
5. ПОИСК (базовый)
Функции
| Функция |
Описание |
Best Practice |
| Полнотекстовый |
По названию, описанию |
PostgreSQL FTS / SQLite FTS5 |
| Фильтрация |
По атрибутам, цене |
Индексы |
| Сортировка |
Цена, популярность, новизна |
Предустановленные |
Лучшие практики
- Базовый поиск в движке — простой LIKE или FTS
- Умный поиск — внешний сервис (Elasticsearch, Algolia)
- Индексация — асинхронная, при изменении товара
API
GET /search?q=...&category=...&price_min=...&sort=...
→ {products[], facets{}, total, page}
6. АДМИНКА
Функции
| Раздел |
Описание |
| Dashboard |
Статистика, графики |
| Каталог |
Категории, товары |
| Заказы |
Список, детали, статусы |
| Клиенты |
Пользователи, история |
| Настройки |
Общие, доставка, оплата |
| Контент |
Страницы, баннеры |
Лучшие практики
- Роли — admin, manager, operator
- Аудит — лог всех действий
- Bulk actions — массовые операции
- Фильтры/поиск — во всех списках
7. API
Принципы
| Принцип |
Описание |
| REST |
Ресурсо-ориентированный |
| JSON |
Формат данных |
| Версионирование |
/api/v1/ |
| Аутентификация |
JWT / API Key |
| Rate limiting |
Защита от перегрузки |
| CORS |
Для SPA фронта |
Эндпоинты (основные)
# Каталог
GET /api/v1/categories
GET /api/v1/categories/:slug
GET /api/v1/products
GET /api/v1/products/:slug
# Корзина
GET /api/v1/cart
POST /api/v1/cart/items
PATCH /api/v1/cart/items/:id
DELETE /api/v1/cart/items/:id
# Заказы
POST /api/v1/orders
GET /api/v1/orders
GET /api/v1/orders/:id
# Пользователи
POST /api/v1/auth/send-code
POST /api/v1/auth/verify
GET /api/v1/profile
PATCH /api/v1/profile
8. SEO (базовый)
Функции
| Функция |
Описание |
Best Practice |
| ЧПУ |
Человекопонятные URL |
/category/product |
| Meta |
title, description |
Шаблоны + ручное |
| Sitemap |
XML карта сайта |
Автогенерация |
| Robots.txt |
Индексация |
Настраиваемый |
| Canonical |
Основной URL |
Для дублей |
| Schema.org |
Микроразметка |
Product, BreadcrumbList |
Лучшие практики
- Шаблоны meta —
{product} купить в {city} | {shop}
- Уникальность — проверка дублей title/description
- Редиректы — 301 при изменении URL
- Микроразметка — Product, Offer, AggregateRating
Резюме
| Компонент |
Сложность |
Критичность |
| Каталог |
Высокая |
Критично |
| Корзина |
Средняя |
Критично |
| Заказ |
Высокая |
Критично |
| Пользователи |
Средняя |
Критично |
| Поиск (базовый) |
Низкая |
Важно |
| Админка |
Высокая |
Критично |
| API |
Средняя |
Критично |
| SEO |
Низкая |
Важно |
Версия: 1.0.0