# Карта проекта tocha_app

## Что это

Административная панель для каталога автомобилей. Laravel 13 + AdminLTE.
Ориентировочно: авторынок / автосалон, продажа авто из Японии и других стран.

---

## История изменений

### 2026-05-06 — Начальная сборка скелета

**Установлено:**
- Laravel 13 (PHP 8.3+)
- `jeroennoten/laravel-adminlte` — UI, опубликованы auth-вьюхи
- Laravel Boost (dev) — MCP-сервер для AI-разработки
- Vite + TailwindCSS v4, PHPUnit v12, Laravel Pint

**Настроено:**
- `APP_NAME`, `APP_URL`, MySQL-подключение (`tocha_app`, root, localhost:3306)

---

### 2026-05-06 — Авторизация и middleware

**Создано:**
- `app/Http/Controllers/Admin/LoginController.php` — вход/выход; авторизация по `name`, не email
- `app/Http/Middleware/EnsureUserIsAdmin.php` — проверка `is_admin`; редирект на /admin/login
- `database/migrations/2026_05_06_145556_add_is_admin_to_users_table.php` — флаг `is_admin` в users
- `database/seeders/AdminSeeder.php` — создаёт пользователя admin/1234
- `resources/views/admin/login.blade.php` — форма входа (AdminLTE auth-page)

**Изменено:**
- `routes/web.php` — добавлена группа `/admin/*` с middleware 'admin'
- `app/Models/User.php` — добавлен `is_admin` в Fillable

**Регистрация middleware:** `bootstrap/app.php` → `withMiddleware()` → alias `'admin'`

---

### 2026-05-06 — Дашборд

**Создано:**
- `app/Http/Controllers/Admin/DashboardController.php` — GET /admin/ → admin.dashboard
- `resources/views/admin/dashboard.blade.php` — приветствие с именем пользователя

---

### 2026-05-06 — Справочники (DictSection + DictValue)

**Создано:**
- `database/migrations/2026_05_06_151148_create_dict_sections_table.php`
  — разделы справочников: code, label, is_system, is_hierarchical, sort_order
- `database/migrations/2026_05_06_151148_create_dict_values_table.php`
  — значения: section_id (FK cascade), parent_id (самоссылка, FK cascade), value, sort_order
- `app/Models/DictSection.php` — values() (корневые), allValues() (все)
- `app/Models/DictValue.php` — section(), parent(), children()
- `app/Http/Controllers/Admin/ManualController.php` — CRUD разделов + CRUD значений
- `database/seeders/DictionarySeeder.php` — 8 системных разделов, 30+ марок с моделями
- `resources/views/admin/manuals/index.blade.php` — список разделов
- `resources/views/admin/manuals/section_form.blade.php` — форма раздела (create/edit)
- `resources/views/admin/manuals/values.blade.php` — список значений (плоский + иерархический)
- `resources/views/admin/manuals/value_form.blade.php` — форма значения (create/edit)

**Структура справочников:**
```
dict_sections: makes (иерархия), body_types, countries, cities, colors_ext, colors_int, engine_volumes, options
dict_values:   Toyota → [Camry, Corolla, ...], Nissan → [...], ...
```

---

### 2026-05-06 — Каталог автомобилей (Car)

**Создано:**
- `database/migrations/2026_05_06_151148_create_cars_table.php`
  — полная схема: статус, марка/модель, технические характеристики, цены, фото (JSON-массив)
- `app/Models/Car.php` — $fillable, $casts (boolean, array), акцессоры status_label/condition_label
- `app/Http/Controllers/Admin/CarController.php` — полный CRUD:
  - `index()` — список с поиском + фильтрами + пагинация 20
  - `create()/edit()` — форма с данными из справочников
  - `store()/update()` — validated() + handlePhotos()
  - `destroy()` — удаление записи + файлов с диска
  - `handlePhotos()` — загрузка/замена main-фото и галереи, удаление выбранных
- `resources/views/admin/cars/index.blade.php` — таблица с фильтрами и превью фото
- `resources/views/admin/cars/form.blade.php` — большая форма (6 секций), JS-фильтрация моделей

---

## Структура маршрутов

```
GET  /                           → welcome
GET  /admin/login                → LoginController::showLoginForm
POST /admin/login                → LoginController::login
POST /admin/logout               → LoginController::logout

[middleware: admin]
GET  /admin/                     → DashboardController::index        (admin.dashboard)
     /admin/cars                 → CarController (resource)          (admin.cars.*)
     /admin/manuals/             → ManualController::index           (admin.manuals.index)
     /admin/manuals/sections/*   → ManualController::section*        (admin.manuals.section.*)
     /admin/manuals/{section}/values/* → ManualController::value*   (admin.manuals.value.*)
```

## Структура хранения файлов

```
storage/app/public/cars/{id}/main/      ← главное фото (1 файл)
storage/app/public/cars/{id}/gallery/   ← галерея (N файлов)
public/storage/ → symlink (php artisan storage:link)
```

## Команды для запуска

```bash
php artisan migrate          # применить миграции
php artisan db:seed          # создать admin + заполнить справочники
php artisan storage:link     # доступ к фото через /storage/...
php artisan serve            # запуск сервера (http://localhost:8000)
./vendor/bin/pint            # форматирование PHP-кода
```
