Бібліотечна система
Бібліотечна система для управління книгами
|
Головний модуль програми управління бібліотекою Детальніше...
#include <algorithm>
#include <format>
#include <iomanip>
#include <iostream>
#include <memory>
#include <set>
#include <sstream>
#include <string>
#include <thread>
#include <vector>
#include "AbstractCollection.hpp"
#include "Author.hpp"
#include "Book.hpp"
#include "CustomExceptions.hpp"
#include "Path.hpp"
#include "SearchUtility.hpp"
#include "Storage.hpp"
#include "Utils.hpp"
#include "ftxui/component/component.hpp"
#include "ftxui/component/screen_interactive.hpp"
#include "ftxui/dom/elements.hpp"
#include "ftxui/screen/screen.hpp"
Класи | |
struct | SortingKeyPressContext |
Контекст для обробки подій клавіатури у меню сортування. Детальніше... | |
Функції | |
void | displayAuthorInfo (const std::string &authorName, const Storage &library, Elements &resultsElements) |
Відображає інформацію про автора в результатах UI. | |
void | displayAuthorStats (const std::string &authorName, const Storage &library, Elements &resultsElements) |
Відображає статистику по конкретному автору в результатах UI. | |
void | displayGeneralStats (const Storage &library, Elements &resultsElements) |
Відображає загальну статистику авторів в результатах UI. | |
void | printAuthors (const std::vector< Author > &authors) |
Виводить інформацію про авторів у консоль. | |
template<typename T > | |
void | searchAndDisplayEntities (const std::vector< std::unique_ptr< T > > &entities, const std::string &keyword) |
Шаблонна функція для пошуку та відображення сутностей. | |
int | getMenuChoice () |
Відображає головне меню програми. | |
void | handleAuthorStats (const Storage &library) |
Обробляє статистику авторів. | |
void | handleFocusChange (const Component &inputTitle, const Component &inputISBN, const Component &inputPublisher, const Component &inputNumPages, const Component &inputYearPublished, const Component &buttonAdd, const Component &buttonBack) |
Змінює фокус між полями введення та кнопками у формах FTXUI. | |
Element | renderBookForm (const Component &inputTitle, const Component &inputISBN, const Component &inputPublisher, const Component &inputNumPages, const Component &inputYearPublished, const Component &buttonAdd, const Component &buttonBack) |
Відображає форму додавання нової книги | |
void | handleAddBook (Storage &library) |
Elements | render_single_book (const Book *book, int index) |
Створює елементи для відображення інформації про одну книгу | |
void | handleShowAllBooks (const Storage &library) |
Відображає пагінований список усіх книг у бібліотеці | |
void | displayBookInfo (const Book *book) |
Виводить детальну інформацію про книгу у консоль | |
void | processAuthors (const Book *book, const std::string &authorName, bool &found) |
Шукає книги за автором та виводить результати | |
void | handleRemoveBook (Storage &library) |
Видаляє книгу з бібліотеки за назвою | |
std::vector< std::unique_ptr< Author > > | collectAllAuthors (const Storage &library) |
Збирає всіх авторів з усіх книг у бібліотеці | |
void | processBookSearch (const std::string &title, const Storage &library, Color &resultColor, bool &showResult, Elements &resultElements) |
Обробляє пошук книги та заповнює елементи результатів. | |
void | handleSearchBooks (const Storage &library) |
Обробляє інтерфейс користувача для пошуку книг. | |
void | handleBestBookLogic (const std::string &authorName, const std::string &bookTitle, std::string &resultMessage, Color &resultColor, bool &showResult, const Storage &library) |
Обробляє логіку встановлення "кращої" книги для автора. | |
ftxui::Element | renderBestBookElements (const ftxui::Component &inputAuthorNameComp, const ftxui::Component &inputBookTitleComp, const ftxui::Component &buttonSetComp, const ftxui::Component &buttonBackComp, bool showResultParam, const std::string &resultMessageParam, ftxui::Color resultColorParam) |
Рендерить елементи інтерфейсу для встановлення "кращої" книги автора. | |
void | handleBestBookSelection (const Storage &library) |
Встановлює кращу книгу для вказаного автора | |
void | renderAuthorInfo (const std::string &authorName, const Storage &library, Elements &elements) |
Рендерить елементи UI для відображення інформації про автора. | |
void | handleAuthorInfo (const Storage &library) |
Переглядає інформацію про автора | |
void | processAuthorBook (const Book *book, const Author *author, Elements &authorElements, bool &hasBooks) |
Перевіряє, чи книга належить автору, і додає її до списку | |
Elements | renderAuthorBooks (const Author *author, const Storage &library) |
Створює елементи для відображення інформації про книги автора | |
bool | hasAuthor (const Book *book, const Author *author) |
Перевіряє, чи вказаний автор є одним з авторів даної книги. | |
template<typename CreateBookElementsFunc > | |
void | processFoundBook (const Book *book, Elements &authorElements, bool &hasBooks, CreateBookElementsFunc createBookElements) |
Обробляє знайдені книги автора та додає їх до елементів для відображення | |
bool | processBookForAuthor (const Book *book, const Author *author, Elements &authorElements, bool &hasBooks, const std::function< Elements(const Book *)> &createBookElements, std::set< std::string, std::less<> > &uniqueBooks, int &totalBooks) |
Обробляє книгу для пошуку та додає її до результатів, якщо вона відповідає критеріям | |
void | renderSearchResults (const Storage &library, const std::string &authorName, Elements &resultsElements) |
Рендерить результати пошуку книг за автором. | |
void | processAuthorSearchResults (const std::string &authorName, Elements &resultsElements, const Storage &library, bool &showResults) |
Обробляє пошук книг за автором та заповнює результати | |
void | handleSearchByAuthor (const Storage &library) |
Обробляє пошук книг за автором з використанням FTXUI. | |
void | performSortingAction (Storage &library, int choice, std::string &statusMessage, Color &statusColor) |
Виконує сортування книг за обраним критерієм | |
bool | handleSortingKeyPress (SortingKeyPressContext &context, const Event &event) |
Обробляє події клавіатури для меню сортування. | |
int | getSortingMenuChoice (Storage &library) |
Відображає меню вибору критерію сортування та отримує вибір користувача. | |
void | handleSortingMenu (Storage &library) |
Обробляє вибір сортування з підменю. | |
void | handleButtonSelectAction (const std::string &authorName, bool &showResults, Elements &resultsElements, const Storage &library, int selected) |
Обробляє дію вибору пункту в меню інформації та статистики авторів. | |
bool | handleAuthorStatsKeyEvent (const int &selected, const std::string &authorName, bool &showResults, Elements &resultsElements, const Storage &library, const Event &event) |
Обробляє події клавіатури для меню статистики авторів | |
void | handleAuthorStatsAndInfo (const Storage &library) |
Обробляє меню інформації та статистики авторів з використанням FTXUI. | |
void | addAuthorInfoToResults (const Author *author, const Storage &library, Elements &resultsElements) |
Додає інформацію про автора до елементів для відображення | |
int | calculateTotalPagesForAuthor (const Author &author, const Storage &library) |
Обчислює загальну кількість сторінок для автора | |
void | calculateAuthorStats (const Author *author, const Storage &library, int &totalBooks, int &totalPages, std::vector< std::string > &bookTitles) |
Обчислює статистику для автора (кількість книг, сторінок, назви книг) | |
void | addBookTitlesToStats (const std::vector< std::string > &bookTitles, Elements &authorStats) |
Додає список книг автора до елементів для відображення | |
void | handleSaveToFile (const Storage &library) |
Обробляє збереження бібліотеки у файл. | |
void | handleLoadFromFile (Storage &library) |
Обробляє інтерактивне завантаження бібліотеки з файлу за допомогою FTXUI. | |
int | main () |
Головний модуль програми управління бібліотекою
Реалізує інтерфейс користувача для роботи з бібліотекою книг:
void addAuthorInfoToResults | ( | const Author * | author, |
const Storage & | library, | ||
Elements & | resultsElements | ||
) |
Додає інформацію про автора до елементів для відображення
author | Вказівник на автора |
library | Посилання на бібліотеку |
resultsElements | Елементи для відображення |
void addBookTitlesToStats | ( | const std::vector< std::string > & | bookTitles, |
Elements & | authorStats | ||
) |
Додає список книг автора до елементів для відображення
bookTitles | Список назв книг |
authorStats | Елементи для відображення |
void calculateAuthorStats | ( | const Author * | author, |
const Storage & | library, | ||
int & | totalBooks, | ||
int & | totalPages, | ||
std::vector< std::string > & | bookTitles | ||
) |
Обчислює статистику для автора (кількість книг, сторінок, назви книг)
author | Вказівник на автора |
library | Посилання на бібліотеку |
totalBooks | Лічильник книг автора |
totalPages | Лічильник сторінок автора |
bookTitles | Список назв книг автора |
Обчислює загальну кількість сторінок для автора
author | Автор |
library | Бібліотека |
Збирає всіх авторів з усіх книг у бібліотеці
library | Константне посилання на об'єкт сховища книг |
Проходить по всіх книгах у бібліотеці та додає їх авторів до результуючого вектора. Кожен автор зберігається як окремий об'єкт у купі за допомогою unique_ptr.
void displayAuthorInfo | ( | const std::string & | authorName, |
const Storage & | library, | ||
Elements & | resultsElements | ||
) |
Відображає інформацію про автора в результатах UI.
Відображає інформацію про автора
authorName | Ім'я автора для відображення. | |
library | Посилання на об'єкт бібліотеки. | |
[out] | resultsElements | Елементи FTXUI для додавання результатів. |
Функція шукає автора за іменем, збирає його книги та форматує інформацію для відображення.
authorName | Ім'я автора |
library | Посилання на бібліотеку |
resultsElements | Елементи для відображення |
void displayAuthorStats | ( | const std::string & | authorName, |
const Storage & | library, | ||
Elements & | resultsElements | ||
) |
Відображає статистику по конкретному автору в результатах UI.
Відображає статистику по конкретному автору
authorName | Ім'я автора для статистики. | |
library | Посилання на об'єкт бібліотеки. | |
[out] | resultsElements | Елементи FTXUI для додавання результатів. |
Функція обчислює та форматує статистику (кількість книг, сторінок) для вказаного автора.
authorName | Ім'я автора |
library | Посилання на бібліотеку |
resultsElements | Елементи для відображення |
void displayBookInfo | ( | const Book * | book | ) |
Виводить детальну інформацію про книгу у консоль
book | Вказівник на об'єкт книги для відображення (може бути nullptr) |
Формат виводу:
void displayGeneralStats | ( | const Storage & | library, |
Elements & | resultsElements | ||
) |
Відображає загальну статистику авторів в результатах UI.
Відображає загальну статистику авторів
library | Посилання на об'єкт бібліотеки. | |
[out] | resultsElements | Елементи FTXUI для додавання результатів. |
Функція обчислює та форматує загальну статистику (кількість унікальних авторів, середня кількість книг/сторінок на автора).
library | Посилання на бібліотеку |
resultsElements | Елементи для відображення |
int getMenuChoice | ( | ) |
Відображає головне меню програми.
Меню містить наступні опції:
int getSortingMenuChoice | ( | Storage & | library | ) |
Відображає меню вибору критерію сортування та отримує вибір користувача.
library | Посилання на об'єкт бібліотеки. |
void handleAuthorInfo | ( | const Storage & | library | ) |
Переглядає інформацію про автора
library | Посилання на об'єкт бібліотеки |
Виконує наступні дії:
BookNotFoundException | Якщо книга з вказаною назвою не знайдена |
void handleAuthorStats | ( | const Storage & | library | ) |
Обробляє статистику авторів.
library | Посилання на об'єкт бібліотеки. |
Формула розрахунку: [ \text{Середнє} = \frac{\sum_{i=1}^{n} \text{books}_i}{n} ]
void handleAuthorStatsAndInfo | ( | const Storage & | library | ) |
Обробляє меню інформації та статистики авторів з використанням FTXUI.
library | Посилання на об'єкт бібліотеки. |
bool handleAuthorStatsKeyEvent | ( | const int & | selected, |
const std::string & | authorName, | ||
bool & | showResults, | ||
Elements & | resultsElements, | ||
const Storage & | library, | ||
const Event & | event | ||
) |
Обробляє події клавіатури для меню статистики авторів
selected | Вибір пункту меню |
authorName | Ім'я автора |
showResults | Прапорець відображення результатів |
resultsElements | Елементи результатів |
library | Бібліотека |
event | Подія клавіатури |
void handleBestBookLogic | ( | const std::string & | authorName, |
const std::string & | bookTitle, | ||
std::string & | resultMessage, | ||
Color & | resultColor, | ||
bool & | showResult, | ||
const Storage & | library | ||
) |
Обробляє логіку встановлення "кращої" книги для автора.
Ця функція виконує перевірку вхідних даних (ім'я автора та назва книги) і намагається встановити вказану книгу як "кращу" для даного автора в бібліотеці. Вона оновлює повідомлення про результат, його колір та прапорець відображення результату на основі успішності операції або виникнення помилок.
authorName | Ім'я автора, для якого встановлюється краща книга. |
bookTitle | Назва книги, яку потрібно встановити як кращу. |
resultMessage | Посилання на рядок, який буде містити повідомлення про результат операції. |
resultColor | Посилання на колір, який буде використаний для відображення повідомлення про результат. |
showResult | Посилання на булевий прапорець, який вказує, чи потрібно відображати результат. |
library | Константне посилання на об'єкт сховища (бібліотеки), в якому відбувається оновлення. |
authorName
або bookTitle
порожні, встановлюється повідомлення про помилку. BookNotFoundException | Якщо книга не знайдена або не належить вказаному автору під час виклику library.setBestBookForAuthor . |
void handleBestBookSelection | ( | const Storage & | library | ) |
Встановлює кращу книгу для вказаного автора
library | Посилання на об'єкт бібліотеки |
Виконує наступні дії:
void handleButtonSelectAction | ( | const std::string & | authorName, |
bool & | showResults, | ||
Elements & | resultsElements, | ||
const Storage & | library, | ||
int | selected | ||
) |
Обробляє дію вибору пункту в меню інформації та статистики авторів.
authorName | Ім'я автора. | |
[out] | showResults | Прапорець для відображення результатів. |
[out] | resultsElements | Елементи FTXUI для додавання результатів. |
library | Посилання на об'єкт бібліотеки. | |
selected | Індекс обраного пункту меню. |
Викликає відповідні функції для відображення інформації, статистики автора або загальної статистики.
void handleFocusChange | ( | const Component & | inputTitle, |
const Component & | inputISBN, | ||
const Component & | inputPublisher, | ||
const Component & | inputNumPages, | ||
const Component & | inputYearPublished, | ||
const Component & | buttonAdd, | ||
const Component & | buttonBack | ||
) |
Змінює фокус між полями введення та кнопками у формах FTXUI.
inputTitle | Компонент поля введення для назви книги. |
inputISBN | Компонент поля введення для ISBN. |
inputPublisher | Компонент поля введення для видавця. |
inputNumPages | Компонент поля введення для кількості сторінок. |
inputYearPublished | Компонент поля введення для року видання. |
buttonAdd | Компонент кнопки "Додати". |
buttonBack | Компонент кнопки "Повернутися". |
Використовується для навігації по формі за допомогою клавіші Enter.
void handleLoadFromFile | ( | Storage & | library | ) |
Обробляє інтерактивне завантаження бібліотеки з файлу за допомогою FTXUI.
Функція створює та відображає повноекранний інтерфейс користувача, що дозволяє користувачеві ввести назву файлу для завантаження. Після натискання кнопки "Завантажити" виконується спроба завантажити дані бібліотеки з вказаного файлу. Відображається повідомлення про успіх або помилку завантаження. Користувач може повернутися до попереднього меню за допомогою кнопки "Повернутися".
library | Посилання на об'єкт Storage, в який буде завантажено дані бібліотеки. |
void handleRemoveBook | ( | Storage & | library | ) |
Видаляє книгу з бібліотеки за назвою
library | Посилання на об'єкт сховища книг |
Виконує наступні дії:
BookNotFoundException | Якщо книга з вказаною назвою не знайдена |
void handleSaveToFile | ( | const Storage & | library | ) |
Обробляє збереження бібліотеки у файл.
Ця функція створює інтерактивний екран, який дозволяє користувачеві ввести назву файлу для збереження поточної бібліотеки. Вона відображає поле вводу, кнопку "Зберегти" та кнопку "Повернутися". Після спроби збереження відображається повідомлення про успіх або помилку.
library | Посилання на об'єкт Storage, що містить дані бібліотеки для збереження. |
void handleSearchBooks | ( | const Storage & | library | ) |
Обробляє інтерфейс користувача для пошуку книг.
Ця функція створює інтерактивний екран FTXUI, який дозволяє користувачеві ввести назву книги для пошуку в бібліотеці. Вона відображає поле введення, кнопки "Пошук" та "Назад", а також результати пошуку.
library | Посилання на об'єкт сховища (бібліотеки), в якому здійснюється пошук. |
void handleSearchByAuthor | ( | const Storage & | library | ) |
Обробляє пошук книг за автором з використанням FTXUI.
library | Посилання на об'єкт бібліотеки |
void handleShowAllBooks | ( | const Storage & | library | ) |
Відображає пагінований список усіх книг у бібліотеці
library | Константне посилання на об'єкт сховища книг |
bool handleSortingKeyPress | ( | SortingKeyPressContext & | context, |
const Event & | event | ||
) |
Обробляє події клавіатури для меню сортування.
context | Структура контексту, що містить необхідні дані. |
event | Подія клавіатури. |
void handleSortingMenu | ( | Storage & | library | ) |
Обробляє вибір сортування з підменю.
library | Посилання на об'єкт бібліотеки. |
Перевіряє, чи вказаний автор є одним з авторів даної книги.
Перевіряє, чи містить книга вказаного автора.
book | Вказівник на об'єкт книги. |
author | Вказівник на об'єкт автора. |
Ця функція перевіряє список авторів, пов'язаних з книгою, щоб визначити, чи є серед них вказаний автор, порівнюючи їхні ім'я та прізвище.
book | Вказівник на об'єкт книги, яку потрібно перевірити. |
author | Вказівник на об'єкт автора, якого потрібно знайти. |
void performSortingAction | ( | Storage & | library, |
int | choice, | ||
std::string & | statusMessage, | ||
Color & | statusColor | ||
) |
Виконує сортування книг за обраним критерієм
library | Посилання на бібліотеку |
choice | Вибір користувача (1-3) |
statusMessage | Повідомлення про статус |
statusColor | Колір повідомлення |
void printAuthors | ( | const std::vector< Author > & | authors | ) |
Виводить інформацію про авторів у консоль.
authors | Вектор авторів для відображення. |
Формат виводу:
void processAuthorBook | ( | const Book * | book, |
const Author * | author, | ||
Elements & | authorElements, | ||
bool & | hasBooks | ||
) |
Перевіряє, чи книга належить автору, і додає її до списку
book | Вказівник на книгу |
author | Вказівник на автора |
authorElements | Елементи для відображення |
hasBooks | Прапорець наявності книг |
void processAuthors | ( | const Book * | book, |
const std::string & | authorName, | ||
bool & | found | ||
) |
Шукає книги за автором та виводить результати
book | Вказівник на книгу для перевірки | |
authorName | Ім'я або прізвище автора для пошуку | |
[in,out] | found | Прапорець, що вказує чи був знайдений хоча б один результат |
Функція:
void processAuthorSearchResults | ( | const std::string & | authorName, |
Elements & | resultsElements, | ||
const Storage & | library, | ||
bool & | showResults | ||
) |
Обробляє пошук книг за автором та заповнює результати
authorName | Ім'я автора для пошуку |
resultsElements | Елементи для відображення результатів |
library | Посилання на бібліотеку |
showResults | Прапорець для відображення результатів |
bool processBookForAuthor | ( | const Book * | book, |
const Author * | author, | ||
Elements & | authorElements, | ||
bool & | hasBooks, | ||
const std::function< Elements(const Book *)> & | createBookElements, | ||
std::set< std::string, std::less<> > & | uniqueBooks, | ||
int & | totalBooks | ||
) |
Обробляє книгу для пошуку та додає її до результатів, якщо вона відповідає критеріям
book | Вказівник на книгу |
author | Вказівник на автора |
authorElements | Елементи для відображення |
hasBooks | Прапорець наявності книг |
createBookElements | Функція для створення елементів книги |
uniqueBooks | Множина унікальних ідентифікаторів книг |
totalBooks | Лічильник знайдених книг |
void processBookSearch | ( | const std::string & | title, |
const Storage & | library, | ||
Color & | resultColor, | ||
bool & | showResult, | ||
Elements & | resultElements | ||
) |
Обробляє пошук книги та заповнює елементи результатів.
title | Назва книги для пошуку. | |
library | Посилання на об'єкт бібліотеки. | |
[out] | resultColor | Колір для повідомлення про результат. |
[out] | showResult | Прапорець для відображення результату. |
[out] | resultElements | Елементи FTXUI для додавання результатів. |
void processFoundBook | ( | const Book * | book, |
Elements & | authorElements, | ||
bool & | hasBooks, | ||
CreateBookElementsFunc | createBookElements | ||
) |
Обробляє знайдені книги автора та додає їх до елементів для відображення
CreateBookElementsFunc | Тип функції для створення елементів книги |
book | Вказівник на книгу |
authorElements | Елементи для відображення |
hasBooks | Прапорець наявності книг |
createBookElements | Функція для створення елементів книги |
Elements render_single_book | ( | const Book * | book, |
int | index | ||
) |
Створює елементи для відображення інформації про одну книгу
book | Вказівник на книгу |
index | Індекс книги у списку |
Створює елементи для відображення інформації про книги автора
author | Вказівник на автора |
library | Посилання на бібліотеку |
void renderAuthorInfo | ( | const std::string & | authorName, |
const Storage & | library, | ||
Elements & | elements | ||
) |
Рендерить елементи UI для відображення інформації про автора.
authorName | Ім'я автора. | |
library | Посилання на об'єкт бібліотеки. | |
[out] | elements | Елементи FTXUI для додавання інформації. |
Шукає автора та форматує його інформацію разом зі списком книг для відображення.
ftxui::Element renderBestBookElements | ( | const ftxui::Component & | inputAuthorNameComp, |
const ftxui::Component & | inputBookTitleComp, | ||
const ftxui::Component & | buttonSetComp, | ||
const ftxui::Component & | buttonBackComp, | ||
bool | showResultParam, | ||
const std::string & | resultMessageParam, | ||
ftxui::Color | resultColorParam | ||
) |
Рендерить елементи інтерфейсу для встановлення "кращої" книги автора.
Ця функція створює та повертає ftxui::Element, який представляє собою візуальний інтерфейс для взаємодії з користувачем при встановленні кращої книги. Вона включає поля для введення імені автора та назви книги, кнопки дії, а також опціонально відображає повідомлення про результат операції.
inputAuthorNameComp | Компонент ftxui для введення імені автора. |
inputBookTitleComp | Компонент ftxui для введення назви книги. |
buttonSetComp | Компонент ftxui для кнопки "Встановити". |
buttonBackComp | Компонент ftxui для кнопки "Назад". |
showResultParam | Булевий прапорець, що вказує, чи потрібно відображати повідомлення про результат. |
resultMessageParam | Рядок, що містить повідомлення про результат операції. |
resultColorParam | Колір для відображення повідомлення про результат. |
Element renderBookForm | ( | const Component & | inputTitle, |
const Component & | inputISBN, | ||
const Component & | inputPublisher, | ||
const Component & | inputNumPages, | ||
const Component & | inputYearPublished, | ||
const Component & | buttonAdd, | ||
const Component & | buttonBack | ||
) |
Відображає форму додавання нової книги
inputTitle | Поле введення назви книги |
inputISBN | Поле введення ISBN |
inputPublisher | Поле введення видавця |
inputNumPages | Поле введення кількості сторінок |
inputYearPublished | Поле введення року публікації |
buttonAdd | Кнопка "Додати" |
buttonBack | Кнопка "Повернутися" |
void renderSearchResults | ( | const Storage & | library, |
const std::string & | authorName, | ||
Elements & | resultsElements | ||
) |
Рендерить результати пошуку книг за автором.
library | Посилання на об'єкт бібліотеки. | |
authorName | Ім'я автора, за яким здійснювався пошук. | |
[out] | resultsElements | Елементи FTXUI для додавання результатів. |
Збирає всіх авторів, знаходить книги, що відповідають пошуковому запиту, та форматує їх для відображення.
void searchAndDisplayEntities | ( | const std::vector< std::unique_ptr< T > > & | entities, |
const std::string & | keyword | ||
) |
Шаблонна функція для пошуку та відображення сутностей.
T | Тип сутності (Book/Author). |
entities | Вектор сутностей для пошуку. |
keyword | Ключове слово для фільтрації. |
Nothing. | @complexity O(n), де n - кількість сутностей. |