Settings: - Aero drag (CdA), air density, pedal efficiency now in GPS config - Human-readable names: "Аэросопротивление", "Плотность воздуха", "КПД педалирования" - Saved to localStorage, used in computeStats Bug fixes: - Recipe detail: overlay.remove without popHandler cleanup → now uses history.back() - weightKg parseFloat in startRecording and importGPX (string "88" bug) - profile.weight_kg stored as number not string - getDailyActivityTotals: separate params for UNION ALL subqueries Docs: - PROJECT_MAP.md — full project structure, DB schema, screens, formulas - README.md — overview, build instructions, data sources
8.5 KiB
8.5 KiB
PROJECT MAP — BalDav
Трекер здоровья и активности. Pure JS + Tauri 2 + SQLite. Без фреймворков и бандлеров.
Статистика
| Метрика | Значение |
|---|---|
| Строк кода | ~15000 |
| Файлов исходников | 44 |
| Язык | JS 71%, Rust 4%, Kotlin 10%, CSS 15% |
| Таблиц в БД | 15 |
| Экранов | 7 основных + 12 модалок |
| IPC команд (Tauri) | 6 |
| Библиотеки | Leaflet, Chart.js, Hammer.js, JSZip |
| Платформы | Android (Kotlin), Desktop (Tauri) |
Структура файлов
Frontend (frontend/)
| Файл | Строк | Назначение |
|---|---|---|
js/main.js |
3264 | Экраны, навигация, модалки, графики |
js/db.js |
972 | SQLite через Tauri IPC. Миграции, CRUD |
js/gps.js |
947 | GPS запись, физика ккал, haversine, импорт/экспорт |
js/tilecache.js |
178 | Оффлайн кэш тайлов карты (IndexedDB) |
js/bmr.js |
14 | Базальный метаболизм (Mifflin-St Jeor) |
css/styles.css |
1599 | Темная тема, мобильный дизайн |
index.html |
26 | Точка входа, порядок загрузки скриптов |
data/products_seed.db |
8.5MB | 13480 продуктов (magnit, 5ka, ION, kdv) |
Библиотеки (lib/): leaflet.js, chart.min.js, chartjs-plugin-zoom.min.js, hammer.min.js, jszip.min.js
Бэкенд Rust (src-tauri/)
| Файл | Строк | Назначение |
|---|---|---|
src/lib.rs |
512 | Миграции v1, IPC команды, seed import |
src/main.rs |
5 | Точка входа |
Cargo.toml |
18 | tauri, tauri-plugin-sql, rusqlite, serde |
tauri.conf.json |
— | Конфиг приложения, плагины, ресурсы |
Android Kotlin (src-tauri/gen/android/.../dev/baldav/app/)
| Файл | Строк | Назначение |
|---|---|---|
MainActivity.kt |
153 | FileObserver для IPC, seed DB копирование, safe insets, SAF |
GpsRecorderService.kt |
205 | Foreground service GPS, WakeLock, JSONL батчевая запись |
generated/*.kt |
~1100 | Tauri-сгенерированные: WebView, IPC, permissions |
Инструменты (tools/)
| Скрипт | Назначение |
|---|---|
5ka_scraper.user.js |
Tampermonkey скрейпер 5ka.ru (рекурсивный BFS категорий) |
ion_scraper.user.js |
Tampermonkey скрейпер web.ion.ru (fetch, без перезагрузок) |
import_ion.js |
Импорт ION продуктов в seed DB |
import_with_dedup.js |
Импорт с дедупликацией по имени |
enrich_nutrients.js |
Обогащение микронутриентами из ION |
parse_magnit.js |
Парсер HTML каталога Магнит |
parse_kdv.js |
Парсер HTML каталога KDV |
scrape_5ka.js, scrape_5ka_api.js |
CLI скрейперы 5ka |
download_tiles.js |
Скачивание тайлов карт для оффлайна |
fetch_openfoodfacts.js |
OpenFoodFacts API |
fuzzy_dedup.js |
Нечёткая дедупликация |
Корень
| Файл | Назначение |
|---|---|
build.sh |
Сборка: android/debug/release, sync frontend, версионирование |
BUILD_NUMBER |
Автоинкремент номера сборки |
ion_products.json |
1111 продуктов ION (сырые данные скрейпера) |
5ka_products_fresh.json |
3103 продукта 5ka (сырые данные) |
База данных
Таблицы (Rust v1 миграция + JS миграции)
| Таблица | Назначение | Ключевые поля |
|---|---|---|
profile |
Key-value настройки | key, value |
products |
Продукты (13480) | name, kcal/protein/fat/carbs per 100g, витамины, минералы, nutrients_guessed |
food_log |
Дневник еды | date, time, product_id/recipe_id, amount_g, unit_id, unit_amount, ккал/БЖУ |
recipes |
Рецепты | name, cooking_method_id, servings, notes |
recipe_ingredients |
Ингредиенты рецептов | recipe_id, product_id, custom_name, amount_g, cooking_method_id |
cooking_methods |
Способы готовки (6 шт) | name, потери витаминов/БЖУ в % |
serving_units |
Единицы измерения (5 шт) | name (шт/ст.л./ч.л./стакан/мл), grams_equivalent |
product_units |
Привязка единиц к продуктам | product_id, unit_id, grams_per_unit |
weight_log |
Лог веса | date, time, weight_kg |
sleep_log |
Лог сна | date, bed/asleep/wake time, nap_minutes |
activity_log |
Лог активности | date, type, minutes, kcal |
supplements |
Добавки (БАД) | name, daily_dose_g, витамины/минералы |
supplement_log |
Приём добавок | date, supplement_id, dose_g |
gps_sessions |
GPS тренировки | date, activity_type, distance, kcal, speed, elevation, bike_id |
gps_points |
Точки трека | session_id, ts, lat, lon, altitude, speed, seq |
bikes |
Велосипеды | name, weight_kg, wheel, звёзды, surface_type, is_active |
Seed DB (products_seed.db)
| Источник | Продуктов | Микронутриенты |
|---|---|---|
| magnit | 8627 | нет |
| 5ka | 3103 | нет |
| ION | 1078 | витамины + минералы |
| kdv | 672 | нет |
| Всего | 13480 | 1398 обогащены (nutrients_guessed) |
Экраны и навигация
Нижний навбар (5 табов)
[Сегодня] [Продукты] [Трек] [Добавки] [Настройки]
Экраны
- Сегодня — дневной баланс ккал, еда (продукты + блюда), активность, вес, сон, добавки, статистика (графики)
- Продукты — подтабы [Продукты | Рецепты], поиск, карточки с КБЖУ, добавление в дневник
- Трек — список GPS тренировок, запись, импорт GPX/FTB, скачивание карт
- Добавки — список БАД, логирование приёма
- Настройки — профиль (вес, рост, BMR), велосипеды, GPS конфиг, оффлайн режим
Модалки
- Еда: showFoodModal, showEditFoodModal, showFoodFromRecipeModal
- Рецепты: showRecipeDetailModal, showRecipeEditorModal, showAddIngredientModal
- Тренировки: showSessionDetail (карта, графики скорости/высоты, пересчёт)
- Прочее: showWeightModal, showSleepModal, showActivityModal, showProfileModal, showBikeModal, showMapDownloadModal, showLogSupplementModal
IPC команды (Rust → JS)
| Команда | Назначение |
|---|---|
import_seed_products |
Импорт продуктов из seed DB, прогресс-события |
get_safe_insets |
Отступы Android status/nav bar |
gps_service_command |
start/stop GPS сервиса |
gps_service_read_points |
Чтение JSONL файла точек |
save_file |
SAF диалог сохранения (GPX экспорт) |
get_app_info |
Версия, git hash, дата сборки |
Формула ккал (GPS)
Велосипед — физическая модель
Power = v * (m*g*sin(gradient) + Crr*m*g*cos(gradient) + 0.5*CdA*rho*v^2)
m = rider_kg + bike_kg
Crr = 0.004 (асфальт) / 0.006 (смешанный) / 0.008 (грунт)
CdA = 0.6, rho = 1.225, efficiency = 0.25
Power > 0: педалирование → kcal = power*dt / (0.25 * 4184)
Power <= 0: каботаж → kcal = базальный метаболизм
Ходьба/бег — MET-таблица
<4 км/ч = 2.5 MET, 4-5.5 = 3.5, 5.5-7 = 5.0, 7-9 = 8.0, 9-12 = 10.0, 12-16 = 12.5, 16+ = 15.0
kcal = (dt/60) * (MET * 3.5 * weight_kg) / 200
Сборка
./build.sh -d android # debug APK
./build.sh android # release APK
./build.sh -i android -d # debug + install