Перейти к содержанию

Технологический стек

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 (восстановить курсы после очистки кэша). Без очистки кэша закэшированный прод-конфиг ломает тестовое окружение.