шаг 4 завершен
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
# Анализ каталога и логика рекомендаций
|
||||
|
||||
## Главный вывод
|
||||
|
||||
Старый каталог нельзя переносить как одну длинную ленту товаров. В списке одновременно есть розничные позиции 100-500 г, домашние фасовки 1-5 кг, семейные закупки 5-10 кг, крупные короба 20-40 кг, премиальные деликатесы, бакалея, мясо, молочная продукция и HoReCa-позиции.
|
||||
|
||||
Если покупатель смотрит форель 1 кг, ему нельзя случайно показывать 20 кг говяжьего оковалка. Рекомендации должны учитывать сценарий покупки, размер фасовки, категорию и ценовой уровень. Иначе каталог будет казаться хаотичным и будет снижать доверие.
|
||||
|
||||
## Сценарные сегменты
|
||||
|
||||
Каталог нужно вести не только по категориям старого сайта, но и по понятным покупательским сценариям:
|
||||
|
||||
- Для дома: 100-500 г, 1 кг, банки, небольшие упаковки, продукты на пробу.
|
||||
- Для семьи: 2-5 кг и понятные продукты для регулярной покупки.
|
||||
- Для совместной покупки: 5-15 кг, где удобно разделить с соседями или родственниками.
|
||||
- Большая фасовка: 10-40 кг, короба, монолит, ящики, выгодная цена за объем.
|
||||
- HoReCa: рестораны, кафе, магазины, позиции с большими объемами и стабильным спросом.
|
||||
- Премиум: икра, семга, палтус, клыкач, краб, гребешок, дорогие сыры.
|
||||
- К пиву: вяленая, копченая рыба, балыки, юкола, снеки.
|
||||
- Быстро приготовить: котлеты, наггетсы, стрипсы, жареная рыба, овощные смеси.
|
||||
- Для суши: нори, рис, угорь, креветки, чука, имбирь, соусы, красная рыба.
|
||||
- Диетическое: филе без кожи, белая рыба, индейка, овощи, ягоды.
|
||||
|
||||
## Какие признаки нужно хранить
|
||||
|
||||
Для правильной витрины и рекомендаций у товара должны быть не только категория и цена, но и дополнительные признаки:
|
||||
|
||||
- размер фасовки: малая, средняя, крупная;
|
||||
- тип покупки: дом, семья, совместная покупка, HoReCa;
|
||||
- тип заморозки: штучная, монолитная, охлажденная;
|
||||
- обработка: филе, стейк, без кожи, без головы, с головой, неразделанная;
|
||||
- назначение: к пиву, для суши, быстро приготовить, премиум, диетическое;
|
||||
- ценовой сегмент: бюджетный, средний, премиум;
|
||||
- совместимость: что логично докупить к этому товару.
|
||||
|
||||
## Рекомендации
|
||||
|
||||
Блоки рекомендаций должны быть управляемыми:
|
||||
|
||||
- Похожие товары: та же категория, близкая фасовка, близкий ценовой уровень.
|
||||
- С этим покупают: товары, которые реально дополняют покупку.
|
||||
- Выгоднее коробом: только если человек уже смотрит похожий продукт и большая фасовка уместна.
|
||||
- Малая фасовка: если товар тяжелый или дорогой, предлагать более доступный вариант.
|
||||
- Собрать набор: например для суши, ужина, закусок к пиву, семейной закупки.
|
||||
- Популярное в категории: не просто случайные товары, а релевантные текущей категории.
|
||||
|
||||
## Чего нельзя делать
|
||||
|
||||
- Не смешивать малую домашнюю покупку с тяжелым HoReCa-оптом без явного сценария.
|
||||
- Не показывать мясо к рыбе только потому, что оно популярное.
|
||||
- Не поднимать наверх дорогие деликатесы, если покупатель ищет бюджетную белую рыбу.
|
||||
- Не показывать 20-30 кг монолит человеку, который выбирает 300 г, 500 г или 1 кг.
|
||||
- Не делать одну общую популярную ленту без категорий, фасовок и сценариев.
|
||||
|
||||
## Что заложено в базу
|
||||
|
||||
В схему добавлены таблицы:
|
||||
|
||||
- `product_segments` - сценарные группы товаров;
|
||||
- `product_segment_links` - связь товара с сегментами;
|
||||
- `product_badges` - короткие бейджи товара;
|
||||
- `product_badge_links` - связь товара с бейджами;
|
||||
- `recommendation_rules` - управляемые правила рекомендаций;
|
||||
- `product_relations` - ручные и автоматические связи между товарами;
|
||||
- `product_events` - события для будущего обучения: просмотр, корзина, заказ, сравнение, клик по рекомендации.
|
||||
|
||||
Это позволит сначала настроить рекомендации вручную, а потом постепенно делать их умнее по реальному поведению покупателей.
|
||||
|
||||
## Как использовать при переносе товаров
|
||||
|
||||
При импорте со старого сайта каждый товар нужно не только положить в старую категорию, но и автоматически проставить предварительные сегменты и бейджи по названию, фасовке и цене.
|
||||
|
||||
Примеры:
|
||||
|
||||
- 100-500 г, банка, 1 кг: `Для дома`, `Малая фасовка`.
|
||||
- 3-10 кг: `Для семьи` или `Для совместной покупки`.
|
||||
- 10-40 кг: `Большая фасовка`, иногда `HoReCa`.
|
||||
- Вяленая/копченая/балык/юкола: `К пиву`.
|
||||
- Нори, рис, угорь, чука, имбирь, креветки: `Для суши`.
|
||||
- Краб, гребешок, клыкач, икра, дорогая семга: `Премиум`.
|
||||
- Котлеты, наггетсы, стрипсы, блинчики, овощные смеси: `Быстро приготовить`.
|
||||
|
||||
После автоматической разметки администратор должен иметь возможность быстро поправить сегменты и бейджи вручную.
|
||||
|
||||
## Идеальный следующий уровень
|
||||
|
||||
Для удобства покупателей стоит добавить:
|
||||
|
||||
- переключатель "Для дома / Для семьи / Оптом";
|
||||
- фильтр по фасовке: до 1 кг, 1-5 кг, 5-10 кг, 10 кг и больше;
|
||||
- блок "Можно взять на пробу";
|
||||
- блок "Выгодно разделить";
|
||||
- блок "Собрать набор";
|
||||
- блок "Не знаете что выбрать?" с мягкими готовыми сценариями;
|
||||
- умную сортировку, где сначала идут релевантные товары, а не случайная популярность.
|
||||
|
||||
Так сайт будет выглядеть не как складская выгрузка, а как понятный помощник в покупке.
|
||||
@@ -0,0 +1,173 @@
|
||||
# Анализ первых товаров и атрибутов
|
||||
|
||||
## Что видно по присланному списку
|
||||
|
||||
Товары нельзя хранить только как "название + цена". Для удобного сайта и админки нужны:
|
||||
|
||||
- товар;
|
||||
- одна или несколько фасовок;
|
||||
- цена за кг, если товар весовой;
|
||||
- цена за упаковку;
|
||||
- тип заморозки;
|
||||
- тип обработки/разделки;
|
||||
- происхождение;
|
||||
- размер или калибр;
|
||||
- вид приготовления;
|
||||
- тип фасовки.
|
||||
|
||||
## Новые группы атрибутов
|
||||
|
||||
В `database/seed.sql` добавлены группы:
|
||||
|
||||
- Упаковка;
|
||||
- Размер рыбы;
|
||||
- Размер креветки;
|
||||
- Тип обработки;
|
||||
- Тип заморозки;
|
||||
- Происхождение;
|
||||
- Размер / калибр;
|
||||
- Вид приготовления;
|
||||
- Тип фасовки.
|
||||
|
||||
## Примеры признаков из товаров
|
||||
|
||||
### Тип заморозки
|
||||
|
||||
- штучная заморозка;
|
||||
- монолитная заморозка;
|
||||
- свежемороженые;
|
||||
- охлажденная.
|
||||
|
||||
### Тип обработки
|
||||
|
||||
- неразделанная;
|
||||
- разделанная с головой;
|
||||
- потрошеная без головы;
|
||||
- без головы;
|
||||
- с головой;
|
||||
- без кожи;
|
||||
- филе;
|
||||
- стейк.
|
||||
|
||||
### Вид приготовления
|
||||
|
||||
- слабосоленая;
|
||||
- вяленая;
|
||||
- горячего копчения;
|
||||
- холодного копчения;
|
||||
- в кляре;
|
||||
- в масле;
|
||||
- с морской капустой.
|
||||
|
||||
### Происхождение
|
||||
|
||||
- Вьетнам;
|
||||
- Камчатка;
|
||||
- Япономорская;
|
||||
- Сахалин;
|
||||
- Каспийская;
|
||||
- Цимлянская;
|
||||
- Чили;
|
||||
- Армения;
|
||||
- Средиземноморская;
|
||||
- Севанская.
|
||||
|
||||
### Размер / калибр
|
||||
|
||||
- 1 кг и более;
|
||||
- 4 кг и более;
|
||||
- 7-8 кг;
|
||||
- L2;
|
||||
- U4;
|
||||
- 16-20.
|
||||
|
||||
## Правила отображения цены
|
||||
|
||||
### Весовой товар с крупной фасовкой
|
||||
|
||||
Пример: горбуша 22 кг, цена 559 руб./кг.
|
||||
|
||||
Показывать:
|
||||
|
||||
- цена за кг: 559 руб.;
|
||||
- за упаковку 22 кг: 12298 руб.;
|
||||
- выбор фасовки: 22 кг или 11 кг.
|
||||
|
||||
### Единственная упаковка 1 кг
|
||||
|
||||
Пример: креветки 1 кг.
|
||||
|
||||
Показывать аккуратно:
|
||||
|
||||
- цена за упаковку 1 кг;
|
||||
- можно не дублировать одинаковую цену два раза, если это визуально перегружает карточку.
|
||||
|
||||
### Маленькая фиксированная упаковка
|
||||
|
||||
Пример: кукумария 200 г.
|
||||
|
||||
Показывать:
|
||||
|
||||
- за упаковку 200 г: 300 руб.;
|
||||
- не пересчитывать за кг, если это не нужно покупателю.
|
||||
|
||||
### Порционная фасовка
|
||||
|
||||
Пример: стейки тунца 0.5 кг.
|
||||
|
||||
Показывать:
|
||||
|
||||
- за упаковку 0.5 кг;
|
||||
- кратность покупки 0.5 кг.
|
||||
|
||||
## Что стоит сделать для удобства покупателей
|
||||
|
||||
- Бейдж "крупная фасовка" для 10 кг, 20 кг, 22 кг и похожих упаковок.
|
||||
- Бейдж "малая фасовка" для 1 кг, 0.5 кг, 200 г.
|
||||
- Бейдж "штучная заморозка" для удобного разделения продукта.
|
||||
- Бейдж "монолитная заморозка" там, где важно предупредить покупателя.
|
||||
- Фильтр "разделка": неразделанная, разделанная, филе, стейк, без головы.
|
||||
- Фильтр "тип заморозки".
|
||||
- Фильтр "страна/регион происхождения".
|
||||
- Фильтр "размер/калибр".
|
||||
|
||||
## Как это ляжет в админку
|
||||
|
||||
У товара должны быть общие поля:
|
||||
|
||||
- название;
|
||||
- категория;
|
||||
- описание;
|
||||
- SEO;
|
||||
- фото;
|
||||
- опубликован/не опубликован.
|
||||
|
||||
У товара должны быть атрибуты:
|
||||
|
||||
- какие группы применяются к этому товару: например Упаковка и Размер рыбы.
|
||||
|
||||
У каждой фасовки/варианта должны быть:
|
||||
|
||||
- упаковка;
|
||||
- размер/калибр, если есть;
|
||||
- цена;
|
||||
- старая цена;
|
||||
- код товара;
|
||||
- артикул;
|
||||
- вес/объем/штук;
|
||||
- доступность;
|
||||
- публикация;
|
||||
- значения атрибутов.
|
||||
|
||||
## Следующее действие
|
||||
|
||||
Нужно получить полный список атрибутов из старой админки, особенно:
|
||||
|
||||
- все значения упаковки;
|
||||
- все размеры рыбы;
|
||||
- все размеры креветок;
|
||||
- все варианты разделки;
|
||||
- все варианты заморозки;
|
||||
- все регионы/страны происхождения.
|
||||
|
||||
После этого можно сделать удобную форму товара в админке не одной строкой, а таблицей фасовок как на старом сайте.
|
||||
@@ -0,0 +1,102 @@
|
||||
# Шаг 4. Каталог, роутинг и первые формы админки
|
||||
|
||||
## Что сделано
|
||||
|
||||
Добавлен базовый роутинг:
|
||||
|
||||
- `/` - главная;
|
||||
- `/catalog` - полный каталог;
|
||||
- `/catalog/{slug}` - страница категории;
|
||||
- 404-страница.
|
||||
|
||||
Добавлены файлы:
|
||||
|
||||
- `app/Core/Router.php`;
|
||||
- `app/Controllers/CatalogController.php`;
|
||||
- `views/catalog/index.php`;
|
||||
- `views/partials/product-card.php`;
|
||||
- `views/pages/404.php`;
|
||||
- `public/.htaccess`.
|
||||
|
||||
## Навигация
|
||||
|
||||
Каталог получил боковую навигацию по категориям:
|
||||
|
||||
- главное дерево категорий;
|
||||
- вложенность до третьего уровня;
|
||||
- подсветка текущей категории;
|
||||
- липкая боковая панель на desktop;
|
||||
- адаптация под мобильный вид.
|
||||
|
||||
Хлебные крошки и кнопка "Вернуться назад" уже работают через общий layout.
|
||||
|
||||
## Товары в каталоге
|
||||
|
||||
Каталог готов выводить опубликованные товары и фасовки.
|
||||
|
||||
Для страницы категории товары выбираются не только из самой категории, но и из всех вложенных подкатегорий.
|
||||
|
||||
Пока товаров нет, выводится понятное сообщение о будущем переносе каталога.
|
||||
|
||||
## Админка
|
||||
|
||||
Добавлены первые формы:
|
||||
|
||||
- `/admin/categories.php` - добавление категории/подкатегории;
|
||||
- `/admin/products.php` - добавление товара с одной стартовой фасовкой.
|
||||
|
||||
Это первичная техническая админка без авторизации. Полноценный защищенный вход администратора нужно сделать отдельным следующим шагом.
|
||||
|
||||
## Атрибуты и фасовки
|
||||
|
||||
После сравнения со старой админкой в схему добавлена расширенная модель атрибутов:
|
||||
|
||||
- `attribute_groups` - группы атрибутов, например "Упаковка", "Размер рыбы", "Размер креветки", "Тип заморозки", "Происхождение";
|
||||
- `attribute_values` - значения атрибутов, например "20 кг", "10 кг", "31/40", "штучная заморозка", "монолитная заморозка";
|
||||
- `product_attribute_groups` - какие группы используются у конкретного товара;
|
||||
- `variant_attribute_values` - какие значения выбраны у конкретной фасовки/варианта.
|
||||
|
||||
В `product_variants` добавлены поля:
|
||||
|
||||
- `code`;
|
||||
- `article`;
|
||||
- `volume_or_pieces`;
|
||||
- `old_package_price`.
|
||||
|
||||
Это нужно, чтобы повторить удобную логику старой админки: один товар, несколько строк фасовок, разные цены, вес/объем/штук, код товара, артикул и дополнительные атрибуты.
|
||||
|
||||
Дополнительный анализ первых товаров и атрибутов вынесен в `docs/АНАЛИЗ_ПЕРВЫХ_ТОВАРОВ_И_АТРИБУТОВ.md`.
|
||||
|
||||
## Дополнение: сценарный каталог и рекомендации
|
||||
|
||||
После анализа большого списка товаров со старого сайта стало понятно, что каталог нельзя строить только как длинную ленту из 42 страниц. В ассортименте смешаны маленькие позиции для дома, семейные фасовки, крупные короба, HoReCa, премиальные деликатесы, бакалея, мясо, молочная продукция и полуфабрикаты.
|
||||
|
||||
В базу добавлена архитектура для умных, но управляемых рекомендаций:
|
||||
|
||||
- `product_segments` и `product_segment_links` - сценарные сегменты: для дома, для семьи, большая фасовка, HoReCa, премиум, к пиву, быстро приготовить, для суши и другие;
|
||||
- `product_badges` и `product_badge_links` - короткие бейджи для карточек и фильтров;
|
||||
- `recommendation_rules` - правила, которые можно будет контролировать из админки;
|
||||
- `product_relations` - ручные и автоматические связи между товарами;
|
||||
- `product_events` - события для будущего обучения: просмотры, корзина, заказ, сравнение, клики по рекомендациям.
|
||||
|
||||
Подробный вывод вынесен в `docs/АНАЛИЗ_КАТАЛОГА_И_РЕКОМЕНДАЦИЙ.md`.
|
||||
|
||||
## Дополнение: навигация, скидки и проходные цены
|
||||
|
||||
После проверки страниц добавлены еще три важных требования:
|
||||
|
||||
- дерево категорий должно раскрываться на каждом уровне, чтобы страницы вроде "Рыба" не превращались в длинное полотно;
|
||||
- у фасовки должна быть скидочная модель: текущая цена, старая перечеркнутая цена, ручная установка скидки и процентная скидка с автоматическим пересчетом;
|
||||
- на главной странице нужен блок "Запрос проходных цен", где покупатель сможет отправить список позиций текстом или прикрепленным файлом, а заявка уйдет администратору на почту.
|
||||
|
||||
В схему добавлены поля `discount_type`, `discount_percent`, используется `old_package_price`, а также таблица `price_requests` для будущих заявок проходных цен.
|
||||
|
||||
## Следующий шаг
|
||||
|
||||
Шаг 5:
|
||||
|
||||
1. Сделать авторизацию администратора.
|
||||
2. Защитить `/admin/`.
|
||||
3. Улучшить формы редактирования категорий и товаров.
|
||||
4. Добавить редактирование и удаление.
|
||||
5. Добавить страницу товара и корзинную заготовку.
|
||||
Reference in New Issue
Block a user