No description
  • TypeScript 92.2%
  • JavaScript 3.7%
  • Dockerfile 1.9%
  • CSS 1%
  • HTML 0.9%
  • Other 0.3%
Find a file
2026-06-09 17:47:37 +03:00
api add docker files for frontend and backend 2026-06-09 17:47:37 +03:00
frontend add docker files for frontend and backend 2026-06-09 17:47:37 +03:00
DEV.md add docker files for frontend and backend 2026-06-09 17:47:37 +03:00
docker-compose.yml add docker files for frontend and backend 2026-06-09 17:47:37 +03:00
README.md add README.md and DEV.md 2026-05-26 10:23:51 +03:00

Журнал работ на строительном объекте

Описание

Внутренний инструмент для управления строительными проектами. Прораб может вести учёт выполненных работ на объекте за каждый день: фиксировать объёмы, виды работ и сопутствующую информацию в удобном табличном интерфейсе.


Функциональность

  • Просмотр записей — таблица с сортировкой и фильтрацией по дате
  • Добавление записи — форма с валидацией обязательных полей
  • Редактирование записи — изменение существующих данных
  • Удаление записис подтверждением действия
  • Справочник видов работ — предзаполненный каталог, исключающий ручной ввод

Технологический стек

Frontend

Технология Назначение
React 19 + TypeScript Требование задания. Мощная типобезопасность и огромное сообщество
Vite Быстрый dev-сервер, мгновенный HMR, оптимальная сборка для SPA
Vitest Фреймворк для тестирования из экосистемы Vite. Единая конфигурация с vite.config.ts, мгновенный запуск, нативная поддержка TypeScript и ESM
Ant Design v5 Знакомая библиотека с готовыми компонентами: Table (сортировка, фильтрация, пагинация), Form, Modal, DatePicker, Popconfirm. Упрощает UX и ускоряет разработку
TanStack Query v5 Серверное состояние, кэширование, инвалидация при мутациях
Zod Определение типов и валидационных схем на границе API-клиента
Feature-Sliced Design Feature-Sliced Design — pages-first подход. Для одностраничного приложения достаточно слоёв shared и pages, Stager ESLint контролирует зависимости

Backend

Технология Назначение
NestJS + TypeScript Enterprise-фреймворк с DI-контейнером, модульной архитектурой, guards и interceptors. Один из самых востребованных фреймворков для TypeScript-бэкенда
Jest Фреймворк для тестирования, встроенная поддержка в NestJS. TestingModule для unit/e2e тестов, supertest для HTTP-запросов
Drizzle ORM TypeScript-first ORM без шага генерации кода. Схема живёт в TypeScript, запросы максимально близки к SQL. Ядро ~7 KB

Database

Технология Назначение
PostgreSQL 16 (Alpine) Надёжная реляционная БД с MVCC и мощным оптимизатором для запросов с фильтрацией и сортировкой

Infrastructure

Технология Назначение
Docker Compose Развёртывание одной командой. Три сервиса: postgres, api, frontend (nginx)

Почему именно этот стек

Стек выстроен вокруг принципа end-to-end типобезопасности: схема Zod, пройдя через API-запрос, Drizzle и PostgreSQL, остаётся единым источником правды на всём пути данных. NestJS обеспечивает строгую модульную архитектуру с DI-контейнером, удобными декораторами для валидации DTO и встроенными механизмами защиты (guards) и трансформации (interceptors). Ant Design v5 предоставляет готовые UX-компоненты (таблица, форма, модальные окна), что значительно ускоряет разработку интерфейса без потери качества. Feature-Sliced Design демонстрирует знание методологий организации кода и поддерживает поддерживаемость проекта даже при небольшом объёме. При этом набор сбалансирован: современный и впечатляющий, но без овер engineering'а.


Архитектура

Начальные данные. При первом запуске справочник видов работ автоматически заполняется предустановленными данными (земляные работы, фундамент, бетонирование, кладка, монтаж опалубки, кровельные, электромонтаж, сантехмонтаж, отделочные, прочие).

Фронтенд организован по методологии Feature-Sliced Design (FSD) с pages-first подходом. Для одностраничного приложения достаточно слоёв shared (переиспользуемые UI-компоненты, утилиты, конфигурация) и pages (вся бизнес-логика, UI и API-вызовы журнала работ). Stager ESLint плагин автоматически контролирует правила зависимостей между слоями.

Бэкенд построен на NestJS с модульной архитектурой. Глобальный ExceptionFilter обеспечивает единый формат ошибок: { error: string, statusCode: number }.


Запуск проекта

Требования

  • Docker и Docker Compose (любая современная версия)

Быстрый старт

git clone <repo-url>
cd construction-project-management
docker-compose up --build

После сборки откройте в браузере http://localhost.


Структура проекта

construction-project-management/
├── frontend/                        # React + TypeScript + Vite + FSD
│   ├── src/
│   │   ├── app/                     # Провайдеры, стили, точка входа
│   │   │   ├── providers/
│   │   │   └── styles/
│   │   ├── pages/                   # Страницы приложения
│   │   │   └── work-logs/           # Весь функционал журнала в одном срезе
│   │   │       ├── ui/
│   │   │       │   ├── WorkLogsPage.tsx
│   │   │       │   ├── WorkLogTable.tsx
│   │   │       │   ├── WorkLogTable.test.tsx
│   │   │       │   ├── WorkLogModal.tsx
│   │   │       │   ├── WorkLogModal.test.tsx
│   │   │       │   ├── WorkLogFilters.tsx
│   │   │       │   ├── WorkLogFilters.test.tsx
│   │   │       │   ├── WorkLogDeleteButton.tsx
│   │   │       │   └── WorkLogDeleteButton.test.tsx
│   │   │       ├── model/
│   │   │       │   ├── work-log.schema.ts
│   │   │       │   ├── work-log.schema.test.ts
│   │   │       │   ├── use-work-logs.ts
│   │   │       │   ├── use-work-logs.test.ts
│   │   │       │   ├── use-work-types.ts
│   │   │       │   └── use-work-types.test.ts
│   │   │       ├── api.ts               # Fetch-функции к API
│   │   │       ├── api.test.ts
│   │   │       └── index.ts
│   │   └── shared/                  # Общий код
│   │       ├── ui/                  # Re-export Ant Design
│   │       ├── lib/                 # Базовый API-клиент
│   │       └── config/              # Константы
│   ├── vite.config.ts              # Конфигурация Vite (сборка, dev-сервер)
│   ├── vitest.config.ts            # Конфигурация Vitest (тесты)
│   ├── eslint.config.js             # Stager ESLint plugin
│   ├── nginx.conf
│   ├── Dockerfile
│   └── package.json
├── api/                         # NestJS + TypeScript + Drizzle ORM
│   ├── src/
│   │   ├── modules/
│   │   │   ├── work-logs/
│   │   │   │   ├── work-logs.controller.ts
│   │   │   │   ├── work-logs.controller.spec.ts
│   │   │   │   ├── work-logs.service.ts
│   │   │   │   ├── work-logs.service.spec.ts
│   │   │   ├── work-types/
│   │   │   │   ├── work-types.controller.ts
│   │   │   │   ├── work-types.controller.spec.ts
│   │   │   │   ├── work-types.service.ts
│   │   │   │   ├── work-types.service.spec.ts
│   │   ├── work-logs.e2e-spec.ts  # E2E тесты CRUD
│   │   ├── work-types.e2e-spec.ts # E2E тесты справочника
│   │   ├── database/            # Drizzle ORM (schema, provider, module)
│   │   ├── common/
│   │   │   └── filters/         # Глобальные exception filters
│   │   ├── app.module.ts        # Корневой модуль
│   │   └── main.ts              # Точка входа
│   ├── drizzle/                 # SQL-миграции
│   ├── drizzle.config.ts
│   ├── Dockerfile
│   ├── entrypoint.sh            # Авто-миграции + seed при старте
│   └── package.json
├── docker-compose.yml
└── README.md