internetMyShop — интернет-магазин с Laravel backend, Blade storefront, отдельным Nuxt frontend и админ-панелью на MoonShine.
Проект находится в контролируемом переходе от legacy Blade-витрины к API-first архитектуре:
- Laravel остаётся единственным источником истины для бизнес-логики;
- legacy Blade storefront продолжает работать;
- Nuxt 4 frontend в
apps/webуже используетBFF-слой иapi/v1; - админка переведена на
MoonShine; - тексты витрины можно управлять из админки через ресурс
Контент витрины.
- главная витрина и каталог товаров;
- страницы категорий, брендов и товаров;
- поиск по каталогу;
- корзина и checkout;
- регистрация, вход, личный кабинет, профили доставки и история заказов;
- двуязычный интерфейс
RU / EN.
MoonShineпод/admin;- управление категориями, брендами, товарами, заказами, страницами и пользователями;
- управление текстами витрины через отдельный CRUD ресурс;
- загрузка изображений для каталога.
- versioned REST API под
/api/v1; - Sanctum token auth для внешних клиентов;
- guest-friendly basket и checkout;
- payment initiation, payment status endpoint, hosted card checkout config и provider webhooks;
- OpenAPI спецификация в
docs/openapi.yaml; - Swagger UI под
/swaggerв non-production окружениях.
|
|
|
|
PHP 8.4Laravel 12Laravel SanctumMoonShine 4Intervention ImageSQLiteдля локальной разработкиMySQL 8для Docker и production-like среды
Nuxt 4Vue 3TypeScriptNitroVitestPlaywright
Docker Composeдля dev-окруженияPHPUnitLarastan / PHPStanLaravel PintESLint
Browser
-> Laravel Blade storefront
-> Controllers / Domain / Models / Policies / Actions
-> sqlite locally or MySQL in Docker
Browser
-> Nuxt 4 frontend in apps/web
-> Nuxt BFF (/bff)
-> Laravel API /api/v1
-> Sanctum token kept behind HttpOnly cookie boundary
Admin
-> MoonShine /admin
-> same Laravel app
-> same database
-> CRUD for catalog, orders, users, pages, storefront content
- backend определяет бизнес-правила, сумму заказа, ownership и роли;
- денежные суммы и конвертация считаются через общий слой
app/Support/Money, а не черезfloat; - Blade storefront остаётся совместимым web-слоем;
- Nuxt frontend не должен хранить bearer token в JavaScript-доступном состоянии;
- браузерный frontend ходит в backend через Nuxt BFF;
- админка и витрина работают поверх одной доменной модели;
- тексты витрины имеют file-based fallback и DB override через
site_contents.
Платёжный слой построен так, чтобы sandbox-провайдер можно было заменить на production-провайдера без переписывания checkout целиком.
Ключевые backend точки:
app/Contracts/Payments/PaymentProviderDriver.phpapp/Services/Payments/PaymentManager.phpapp/Services/Payments/PaymentService.phpapp/Support/Money/Money.phpapp/Support/Money/Currency.phpconfig/payments.php
Текущий набор провайдеров:
paypal— sandbox hosted card fields;fake— полностью локальный provider для tests/e2e.
Текущий flow подключения и замены провайдера описан в этом README.
В проекте уже зафиксированы следующие базовые гарантии:
- аутентификация API работает через
Sanctum; - browser auth у Nuxt реализован через
HttpOnlycookie и BFF; - роли и доступ в админку централизованы через
Gate access-admin; - ownership профилей и заказов защищён
Policies; - checkout не доверяет клиентским
amount,status,user_id; - корзина использует зашифрованную cookie;
- upload-пути проходят через backend-валидацию;
- для web-ответов выставляются security headers и CSP;
- OpenAPI spec проверяется тестом на соответствие зарегистрированным API routes.
Подробности по архитектуре и платёжному flow собраны в разделах Архитектура и Платёжная интеграция этого README.
Текущий dev/test провайдер по умолчанию: PayPal Sandbox. Он используется для hosted card fields sandbox-flow. Витрина магазина живёт в KZT, поэтому sandbox-списание может идти в USD через backend conversion rate.
app/ Laravel application code
Actions/ write-side business actions
Domain/ queries, filters, policies and module logic
Http/ controllers, requests, middleware, resources
Models/ Eloquent models
MoonShine/ admin panel resources, pages and layout
Services/ application services
Support/ defaults, exact money math and support classes
apps/web/ separate Nuxt frontend
components/ reusable UI
composables/ frontend state and API helpers
pages/ route-level pages
server/ Nuxt BFF routes and backend proxy
tests/ Vitest and Playwright tests
database/ migrations, factories, seeders
docker/ Docker development runtime files
docs/ OpenAPI spec and project screenshots
public/ web root and compiled assets
resources/ Blade templates, translations, source assets
routes/ web and API routes
tests/ Laravel feature and unit tests
Основной кроссплатформенный способ запуска и проверки проекта:
php scripts/app.php <command>Этот launcher одинаково работает на Windows, Ubuntu и macOS.
Он нужен для двух вещей:
- у команды один и тот же набор команд на всех ОС;
- проект не зависит от сломанной внешней обёртки
composer, если она есть в системе.
Минимальные требования:
phpnodenpmdockerдля Docker-команд
Если в PATH лежит не тот PHP, launcher пытается сам найти PHP 8.4.
При необходимости можно явно указать runtime через переменную окружения:
PROJECT_PHP_BIN=/path/to/php8.4Windows PowerShell:
$env:PROJECT_PHP_BIN='C:\OSPanel\modules\PHP-8.4\php.exe'На Windows + OSPanel launcher дополнительно подставляет проектный temp-dir для PHP 8.4, чтобы artisan test, загрузки файлов и composer-запуски не упирались в системный временный каталог панели.
composer app:* и npm run web:* остаются допустимыми алиасами, если локальный composer установлен и исправно работает.
php scripts/app.php deps:installphp scripts/app.php local:prepare
php scripts/app.php local:setupЭти команды:
- создают
.envиз.env.example, если файла ещё нет; - создают
database/database.sqlite, если файла ещё нет; - генерируют
APP_KEY; - выполняют миграции;
- заливают demo seed;
- создают
storagelink.
php scripts/app.php local:serveОсновные адреса локального backend:
- Blade storefront:
http://localhost:8000 - admin MoonShine:
http://localhost:8000/admin - Swagger UI:
http://localhost:8000/swagger - OpenAPI spec:
http://localhost:8000/swagger/openapi.yaml
php scripts/app.php web:devАдрес Nuxt frontend:
http://localhost:3000
Если нужно переопределить backend API для Nuxt, создайте apps/web/.env:
NUXT_BACKEND_API_BASE=http://localhost:8000/api/v1Текущий docker-compose.yml предназначен для разработки, а не для production.
Почему:
- backend контейнер запускает
php artisan serve; - frontend контейнер запускает
nuxt dev; - это удобно для dev, но не является production-grade runtime.
php scripts/app.php docker:upphp scripts/app.php docker:logsphp scripts/app.php docker:migrate
php scripts/app.php docker:seed
php scripts/app.php docker:seed:content
php scripts/app.php docker:refresh
php scripts/app.php docker:downDocker endpoints:
- Laravel / Blade / admin:
http://localhost:8080 - Nuxt frontend:
http://localhost:3001 - Swagger UI:
http://localhost:8080/swagger - Docker MySQL:
127.0.0.1:3307
Для backend используйте именно localhost:8080, а не 127.0.0.1:8080, потому что в приложении включена проверка доверенных host-имен.
- admin:
admin@example.test/Password123! - user:
user@example.test/Password123!
- admin пользователя;
- demo покупателя;
- категории и бренды;
- товары;
- профиль доставки для demo user;
- базовые DB-записи контента витрины.
php scripts/app.php local:refreshphp scripts/app.php local:seed:content
php scripts/app.php docker:seed:contentВажно:
- полный demo seed подходит для local и staging;
- для production не используйте
migrate:fresh --seed, если не хотите потерять данные; - для production контента витрины используйте только
StorefrontSiteContentSeederили ручное управление через MoonShine.
php scripts/app.php backend:lint
php scripts/app.php backend:analyse
php scripts/app.php backend:test
php scripts/app.php backend:qualityphp scripts/app.php web:lint
php scripts/app.php web:typecheck
php scripts/app.php web:test:unit
php scripts/app.php web:build
php scripts/app.php web:qualityphp scripts/app.php web:test:e2e:install
php scripts/app.php web:test:e2ephp scripts/app.php doctor
php scripts/app.php verify:all
php scripts/app.php verify:e2eЕсли на Windows PHP 8.4 не лежит в PATH, для Playwright можно задать:
PLAYWRIGHT_PHP_BINARY=C:\OSPanel\modules\PHP-8.4\php.exe- auth API;
- catalog API;
- documented catalog filters for category and brand endpoints;
- basket API;
- basket clear, empty checkout and exact decimal basket totals;
- checkout safety rules;
- payment create / checkout-config / capture / webhook flow;
- payment status page, provider return and provider cancel web-flow;
- profile and order ownership;
- profile API CRUD through
GET / POST / PUT / DELETE; - MoonShine admin access;
- MoonShine catalog image upload on Windows-friendly fixture path;
- storefront content overrides;
- public storefront pages and authenticated account pages;
- Swagger route availability;
- OpenAPI route + HTTP method contract;
- Nuxt unit logic;
- Playwright сценарий
login -> basket -> checkout.
Если в PowerShell появляется ошибка:
Could not open input file: \composer.phar
значит shell взял не нормальный Composer, а сломанную системную обёртку вроде C:\OSPanel\modules\PHP-8.2\composer.bat.
Для проекта это больше не блокер. Используйте команды:
php scripts/app.php doctor
php scripts/app.php local:setup
php scripts/app.php docker:logs
php scripts/app.php verify:allКоманда doctor покажет, какие PHP, Composer, NPM и Docker launcher нашёл на конкретной машине.
На Windows это нормально, если doctor показывает разные значения для Launcher PHP и Project PHP: например, launcher может стартовать из PHP 8.2, а проектовые команды и тесты уже выполнять через найденный PHP 8.4.
Если автоопределение не сработало, укажите:
$env:PROJECT_PHP_BIN='C:\OSPanel\modules\PHP-8.4\php.exe'Если в Docker на http://localhost:8080 у админки появляются 419 Page Expired или странные редиректы на login, проверьте SESSION_DOMAIN:
SESSION_DOMAIN=Для локального localhost его нужно оставлять пустым. Значение вроде SESSION_DOMAIN=localhost даёт нестабильные cookie в браузерах.
- README.md — быстрый вход, стек, запуск, тесты;
- docs/openapi.yaml — API контракт;
- CONTRIBUTING.md — правила инженерной работы.
После каждого meaningful изменения в проекте нужно обновлять связанные документы в том же коммите или PR.
Минимум:
README.md— если изменился запуск, окружение, runtime, seed, workflow, архитектурные границы или платёжный flow;docs/openapi.yaml— если изменились API routes, payloads или auth requirements;CONTRIBUTING.md— если изменились инженерные правила или договорённости по процессу.
Кратко:
- рекомендуемый production-вариант:
Ubuntu VPS + Nginx + PHP-FPM 8.4 + MySQL 8 + Node 24 + systemd; - допустимый staging/dev-вариант: текущий Docker stack;
- shared hosting без постоянного Node process подходит только для Blade storefront и MoonShine, но не для полноценного Nuxt runtime.
Проект лицензирован как проприетарный.
- владелец:
Rinat Sarmuldin - контакт:
ura07srr@gmail.com - файл лицензии:
LICENSE.md
Если файл, библиотека, иконка, шрифт или зависимость имеют свою лицензию, действует лицензия соответствующего third-party компонента.