From 6d7ef09c5bee8730c0010264a40cc82db909c1b5 Mon Sep 17 00:00:00 2001 From: Alisa Date: Wed, 3 Jun 2026 23:12:10 +0300 Subject: [PATCH] =?UTF-8?q?=D1=88=D0=B0=D0=B3=201=20=D1=81=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 14 ++ .gitignore | 9 ++ README.md | 36 +++++ admin/index.php | 7 + app/Core/Database.php | 36 +++++ app/Core/Env.php | 52 +++++++ app/Core/View.php | 23 +++ app/bootstrap.php | 22 +++ app/helpers.php | 28 ++++ database/schema.sql | 2 + docs/.gitkeep | 1 + public/assets/css/app.css | 53 +++++++ public/index.php | 23 +++ storage/cache/.gitkeep | 1 + storage/exports/.gitkeep | 1 + storage/logs/.gitkeep | 1 + storage/uploads/.gitkeep | 1 + views/layouts/main.php | 21 +++ views/pages/home.php | 16 ++ ПЛАН_ДЕЙСТВИЙ_РЫБСТОК.md | 65 ++++---- ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md | 280 +++++++++++++++++++++++++++++++++++ 21 files changed, 658 insertions(+), 34 deletions(-) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 admin/index.php create mode 100644 app/Core/Database.php create mode 100644 app/Core/Env.php create mode 100644 app/Core/View.php create mode 100644 app/bootstrap.php create mode 100644 app/helpers.php create mode 100644 database/schema.sql create mode 100644 docs/.gitkeep create mode 100644 public/assets/css/app.css create mode 100644 public/index.php create mode 100644 storage/cache/.gitkeep create mode 100644 storage/exports/.gitkeep create mode 100644 storage/logs/.gitkeep create mode 100644 storage/uploads/.gitkeep create mode 100644 views/layouts/main.php create mode 100644 views/pages/home.php create mode 100644 ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9b9e44c --- /dev/null +++ b/.env.example @@ -0,0 +1,14 @@ +APP_NAME=RybStock +APP_ENV=local +APP_DEBUG=true +APP_URL=http://localhost + +DB_HOST=localhost +DB_PORT=3306 +DB_DATABASE=database_name +DB_USERNAME=database_user +DB_PASSWORD="database_password" +DB_CHARSET=utf8mb4 + +MAIL_FROM=orders@loveriba.ru +ADMIN_EMAIL= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..80f9f44 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.env +/storage/logs/*.log +/storage/cache/* +/storage/exports/* +/storage/uploads/* +!/storage/cache/.gitkeep +!/storage/exports/.gitkeep +!/storage/uploads/.gitkeep +!/storage/logs/.gitkeep diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c2cfed --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Рыбсток + +Интернет-магазин продуктов питания на чистом PHP. + +## Техническая основа + +- PHP 8.2+ или PHP 8.3+ +- MariaDB/MySQL +- PDO +- HTML/CSS/JavaScript +- Собственная админка на PHP + +## Стартовая структура + +- `public/` - публичная часть сайта и входная точка. +- `app/` - основной PHP-код. +- `views/` - шаблоны страниц. +- `admin/` - будущая админка. +- `database/` - SQL-схемы и данные. +- `storage/` - загрузки, экспорты, кеш и логи. +- `docs/` - проектная документация. + +## База данных + +Данные подключения хранятся в `.env`. + +Для безопасности `.env` добавлен в `.gitignore`; пример настроек лежит в `.env.example`. + +## Запуск локально + +1. Установить Open Server Panel, Laragon или другой локальный сервер с PHP и MariaDB. +2. Направить корень сайта на папку `public/`. +3. Проверить настройки базы в `.env`. +4. Открыть сайт в браузере. + +Если сервер смотрит не в `public/`, нужно настроить виртуальный хост, чтобы публичной была именно эта папка. diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..4a13bff --- /dev/null +++ b/admin/index.php @@ -0,0 +1,7 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]); + + return self::$pdo; + } +} diff --git a/app/Core/Env.php b/app/Core/Env.php new file mode 100644 index 0000000..435989b --- /dev/null +++ b/app/Core/Env.php @@ -0,0 +1,52 @@ += 2 + && (($value[0] === '"' && $value[-1] === '"') || ($value[0] === "'" && $value[-1] === "'")) + ) { + return substr($value, 1, -1); + } + + return $value; + } +} diff --git a/app/Core/View.php b/app/Core/View.php new file mode 100644 index 0000000..4568ed5 --- /dev/null +++ b/app/Core/View.php @@ -0,0 +1,23 @@ +query('SELECT 1'); + $dbStatus = 'connected'; +} catch (Throwable $exception) { + $dbStatus = app_env('APP_DEBUG', 'false') === 'true' + ? 'error: ' . $exception->getMessage() + : 'error'; +} + +view('pages/home', [ + 'title' => 'Рыбсток', + 'dbStatus' => $dbStatus, +]); diff --git a/storage/cache/.gitkeep b/storage/cache/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/storage/cache/.gitkeep @@ -0,0 +1 @@ + diff --git a/storage/exports/.gitkeep b/storage/exports/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/storage/exports/.gitkeep @@ -0,0 +1 @@ + diff --git a/storage/logs/.gitkeep b/storage/logs/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/storage/logs/.gitkeep @@ -0,0 +1 @@ + diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/storage/uploads/.gitkeep @@ -0,0 +1 @@ + diff --git a/views/layouts/main.php b/views/layouts/main.php new file mode 100644 index 0000000..857eba5 --- /dev/null +++ b/views/layouts/main.php @@ -0,0 +1,21 @@ + + + + + + + <?= htmlspecialchars($title ?? 'Рыбсток', ENT_QUOTES, 'UTF-8') ?> + + + +
+ +
+ + diff --git a/views/pages/home.php b/views/pages/home.php new file mode 100644 index 0000000..dd51198 --- /dev/null +++ b/views/pages/home.php @@ -0,0 +1,16 @@ + +
+

Старт проекта

+

Рыбсток

+

Чистый PHP-проект подготовлен. Следующий шаг - схема базы данных и таблицы для каталога, фасовок, заказов и админки.

+ +
+ MariaDB: + +
+
diff --git a/ПЛАН_ДЕЙСТВИЙ_РЫБСТОК.md b/ПЛАН_ДЕЙСТВИЙ_РЫБСТОК.md index f6d9693..9553ccd 100644 --- a/ПЛАН_ДЕЙСТВИЙ_РЫБСТОК.md +++ b/ПЛАН_ДЕЙСТВИЙ_РЫБСТОК.md @@ -356,7 +356,7 @@ ## 5. Вопросы, которые стоит уточнить перед разработкой -1. На какой платформе быстрее запускать проект: Laravel/Filament, WordPress/WooCommerce с доработками, 1C-Bitrix, Django, Next.js + готовая админка или другая связка? +1. Какой локальный сервер и хостинг использовать для проекта на чистом PHP: Open Server Panel, Laragon, обычный хостинг, VPS или другой вариант? 2. Есть ли уже текущий сайт, каталог, база товаров, Excel/CSV с товарами и фотографиями? 3. Как сейчас хранятся товары: в Excel, 1С, МойСклад, вручную, в другой CMS? 4. Нужно ли интегрироваться с 1С, МойСкладом или другой учетной системой? @@ -413,44 +413,36 @@ - Импорт товаров из Excel/CSV. - Экспорт заказов в Excel. -## 7. Предлагаемый технический подход +## 7. Технический подход -Так как нужна быстрая сборка под ключ с логичной админкой, гибкими товарами и возможностью доработки программистом, оптимальные варианты: +Проект Рыбсток делаем на чистом PHP без фреймворка. -### Вариант A: Laravel + Filament +Базовая связка: -Подходит, если нужен индивидуальный проект с сильной админкой, гибкими фасовками, промокодами, заказами и прайсами. +- PHP 8.2+ или PHP 8.3+; +- MySQL или MariaDB; +- PDO для работы с базой; +- собственная админка на PHP; +- HTML, CSS и JavaScript для витрины; +- Яндекс.Карты для адресов и расчета доставки; +- email-отправка через SMTP; +- CSV/XLSX-выгрузка прайс-листа. -Плюсы: +Чистый PHP выбран потому, что проект должен быстро запускаться на обычном хостинге, легко передаваться программисту и не зависеть от тяжелых фреймворков. При этом код нужно писать структурно: отдельные папки для контроллеров, моделей/репозиториев, сервисов, шаблонов, админки, загрузок, экспортов и настроек. -- быстрая мощная админка; -- гибкая база данных; -- удобно дорабатывать; -- легко сделать Excel-выгрузку; -- хорошо подходит для кастомной логики доставки и фасовок. +Рекомендуемая структура проекта: -Минусы: - -- больше разработки, чем на готовой CMS. - -### Вариант B: WordPress + WooCommerce + доработки - -Подходит, если важнее очень быстрый запуск на готовой базе. - -Плюсы: - -- быстро поднять витрину; -- много готовых модулей; -- понятная админка. - -Минусы: - -- сложная кастомная логика фасовок, доставки и промокодов может потребовать много доработок; -- админка может стать менее аккуратной при большом количестве плагинов. - -### Рекомендация - -Для проекта Рыбсток лучше выбрать Laravel + Filament, если цель - надежный сайт с гибкой логикой и понятной админкой, который можно быстро дорабатывать. Если нужно запуститься максимально срочно любой ценой, можно рассмотреть WooCommerce, но сложность фасовок и доставки делает индивидуальную разработку предпочтительнее. +- `public/` - входная точка сайта и публичные assets; +- `app/` - основной PHP-код; +- `app/Controllers/` - обработчики страниц; +- `app/Models/` - модели данных; +- `app/Repositories/` - запросы к базе; +- `app/Services/` - бизнес-логика: доставка, промокоды, корзина, письма, прайс; +- `views/` - шаблоны сайта; +- `admin/` - собственная админка; +- `storage/` - загрузки, экспорты, логи; +- `database/` - SQL-схема, миграции или seed-файлы; +- `docs/` - рабочие документы проекта. ## 8. Пошаговый план работ @@ -631,4 +623,9 @@ ## 10. Ближайший следующий шаг -Перед кодом нужно выбрать платформу и получить исходные данные по каталогу. Рекомендуемый следующий шаг: принять решение по технической связке и подготовить структуру базы данных/моделей для товаров, фасовок, заказов, промокодов и доставки. +Перед кодом нужно получить исходные данные по каталогу и подготовить структуру базы данных/моделей для товаров, фасовок, заказов, промокодов и доставки. + +## 11. Статус выполнения + +- Шаг 1 выполнен: выбрана техническая связка на чистом PHP, создан стартовый каркас проекта, подключение к MariaDB через `.env`, базовые папки и файл `ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md`. +- Следующий шаг: спроектировать базу данных, модели, связи и структуру собственной админки. diff --git a/ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md b/ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md new file mode 100644 index 0000000..7fe9133 --- /dev/null +++ b/ШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md @@ -0,0 +1,280 @@ +# Шаг 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. + +Прайс должен собираться из опубликованных товаров и опубликованных фасовок. Каждая фасовка должна быть отдельной строкой, чтобы покупатель видел все цены. + +## Второй шаг + +Следующий шаг: спроектировать базу данных и модели проекта под чистый PHP. + +Нужно подготовить: + +1. Список таблиц. +2. Поля каждой таблицы. +3. Связи между таблицами. +4. Правила расчета цены фасовки. +5. Правила расчета доставки. +6. Структуру собственной админки. +7. Первичный SQL-файл `database/schema.sql`. + +После второго шага можно будет создавать файловую структуру проекта и начинать код. + +Файловая структура уже создана на шаге 1, поэтому на шаге 2 можно сразу перейти к SQL-схеме, таблицам и первичным PHP-моделям. + +## Что нужно уточнить перед кодом + +Минимально важные вопросы: + +1. Есть ли файл с товарами, ценами и фасовками: Excel, CSV или другая база? +2. Есть ли фотографии товаров и склада? +3. Какой email использовать для получения заказов? +4. Есть ли логотип Рыбсток? +5. Где будет размещаться сайт: обычный хостинг, VPS, Timeweb, Beget, Reg.ru, другой вариант? +6. Нужно ли сразу делать импорт из Excel или на старте можно заносить товары через админку? +7. Какой локальный сервер удобнее использовать: Open Server Panel, Laragon или другой?