Important
Данный проект представляет собой экосистему из двух независимых микросервисов, объединенных через Nginx Reverse Proxy. Система демонстрирует продвинутые принципы ООП на C++, работу с асинхронными HTTP-запросами, контейнеризацию и персистентное хранение данных в PostgreSQL.
laba_10/
├── services/
│ ├── math-service/ # Микросервис математических вычислений
│ │ ├── domain/ # Модели (Rational, Complex, Pair)
│ │ ├── service/ # Бизнес-логика
│ │ ├── controller/ # REST API (httplib)
│ │ ├── repository/ # Логирование операций в БД
│ │ ├── CMakeLists.txt
│ │ └── Dockerfile
│ ├── time-service/ # Микросервис управления временем
│ │ ├── domain/ # Модель Time (нормализация, валидация)
│ │ ├── service/ # Логика работы с репозиторием
│ │ ├── repository/ # Слой доступа к PostgreSQL (libpqxx)
│ │ ├── controller/ # API эндпоинты
│ │ └── Dockerfile
│ └── web-ui/ # Frontend (Vue 3 + Nginx)
├── docker-compose.yml # Оркестрация всей системы
└── nginx/ # Конфигурация Reverse Proxy
erDiagram
TIME_RECORDS {
serial id PK
int hours "0-23"
int minutes "0-59"
int seconds "0-59"
varchar formatted_time "HH:MM:SS"
timestamp created_at
}
MATH_OPERATIONS {
serial id PK
varchar operation_name "e.g. Rational Add"
jsonb input_data "Args in JSON"
varchar result "Final value"
timestamp created_at
}
Tip
200 OK <- сервер принял данные и произвел расчет
curl "http://localhost:8080/api/math/ring?outer=10&inner=5"ответ:
{
"area" : 235.619449
}200 OK <- сервер принял данные и произвел расчет
Сложение(add)
curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"Вычитание(sub)
curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"Умножение(mul)
curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"Деление(div)
curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"Сравнение на равенство(eq)
curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"Сравнение на неравенство(neq)
curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"200 OK <- сервер принял две дроби и произвел расчеты
Сложение(add)
curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=add"Сложение(add)
curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=add"Вычитание(sub)
curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=sub"Деление(div)
curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=div"200 OK <- сервер принял данные и произвел расчет площади
curl "http://localhost:8080/api/math/triangle/area?a=3.0&b=4.0&c=5.0"ответ:
{
"area" : "2.9047038"
}curl "http://localhost:8080/api/math/history"curl "http://localhost:8080/api/math/complex/polar?re=3.0&im=4.0"curl -X GET "http://localhost:8080/api/time/1"curl -X POST -d "time_str=14:30:00" "http://localhost:8080/api/time"Caution
400 (Bad Request) <- какое-то из полей пустое

400 (Bad Request) <- неправильный формат ввода

400 (Bad Request) <- деление на ноль

500 (Internal Server Error) <- мне было лень обрабатывать это

Important
В корне проекта у нас есть .env.example
#Settings database(Postgres)
DB_HOST=postgres
DB_PORT=5432
DB_USER=default_user
DB_PASSWORD=default_password
DB_NAME=default_db
#Service settings
TIME_SERVICE_PORT=8081
MATH_SERVICE_PORT=8082
WEB_UI_PORT=8080просто замените заглушки на реальные значения и переведите в формат .env
Important
Запуск через докер
cd infrastructure
docker compose up -d --buildВот так можно посмотреть БДшку
export PGPASSWORD="your pass in .env for pass_pg"
psql -h localhost -p 5432 -U admin -d postgresпотом
\c laba_dbдля проверки там ли вы, можно сделать так
\dtвы увидите
Получаем все данные из time_service
SELECT * FROM time_service;Получаем все данные из math_service
SELECT * FROM math_service;by finnik












