Разработка витрины и кабинета продавца для маркетплейса
Личный кабинет продавца — один из ключевых модулей маркетплейса. От его удобства напрямую зависит, как быстро продавцы заполняют каталог, обрабатывают заказы и управляют своим присутствием на платформе. Плохой кабинет — это onboarding длиной в неделю, постоянные обращения в поддержку и отток поставщиков.
Архитектура модуля
Кабинет продавца — это отдельное SPA или набор страниц, изолированных от покупательской части. Работает в рамках той же Laravel/Node.js кодовой базы, но через отдельный middleware-стек с проверкой роли seller и привязкой к конкретному shop_id.
Основные разделы:
- Дашборд с ключевыми метриками (выручка, количество заказов, конверсия, рейтинг)
- Управление товарами: создание, редактирование, массовый импорт через Excel/CSV
- Управление заказами: статусы, трекинг, формирование этикеток
- Финансы: баланс, история выплат, запрос вывода средств
- Настройки магазина: описание, логотип, политики возврата, рабочие часы
Витрина продавца (публичная страница)
Публичная витрина — это /shop/{slug} с подборкой товаров, информацией о продавце и блоком рейтинга. Генерируется на сервере для SEO. Включает:
- Агрегированные данные: средний рейтинг, количество отзывов, процент выкупа
- Фильтрацию и поиск внутри магазина
- Кнопку подписки на магазин (для повторных покупок)
- Блок последних отзывов с ответами продавца
Управление товарами
Форма создания товара — сложный компонент с зависимыми полями. Набор атрибутов меняется в зависимости от категории (для электроники — гарантия и характеристики, для одежды — размерная сетка и состав). Реализуется через динамическую схему атрибутов, хранящуюся в базе.
category_attributes (category_id, attribute_name, type, required, options)
product_attribute_values (product_id, attribute_id, value)
Массовый импорт через очередь: файл загружается на S3, задача разбирает его построчно, создаёт товары и фото, отчёт об ошибках возвращается продавцу по email или в UI.
Дашборд — метрики в реальном времени
Данные дашборда не строятся по запросу — слишком дорого. Используется материализация:
- Таблица
seller_statsобновляется раз в час через scheduled job - Данные за текущий день считаются live через Redis-счётчики
- Графики строятся на основе
order_daily_aggregates— таблицы с предагрегированными данными по дням
Для визуализации подходит Recharts или Chart.js. Компонент дашборда получает данные через отдельный API-endpoint, не смешивая их с основным CRUD.
Обработка заказов продавцом
Продавец видит только заказы, содержащие его товары. Интерфейс обработки:
- Подтверждение заказа (переход в статус
confirmed, уведомление покупателю) - Передача в доставку: ввод трек-номера или вызов API службы доставки
- Отметка отправки: статус
shipped, автоматический email покупателю - Обработка возвратов: запрос возврата от покупателя → решение продавца → финансовая операция
Каждый переход статуса логируется в order_status_history с timestamps и actor_id.
Права доступа внутри кабинета
У крупного продавца может быть команда. Нужна система ролей внутри магазина:
| Роль | Товары | Заказы | Финансы | Настройки |
|---|---|---|---|---|
| Владелец | R/W | R/W | R/W | R/W |
| Менеджер | R/W | R/W | R | — |
| Склад | R | R/W | — | — |
Реализуется через Spatie Laravel Permission с tenant-scope: shop_id привязывается к каждой роли.
Технический стек и сроки
Backend: Laravel с Eloquent, политики Gate/Policy, очереди на Redis/Horizon Frontend: React с React Hook Form, TanStack Query, компоненты Shadcn/ui Хранение файлов: S3 (MinIO для self-hosted), генерация presigned URL для загрузки напрямую с браузера
Базовый кабинет (товары + заказы + дашборд без сложной аналитики) — 3–4 недели разработки. Полный модуль с массовым импортом, ролями в команде и финансовым разделом — 6–8 недель.







