← Все проекты

Кейс · Go-бэкенд

Книга учёта: личные финансы

Учёт личных финансов: счета в разных валютах с ручными курсами, доходы, расходы и переводы, бюджеты, платежи по cron-подобному расписанию, импорт CSV с превью, отчёты. Деньги только в целых минорных единицах, данные пользователей изолированы, графики нарисованы на SVG без библиотек. Go + SQLite и фронтенд на Nuxt 4.

  • Go
  • SQLite
  • modernc.org/sqlite (без CGO)
  • REST API
  • Nuxt 4
  • Vue 3
  • TypeScript
  • Pinia
  • SVG-графики
  • vitest
  • ESLint
  • Docker
  • GitHub Actions
  • PBKDF2
  • CSV import/export

01 · Как выглядит

Скриншоты

Скриншот проекта «Книга учёта: личные финансы» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «Книга учёта: личные финансы» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

«Книга учёта» — самостоятельно размещаемый учёт личных финансов: счета в разных валютах, доходы, расходы и переводы, бюджеты с предупреждениями, платежи по расписанию, импорт CSV из банка и отчёты. Один Go-бинарник с SQLite внутри и встроенным фронтендом на Nuxt 4.

Главное — деньги: везде, в базе, API и браузере, они хранятся целыми минорными единицами (копейки, центы), а пересчёт валют идёт через big.Int с округлением. Графики нарисованы на SVG без библиотеки. Данные в интерфейсе демо-режима везде помечены как выдуманные.

Ограничения

Курсы только ручные и текущие: история курсов не хранится, поэтому прошлое пересчитывается по сегодняшним курсам и курсовая разница не видна. Базовую валюту и валюту счёта нельзя сменить.

Бюджет один и тот же каждый месяц, без переноса остатков. Платежи по расписанию создаются, когда кто-то открывает приложение или нажимает кнопку: фонового планировщика нет.

Нет смены и восстановления пароля, подтверждения почты. SQLite и один процесс: для личного или семейного использования, не для высокой нагрузки. В style-src остался unsafe-inline (стили Vue), SSR отключён, это SPA-оболочка.

Тесты с -race проходят только в CI (локально нет gcc), Docker-образ не собирался.

Что внутри

  • Счета в разных валютах и ручные курсы (хранятся как целое ×10⁶); итоги и отчёты считаются в базовой валюте
  • Доходы, расходы и переводы между счетами, в том числе между валютами; теги, поиск и фильтры
  • Деньги без float: целые минорные единицы, пересчёт через big.Int с округлением «от нуля», тесты на разбор и округление сумм
  • Бюджеты: месячный лимит на категорию, порог предупреждения, статусы «в пределах», «близко», «превышен»
  • Платежи по cron-подобному правилу из пяти полей (@monthly, */10, диапазоны, дни недели); пропущенные даты нагоняются
  • Импорт CSV: определение разделителя, превью, сопоставление колонок, кодировка Windows-1251, пробный прогон без записи, пропуск дублей, отчёт по ошибочным строкам; экспорт CSV с защитой от formula-injection и полный JSON
  • Отчёты: капитал по времени, расходы и доходы по категориям, месяц к месяцу и тренды (наклон МНК, целочисленно)
  • Изоляция пользователей: каждый запрос привязан к пользователю из сессии, тесты проверяют, что чужие объекты не читаются и не меняются
  • Свои SVG-графики (линия, столбцы, горизонтальные полосы, спарклайн) с role="img" и текстовой таблицей для скринридеров; светлая и тёмная темы, клавиатурные сочетания

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> finance-tracker
cd finance-tracker
SEED_DEMO=1 go run .   # http://localhost:8102, демо-пользователь с выдуманными данными за 12 месяцев

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Открою доступ по запросу: напишите, и пришлю приглашение.

Запросить код