Кейс · 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 · Как выглядит
Скриншоты


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 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Открою доступ по запросу: напишите, и пришлю приглашение.
Запросить код