Интернет-магазин «Дверь&Пол»
Полноценная e-commerce платформа для розничного продавца межкомнатных дверей, напольных покрытий и фурнитуры: витрина с гибким каталогом и фасетными фильтрами, корзина и оформление заказа, административная панель для контент-менеджеров, а также мгновенная доставка заявок и заказов в Telegram. Проект построен на ASP.NET Core и сознательно обходится без тяжелого SPA-фреймворка: вместо него работает собственный легкий слой маршрутизации поверх Minimal API с серверным рендерингом HTML-фрагментов, что обеспечило быструю отрисовку, низкую стоимость поддержки и предсказуемое поведение каталога даже на тысячах товарных позиций.
Задача
Бизнесу требовался каталог, который коробочные CMS закрывают плохо. Товарные группы слишком разнородны: у дверей есть сторона открывания, габариты и покрытие, у ламината класс износостойкости и тип замка, у фурнитуры собственный набор атрибутов. Под каждую категорию нужен был свой произвольный набор характеристик и фильтров, причем заводить их должен контент-менеджер без участия программиста.
Дополнительные требования усложняли картину:
- Двери продаются парами левого и правого исполнения, но в каталоге это один товар с переключателем варианта, а не два отдельных дубля.
- Категории имеют произвольную вложенность, и фильтр в родительской категории должен охватывать все вложенные подкатегории.
- Заявки с сайта и заказы должны попадать к менеджерам за секунды, без постоянно открытой CRM или почты.
- Витрина должна быстро загружаться и оставаться легкой в обслуживании, без раздувания инфраструктуры.
Решение
Каталог построен на гибкой модели характеристик: атрибуты, их допустимые значения и привязки к товарам вынесены в отдельные сущности, поэтому добавление нового параметра или целой категории не требует изменения схемы базы и правок в коде. Характеристики наследуются вниз по дереву категорий рекурсивно, так что фильтр, заданный на верхнем уровне, автоматически работает во всех вложенных разделах.
Варианты товара решены через группировку дочерних позиций вокруг родительской. Для дверей реализовано автоматическое создание зеркального исполнения: при сохранении одной карточки вторая сторона генерируется системой сама. На странице товара алгоритм сам определяет, какие характеристики отличают варианты друг от друга, и выводит их как переключатели, мгновенно ведущие на соседнюю товарную позицию.
Фасетные фильтры объединяют выбор по характеристикам и диапазон цены, а их состояние синхронизировано с адресной строкой, поэтому отфильтрованную выборку можно сохранить в закладки и переслать. Сервер отдает уже готовую отрисованную сетку товаров, фронтенд лишь подставляет ее в страницу.
Лиды и заказы доставляются в Telegram: телефон из быстрой заявки и состав корзины из оформления заказа уходят во все привязанные чаты менеджеров за секунды.
Архитектура и сложности
Ядро приложения это собственный компактный слой маршрутизации поверх Minimal API. При старте сборка сканируется через рефлексию, контроллеры-классы находятся автоматически и сами регистрируют свои маршруты, что убирает ручную проводку эндпоинтов. Отдельный механизм рендерит Razor-фрагменты в строку и возвращает их по AJAX, давая интерфейсу ощущение одностраничного приложения при полностью серверной отрисовке и минимуме клиентского кода.
Наиболее тонкая часть это рекурсивная работа с деревом категорий и наследованием характеристик, а также корректное определение различающихся параметров между вариантами товара, чтобы переключатели на карточке вели именно на нужную позицию и не дублировали неизменные атрибуты. Отдельное внимание ушло на фильтрацию, которая должна одновременно сужать и список товаров, и список доступных значений характеристик, оставаясь согласованной.
Контур безопасности включает авторизацию по зашифрованному cookie-токену, хранение паролей в виде соли и хеша, а также собственный атрибут авторизации с проверкой в middleware и редиректом неаутентифицированных пользователей на вход. Фоновые задачи вынесены в планировщик Quartz, а для будущих сценариев реального времени заложен канал SignalR с компактным бинарным протоколом MessagePack.
Фронтенд намеренно легкий: вместо фреймворка применен набор небольших собственных плагинов поверх jQuery (вкладки, редактируемый выпадающий список, галерея изображений с полноэкранным просмотром, маски телефонов, всплывающие уведомления), а корзина и избранное живут в cookie без лишних запросов к серверу.
Результат
- Рабочий магазин с витриной и админкой выведен в продакшен в сжатые сроки благодаря легкой архитектуре без тяжелых зависимостей.
- Каталог масштабируется на тысячи позиций и любую глубину вложенности категорий без изменения схемы базы данных.
- Новая категория со своим набором фильтров заводится силами контент-менеджера, без привлечения разработки, что снимает узкое место в наполнении магазина.
- Автогенерация зеркального исполнения дверей сократила время заведения карточки примерно вдвое и исключила рассинхрон между парными позициями.
- Заявки и заказы доходят до менеджеров за секунды через Telegram, что ускоряет обработку обращений и снижает риск потери лида.
- Отказ от SPA в пользу серверного рендеринга фрагментов дал легкую первичную загрузку, низкое потребление ресурсов и простую поддерживаемость кодовой базы.
Стек
ASP.NET Core (.NET, Razor Pages, Minimal API), C#, MS SQL Server, linq2db, SignalR с протоколом MessagePack, Quartz.NET, шифрование Rijndael, интеграция с Telegram Bot API, HtmlAgilityPack, jQuery и собственные UI-компоненты, серверный рендеринг HTML-фрагментов поверх AJAX.
