Веб-приложение для учёта выполненных на объекте работ: прораб ведёт записи по дням (дата, вид работ, объём с единицей измерения, ФИО исполнителя), фильтрует и сортирует их по дате, добавляет, редактирует и удаляет.
| Слой | Технологии |
|---|---|
| Frontend | React 18 + TypeScript + Vite |
| Backend | Node.js + TypeScript + Fastify |
| Валидация | zod (fastify-type-provider-zod) |
| ORM | Prisma |
| БД | PostgreSQL 16 |
| Инфраструктура | Docker Compose + nginx |
Обязательное:
- Список записей журнала (дата выполнения, вид работ, объём + ед. изм., ФИО).
- Сортировка по дате (клик по заголовку «Дата» или выпадающий список) и фильтр по диапазону дат.
- Добавление записи с валидацией обязательных полей (на клиенте и на сервере).
- Удаление записи.
Дополнительное (реализовано):
- Редактирование существующей записи.
- Справочник видов работ — отдельная таблица в БД с сидингом; вид работ выбирается из выпадающего списка, единица измерения подставляется автоматически.
Нужен установленный Docker. Из корня проекта:
docker-compose up --buildЗатем открыть http://localhost:8080
При старте бэкенд автоматически применяет миграции и наполняет справочник видов
работ. Данные PostgreSQL сохраняются в Docker-томе pgdata между перезапусками.
- Фронтенд: http://localhost:8080
- API: http://localhost:3000/api (например, http://localhost:3000/api/work-logs)
Примечание про команду. В зависимости от версии Docker используйте либо
docker-compose up --build(отдельный бинарь), либоdocker compose up --build(плагин). Остановить и удалить контейнеры с данными:docker-compose down -v.
Понадобится Node.js 20+ и запущенный PostgreSQL.
- Поднять PostgreSQL (пример через Docker):
docker run -d --name worklog-db -p 5432:5432 \ -e POSTGRES_USER=worklog -e POSTGRES_PASSWORD=worklog -e POSTGRES_DB=worklog \ postgres:16-alpine
- Настроить переменные окружения бэкенда:
cp .env.example backend/.env
- Бэкенд (в каталоге
backend/):cd backend npm install npx prisma migrate dev npx prisma db seed npm run dev - Фронтенд (в каталоге
frontend/, во втором терминале):Dev-сервер Vite проксируетcd frontend npm install npm run dev/apiнаhttp://localhost:3000, поэтому открывать нужно адрес фронта: http://localhost:5173
Базовый путь — /api.
| Метод | Путь | Описание |
|---|---|---|
GET |
/api/health |
Проверка живости сервиса. |
GET |
/api/work-types |
Справочник видов работ (для выпадающего списка). |
GET |
/api/work-logs?from=&to=&sort=asc|desc |
Список записей с фильтром по диапазону дат и сортировкой по дате (по умолчанию desc). |
POST |
/api/work-logs |
Создать запись. Тело: performedAt (YYYY-MM-DD), workTypeId (number), volume (>0), unit, executor. |
PATCH |
/api/work-logs/:id |
Изменить запись (те же поля). |
DELETE |
/api/work-logs/:id |
Удалить запись. |
Невалидное тело запроса возвращает 400 с описанием ошибок, обращение к
несуществующей записи — 404.
.
├── docker-compose.yml # db + backend + frontend
├── .env.example # переменные для локального запуска без Docker
├── backend/
│ ├── Dockerfile
│ ├── prisma/
│ │ ├── schema.prisma # модели WorkType и WorkLog
│ │ ├── migrations/ # начальная миграция
│ │ └── seed.ts # наполнение справочника видов работ
│ └── src/
│ ├── index.ts # запуск Fastify, плагины, обработка ошибок
│ ├── prisma.ts # экземпляр PrismaClient
│ ├── schemas.ts # zod-схемы валидации
│ └── routes/ # work-logs (CRUD) и work-types
└── frontend/
├── Dockerfile # сборка Vite + nginx
├── nginx.conf # раздача статики и прокси /api
└── src/
├── App.tsx # экран журнала: загрузка, фильтры, режимы add/edit
├── api.ts # обёртка над fetch (базовый путь /api)
├── types.ts
└── components/ # WorkLogForm, WorkLogTable, Filters