- TypeScript 92.2%
- JavaScript 3.7%
- Dockerfile 1.9%
- CSS 1%
- HTML 0.9%
- Other 0.3%
| api | ||
| frontend | ||
| DEV.md | ||
| docker-compose.yml | ||
| README.md | ||
Журнал работ на строительном объекте
Описание
Внутренний инструмент для управления строительными проектами. Прораб может вести учёт выполненных работ на объекте за каждый день: фиксировать объёмы, виды работ и сопутствующую информацию в удобном табличном интерфейсе.
Функциональность
- Просмотр записей — таблица с сортировкой и фильтрацией по дате
- Добавление записи — форма с валидацией обязательных полей
- Редактирование записи — изменение существующих данных
- Удаление записи — с подтверждением действия
- Справочник видов работ — предзаполненный каталог, исключающий ручной ввод
Технологический стек
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