Веб-приложение для ведения журнала производства работ на стройплощадке. Позволяет фиксировать записи о выполненных работах (дата, вид работ из справочника, объём, единица измерения, исполнитель), просматривать их списком с сортировкой и фильтрацией по дате, добавлять, редактировать и удалять записи.
Проект состоит из трёх сервисов, объединённых через docker-compose: PostgreSQL, REST-бэкенд на NestJS и SPA-фронтенд на React, который отдаётся через nginx.
- NestJS даёт модульную структуру (modules / controllers / services), встроенный DI и
ValidationPipeсclass-validator. Серверная валидация входных данных (обязательные поля,volume > 0, корректная ISO-дата, существованиеworkTypeId) описывается декларативно через DTO, а не россыпью ручных проверок. - Prisma обеспечивает типобезопасный доступ к данным: схема в
schema.prisma- единственный источник правды, из неё генерируется типизированный клиент.prisma db pushподнимает схему, отдельный seed-скрипт наполняет справочник видов работ при первом старте. - PostgreSQL - надёжная реляционная СУБД, естественная для связанных сущностей (запись журнала ссылается на вид работ через внешний ключ).
- Связка даёт end-to-end type-safety на стороне сервера: от схемы БД до DTO контроллера.
- React + TypeScript - типизированный UI, контракт API описан теми же типами, что использует бэкенд.
- Vite - быстрый dev-сервер и сборка, минимальная конфигурация (хороший DX).
- TanStack Query управляет серверным состоянием: кэширование, инвалидация после мутаций (создание / редактирование / удаление), статусы загрузки и ошибок из коробки. Не нужно вручную держать данные в локальном состоянии и синхронизировать их.
- Tailwind CSS - быстрая верстка утилитарными классами без отдельных CSS-файлов.
Один файл поднимает всю систему: база с healthcheck, бэкенд (стартует только после готовности БД, сам делает prisma db push + seed), фронтенд за nginx с проксированием /api на бэкенд. Запуск в одну команду, окружение воспроизводимо.
Основной способ - через Docker. Нужен установленный Docker с Docker Compose.
cp .env.example .env
docker compose up --buildПосле сборки открыть http://localhost:8080.
- Фронтенд: http://localhost:8080
- API через nginx-прокси: http://localhost:8080/api
- API напрямую к бэкенду: http://localhost:3000/api
Миграция схемы (prisma db push) и наполнение справочника видов работ (seed) выполняются автоматически при старте бэкенда - дополнительных шагов не требуется.
Понадобятся Node.js 22 и запущенный PostgreSQL.
-
Поднять PostgreSQL (проще всего тем же образом через Docker):
docker run --name journal-db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=journal -p 5432:5432 -d postgres:16-alpine
-
Backend (порт 3000):
cd backend npm install export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/journal?schema=public" npx prisma db push npm run seed npm run start:dev
-
Frontend (порт 5173):
cd frontend npm install npm run dev
Открыть http://localhost:5173. Dev-сервер фронтенда обращается к бэкенду на http://localhost:3000/api (CORS на бэкенде разрешён для http://localhost:5173 и http://localhost:8080).
Базовый префикс - /api.
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/work-types |
Список видов работ (справочник) |
| GET | /api/entries |
Список записей журнала. Query: sort=asc|desc (по workDate, по умолчанию desc), from=YYYY-MM-DD, to=YYYY-MM-DD (фильтр по дате, включительно, оба опциональны) |
| POST | /api/entries |
Создать запись. Body: { workDate, workTypeId, volume, unit, executor }. Ответ 201 |
| PATCH | /api/entries/:id |
Изменить запись (частично, те же поля). Ответ 200 |
| DELETE | /api/entries/:id |
Удалить запись. Ответ 204 |
Валидация на сервере (ошибка 400): workDate - обязательна, корректная ISO-дата; workTypeId - обязателен, должен существовать в справочнике; volume - обязателен, число > 0; unit - обязателен, непустой; executor - обязателен, непустая строка после trim.
- Список записей журнала с сортировкой по дате (asc/desc)
- Фильтрация списка по диапазону дат (from / to, включительно)
- Добавление записи с серверной валидацией всех полей
- Удаление записи
- Справочник видов работ (отдельная сущность, seed при первом старте)
- Редактирование записи (опционально, реализовано)
- Запуск всей системы одной командой через docker-compose