279 lines
10 KiB
Markdown
279 lines
10 KiB
Markdown
# Шаг 1. Техническое решение для сайта Рыбсток
|
||
|
||
## Решение
|
||
|
||
Проект Рыбсток делаем на чистом PHP без фреймворка.
|
||
|
||
Базовая связка:
|
||
|
||
- Backend: чистый PHP 8.2+ или PHP 8.3+
|
||
- База данных: MySQL или MariaDB
|
||
- Доступ к базе: PDO
|
||
- Frontend: HTML, CSS, JavaScript
|
||
- Админка: собственная админ-панель на PHP
|
||
- Шаблоны: обычные PHP-шаблоны
|
||
- Поиск на первом этапе: SQL-поиск с нормализацией русских слов и словарем синонимов
|
||
- Поиск на расширенном этапе: отдельный поисковый индекс или внешний движок, если понадобится
|
||
- Excel-выгрузка: CSV на первом этапе, XLSX через PHP-библиотеку или ручную генерацию позже
|
||
- Карты и адреса: Яндекс.Карты / Яндекс Геокодер / Яндекс Маршрутизация
|
||
- Email: SMTP-почта домена или внешний SMTP-сервис
|
||
|
||
## Почему чистый PHP подходит
|
||
|
||
Чистый PHP подходит, если важны:
|
||
|
||
- быстрый запуск на обычном хостинге;
|
||
- понятный код без тяжелого фреймворка;
|
||
- простая передача проекта другому программисту;
|
||
- полный контроль над логикой фасовок, корзины, доставки и админки;
|
||
- минимум зависимостей;
|
||
- возможность быстро править проект вручную.
|
||
|
||
Важно: чистый PHP нужно писать структурно. Даже без фреймворка проект должен иметь понятные слои: маршруты, контроллеры, модели/репозитории, сервисы, шаблоны и админку. Иначе большой каталог, фасовки, промокоды и доставка быстро станут трудными для поддержки.
|
||
|
||
## Что сейчас есть в папке проекта
|
||
|
||
В папке проекта создан стартовый каркас:
|
||
|
||
- `.git`
|
||
- `.vscode`
|
||
- `ПЛАН_ДЕЙСТВИЙ_РЫБСТОК.md`
|
||
- `ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md`
|
||
- `.env`
|
||
- `.env.example`
|
||
- `.gitignore`
|
||
- `README.md`
|
||
- `public/index.php`
|
||
- `public/assets/css/app.css`
|
||
- `app/bootstrap.php`
|
||
- `app/helpers.php`
|
||
- `app/Core/Env.php`
|
||
- `app/Core/Database.php`
|
||
- `app/Core/View.php`
|
||
- `views/layouts/main.php`
|
||
- `views/pages/home.php`
|
||
- `admin/index.php`
|
||
- `database/schema.sql`
|
||
- `storage/`
|
||
- `docs/`
|
||
|
||
В `.env` внесены данные подключения к базе MariaDB. Сам файл закрыт от git через `.gitignore`.
|
||
|
||
## Что нужно установить для разработки
|
||
|
||
На рабочем компьютере должны быть доступны:
|
||
|
||
- PHP 8.2 или новее, лучше PHP 8.3
|
||
- MySQL или MariaDB
|
||
- Веб-сервер: Apache или Nginx
|
||
- Git
|
||
|
||
Желательно:
|
||
|
||
- Open Server Panel, Laragon или другой локальный сервер для Windows
|
||
- phpMyAdmin или Adminer для работы с базой
|
||
- Composer только по желанию, если позже захотим подключить готовые библиотеки для SMTP, Excel или dotenv
|
||
|
||
Для чистого PHP Composer не обязателен на старте.
|
||
|
||
## Рекомендуемая структура проекта
|
||
|
||
```text
|
||
loveriba.ru/
|
||
app/
|
||
Config/
|
||
Controllers/
|
||
Core/
|
||
Models/
|
||
Repositories/
|
||
Services/
|
||
Validators/
|
||
admin/
|
||
controllers/
|
||
views/
|
||
public/
|
||
assets/
|
||
css/
|
||
js/
|
||
images/
|
||
index.php
|
||
storage/
|
||
uploads/
|
||
exports/
|
||
logs/
|
||
views/
|
||
layouts/
|
||
pages/
|
||
product/
|
||
catalog/
|
||
cart/
|
||
checkout/
|
||
emails/
|
||
database/
|
||
migrations/
|
||
seeders/
|
||
schema.sql
|
||
docs/
|
||
.env.example
|
||
README.md
|
||
```
|
||
|
||
## Основные модули
|
||
|
||
- `Products` - товары
|
||
- `ProductVariants` - фасовки и цены
|
||
- `Categories` - категории и подкатегории
|
||
- `Cart` - корзина
|
||
- `Checkout` - оформление заказа
|
||
- `Orders` - заказы
|
||
- `Promocodes` - промокоды и ограничения
|
||
- `Delivery` - расчет доставки
|
||
- `CustomerAccess` - вход по email-коду и история заказов
|
||
- `CompareList` - список сравнения до 10 товаров
|
||
- `Search` - поиск и голосовой ввод
|
||
- `Reviews` - отзывы и рейтинг
|
||
- `PriceExport` - прайс-лист
|
||
- `AdminSettings` - настройки сайта, писем, доставки, счетчиков
|
||
|
||
## Базовая структура базы данных
|
||
|
||
На втором шаге нужно спроектировать таблицы:
|
||
|
||
- `admins` - администраторы
|
||
- `categories`
|
||
- `products`
|
||
- `product_variants`
|
||
- `orders`
|
||
- `order_items`
|
||
- `promocodes`
|
||
- `promocode_targets`
|
||
- `customer_login_codes`
|
||
- `reviews`
|
||
- `site_settings`
|
||
- `popular_products`
|
||
- `promo_blocks`
|
||
- `delivery_calculations`
|
||
- `product_images`
|
||
- `product_search_terms`
|
||
|
||
## Важные технические решения
|
||
|
||
### Фасовки
|
||
|
||
Фасовка должна быть отдельной таблицей, а не просто текстовым полем товара. Это важно, потому что у каждой фасовки своя цена, шаг количества, единица измерения и отображение в корзине.
|
||
|
||
Пример:
|
||
|
||
- товар: горбуша неразделанная;
|
||
- фасовка: пласт 10 кг;
|
||
- базовая единица: кг;
|
||
- цена за кг: 600 руб.;
|
||
- цена фасовки: 6000 руб.;
|
||
- шаг количества: 10 кг.
|
||
|
||
### Корзина
|
||
|
||
Корзина должна хранить не просто товар, а конкретную фасовку товара.
|
||
|
||
Пример позиции:
|
||
|
||
- `product_id`
|
||
- `variant_id`
|
||
- название товара
|
||
- название фасовки
|
||
- количество
|
||
- шаг количества
|
||
- цена за единицу
|
||
- цена за фасовку
|
||
- итог
|
||
|
||
### Заказы
|
||
|
||
Заказ должен сохранять снимок данных на момент оформления:
|
||
|
||
- название товара;
|
||
- выбранная фасовка;
|
||
- цена;
|
||
- количество;
|
||
- итог;
|
||
- расчет доставки;
|
||
- примененный промокод.
|
||
|
||
Это нужно, чтобы изменение цены в каталоге не ломало старые заказы.
|
||
|
||
### Доставка
|
||
|
||
Расчет доставки делаем отдельным PHP-сервисом `DeliveryCalculator`.
|
||
|
||
Он принимает:
|
||
|
||
- тип получения;
|
||
- адрес;
|
||
- сумму заказа;
|
||
- расстояние от МКАД;
|
||
- признак подъема.
|
||
|
||
И возвращает:
|
||
|
||
- стоимость доставки;
|
||
- порог бесплатной доставки;
|
||
- текстовое объяснение для клиента;
|
||
- технические данные для заказа.
|
||
|
||
### Админка
|
||
|
||
Админка должна быть собственной, без лишних плагинов.
|
||
|
||
Минимальные разделы:
|
||
|
||
- товары;
|
||
- категории;
|
||
- фасовки;
|
||
- заказы;
|
||
- промокоды;
|
||
- акции;
|
||
- популярные товары;
|
||
- отзывы;
|
||
- настройки доставки;
|
||
- настройки писем;
|
||
- прайс-лист;
|
||
- страницы и тексты сайта.
|
||
|
||
### Email вместо SMS
|
||
|
||
Все коды входа и письма отправляются только на email. SMS не используются.
|
||
|
||
### Прайс-лист
|
||
|
||
На первом этапе можно сделать выгрузку CSV, который открывается в Excel. Если нужен именно `.xlsx`, подключим отдельную библиотеку или сделаем генератор XLSX.
|
||
|
||
Прайс должен собираться из опубликованных товаров и опубликованных фасовок. Каждая фасовка должна быть отдельной строкой, чтобы покупатель видел все цены.
|
||
|
||
## Второй шаг
|
||
|
||
Второй шаг выполнен: база данных спроектирована в файле `database/schema.sql`, стартовые данные добавлены в `database/seed.sql`, описание связей создано в `docs/ШАГ_2_БАЗА_ДАННЫХ.md`.
|
||
|
||
Подготовлено:
|
||
|
||
1. Список таблиц.
|
||
2. Поля каждой таблицы.
|
||
3. Связи между таблицами.
|
||
4. Правила расчета цены фасовки.
|
||
5. Правила расчета доставки.
|
||
6. Первичный SQL-файл `database/schema.sql`.
|
||
7. Стартовые данные `database/seed.sql`.
|
||
|
||
Следующий шаг: сделать применение SQL-схемы и первичные PHP-классы для чтения данных.
|
||
|
||
## Что нужно уточнить перед кодом
|
||
|
||
Минимально важные вопросы:
|
||
|
||
1. Есть ли файл с товарами, ценами и фасовками: Excel, CSV или другая база?
|
||
2. Есть ли фотографии товаров и склада?
|
||
3. Какой email использовать для получения заказов?
|
||
4. Есть ли логотип Рыбсток?
|
||
5. Где будет размещаться сайт: обычный хостинг, VPS, Timeweb, Beget, Reg.ru, другой вариант?
|
||
6. Нужно ли сразу делать импорт из Excel или на старте можно заносить товары через админку?
|
||
7. Какой локальный сервер удобнее использовать: Open Server Panel, Laragon или другой?
|