feat: implement Iteration 0 foundation (backend + Flutter client)
Backend (Go): - Project structure with chi router, pgxpool, goose migrations - JWT auth (access/refresh tokens) with Firebase token verification - NoopTokenVerifier for local dev without Firebase credentials - PostgreSQL user repository with atomic profile updates (transactions) - Mifflin-St Jeor calorie calculation based on profile data - REST API: POST /auth/login, /auth/refresh, /auth/logout, GET/PUT /profile, GET /health - Middleware: auth, CORS (localhost wildcard), logging, recovery, request_id - Unit tests (51 passing) and integration tests (testcontainers) - Docker Compose setup with postgres healthcheck and graceful shutdown Flutter client: - Riverpod state management with GoRouter navigation - Firebase Auth (email/password + Google sign-in with web popup support) - Platform-aware API URLs (web/Android/iOS) - Dio HTTP client with JWT auth interceptor and concurrent refresh handling - Secure token storage - Screens: Login, Register, Home (tabs: Menu, Recipes, Products, Profile) - Unit tests (17 passing) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
250
docs/Description.md
Normal file
250
docs/Description.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# FoodAI — мобильное приложение для управления питанием
|
||||
|
||||
## Концепция
|
||||
|
||||
FoodAI — мобильное приложение, которое помогает пользователю управлять своим питанием: планировать меню, вести учёт калорий и контролировать запасы продуктов. Ключевая особенность — использование камеры телефона для распознавания продуктов, чеков и готовых блюд с автоматическим подсчётом калорий и подбором рецептов.
|
||||
|
||||
## Целевая аудитория
|
||||
|
||||
- Люди, следящие за питанием и калорийностью рациона
|
||||
- Те, кто хочет разнообразить своё меню и научиться готовить
|
||||
- Люди, которые хотят минимизировать пищевые отходы, используя имеющиеся продукты
|
||||
- Начинающие кулинары, которым важен пошаговый процесс готовки
|
||||
|
||||
## Основные функции
|
||||
|
||||
### 1. Распознавание продуктов через камеру
|
||||
|
||||
- **Сканирование чека.** Пользователь фотографирует чек из магазина. Приложение распознаёт список купленных продуктов и автоматически добавляет их в запасы.
|
||||
- **Фото продуктов.** Пользователь фотографирует продукты (например, содержимое холодильника). Приложение определяет, что на фото, и добавляет распознанные продукты в запасы.
|
||||
- **Фото готового блюда.** Пользователь фотографирует готовое блюдо или порцию еды. Приложение определяет блюдо и примерную калорийность.
|
||||
- **Мультифото.** При фотографировании продуктов можно сделать несколько снимков подряд (например, разные полки холодильника), и результаты объединяются в один общий список.
|
||||
- **Корректировка результатов.** После любого распознавания пользователь может отредактировать каждый продукт: изменить название, вес, количество, категорию, удалить ошибочно распознанный или добавить пропущенный.
|
||||
|
||||
### 2. Учёт продуктов
|
||||
|
||||
- Список имеющихся продуктов с возможностью ручного редактирования.
|
||||
- Автоматическое пополнение запасов через сканирование чеков и фото.
|
||||
- Автоматическое списание продуктов при отметке приготовленных рецептов.
|
||||
- **Срок годности как период хранения.** Вместо фиксированной даты «до XX.XX» используется модель «срок хранения после покупки» (например, молоко — 5 дней). Дата вычисляется автоматически от даты добавления. Период можно скорректировать вручную для конкретного продукта. Для каждой категории продуктов есть значения по умолчанию, которые пользователь может настроить.
|
||||
- Уведомления о продуктах с истекающим сроком годности.
|
||||
- **Частичное использование.** Возможность отметить, что продукт использован частично (открытое молоко, отрезанный кусок сыра), с корректировкой оставшегося количества.
|
||||
- **Сброс и перезаполнение.** Возможность очистить все продукты и перезаполнить список заново — через фото содержимого холодильника или сканирование чека. Полезно при инвентаризации запасов.
|
||||
- **Объединение дубликатов.** При добавлении продукта, который уже есть в запасах, приложение предлагает объединить (прибавить количество) или добавить отдельной позицией (если разные сроки годности/партии).
|
||||
- **Единицы измерения.** Каждый продукт хранится с единицей измерения (г, кг, мл, л, шт, пучок, упаковка). При добавлении система предлагает наиболее подходящую единицу для категории, с возможностью смены.
|
||||
|
||||
### 3. Подбор меню и рекомендации
|
||||
|
||||
На основе имеющихся продуктов приложение предлагает рецепты с учётом фильтров:
|
||||
|
||||
- **По периоду:** на один приём пищи, на день, на неделю.
|
||||
- **По сложности:** быстрые и простые блюда, средняя сложность, сложные рецепты.
|
||||
- **По кухне:** азиатская, европейская, средиземноморская, русская и другие.
|
||||
- **По типу приёма пищи:** завтрак, обед, ужин, перекус.
|
||||
- **По диетическим предпочтениям:** вегетарианское, безглютеновое, низкокалорийное и т.д.
|
||||
|
||||
Если для рецепта не хватает некоторых продуктов, приложение показывает, чего именно не хватает, и формирует список покупок.
|
||||
|
||||
**Рекомендации.** Приложение проактивно предлагает рецепты и меню:
|
||||
|
||||
- На главном экране — блок «Рекомендуем приготовить» на основе имеющихся продуктов (приоритет: продукты с истекающим сроком).
|
||||
- После добавления продуктов (чек/фото) — экран-предложение «Составить меню из купленного?» с вариантами кухонь, сложности и периода.
|
||||
- В каталоге рецептов — персональная лента «Для вас» на основе предпочтений, истории, оценок.
|
||||
- На экране меню при пустых слотах — подсказка «Подобрать блюдо» с учётом оставшегося бюджета калорий на день.
|
||||
- **Замена ингредиентов.** Если для рецепта не хватает ингредиента, приложение может предложить замену из имеющихся продуктов (например, пекорино → пармезан).
|
||||
- **Быстрый повтор.** Часто готовимые блюда отображаются в секции «Готовили недавно» для быстрого доступа.
|
||||
|
||||
### 4. Планирование меню
|
||||
|
||||
- Составление меню на каждый день недели.
|
||||
- **Автогенерация меню.** Приложение может сгенерировать меню на день или неделю целиком по заданным параметрам (кухня, калорийность, сложность, из имеющихся продуктов). Пользователь может принять, заменить отдельные блюда или сгенерировать заново.
|
||||
- Редактирование и перестановка блюд между днями.
|
||||
- Автоматический подсчёт суммарной калорийности за день/неделю.
|
||||
- Формирование списка покупок на основе запланированного меню и имеющихся запасов.
|
||||
- История меню — возможность вернуться к удачному плану питания прошлых недель.
|
||||
- **Шаблоны меню.** Возможность сохранить текущее меню как шаблон (например, «Моя рабочая неделя», «Безглютеновая неделя») и применять его повторно.
|
||||
|
||||
### 5. Учёт калорий
|
||||
|
||||
- Автоматический подсчёт калорий на основе добавленных в дневник приёмов пищи.
|
||||
- Распознавание калорийности по фото готового блюда или продуктов.
|
||||
- Дневник питания: запись того, что было съедено за день.
|
||||
- **Размер порции.** При записи в дневник можно указать, какую долю порции съел пользователь (1, 0.5, 1.5 порции и т.д.).
|
||||
- Отображение баланса БЖУ (белки, жиры, углеводы).
|
||||
- Настройка целевой калорийности и отслеживание прогресса.
|
||||
- Графики и статистика за день, неделю, месяц.
|
||||
- **Быстрое добавление.** Перекусы, не являющиеся рецептом (банан, чай с сахаром), можно добавить через поиск по базе продуктов без необходимости фотографировать.
|
||||
|
||||
### 6. Рецепты
|
||||
|
||||
- Каталог рецептов с поиском и фильтрацией.
|
||||
- Карточка рецепта: список ингредиентов, калорийность, время приготовления, сложность, кухня.
|
||||
- Возможность оставить отзыв и оценку к рецепту.
|
||||
- Добавление рецепта в избранное.
|
||||
- Просмотр отзывов других пользователей.
|
||||
- **Замена ингредиентов.** В карточке рецепта для каждого ингредиента отображаются возможные замены. Если основного ингредиента нет в запасах, но есть подходящая замена — это отражается в наличии.
|
||||
- **Пользовательские рецепты.** Возможность создать и сохранить свой рецепт, который будет доступен в личном каталоге.
|
||||
|
||||
### 7. Пошаговая готовка с таймерами
|
||||
|
||||
- Режим готовки: рецепт разбит на последовательные шаги с фото и описанием.
|
||||
- На шагах, требующих ожидания (варить 15 минут, дать настояться 30 минут), отображается кнопка запуска таймера.
|
||||
- Нажатие на шаг с таймером запускает обратный отсчёт с уведомлением по завершении.
|
||||
- Возможность запуска нескольких таймеров параллельно (например, пока варится паста, готовится соус).
|
||||
- Экран не гаснет в режиме готовки.
|
||||
- **Завершение готовки:** после последнего шага — предложение записать в дневник, оценить рецепт и поделиться фото результата.
|
||||
|
||||
### 8. Онбординг
|
||||
|
||||
Первый запуск приложения включает короткий пошаговый процесс:
|
||||
|
||||
1. Приветствие и краткое описание возможностей (2–3 карточки с иллюстрациями).
|
||||
2. Указание базовых параметров: пол, возраст, рост, вес, уровень активности.
|
||||
3. Выбор цели: похудение, поддержание, набор массы. Расчёт рекомендуемой калорийности.
|
||||
4. Указание ограничений и предпочтений (аллергии, диеты).
|
||||
5. Предпочтения по кухням (выбрать 2–3 из списка).
|
||||
6. Предложение добавить первые продукты: сфотографировать холодильник, сканировать чек или пропустить.
|
||||
7. Переход на главный экран.
|
||||
|
||||
## Экраны приложения
|
||||
|
||||
### Главный экран
|
||||
- Сводка на сегодня: запланированные приёмы пищи, текущий баланс калорий.
|
||||
- Быстрые действия: сфотографировать чек, сфотографировать еду, найти рецепт.
|
||||
- **Рекомендации:** блок «Рекомендуем приготовить» — 2–3 карточки рецептов на основе имеющихся продуктов (приоритет — продукты с истекающим сроком).
|
||||
- **Быстрый повтор:** секция «Готовили недавно» — последние 3–5 приготовленных рецептов для быстрого повтора.
|
||||
|
||||
### Мои продукты
|
||||
- Список имеющихся продуктов, сгруппированных по категориям.
|
||||
- Кнопка добавления: вручную, через фото, через сканирование чека.
|
||||
- **Кнопка сброса/перезаполнения** в контекстном меню.
|
||||
- Срок годности отображается как «осталось X дней» (вычисляется от даты добавления + период хранения).
|
||||
|
||||
### Экран корректировки после распознавания
|
||||
- Общий для всех типов распознавания (чек, фото продуктов, фото блюда).
|
||||
- Каждый продукт: редактируемое название, вес/количество (инлайн-редактирование), единица измерения, категория, период хранения.
|
||||
- **Переход к составлению меню** — после подтверждения продуктов.
|
||||
|
||||
### Переходный экран «Составить меню?»
|
||||
- Появляется после добавления продуктов через чек или фото.
|
||||
- Предлагает составить меню из добавленных (и имеющихся) продуктов.
|
||||
- Быстрый выбор: на день / на неделю, кухня, сложность.
|
||||
- Кнопки «Составить меню» и «Пропустить».
|
||||
|
||||
### Меню
|
||||
- Календарь с запланированными приёмами пищи.
|
||||
- Возможность перетаскивания блюд между днями.
|
||||
- Итоговая калорийность по каждому дню.
|
||||
- **Кнопка автогенерации** меню на неделю.
|
||||
- **Подсказки** в пустых слотах с рекомендациями.
|
||||
|
||||
### Каталог рецептов
|
||||
- Поиск и фильтры (кухня, сложность, время, калорийность, тип приёма пищи).
|
||||
- Карточки рецептов с фото, названием, калорийностью и рейтингом.
|
||||
- Кнопка «Подобрать из моих продуктов».
|
||||
- **Секция «Для вас»** — персональные рекомендации.
|
||||
- **Секция «Готовили недавно»** — быстрый повтор.
|
||||
|
||||
### Карточка рецепта
|
||||
- Фото блюда.
|
||||
- Описание, время приготовления, сложность, калорийность, БЖУ.
|
||||
- Список ингредиентов с отметкой наличия в запасах и **предложениями замен**.
|
||||
- Кнопка «Начать готовить» — переход в режим пошаговой готовки.
|
||||
- Отзывы и оценки.
|
||||
- Кнопка «Добавить в меню».
|
||||
|
||||
### Режим готовки
|
||||
- Пошаговое отображение процесса.
|
||||
- Крупный текст и фото для удобства на кухне.
|
||||
- Кнопки таймеров на соответствующих шагах.
|
||||
- Панель активных таймеров внизу экрана.
|
||||
- **Экран завершения:** предложение записать в дневник, оценить, поделиться.
|
||||
|
||||
### Дневник питания
|
||||
- Записи о приёмах пищи за день.
|
||||
- Добавление: из рецепта, из меню, через фото, вручную, **из быстрого поиска по базе продуктов**.
|
||||
- **Регулировка размера порции** при добавлении.
|
||||
- Итоги дня: калории, БЖУ, прогресс к цели.
|
||||
|
||||
### Статистика
|
||||
- Графики калорийности и БЖУ за выбранный период.
|
||||
- Сравнение с целевыми показателями.
|
||||
- Тренды и динамика.
|
||||
|
||||
### Список покупок
|
||||
- Формируется автоматически из запланированного меню с учётом имеющихся запасов.
|
||||
- Возможность ручного редактирования.
|
||||
- Отметка купленных позиций.
|
||||
|
||||
### Профиль
|
||||
- Персональные данные (вес, рост, возраст, уровень активности).
|
||||
- Цели (похудение, набор массы, поддержание).
|
||||
- Расчёт рекомендуемой суточной калорийности.
|
||||
- Диетические предпочтения и ограничения.
|
||||
- **Настройки сроков хранения** по категориям продуктов.
|
||||
- **Мои рецепты** — пользовательские рецепты.
|
||||
|
||||
## Пользовательские сценарии
|
||||
|
||||
### Сценарий 1: Первый запуск
|
||||
1. Пользователь скачивает приложение и проходит онбординг.
|
||||
2. Указывает параметры, цели, предпочтения по кухням.
|
||||
3. Фотографирует содержимое холодильника.
|
||||
4. Корректирует список продуктов (вес, количество, названия).
|
||||
5. Приложение предлагает составить меню из того, что есть.
|
||||
6. Пользователь получает первое сгенерированное меню.
|
||||
|
||||
### Сценарий 2: Пришёл из магазина
|
||||
1. Пользователь фотографирует чек.
|
||||
2. Приложение распознаёт продукты. Пользователь корректирует (редактирует вес/количество, удаляет лишнее, добавляет пропущенное).
|
||||
3. Для дубликатов — предложение объединить с имеющимися.
|
||||
4. Подтверждает → переходный экран: «Составить меню из купленного?»
|
||||
5. Выбирает: на неделю, европейская кухня, средняя сложность.
|
||||
6. Получает сгенерированное меню, корректирует, сохраняет.
|
||||
|
||||
### Сценарий 3: Что приготовить из того, что есть?
|
||||
1. Пользователь открывает подбор рецептов.
|
||||
2. Выбирает фильтры: «из моих продуктов», «ужин», «до 30 минут», «азиатская кухня».
|
||||
3. Получает список подходящих рецептов, отсортированных по степени совпадения с имеющимися продуктами.
|
||||
4. Для рецепта, где не хватает ингредиента, видит предложение замены (пекорино → пармезан).
|
||||
5. Выбирает рецепт и начинает пошаговую готовку.
|
||||
|
||||
### Сценарий 4: Планирование недели
|
||||
1. Пользователь открывает экран меню.
|
||||
2. Нажимает «Автогенерация» → выбирает параметры (кухня, калорийность, из моих продуктов).
|
||||
3. Приложение генерирует меню на неделю. Пользователь заменяет пару блюд вручную.
|
||||
4. Формируется список покупок — с учётом имеющихся запасов.
|
||||
|
||||
### Сценарий 5: Учёт калорий на ходу
|
||||
1. Пользователь обедает в кафе.
|
||||
2. Фотографирует блюдо.
|
||||
3. Приложение определяет блюдо и его примерную калорийность.
|
||||
4. Пользователь корректирует размер порции.
|
||||
5. Данные записываются в дневник питания.
|
||||
|
||||
### Сценарий 6: Готовка по рецепту
|
||||
1. Пользователь открывает рецепт и нажимает «Начать готовить».
|
||||
2. Следует пошаговым инструкциям.
|
||||
3. На шаге «Варить бульон 40 минут» нажимает на таймер.
|
||||
4. Переходит к параллельным шагам (нарезка овощей) пока таймер тикает.
|
||||
5. Получает уведомление о готовности бульона.
|
||||
6. На последнем шаге — предложение записать блюдо в дневник и оценить рецепт.
|
||||
|
||||
### Сценарий 7: Инвентаризация продуктов
|
||||
1. Пользователь давно не обновлял список продуктов.
|
||||
2. Открывает «Мои продукты» → контекстное меню → «Очистить и перезаполнить».
|
||||
3. Подтверждает сброс.
|
||||
4. Фотографирует содержимое холодильника (несколько фото).
|
||||
5. Корректирует распознанный список.
|
||||
6. Продукты обновлены, сроки пересчитаны от текущей даты.
|
||||
|
||||
### Сценарий 8: Использование рекомендаций
|
||||
1. Пользователь открывает приложение утром.
|
||||
2. На главном экране видит: «Рекомендуем приготовить: Стир-фрай с курицей — используйте курицу (срок истекает завтра) и овощи из запасов».
|
||||
3. Тап по карточке → карточка рецепта → «Начать готовить».
|
||||
|
||||
## Монетизация (варианты)
|
||||
|
||||
- **Freemium.** Базовые функции бесплатно (ручной ввод продуктов, просмотр рецептов, планирование меню). Распознавание через камеру, расширенная аналитика, персональные рекомендации — по подписке.
|
||||
- **Подписка.** Ежемесячная/годовая подписка на полный функционал.
|
||||
- **Без рекламы.** Бесплатная версия с рекламой, платная — без.
|
||||
Reference in New Issue
Block a user