Лабораторная работа №4 (React + Node.js)
Вариант: 9 — Грузоперевозки
Тема: автоматизация компании, специализирующейся на перевозке грузов автомобильным транспортом
FreightLog — веб-приложение для управления грузоперевозками. Система позволяет вести каталог грузов, назначать водителей, отслеживать доставку на карте, оптимизировать маршруты и анализировать накладные.
- Node.js 18+
- MongoDB 6+ (локально или MongoDB Atlas)
# Клонировать / перейти в папку проекта
cd LR4
# Установить зависимости
npm run install:all
# Заполнить базу демо-данными (12 грузов, 5 водителей, 5 ТС)
npm run seed
# Запустить сервер и клиент одновременно
npm run dev| Сервис | URL |
|---|---|
| Клиент (React) | http://localhost:5173 |
| API (Express) | http://localhost:5000/api |
| Пароль | Роль | |
|---|---|---|
admin@freight.by |
admin123 |
Администратор |
dispatcher@freight.by |
disp123 |
Диспетчер |
LR4/
├── client/ # React-приложение (Vite)
│ └── src/
│ ├── components/ # React-компоненты
│ │ ├── RouteOptimizer.jsx # Функциональный + useMemo
│ │ ├── CargoTracker.jsx # Классовый компонент
│ │ ├── DriverManager.jsx # Стрелочная функция
│ │ ├── SortableTable.jsx # Сортируемая таблица
│ │ ├── MapView.jsx # Интерактивная карта (Leaflet)
│ │ └── ...
│ ├── pages/ # Страницы приложения
│ ├── context/ # AuthContext (useContext + useReducer)
│ ├── services/ # API-клиент, XMLHttpRequest
│ └── styles/ # CSS (Flexbox, Grid, variables)
│
└── server/ # Express-сервер
├── models/ # Mongoose-модели
├── routes/ # REST API маршруты
├── middleware/ # Auth, валидация
├── utils/ # Геокодирование, расчёт маршрутов
└── seed/ # Демо-данные
| Страница | Путь | Доступ | Описание |
|---|---|---|---|
| Главная | / |
Все | Статистика, калькулятор маршрута |
| Каталог грузов | /catalog |
Все | Список, поиск, сортировка |
| Детали груза | /catalog/:id |
Все | Карта, GPS-трекер, накладная |
| Панель управления | /dashboard |
Авторизованные | CRUD, назначение водителей |
| О компании | /about |
Все | Информация о компании |
| Контакты | /contacts |
Все | Форма обратной связи |
| Вход / Регистрация | /login, /register |
Все | Аутентификация |
| Модель | Описание | Ключевые поля |
|---|---|---|
| User | Пользователи | email, password (bcrypt), role |
| Vehicle | Транспорт | plateNumber, type, capacityKg, status |
| Driver | Водители | licenseNumber, category, rating |
| Cargo | Грузы | origin, destination, weightKg, status |
| Route | Маршруты | cargo, driver, distanceKm, fuelLog |
Все модели содержат встроенные валидаторы Mongoose (типы, min/max, enum, regex).
GET /api/cargo — список грузов (search, sort, order)
GET /api/cargo/:id — детали груза
GET /api/cargo/:id/track — GPS-позиция груза
GET /api/drivers — список водителей
GET /api/vehicles — список транспорта
POST /api/auth/login — вход
POST /api/auth/register — регистрация
POST /api/ai/optimize — расчёт маршрута
POST /api/cargo — создать груз
PUT /api/cargo/:id — обновить груз
DELETE /api/cargo/:id — удалить груз
POST /api/ai/analyze-document — анализ накладной
POST /api/routes/process-order — цепочка обработки заказа
- Валидация названий городов (только буквы, 2–50 символов)
- Геокодирование городов Беларуси и СНГ из встроенного справочника
- Расчёт расстояния по формуле Haversine
- Оптимизация порядка промежуточных точек (алгоритм ближайшего соседа)
- Отображение маршрута на интерактивной карте OpenStreetMap
- При вводе несуществующего города или случайных символов — ошибка валидации
Пример: Минск → Гомель через Бобруйск — маршрут строится через реальные координаты этих городов.
- Периодический опрос позиции через XMLHttpRequest (каждые 8 сек)
- Позиция рассчитывается как интерполяция между городом отправления и назначения
- Прогресс увеличивается при статусе
in_transit(0% → 95%) - На карте отображаются 3 точки: отправление, текущая позиция, назначение
- setTimeout — автоматическое уведомление при превышении планового времени доставки (сохранение в localStorage)
Цепочка асинхронных операций с async/await:
- Расчёт маршрута
- Проверка накладной
- Назначение водителя и транспорта
Скопируйте server/.env.example в server/.env:
PORT=5000
MONGODB_URI=mongodb://127.0.0.1:27017/freight_transport
JWT_SECRET=your_secret_key
CLIENT_URL=http://localhost:5173
# Опционально — для реальных AI API (на 7+ баллов)
GOOGLE_ROUTES_API_KEY=
IBM_NLU_API_KEY=
IBM_NLU_URL=https://api.us-south.natural-language-understanding.watson.cloud.ibm.comБез API-ключей приложение работает в полном объёме: маршруты рассчитываются по справочнику городов, анализ накладных — по ключевым словам.
Минск, Гомель, Бобруйск, Могилёв, Витебск, Гродно, Брест, Пинск, Орша, Барановичи, Борисов, Солигорск, Новополоцк, Лида, Мозырь, Полоцк, Жлобин, Москва, Киев, Вильнюс, Варшава и др.
| Команда | Описание |
|---|---|
npm run dev |
Запуск сервера + клиента |
npm run seed |
Заполнение БД демо-данными |
npm run build |
Сборка клиента для production |
npm run install:all |
Установка всех зависимостей |