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>
25 KiB
25 KiB
FoodAI — мобильное приложение для управления питанием
Концепция
FoodAI — мобильное приложение, которое помогает пользователю управлять своим питанием: планировать меню, вести учёт калорий и контролировать запасы продуктов. Ключевая особенность — использование камеры телефона для распознавания продуктов, чеков и готовых блюд с автоматическим подсчётом калорий и подбором рецептов.
Целевая аудитория
- Люди, следящие за питанием и калорийностью рациона
- Те, кто хочет разнообразить своё меню и научиться готовить
- Люди, которые хотят минимизировать пищевые отходы, используя имеющиеся продукты
- Начинающие кулинары, которым важен пошаговый процесс готовки
Основные функции
1. Распознавание продуктов через камеру
- Сканирование чека. Пользователь фотографирует чек из магазина. Приложение распознаёт список купленных продуктов и автоматически добавляет их в запасы.
- Фото продуктов. Пользователь фотографирует продукты (например, содержимое холодильника). Приложение определяет, что на фото, и добавляет распознанные продукты в запасы.
- Фото готового блюда. Пользователь фотографирует готовое блюдо или порцию еды. Приложение определяет блюдо и примерную калорийность.
- Мультифото. При фотографировании продуктов можно сделать несколько снимков подряд (например, разные полки холодильника), и результаты объединяются в один общий список.
- Корректировка результатов. После любого распознавания пользователь может отредактировать каждый продукт: изменить название, вес, количество, категорию, удалить ошибочно распознанный или добавить пропущенный.
2. Учёт продуктов
- Список имеющихся продуктов с возможностью ручного редактирования.
- Автоматическое пополнение запасов через сканирование чеков и фото.
- Автоматическое списание продуктов при отметке приготовленных рецептов.
- Срок годности как период хранения. Вместо фиксированной даты «до XX.XX» используется модель «срок хранения после покупки» (например, молоко — 5 дней). Дата вычисляется автоматически от даты добавления. Период можно скорректировать вручную для конкретного продукта. Для каждой категории продуктов есть значения по умолчанию, которые пользователь может настроить.
- Уведомления о продуктах с истекающим сроком годности.
- Частичное использование. Возможность отметить, что продукт использован частично (открытое молоко, отрезанный кусок сыра), с корректировкой оставшегося количества.
- Сброс и перезаполнение. Возможность очистить все продукты и перезаполнить список заново — через фото содержимого холодильника или сканирование чека. Полезно при инвентаризации запасов.
- Объединение дубликатов. При добавлении продукта, который уже есть в запасах, приложение предлагает объединить (прибавить количество) или добавить отдельной позицией (если разные сроки годности/партии).
- Единицы измерения. Каждый продукт хранится с единицей измерения (г, кг, мл, л, шт, пучок, упаковка). При добавлении система предлагает наиболее подходящую единицу для категории, с возможностью смены.
3. Подбор меню и рекомендации
На основе имеющихся продуктов приложение предлагает рецепты с учётом фильтров:
- По периоду: на один приём пищи, на день, на неделю.
- По сложности: быстрые и простые блюда, средняя сложность, сложные рецепты.
- По кухне: азиатская, европейская, средиземноморская, русская и другие.
- По типу приёма пищи: завтрак, обед, ужин, перекус.
- По диетическим предпочтениям: вегетарианское, безглютеновое, низкокалорийное и т.д.
Если для рецепта не хватает некоторых продуктов, приложение показывает, чего именно не хватает, и формирует список покупок.
Рекомендации. Приложение проактивно предлагает рецепты и меню:
- На главном экране — блок «Рекомендуем приготовить» на основе имеющихся продуктов (приоритет: продукты с истекающим сроком).
- После добавления продуктов (чек/фото) — экран-предложение «Составить меню из купленного?» с вариантами кухонь, сложности и периода.
- В каталоге рецептов — персональная лента «Для вас» на основе предпочтений, истории, оценок.
- На экране меню при пустых слотах — подсказка «Подобрать блюдо» с учётом оставшегося бюджета калорий на день.
- Замена ингредиентов. Если для рецепта не хватает ингредиента, приложение может предложить замену из имеющихся продуктов (например, пекорино → пармезан).
- Быстрый повтор. Часто готовимые блюда отображаются в секции «Готовили недавно» для быстрого доступа.
4. Планирование меню
- Составление меню на каждый день недели.
- Автогенерация меню. Приложение может сгенерировать меню на день или неделю целиком по заданным параметрам (кухня, калорийность, сложность, из имеющихся продуктов). Пользователь может принять, заменить отдельные блюда или сгенерировать заново.
- Редактирование и перестановка блюд между днями.
- Автоматический подсчёт суммарной калорийности за день/неделю.
- Формирование списка покупок на основе запланированного меню и имеющихся запасов.
- История меню — возможность вернуться к удачному плану питания прошлых недель.
- Шаблоны меню. Возможность сохранить текущее меню как шаблон (например, «Моя рабочая неделя», «Безглютеновая неделя») и применять его повторно.
5. Учёт калорий
- Автоматический подсчёт калорий на основе добавленных в дневник приёмов пищи.
- Распознавание калорийности по фото готового блюда или продуктов.
- Дневник питания: запись того, что было съедено за день.
- Размер порции. При записи в дневник можно указать, какую долю порции съел пользователь (1, 0.5, 1.5 порции и т.д.).
- Отображение баланса БЖУ (белки, жиры, углеводы).
- Настройка целевой калорийности и отслеживание прогресса.
- Графики и статистика за день, неделю, месяц.
- Быстрое добавление. Перекусы, не являющиеся рецептом (банан, чай с сахаром), можно добавить через поиск по базе продуктов без необходимости фотографировать.
6. Рецепты
- Каталог рецептов с поиском и фильтрацией.
- Карточка рецепта: список ингредиентов, калорийность, время приготовления, сложность, кухня.
- Возможность оставить отзыв и оценку к рецепту.
- Добавление рецепта в избранное.
- Просмотр отзывов других пользователей.
- Замена ингредиентов. В карточке рецепта для каждого ингредиента отображаются возможные замены. Если основного ингредиента нет в запасах, но есть подходящая замена — это отражается в наличии.
- Пользовательские рецепты. Возможность создать и сохранить свой рецепт, который будет доступен в личном каталоге.
7. Пошаговая готовка с таймерами
- Режим готовки: рецепт разбит на последовательные шаги с фото и описанием.
- На шагах, требующих ожидания (варить 15 минут, дать настояться 30 минут), отображается кнопка запуска таймера.
- Нажатие на шаг с таймером запускает обратный отсчёт с уведомлением по завершении.
- Возможность запуска нескольких таймеров параллельно (например, пока варится паста, готовится соус).
- Экран не гаснет в режиме готовки.
- Завершение готовки: после последнего шага — предложение записать в дневник, оценить рецепт и поделиться фото результата.
8. Онбординг
Первый запуск приложения включает короткий пошаговый процесс:
- Приветствие и краткое описание возможностей (2–3 карточки с иллюстрациями).
- Указание базовых параметров: пол, возраст, рост, вес, уровень активности.
- Выбор цели: похудение, поддержание, набор массы. Расчёт рекомендуемой калорийности.
- Указание ограничений и предпочтений (аллергии, диеты).
- Предпочтения по кухням (выбрать 2–3 из списка).
- Предложение добавить первые продукты: сфотографировать холодильник, сканировать чек или пропустить.
- Переход на главный экран.
Экраны приложения
Главный экран
- Сводка на сегодня: запланированные приёмы пищи, текущий баланс калорий.
- Быстрые действия: сфотографировать чек, сфотографировать еду, найти рецепт.
- Рекомендации: блок «Рекомендуем приготовить» — 2–3 карточки рецептов на основе имеющихся продуктов (приоритет — продукты с истекающим сроком).
- Быстрый повтор: секция «Готовили недавно» — последние 3–5 приготовленных рецептов для быстрого повтора.
Мои продукты
- Список имеющихся продуктов, сгруппированных по категориям.
- Кнопка добавления: вручную, через фото, через сканирование чека.
- Кнопка сброса/перезаполнения в контекстном меню.
- Срок годности отображается как «осталось X дней» (вычисляется от даты добавления + период хранения).
Экран корректировки после распознавания
- Общий для всех типов распознавания (чек, фото продуктов, фото блюда).
- Каждый продукт: редактируемое название, вес/количество (инлайн-редактирование), единица измерения, категория, период хранения.
- Переход к составлению меню — после подтверждения продуктов.
Переходный экран «Составить меню?»
- Появляется после добавления продуктов через чек или фото.
- Предлагает составить меню из добавленных (и имеющихся) продуктов.
- Быстрый выбор: на день / на неделю, кухня, сложность.
- Кнопки «Составить меню» и «Пропустить».
Меню
- Календарь с запланированными приёмами пищи.
- Возможность перетаскивания блюд между днями.
- Итоговая калорийность по каждому дню.
- Кнопка автогенерации меню на неделю.
- Подсказки в пустых слотах с рекомендациями.
Каталог рецептов
- Поиск и фильтры (кухня, сложность, время, калорийность, тип приёма пищи).
- Карточки рецептов с фото, названием, калорийностью и рейтингом.
- Кнопка «Подобрать из моих продуктов».
- Секция «Для вас» — персональные рекомендации.
- Секция «Готовили недавно» — быстрый повтор.
Карточка рецепта
- Фото блюда.
- Описание, время приготовления, сложность, калорийность, БЖУ.
- Список ингредиентов с отметкой наличия в запасах и предложениями замен.
- Кнопка «Начать готовить» — переход в режим пошаговой готовки.
- Отзывы и оценки.
- Кнопка «Добавить в меню».
Режим готовки
- Пошаговое отображение процесса.
- Крупный текст и фото для удобства на кухне.
- Кнопки таймеров на соответствующих шагах.
- Панель активных таймеров внизу экрана.
- Экран завершения: предложение записать в дневник, оценить, поделиться.
Дневник питания
- Записи о приёмах пищи за день.
- Добавление: из рецепта, из меню, через фото, вручную, из быстрого поиска по базе продуктов.
- Регулировка размера порции при добавлении.
- Итоги дня: калории, БЖУ, прогресс к цели.
Статистика
- Графики калорийности и БЖУ за выбранный период.
- Сравнение с целевыми показателями.
- Тренды и динамика.
Список покупок
- Формируется автоматически из запланированного меню с учётом имеющихся запасов.
- Возможность ручного редактирования.
- Отметка купленных позиций.
Профиль
- Персональные данные (вес, рост, возраст, уровень активности).
- Цели (похудение, набор массы, поддержание).
- Расчёт рекомендуемой суточной калорийности.
- Диетические предпочтения и ограничения.
- Настройки сроков хранения по категориям продуктов.
- Мои рецепты — пользовательские рецепты.
Пользовательские сценарии
Сценарий 1: Первый запуск
- Пользователь скачивает приложение и проходит онбординг.
- Указывает параметры, цели, предпочтения по кухням.
- Фотографирует содержимое холодильника.
- Корректирует список продуктов (вес, количество, названия).
- Приложение предлагает составить меню из того, что есть.
- Пользователь получает первое сгенерированное меню.
Сценарий 2: Пришёл из магазина
- Пользователь фотографирует чек.
- Приложение распознаёт продукты. Пользователь корректирует (редактирует вес/количество, удаляет лишнее, добавляет пропущенное).
- Для дубликатов — предложение объединить с имеющимися.
- Подтверждает → переходный экран: «Составить меню из купленного?»
- Выбирает: на неделю, европейская кухня, средняя сложность.
- Получает сгенерированное меню, корректирует, сохраняет.
Сценарий 3: Что приготовить из того, что есть?
- Пользователь открывает подбор рецептов.
- Выбирает фильтры: «из моих продуктов», «ужин», «до 30 минут», «азиатская кухня».
- Получает список подходящих рецептов, отсортированных по степени совпадения с имеющимися продуктами.
- Для рецепта, где не хватает ингредиента, видит предложение замены (пекорино → пармезан).
- Выбирает рецепт и начинает пошаговую готовку.
Сценарий 4: Планирование недели
- Пользователь открывает экран меню.
- Нажимает «Автогенерация» → выбирает параметры (кухня, калорийность, из моих продуктов).
- Приложение генерирует меню на неделю. Пользователь заменяет пару блюд вручную.
- Формируется список покупок — с учётом имеющихся запасов.
Сценарий 5: Учёт калорий на ходу
- Пользователь обедает в кафе.
- Фотографирует блюдо.
- Приложение определяет блюдо и его примерную калорийность.
- Пользователь корректирует размер порции.
- Данные записываются в дневник питания.
Сценарий 6: Готовка по рецепту
- Пользователь открывает рецепт и нажимает «Начать готовить».
- Следует пошаговым инструкциям.
- На шаге «Варить бульон 40 минут» нажимает на таймер.
- Переходит к параллельным шагам (нарезка овощей) пока таймер тикает.
- Получает уведомление о готовности бульона.
- На последнем шаге — предложение записать блюдо в дневник и оценить рецепт.
Сценарий 7: Инвентаризация продуктов
- Пользователь давно не обновлял список продуктов.
- Открывает «Мои продукты» → контекстное меню → «Очистить и перезаполнить».
- Подтверждает сброс.
- Фотографирует содержимое холодильника (несколько фото).
- Корректирует распознанный список.
- Продукты обновлены, сроки пересчитаны от текущей даты.
Сценарий 8: Использование рекомендаций
- Пользователь открывает приложение утром.
- На главном экране видит: «Рекомендуем приготовить: Стир-фрай с курицей — используйте курицу (срок истекает завтра) и овощи из запасов».
- Тап по карточке → карточка рецепта → «Начать готовить».
Монетизация (варианты)
- Freemium. Базовые функции бесплатно (ручной ввод продуктов, просмотр рецептов, планирование меню). Распознавание через камеру, расширенная аналитика, персональные рекомендации — по подписке.
- Подписка. Ежемесячная/годовая подписка на полный функционал.
- Без рекламы. Бесплатная версия с рекламой, платная — без.