Курсова робота (2 курс)
Цей проєкт є курсовою роботою, розробленою на мові програмування C++ 20 з використанням бази даних PostgreSQL. Система призначена для автоматизації бібліотечного фонду міста та забезпечує ефективне управління бібліотечними ресурсами: книгами, читачами, статистикою відвідуваності тощо.
Інтерфейс розроблено для двох типів користувачів: бібліотекарів, які здійснюють основну діяльність з обробки даних, та адміністраторів, які мають повний доступ до функцій керування системою.
| Назва | Призначення | |
|---|---|---|
| ☕ | C++ 20 | Основна мова програмування |
| 🐘 | PostgreSQL | Система управління базами даних |
| 💻 | Visual Studio 2026 | Середовище розробки |
| 🔄 | Git | Система керування версіями |
| 🔗 | Libpqxx | Бібліотека для роботи з PostgreSQL — github.com/jtv/libpqxx |
| ✨ | FTXUI | Бібліотека для створення консольного інтерфейсу — github.com/ArthurSonzogni/FTXUI |
-
Завантаж PostgreSQL з офіційного сайту: 👉 postgresql.org/download/windows
-
Під час встановлення запам'ятай пароль користувача
postgres— він знадобиться далі. -
Після встановлення додай шлях до
binу системні змінні:- Знайди шлях, наприклад:
D:\Programs\Postgres\bin - Відкрий:
Пуск → Змінні середовища → Змінні середовища системи - У розділі Системні змінні знайди
Path→ Редагувати → Створити - Встав шлях і натисни OK у всіх вікнах
- Знайди шлях, наприклад:
Файл бекапу знаходиться у папці database/ репозиторію.
Відкрий PowerShell і виконай по черзі:
# 1. Створити базу даних
psql -U postgres -c 'CREATE DATABASE "Library"'
# 2. Перейти до папки з бекапом (вкажи свій шлях до репо)
cd "D:\Dокументи\Мої програми\Курсова 2\database"
# 3. Відновити базу даних з бекапу
# Відновлення з SQL
psql -U postgres -d "library" -f "library.sql"
# Відновлення з дампу
pg_restore -U postgres -d "library" -c "library.dump"При виконанні команд система може запитати пароль користувача
postgres.
Перед збіркою відкрий файл main.cpp і знайди рядок:
std::make_shared<PostgresFactory>("dbname=library user=postgres password=admin1");Заміни admin1 на свій пароль від PostgreSQL:
std::make_shared<PostgresFactory>("dbname=library user=postgres password=ТУТ_ТВІЙ_ПАРОЛЬ");Для збірки проєкту на Windows рекомендується використовувати менеджер пакетів vcpkg, встановлений на диск D: для уникнення конфліктів із правами доступу на системному диску.
Відкрийте PowerShell (Адміністратор) та виконайте:
# Створення робочої директорії
d:
mkdir D:\Programs
cd D:\Programs
# Клонування та збірка менеджера пакетів
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
# Налаштування системних змінних оточення
[System.Environment]::SetEnvironmentVariable("VCPKG_ROOT", "D:\Programs\vcpkg", "User")
[System.Environment]::SetEnvironmentVariable("VCPKG_DEFAULT_BINARY_CACHE", "D:\Programs\vcpkg\archives", "User").\vcpkg install ftxui:x64-windows
.\vcpkg install libpqxx:x64-windows.\vcpkg integrate installПеревірте наступні параметри у властивостях проєкту:
- Стандарт мови:
Project Properties → General → C++ Language Standard → ISO C++20 Standard (/std:c++20) - Платформа: переконайтеся, що обрано архітектуру
x64
Проєкт побудований на трирівневій архітектурі (інтерфейс → логіка → доступ до БД) та використовує наступні патерни проєктування:
| Патерн | Клас(и) | Призначення |
|---|---|---|
| Abstract Factory | PostgresFactory, IDBConnect, IDBOutput |
Створення об'єктів для підключення до PostgreSQL |
| Adapter | ResultAdapter |
Конвертація pqxx::result у формат PostgresOutput |
| Factory Method | MenuCreator, AdminMenu, LibrarianMenu |
Динамічне створення меню залежно від ролі |
| Singleton | Logger |
Централізоване логування подій |
| Facade | ApplicationCoordinator |
Координація взаємодії між компонентами |
| Decorator | ConsoleUtilsDecorator |
Стилізація консольного виведення |
| Proxy | AuthorizationProxy |
Контроль доступу та логування авторизації |
Курсова 2/
│
├── database/
│ ├── library.dump # бінарний дамп БД (pg_restore)
│ └── library.sql # SQL-дамп БД (текстовий, для psql)
│
├── Library/ # вихідний код застосунку (C++)
│ ├── AdminMenu.cpp / .h # меню адміністратора
│ ├── ApplicationCoordinator.cpp / .h # Facade — координація застосунку
│ ├── Authorization.cpp / .h # авторизація (запит до users у БД)
│ ├── AuthorizationProxy.cpp / .h # Proxy — обмеження часу входу 07:00–16:00
│ ├── ConsoleUtils.cpp / .h # консольний UI (FTXUI): форми, меню
│ ├── ConsoleUtilsDecorator.cpp / .h # Decorator — стилізація/кольори виводу
│ ├── ExtendFeatures.cpp / .h # логіка адмін-функцій (бібліотеки, бібліотекарі, addUser)
│ ├── IAddOperations.h # інтерфейс операцій додавання
│ ├── IApplicationCoordinator.h # інтерфейс координатора застосунку
│ ├── IAuthorization.h # інтерфейс авторизації
│ ├── IBaseOperations.h # інтерфейс базових операцій читання
│ ├── IConsoleUtils.h # інтерфейс консольного UI
│ ├── IDBConnect.h # інтерфейс підключення до БД
│ ├── IDBFactory.h # інтерфейс Abstract Factory для БД
│ ├── IDBOutput.h # інтерфейс форматування/виводу результатів
│ ├── IMenu.h # інтерфейс меню (пункти + обробка вибору)
│ ├── IMenuCreator.h # інтерфейс Factory Method для меню
│ ├── IUserContext.h # інтерфейс контексту поточного користувача
│ ├── LibrarianMenu.cpp / .h # меню бібліотекаря
│ ├── Library.vcxproj # проєкт Visual Studio (MSBuild)
│ ├── Library.vcxproj.filters # групування файлів у Solution Explorer
│ ├── Library.vcxproj.user # локальні (не git) налаштування запуску VS
│ ├── log.txt # журнал подій застосунку (генерується під час роботи)
│ ├── Logger.cpp / .h # Singleton — журналювання дій
│ ├── main.cpp # точка входу (entry point)
│ ├── MainFeatures.cpp / .h # логіка функцій бібліотекаря (книги, читачі, візити)
│ ├── MenuCreator.cpp / .h # Factory Method — створення меню за роллю
│ ├── PostgresConnect.cpp / .h # обгортка з'єднання pqxx::connection
│ ├── PostgresFactory.h # Abstract Factory — фабрика PostgreSQL-об'єктів
│ ├── PostgresOutput.cpp / .h # форматування та запис результатів у output.txt
│ ├── ResultAdapter.cpp / .h # Adapter — pqxx::result → PostgresOutput
│ └── UserContext.h # зберігає логін/роль поточного користувача
│
├── .gitattributes # налаштування git (line endings тощо)
├── .gitignore # ігноровані git файли/папки
├── 2.png # Use-Case діаграма проєкту
├── Запити.txt # чернетка SQL-запитів, використаних у роботі
├── Курсова 2.sln # файл рішення Visual Studio (відкриває весь проєкт)
├── LICENSE.txt # текст ліцензії MIT
└── README.md # цей файл
Головне меню бібліотекаря містить такі пункти:
- Information about books — перегляд повного переліку книг (назва, автор, жанр, видавництво, рік, ISBN) на основі
JOINз таблицямиbook_details,book_authors,authors - Information about readers — перегляд читачів та їхньої категорії (
JOINзcategory_details,categories) - Information about visits — перегляд історії відвідувань (
JOINтаблицьvisits,readers,libraries,books) - Most popular books — рейтинг книг за кількістю видач (
GROUP BY+COUNT+ORDER BY) - Add book — додавання нової книги; автор створюється автоматично, якщо ще не існує в БД; жанр, видавництво, рік і ISBN — необов'язкові
- Add reader — додавання читача з вибором категорії: школяр, студент, дошкільник або науковець, кожна з яких має власний набір додаткових полів (заклад, спеціальність, номер школи, назва садочка, галузь дослідження)
- Add visit — реєстрація видачі книги читачеві у конкретній бібліотеці (форма з випадаючими списками наявних читачів, бібліотек і книг)
- Exit — вихід із системи
Головне меню адміністратора містить такі пункти:
- Information about libraries — перелік усіх бібліотек фонду
- Information about librarians — перелік бібліотекарів з прив'язкою до конкретної бібліотеки та графіком роботи (дні й години зміни)
- Add user — створення нового облікового запису системи (логін, пароль, роль); для ролі бібліотекаря додатково вказуються ПІБ, бібліотека та графік роботи
- System statistics — відкриває системний журнал (
log.txt) у Блокноті для перегляду історії дій і подій застосунку - Log out — вихід із системи
- Авторизація з розмежуванням прав доступу — після входу роль користувача (
admin/librarian) визначається запитом до БД, і система формує відповідне меню - Обмеження часу доступу (Proxy) —
AuthorizationProxyдозволяє авторизацію лише в проміжку з 07:00 до 16:00; поза цим вікном спроба входу відхиляється, а подія фіксується в журналі - JOIN-запити до БД — усі звітні розділи (книги, читачі, відвідування, статистика) будуються на
JOIN-запитах до кількох пов'язаних таблиць - Автоматичне збереження результатів — вивід будь-якого звітного запиту форматується (
PostgresOutput+ResultAdapter) і записується у файлoutput.txt, який одразу відкривається в Блокноті - Журналювання дій системи — усі ключові події (вхід, помилки SQL, створення об'єктів, дії користувача) фіксуються з таймстампом у
log.txtчерезSingleton Logger - Розширюваність на інші СУБД — доступ до БД абстраговано через
Abstract Factory(IDBFactory,IDBConnect,IDBOutput), тож підключення нової СУБД не вимагає змін у бізнес-логіці
⚠️ Примітка: функції автоматичного відкриттяoutput.txtтаlog.txtу Блокноті (CreateProcessW/notepad.exe) реалізовані лише для Windows. На інших платформах ці дії пропускаються з відповідним записом у журналі.
Не хочеш збирати проєкт самостійно? У розділі Releases доступний готовий білд для Windows x64.
⚠️ Важливо: застосунок — не один файл.Library.exeдинамічно лінкується з бібліотекамиlibpqxxіPostgreSQL, тож для запуску потрібні всі файли разом, з тієї самої папкиx64/Release:
Файл Призначення Library.exeсам застосунок pqxx.dllобгортка libpqxx для роботи з PostgreSQL LIBPQ.dllклієнтська бібліотека PostgreSQL (libpq) libssl-3-x64.dllOpenSSL — шифрування з'єднання до БД libcrypto-3-x64.dllOpenSSL — криптографічні примітиви Library.pdbсимволи налагодження (необов'язковий, для дебагу) Завантаж усі файли з релізу в одну папку — без
.dllзастосунок не запуститься (Windows видасть помилку про відсутню бібліотеку).
- Встанови PostgreSQL та віднови базу даних — див. розділи 🗄 Встановлення PostgreSQL та 🗃 Відновлення бази даних вище.
- Завантаж усі файли релізу (
Library.exe+.dll, перелічені вище) з останнього релізу в одну папку. - Запусти
Library.exe. Якщо пароль користувачаpostgresвідрізняється від того, що зашитий у білд (admin1), підключення до БД завершиться помилкою — у такому разі зібери проєкт самостійно, змінивши пароль уmain.cpp(див. ⚙️ Налаштування підключення до БД). - Вхід у систему дозволений лише з 07:00 до 16:00 — це навмисне обмеження (
AuthorizationProxy), а не помилка застосунку. - Файли
log.txtтаoutput.txtстворюються поруч із.exeпід час роботи програми.
Цей проєкт ліцензовано під MIT License. Детальніше дивіться у файлі LICENSE.
