Современное веб-приложение для управления личными финансами, построенное на Next.js и Supabase.
- Next.js 15 - React фреймворк с App Router
- TypeScript - Типизированный JavaScript
- Tailwind CSS - Утилитарный CSS фреймворк
- Supabase - Открытая альтернатива Firebase
- ESLint - Линтер для JavaScript/TypeScript
- 📊 Учет доходов и расходов - Ведение детального учета финансов
- 📈 Аналитика и отчеты - Визуализация финансовых данных
- 🏷️ Категоризация - Организация трат по категориям
- 💳 Управление счетами - Отслеживание баланса по разным счетам
- 📱 Адаптивный дизайн - Удобное использование на всех устройствах
- 🔐 Безопасность - Защита персональных финансовых данных
git clone <your-repo-url>
cd bochonok
npm install- Создайте проект на supabase.com
- Перейдите в Settings → API
- Скопируйте Project URL и Public Anon Key
Создайте файл .env.local в корне проекта:
cp .env.example .env.localЗаполните переменные окружения:
# Supabase Configuration
NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
# Optional: Supabase Service Role Key (for admin operations)
SUPABASE_SERVICE_ROLE_KEY=your_service_role_keynpm run devОткройте http://localhost:3000 в браузере.
src/
├── app/ # Next.js App Router
│ ├── auth/
│ │ └── callback/
│ │ └── route.ts # Обработка OAuth callback от Supabase
│ ├── login/
│ │ └── page.tsx # Страница входа/регистрации
│ ├── globals.css # Глобальные стили Tailwind
│ ├── layout.tsx # Корневой layout приложения
│ └── page.tsx # Главная страница (защищенная)
├── components/
│ └── auth/ # Компоненты аутентификации
│ ├── login-form.tsx # Форма входа/регистрации
│ └── user-nav.tsx # Навигация пользователя (профиль/выход)
├── lib/
│ ├── supabase/ # Supabase клиенты
│ │ ├── client.ts # Браузерный клиент (для Client Components)
│ │ └── server.ts # Серверный клиент (для Server Components)
│ └── types/
│ ├── database.ts # Автогенерированные типы Supabase
│ └── database-simplified.ts # Упрощенная версия для новичков
└── middleware.ts # Next.js middleware для защиты маршрутов
layout.tsx- Основной макет приложения, подключает шрифты и стилиpage.tsx- Главная страница с дашбордом бюджета (требует авторизации)login/page.tsx- Страница входа с формой регистрации/авторизацииauth/callback/route.ts- API роут для обработки OAuth редиректов от Supabase
auth/login-form.tsx- Интерактивная форма с кнопками "Войти" и "Зарегистрироваться"auth/user-nav.tsx- Компонент навигации для авторизованных пользователей
supabase/client.ts- Создает клиент Supabase для браузера (Client Components)supabase/server.ts- Создает клиент Supabase для сервера (Server Components, API)types/database.ts- Типы TypeScript для всех таблиц БД (автогенерируется)types/database-simplified.ts- Упрощенная версия типов для новичков
- Проверяет авторизацию пользователя на каждом запросе
- Перенаправляет неавторизованных на
/login - Обновляет токены авторизации автоматически
Проект включает готовую систему аутентификации с Supabase:
-
Регистрация нового пользователя:
- Пользователь заполняет email и пароль
- Supabase отправляет письмо с подтверждением
- После подтверждения создается аккаунт
-
Вход существующего пользователя:
- Пользователь вводит email и пароль
- Supabase проверяет данные и создает сессию
- Пользователь перенаправляется на главную страницу
-
Защита маршрутов:
middleware.tsпроверяет каждый запрос- Если пользователь не авторизован → редирект на
/login - Если авторизован → доступ к защищенным страницам
-
LoginForm (
login-form.tsx):- Форма с полями email/password
- Кнопки "Войти" и "Зарегистрироваться"
- Обработка ошибок и успешных действий
-
UserNav (
user-nav.tsx):- Показывает информацию о пользователе
- Кнопка выхода из аккаунта
- Отображается только для авторизованных
- Пароли хешируются автоматически Supabase
- JWT токены для поддержания сессии
- Автоматическое обновление токенов
- Row Level Security (RLS) в базе данных
# Запуск в режиме разработки
npm run dev
# Сборка для продакшена
npm run build
# Запуск продакшен сервера
npm start
# Линтинг кода
npm run lintПроект использует два типа клиентов:
- Browser Client (
src/lib/supabase/client.ts) - для клиентских компонентов - Server Client (
src/lib/supabase/server.ts) - для серверных компонентов и API
Middleware (src/middleware.ts) автоматически:
- Проверяет аутентификацию пользователя
- Перенаправляет неавторизованных пользователей на страницу входа
- Обновляет токены аутентификации
Файл src/lib/types/database.ts содержит автоматически сгенерированные типы для работы с Supabase. Давайте разберем что там происходит:
1. Базовый тип Json - описывает все возможные JSON данные
export type Json = string | number | boolean | null | { [key: string]: Json } | Json[]2. Основной тип Database - "карта" всей вашей базы данных
__InternalSupabase- техническая информация Supabase (можно игнорировать)public- основная схема БДTables- все ваши таблицыprofiles- таблица профилей пользователей
3. Структура таблицы profiles:
Row- как выглядят данные при чтении (id, user_id, full_name, avatar_url, created_at)Insert- что нужно при создании записи (большинство полей опциональны)Update- что можно изменить при обновлении (все поля опциональны)
4. Сложные utility типы - Tables<>, TablesInsert<>, TablesUpdate<> и др.
- Это сложные TypeScript помощники для извлечения типов
- Для новичков могут быть слишком сложными
- Позволяют писать
Tables<'profiles'>вместо длинного пути к типу
Большая часть файла - это автоматически сгенерированный код от Supabase CLI. Для начала достаточно понимать:
- Тип
Json- оставляем, он нужен для безопасности - Тип
Database- основа всего, обязательно нужен - Структуру таблиц - описывает ваши данные
- Простые типы для удобства:
// Вместо сложных utility типов можно использовать простые:
export type Profile = Database['public']['Tables']['profiles']['Row']
export type ProfileInsert = Database['public']['Tables']['profiles']['Insert']
export type ProfileUpdate = Database['public']['Tables']['profiles']['Update']Создана упрощенная версия в src/lib/types/database-simplified.ts - она содержит только самое необходимое без сложной магии TypeScript.
Когда вы добавите новые таблицы в Supabase, обновите типы командой:
npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/lib/types/database.ts- Создайте таблицы в Supabase - используйте SQL Editor или Table Editor
- Обновите типы - добавьте типы ваших таблиц в
database.ts - Настройте RLS - включите Row Level Security для безопасности
- Добавьте новые компоненты - создайте UI для вашего приложения
- Деплой - разверните на Vercel, Netlify или другой платформе
Если у вас есть вопросы или проблемы, создайте issue в репозитории.