Кроссплатформенный сервис мониторинга подписок для кейса «Монитор подписок». Проект включает общий backend, web-клиент, Android-приложение и iOS-приложение.
- Регистрация и авторизация пользователя по JWT.
- Единый backend API для web, Android и iOS.
- Ручное добавление, редактирование и удаление подписок.
- Просмотр списка подписок, ближайших списаний и календаря платежей.
- Аналитика расходов по категориям и сервисам.
- Прогноз затрат на месяц, полгода и год.
- Импорт подписок из почты через IMAP или демо-режим с тестовыми письмами.
- Уведомления о предстоящих списаниях.
- Профиль пользователя: просмотр и редактирование данных, смена пароля.
backend/
app/
core/ Конфиг, БД, безопасность, JWT
models/ SQLAlchemy-модели
routes/ FastAPI-роуты
schemas/ Pydantic-схемы
services/ Бизнес-логика
email_parser/ IMAP-парсер и эвристики извлечения подписок
main.py Точка входа FastAPI
Dockerfile
requirements.txt
frontend/
web/ WEB-клиент на ванильном JS + Node static server
android/ Android-приложение
ios/ iOS-приложение CtrlS
docker-compose.yml
.env.example
- Python
- FastAPI
- SQLAlchemy
- PostgreSQL
- JWT
- IMAP
- HTML
- CSS
- Vanilla JavaScript
- Node.js
- Java
- Retrofit
- MPAndroidChart
- WorkManager
- Swift
- SwiftUI
Все клиенты используют один backend API.
- Backend поднимает REST API для авторизации, подписок, аналитики, прогноза, уведомлений и импорта из почты.
- Web-клиент проксирует запросы через
/api/*на backend. - Android-клиент работает напрямую с backend через Retrofit.
- iOS-клиент работает напрямую с backend через
RealAPIService.
POST /auth/registerPOST /auth/loginGET /auth/mePATCH /auth/mePOST /auth/change-passwordPOST /subscriptionsGET /subscriptionsGET /subscriptions/{id}PUT /subscriptions/{id}DELETE /subscriptions/{id}POST /email/importGET /analyticsGET /analytics/chart?period=month|half_year|yearGET /forecastGET /notifications/upcoming?days=3GET /healthGET /db-check
- Страницы логина и регистрации.
- Главная панель с KPI и ближайшими списаниями.
- Экран подписок с созданием, редактированием, удалением и паузой.
- Календарь платежей.
- Аналитика с графиками.
- Настройки профиля и смена пароля.
- Просмотр ближайших уведомлений.
- Экран авторизации и регистрации.
- Главная страница с прогнозом и ближайшими списаниями.
- Список подписок с фильтрами, редактированием, удалением и паузой.
- Экран аналитики с графиками.
- Календарь платежей.
- Профиль пользователя.
- Импорт подписок из почты.
- Локальные уведомления через WorkManager.
- Авторизация и регистрация.
- Главная страница с итогами, прогнозом и ближайшими списаниями.
- Экран подписок с поиском, фильтрацией и CRUD.
- Календарь платежей.
- Аналитика.
- Профиль пользователя.
- Импорт из почты.
- Экран уведомлений.
- Docker и Docker Compose, если запускать backend в контейнерах.
- Или локально:
- Python 3.11+
- PostgreSQL 16+
- Node.js 18+ для web-клиента.
- Android Studio для Android.
- Xcode для iOS.
Скопируйте .env в корень проекта:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=technostrelkadb
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
JWT_SECRET_KEY=change-me
ACCESS_TOKEN_EXPIRE_MINUTES=60docker compose up --buildПосле запуска:
- API:
http://127.0.0.1:8000 - Swagger:
http://127.0.0.1:8000/docs
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadВажно:
- нужен запущенный PostgreSQL;
- backend читает переменные из корневого
.env.
cd frontend/web
npm install
npm startПо умолчанию web-клиент будет доступен на:
http://localhost:3000
По умолчанию запросы проксируются на backend:
http://localhost:8000
При необходимости можно переопределить адрес backend:
BACKEND_URL=http://127.0.0.1:8000 npm start- Откройте папку
frontend/androidв Android Studio. - Убедитесь, что backend уже запущен.
- Запустите приложение на эмуляторе или устройстве.
Текущее базовое API для Android:
http://10.0.2.2:8000
Это подходит для Android Emulator. Для физического устройства адрес backend нужно заменить на IP вашей машины в локальной сети.
- Откройте
frontend/ios/CtrlS/CtrlS.xcodeprojв Xcode. - Убедитесь, что backend уже запущен.
- Запустите приложение на симуляторе или устройстве.
Текущее базовое API для iOS:
http://127.0.0.1:8000
Для физического устройства адрес backend также нужно заменить на IP машины, где поднят backend.
Поддерживается два режима:
use_sample=trueдля безопасной демонстрации на тестовых письмах;- IMAP-импорт с явным согласием пользователя на использование пароля приложения.
Поддерживаемые IMAP-серверы:
imap.gmail.comimap.mail.ruimap.yandex.ruimap.rambler.ruimap.mail.yahoo.comimap-mail.outlook.comoutlook.office365.com
Для публичной демонстрации рекомендуется использовать демо-режим, чтобы не зависеть от внешней почтовой инфраструктуры.