177 lines
6.5 KiB
Markdown
177 lines
6.5 KiB
Markdown
# Шаг 2. База данных и связи
|
||
|
||
## Что сделано
|
||
|
||
Создана SQL-схема `database/schema.sql` для MariaDB/MySQL и стартовые данные `database/seed.sql`.
|
||
|
||
Также создана локальная страница установки `public/install.php`.
|
||
|
||
Она применяет:
|
||
|
||
- `database/schema.sql`;
|
||
- `database/seed.sql`.
|
||
|
||
Важно: установка пересоздает таблицы, поэтому использовать ее только на старте или в локальной разработке.
|
||
|
||
Схема покрывает основные части проекта:
|
||
|
||
- администраторы;
|
||
- категории и подкатегории;
|
||
- товары;
|
||
- фасовки и цены;
|
||
- изображения товаров;
|
||
- поисковые термины;
|
||
- промокоды и их привязки;
|
||
- расчеты доставки;
|
||
- заказы и позиции заказов;
|
||
- история статусов заказа;
|
||
- вход клиента по email-коду;
|
||
- отзывы;
|
||
- акции;
|
||
- популярные товары;
|
||
- настройки сайта;
|
||
- праздничные/нерабочие дни.
|
||
- старые URL и 301-редиректы для сохранения индексации.
|
||
|
||
## Главная логика связей
|
||
|
||
### Категории
|
||
|
||
Таблица `categories` поддерживает вложенность через `parent_id`.
|
||
|
||
Это позволяет хранить:
|
||
|
||
- главные категории;
|
||
- подкатегории;
|
||
- меню каталога;
|
||
- SEO-текст для страниц категорий.
|
||
|
||
Для переноса со старого сайта у категорий есть поле `legacy_path`. Если старый URL отличается от нового slug, старый путь нужно сохранить и добавить 301-редирект в таблицу `redirects`.
|
||
|
||
Для SEO у категорий есть поля `h1`, `seo_title`, `seo_description`, `seo_keywords`.
|
||
|
||
### Товары
|
||
|
||
Таблица `products` хранит основную карточку товара:
|
||
|
||
- название;
|
||
- slug;
|
||
- категорию;
|
||
- описание;
|
||
- основное фото;
|
||
- базовую единицу;
|
||
- режим отображения цены;
|
||
- публикацию;
|
||
- доступность;
|
||
- признаки "новинка", "хит", "акция".
|
||
|
||
Для товаров также есть поле `legacy_path`, чтобы переносить старые ссылки без потери индексации.
|
||
|
||
Для SEO у товаров есть поля `h1`, `seo_title`, `seo_description`, `seo_keywords`.
|
||
|
||
### Фасовки
|
||
|
||
Таблица `product_variants` хранит отдельные фасовки товара.
|
||
|
||
Именно фасовка попадает в корзину, а не просто товар.
|
||
|
||
Пример:
|
||
|
||
- товар: горбуша неразделанная;
|
||
- фасовка: пласт 10 кг;
|
||
- `package_quantity`: 10;
|
||
- `step_quantity`: 10;
|
||
- `price_per_unit`: 600;
|
||
- `package_price`: 6000.
|
||
|
||
Так можно корректно сделать плюс/минус кратно фасовке.
|
||
|
||
### Заказы
|
||
|
||
Таблица `orders` хранит заказ целиком:
|
||
|
||
- имя;
|
||
- телефон;
|
||
- email;
|
||
- тип получения;
|
||
- адрес;
|
||
- суммы;
|
||
- промокод;
|
||
- расчет доставки;
|
||
- статус.
|
||
|
||
Таблица `order_items` хранит снимок каждой позиции заказа.
|
||
|
||
Снимок нужен, чтобы старые заказы не менялись при изменении цены или названия товара в каталоге.
|
||
|
||
### Промокоды
|
||
|
||
Таблица `promocodes` хранит сам промокод.
|
||
|
||
Таблица `promocode_targets` хранит ограничения:
|
||
|
||
- на категорию;
|
||
- на товар.
|
||
|
||
Если промокод действует на весь заказ, targets не нужны.
|
||
|
||
Для отображения выгодных цен в каталоге у промокодов есть поля:
|
||
|
||
- `show_in_price_tiers` - показывать как градацию цены;
|
||
- `price_tier_label` - подпись для карточки товара.
|
||
|
||
Так можно показывать покупателю базовую цену, цену от 20 000 руб. наличными и цену от 50 000 руб. наличными.
|
||
|
||
### Доставка
|
||
|
||
Таблица `delivery_calculations` хранит результат расчета:
|
||
|
||
- тип доставки;
|
||
- адрес;
|
||
- сумма заказа;
|
||
- расстояние от МКАД;
|
||
- порог бесплатной доставки;
|
||
- стоимость доставки;
|
||
- стоимость подъема;
|
||
- объяснение расчета.
|
||
|
||
Это нужно, чтобы в заказе сохранялся расчет, который видел клиент.
|
||
|
||
### История заказов по email
|
||
|
||
Таблица `customer_login_codes` хранит одноразовые коды входа по email.
|
||
|
||
SMS не используются.
|
||
|
||
### Настройки
|
||
|
||
Таблица `site_settings` хранит настройки сайта:
|
||
|
||
- телефон;
|
||
- email администратора;
|
||
- правила доставки;
|
||
- температуры камер;
|
||
- тексты и числовые параметры.
|
||
|
||
## Как применить схему
|
||
|
||
1. Открыть в браузере `/install.php?token=rybstock-local-install`.
|
||
2. Нажать кнопку "Создать таблицы и стартовые данные".
|
||
3. После успешной установки база будет содержать таблицы проекта и стартовые категории/настройки.
|
||
|
||
Страница работает только при `APP_ENV=local` и правильном `INSTALL_TOKEN` из `.env`.
|
||
|
||
## Что нужно сделать следующим шагом
|
||
|
||
Шаг 3:
|
||
|
||
1. Создать базовые PHP-классы для работы с таблицами:
|
||
- `CategoryRepository`;
|
||
- `ProductRepository`;
|
||
- `ProductVariantRepository`;
|
||
- `OrderRepository`;
|
||
- `PromocodeRepository`;
|
||
- `SettingRepository`.
|
||
2. Сделать первый вывод категорий на главной странице.
|
||
3. Подготовить основу админки: вход администратора и список разделов.
|