Frontend — Family Budget SPA
React SPA для учёта семейного бюджета: импорт банковских выписок, категоризация операций, аналитика.
Стек
- React 19 + TypeScript
- Vite — сборка и dev-сервер
- React Router 7 — маршрутизация
- Recharts — графики (столбиковые, круговые)
- @family-budget/shared — общие TypeScript-типы (API-контракты)
Структура
frontend/
├── index.html — точка входа
├── vite.config.ts — конфигурация Vite (прокси на backend)
├── tsconfig.json
└── src/
├── main.tsx — рендер корневого компонента
├── App.tsx — маршруты и проверка авторизации
├── styles/
│ └── index.css — глобальные стили, CSS-переменные
├── api/ — модули запросов к backend
│ ├── client.ts — fetch-обёртка с обработкой 401
│ ├── auth.ts — login, logout, me
│ ├── transactions.ts — GET/PUT /api/transactions
│ ├── accounts.ts — GET/PUT /api/accounts
│ ├── categories.ts — GET /api/categories
│ ├── rules.ts — CRUD /api/category-rules
│ ├── analytics.ts — summary, by-category, timeseries
│ └── import.ts — POST /api/import/statement
├── context/
│ └── AuthContext.tsx — провайдер авторизации
├── pages/
│ ├── LoginPage.tsx — форма входа
│ ├── HistoryPage.tsx — таблица операций с фильтрами
│ ├── AnalyticsPage.tsx — сводка, графики, категории
│ └── SettingsPage.tsx — счета, категории, правила
├── components/
│ ├── Layout.tsx — боковое меню, обёртка
│ ├── TransactionFilters.tsx
│ ├── TransactionTable.tsx
│ ├── Pagination.tsx
│ ├── EditTransactionModal.tsx
│ ├── ImportModal.tsx
│ ├── PeriodSelector.tsx
│ ├── SummaryCards.tsx
│ ├── TimeseriesChart.tsx
│ ├── CategoryChart.tsx
│ ├── AccountsList.tsx
│ ├── CategoriesList.tsx
│ └── RulesList.tsx
└── utils/
└── format.ts — форматирование сумм и дат
Экраны
| Экран | Маршрут | Описание |
|---|---|---|
| Логин | — | Отображается при отсутствии сессии |
| Операции | /history |
Таблица транзакций, фильтры, импорт, редактирование |
| Аналитика | /analytics |
Сводка, динамика (bar chart), расходы по категориям |
| Настройки | /settings |
Счета (алиасы), категории (просмотр), правила |
Требования
- Node.js >= 20
- Собранный пакет
@family-budget/shared(см. корневой README) - Запущенный backend на
http://localhost:3000
Команды
# Установка зависимостей (из корня монорепо)
npm install
# Сборка shared-типов (если ещё не собраны)
npm run build -w shared
# Запуск dev-сервера (порт 5173, прокси /api → localhost:3000)
npm run dev -w frontend
# Production-сборка
npm run build -w frontend
# Предпросмотр production-сборки
npm run preview -w frontend
Прокси
В dev-режиме Vite проксирует все запросы /api/* на http://localhost:3000 (см. vite.config.ts). В production фронтенд отдаётся как статика, а проксирование настраивается на уровне reverse proxy (nginx и т.п.).
Авторизация
- При загрузке SPA выполняется
GET /api/auth/me. - Если сессия не активна — отображается форма логина.
- При получении
401от любого API-запроса — автоматический сброс состояния и возврат к форме логина. - Таймаут сессии — 3 часа бездействия (управляется backend).
API-контракты
Типы запросов и ответов определены в @family-budget/shared и описаны в спецификациях:
docs/backlog/auth.md— авторизацияdocs/backlog/api_history.md— история операцийdocs/backlog/api_import.md— импорт выписокdocs/backlog/api_reference_accounts_categories.md— справочникиdocs/backlog/api_rules.md— правила категоризацииdocs/backlog/analytics.md— аналитикаdocs/backlog/edit_and_rules.md— редактирование транзакций