Files
go-service/docs/frontend.md
2026-07-17 15:57:05 +03:00

5.9 KiB
Raw Permalink Blame History

Фронтенд (веб-дашборд)

Устройство встроенного веб-интерфейса: страницы, модули TypeScript, сборка, взаимодействие с API.

Аудитория: разработчики.

Содержание

Обзор

Фронтенд — SPA на ванильном TypeScript без фреймворков и рантайм-зависимостей: ES-модули, Canvas для графиков, Web Audio API для звуковой индикации. Исходники — cmd/server/web/js/, компилируются tsc в web/dist/ (ES2020, strict), стили — web/css/, разметка — web/*.html.

Готовые файлы вшиваются в бинарник сервера (go:embed web/dist web/css web/fonts web/*.html web/*.png) и раздаются с корня / — отдельного веб-сервера для фронтенда нет.

Страницы

Страница Назначение Точка входа JS
index.html Редирект на дашборд
dashboard.html Мониторинг в реальном времени: статус, каналы, график, VU-метр звука, камера dist/app.js
logs.html Просмотр исторических данных: список .bin-файлов, сэмплы с пагинацией, события dist/logs.js

Модули TypeScript

Карта модулей js/ (в скобках — размер на момент написания):

Модуль Роль
app.ts (434 строки) Оркестратор дашборда: инициализация всех модулей, цикл опроса сервера (каждые 500 мс), раздача данных в state/ui/chart/audio
data.ts (32) API-слой дашборда: fetchHealth(), fetchHistory() + типы ответов
state.ts (222) Состояние дашборда: история сигнала, peak-holder'ы амплитуды и уровня сигнала с таймерами удержания
ui.ts (414) Каталог DOM-элементов (DOM) и все операции обновления интерфейса: статус, бары, каналы, индикаторы
chart.ts (137) Отрисовка графика истории на Canvas (сетка, шкала 063)
audio.ts (306) AudioEngine — звуковая индикация через Web Audio API: тон зависит от уровня силы (600/1000/1200 Гц), громкость регулируется
camera.ts (164) Панель камеры: подключение/отключение MJPEG <img src="/api/cam">, перекрестие, периодическая проверка потока
layout.ts (235) Разделитель панелей (drag-resize), открытие/закрытие правой панели
accordion.ts (23) Сворачиваемый блок «Принятые данные»
logs.ts (747) Вся страница logs.html: список файлов, таблица сэмплов и событий с пагинацией, график по файлу, автообновление

Зависимости между модулями — однонаправленные: app.ts импортирует остальные; logs.ts автономен (использует только chart.ts). Типы ответов API объявлены локально в data.ts и logs.ts (дублирование — см. tech-debt.md).

Взаимодействие с API

Полная спецификация — api.md.

Модуль Эндпоинты
data.ts (дашборд) GET /api/health, GET /api/history — опрос каждые 500 мс из app.ts
camera.ts GET /api/cam (MJPEG через <img>)
logs.ts GET /api/log/files, GET /api/log/data, GET /api/log/events, GET /api/health (серверное время)

Сборка

cd cmd/server/web
npm install        # однократно (единственная dev-зависимость — typescript)
npm run build      # tsc: js/*.ts → dist/*.js
npm run watch      # tsc --watch
npm run clean      # удалить dist/

Конфигурация — tsconfig.json: target/module ES2020, strict: true, rootDir: js, outDir: dist. Каталоги dist/ и node_modules/ в git не хранятся.

Важно: без собранного dist/ не соберётся и Go-сервер (go:embed) — см. development.md.

Цикл разработки

  1. Терминал 1: cd cmd/server/web && npm run watch — пересборка TS при каждом сохранении;
  2. Терминал 2: make dev — Go-сервер;
  3. После изменения .ts — обновить страницу; после изменения .html/.css при работе через встроенные файлы — перезапустить сервер (файлы вшиваются на этапе сборки, make dev через go run перечитает их при рестарте).

Данные без железа — эмулятор: development.md.