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

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

Уровень: L2 (детали) | Вверх: ../README.md

Принцип организации

Проект организован по layer-based подходу с элементами feature-based для модуля offline. Каждая директория верхнего уровня соответствует архитектурному слою или функциональной области. Зависимости направлены сверху вниз: страницы → компоненты → хуки → сторы → API → offline.

Дерево директорий

frontend/src/
├── api/                    # HTTP-клиент и модули API (8 файлов, ~240 строк)
│   ├── client.ts           #   Axios instance с интерцепторами auth/refresh
│   ├── auth.ts             #   Аутентификация: login, register, refresh, getMe
│   ├── items.ts            #   CRUD для вещей
│   ├── outfits.ts          #   CRUD для образов + share + suggest-title
│   ├── media.ts            #   Загрузка и получение медиа (с компрессией)
│   ├── feed.ts             #   Получение ленты образов
│   ├── reference.ts        #   Справочники: цвета, категории, слоты, стили
│   └── share.ts            #   Шаринг образов по токену
├── components/             # Переиспользуемые React-компоненты (34 файла, ~1 765 строк)
│   ├── ui/                 #   Базовые UI-элементы (17 TSX + CSS, ~1 307 строк)
│   ├── common/             #   Бизнес-компоненты (6 TSX + CSS, ~224 строки)
│   └── layout/             #   Компоненты каркаса (3 TSX + CSS, ~234 строки)
├── config/                 # Конфигурация и маппинги (1 файл, ~64 строки)
│   └── attrMappings.ts     #   ML article type → категория, цвет → название
├── embeddings/             # Векторные эмбеддинги и поиск похожих (7 файлов, ~421 строка)
│   ├── embeddingTypes.ts   #   Типы: SimilarityResult, WorkerMessage
│   ├── embeddingRepository.ts  # CRUD эмбеддингов в IndexedDB
│   ├── vectorMath.ts       #   Косинусное сходство, евклидово расстояние
│   ├── outfitEmbeddingService.ts  # Вычисление эмбеддинга образа
│   ├── similarityService.ts    # Поиск похожих через Web Worker
│   ├── useEmbeddingSearch.ts   # React-хуки: useSimilarItems, useSimilarOutfits
│   └── search.worker.ts   #   Web Worker для вычислений сходства
├── hooks/                  # Пользовательские React-хуки (4 файла, ~352 строки)
│   ├── useDebounce.ts      #   Дебаунс значения (400ms по умолчанию)
│   ├── useWeather.ts       #   Погода: геолокация, кэш 30 мин, Open-Meteo API
│   ├── useVirtualPagination.ts  # Виртуальная пагинация (IntersectionObserver)
│   └── useServiceWorker.ts #   Управление обновлениями PWA
├── offline/                # Offline-first функциональность (17 файлов, ~1 933 строки)
│   ├── db/                 #   Dexie.js схема и инстанс (7 таблиц, v1–v4)
│   ├── hooks/              #   Хуки для локальных данных (6 файлов)
│   ├── network/            #   Отслеживание сетевого статуса
│   ├── repositories/       #   Слой доступа к данным (items, outfits, media, sync)
│   ├── services/           #   Бизнес-логика (initialSync, offlineItems/Outfits)
│   └── sync/               #   Очередь синхронизации и движок (syncEngine)
├── pages/                  # Страницы приложения (16 TSX + CSS, ~3 741 строка)
│   ├── HomePage.tsx        #   Главная: погода, коллекции, недавние образы
│   ├── FeedPage.tsx        #   Лента: infinite scroll, фильтры, save/unsave
│   ├── WardrobePage.tsx    #   Гардероб: фильтры (слот, цвет, стиль, сезон)
│   ├── WardrobeItemPage.tsx    # Детали вещи: редактирование, похожие
│   ├── AddItemSourcePage.tsx   # Добавление: камера или файл
│   ├── AddItemDetailsPage.tsx  # Детали вещи: ML-предсказания, форма
│   ├── OutfitsPage.tsx     #   Список образов: фильтр own/external
│   ├── OutfitBuilderPage.tsx   # Конструктор: слоты, AI-заголовок
│   ├── OutfitDetailPage.tsx    # Детали образа: вещи, похожие, удаление
│   ├── ItemSelectPage.tsx  #   Выбор вещи для слота в конструкторе
│   ├── ProfilePage.tsx     #   Профиль: аватар, shared-образы, статистика
│   ├── SettingsPage.tsx    #   Настройки: имя, пароль, аватар
│   ├── SharePage.tsx       #   Шаринг: ссылка, сторис-изображение
│   ├── ShareRecipientPage.tsx  # Просмотр shared-образа по токену
│   ├── LoginPage.tsx       #   Авторизация
│   └── RegisterPage.tsx    #   Регистрация
├── routes/                 # Маршрутизация (1 файл)
│   └── ProtectedRoute.tsx  #   Редирект на /login если не авторизован
├── shared/                 # Общие ресурсы (статические ассеты)
├── stores/                 # Zustand-сторы (2 файла, ~155 строк)
│   ├── auth.ts             #   Аутентификация: токены, user, hydrate, logout
│   └── outfitBuilder.ts    #   Конструктор образов: слоты, выбор вещей
├── theme/                  # Дизайн-система (5 файлов, ~380 строк)
│   ├── tokens.ts           #   Сырые дизайн-токены (цвета, шрифты, отступы)
│   ├── semanticTokens.ts   #   Семантические токены
│   ├── typography.ts       #   Типографические стили
│   ├── antdTheme.ts        #   Кастомизация темы Ant Design
│   └── cssVars.css         #   CSS custom properties
├── types/                  # TypeScript-типы (2 файла, ~289 строк)
│   └── api.ts              #   Все DTO: User, Item, Outfit, Media, ...
├── utils/                  # Утилиты (6 файлов, ~410 строк)
│   ├── compressImage.ts    #   Сжатие изображений (canvas, max 896×896)
│   ├── media.ts            #   Построение URL медиа-ресурсов
│   ├── feedSessionCache.ts #   Кэш сессии ленты
│   ├── generateOutfitStoryImage.ts  # Генерация сторис-изображения
│   ├── ruPluralize.ts      #   Русские склонения
│   └── showAppConfirm.ts   #   Диалог подтверждения
├── App.tsx                 # Корневой компонент: Router, QueryProvider, тема
├── main.tsx                # Точка входа: hydrate, syncEngine, SW
├── queryClient.ts          # Конфигурация React Query (staleTime: 5 мин)
└── vite-env.d.ts           # Vite environment types

Зависимости между модулями

graph TD
    pages --> components
    pages --> hooks
    pages --> stores
    pages --> offline_hooks["offline/hooks"]
    pages --> embeddings

    components --> stores
    components --> utils
    components --> offline_hooks

    hooks --> api
    hooks --> stores

    offline_hooks --> offline_repos["offline/repositories"]
    offline_hooks --> api

    offline_services["offline/services"] --> offline_repos
    offline_services --> api
    offline_services --> offline_sync["offline/sync"]

    offline_sync --> offline_repos
    offline_sync --> api

    offline_repos --> offline_db["offline/db"]

    embeddings --> offline_db

    api --> types
    stores --> types
    offline_repos --> types

Диаграмма

-> Детали по каждому модулю и файлу: module-details.md