Технологический стек¶
Backend¶
| Компонент | Версия / пакет | Роль |
|---|---|---|
| PHP | 8.3 | Язык |
| Laravel | 11.54 | Фреймворк приложения |
| Inertia.js (server) | inertiajs/inertia-laravel |
Мост Laravel ↔ Vue без отдельного API |
| Filament | filament/filament |
Админ-панель СРМ (/admin) |
| Laravel Horizon | laravel/horizon |
Управление очередями (Redis) |
| Laravel Reverb | laravel/reverb |
WebSocket-сервер для realtime |
| spatie/laravel-model-states | — | Стейт-машины заказа / счёта / отгрузки / груза |
| maatwebsite/excel | — | Импорт товаров из XLS/CSV |
Frontend (SPA)¶
| Компонент | Роль |
|---|---|
| Vue 3 | UI-фреймворк |
| Inertia.js (vue3) | SPA-навигация поверх Laravel-роутов, без REST-API |
| Vite | Сборщик, alias @ → resources/js |
| Tailwind CSS | Утилитарные стили |
| Laravel Echo | Клиент WebSocket (подписка на каналы заказов) |
| qrcode | Генерация QR для подтверждения телефона через Telegram |
Frontend построен как единое SPA на Inertia: контроллер возвращает Inertia::render('Pages/...') с пропсами, а Vue-страница их отображает. Отдельного HTTP-API нет — точки входа описаны прямо в Laravel-роутах.
Дизайн-система (Metronic-стиль на Tailwind)¶
Воспроизводится визуал Metronic v8 без Bootstrap/jQuery — на чистом Tailwind + Vue.
- Токены (
tailwind.config.js):primary#1b84ff(синий),sidebar#1e1e2d(тёмный),body#f5f8fa, теньshadow-card. Шрифт Inter. - Компоненты (
resources/css/app.css,@layer components):.card / .card-header / .card-body,.btn .btn-primary / .btn-light / .btn-success / .btn-danger,.badge .badge-light-*,.form-label / .form-control / .form-select,.menu-link,.tbl(и компактный.tbl-compact). - Иконки
Components/Icon.vue— SVG в стиле Lucide. - Оболочка
Layouts/AppShell.vue— тёмный сайдбар + липкий белый хедер.AgentLayoutиClientLayout— обёртки надAppShellсо своим меню.
Хранилища и инфраструктура¶
| Компонент | Назначение |
|---|---|
| MySQL 8.0 | Основная БД (taomaster) |
| Redis | Кэш, очереди, OTP-коды, сессии Horizon |
| SQLite (in-memory) | Тестовая БД (форсируется в phpunit.xml) |
| Supervisor | Демоны Horizon и Reverb |
| nginx + Apache (ISPmanager) | Веб-сервер: nginx фронт, Apache+PHP-FPM бэк |
Структура каталога приложения¶
| Путь | Что лежит |
|---|---|
app/Http/Controllers/Agent/* |
Контроллеры стороны посредника |
app/Http/Controllers/Client/* |
Контроллеры стороны клиента |
app/Http/Controllers/Webhooks/* |
Вебхуки ботов Telegram/MAX |
app/Filament/* |
Ресурсы и страницы админки |
app/Services/* |
Доменные сервисы (Ledger, Commission, Rate, Catalog, Delivery, Translate, Otp, …) |
app/States/*, app/Support/Enums/* |
Стейт-машины и перечисления статусов |
app/Support/Concerns/BelongsToAgent |
Трейт мультиарендности |
resources/js/Pages/* |
Vue-страницы (Inertia) |
resources/js/Layouts/*, Components/* |
Оболочки и общие компоненты |
routes/{web,agent,client,console,channels}.php |
Маршруты |
database/migrations/* |
Схема БД (≈ 116 миграций) |
Тестирование¶
- Pest 3.8 +
pest-plugin-laravel. - Тесты идут на SQLite in-memory (
phpunit.xmlфорсируетDB_CONNECTION=sqlite), боевая MySQL не затрагивается. - На момент последней сверки — более 200 тестов зелёные.
Правило прогона тестов в проде
Сайт работает в прод-режиме (config:cache, route:cache). Перед php artisan test обязателен php artisan optimize:clear, после — php artisan optimize и php artisan rates:fetch-cbr (восстановить курсы после очистки кэша). Без очистки кэша закэшированный прод-конфиг ломает тестовое окружение.