BOOK-LIBRARY: обзор и сценарии
BOOK-LIBRARY решает спокойную прикладную задачу: собрать электронные книги в каталог, где читатель видит понятные категории и карточки, а администратор может пополнять коллекцию без ручного ведения отдельных HTML-страниц.
Проект не пытается быть полноценным книжным маркетплейсом или социальной сетью. По коду и документации это именно библиотечный каталог с загрузкой файлов, хранением метаданных и скачиванием книг.
Сценарий читателя
Публичная часть начинается с главной страницы frontend/src/routes/+page.svelte: она запрашивает /api/categories и показывает сетку категорий. В карточке категории есть emoji, название и описание. Если категорий нет, интерфейс честно предлагает зайти в админку и создать их.
Дальше читатель открывает страницу категории frontend/src/routes/categories/[id]/+page.svelte. Там приложение:
- загружает список категорий, чтобы показать название текущей;
- запрашивает книги через
/api/categories/:id/books; - выводит обложку, порядковый номер, название, автора, описание и кнопку скачивания.
Скачивание устроено не прямой ссылкой на файл. Frontend отправляет POST /api/download/book/:id, backend проверяет, что книга существует, создаёт временный токен и возвращает URL вида /download/temp/:token. Такой подход удобен для каталога: публичный интерфейс не раскрывает постоянный путь к файлу книги.
Сценарий администратора
Админская часть закрыта авторизацией. Вход реализован через /api/admin/login: backend сравнивает логин из окружения и bcrypt-хэш пароля, после чего сохраняет состояние в session cookie.
После входа администратор может:
- создавать категории с названием, описанием и emoji;
- удалять категории вместе с книгами внутри;
- добавлять одну книгу через форму;
- редактировать название, автора, описание, категорию и обложку;
- удалять отдельные книги;
- загружать ZIP-архив для пакетного импорта.
В интерфейсе админки отдельно виден сценарий пакетной загрузки. Форма отправляет архив на /api/admin/books/batch, а ответ приходит как NDJSON-поток. Это позволяет показывать прогресс: сколько файлов найдено, какой файл обрабатывается, сколько книг импортировано, пропущено или завершилось ошибкой.
Где появляется автоимпорт
При одиночной загрузке книги форма прямо подсказывает, что поля можно оставить пустыми: система попробует заполнить их автоматически. Это подтверждается backend-контроллером createBook: если не хватает title, author, description, cover или categoryId, запускается processBookFile.
Автоимпорт делает несколько практичных вещей:
- пытается извлечь метаданные и фрагмент текста из файла;
- передаёт данные в LLM, чтобы восстановить название, автора, описание и категорию;
- ищет подходящую обложку;
- если LLM предложила новую категорию, backend может создать её автоматически.
Это полезно при большой коллекции, где руками заполнять каждую карточку долго. При этом результат всё равно лучше воспринимать как черновик: описание, категория и обложка могут требовать ручной проверки.
Что важно для портфолио
В этом проекте хорошо видна практичная связка нескольких слоёв:
- пользовательский каталог на SvelteKit;
- админские формы и защищённые маршруты;
- Express API;
- SQLite как простое хранилище метаданных;
- файловое хранилище книг и обложек;
- LLM-помощник для заполнения карточек;
- legacy-страницы на EJS для более простого HTML-доступа.
Главная ценность проекта — не в сложности интерфейса, а в том, что он закрывает полный рабочий цикл: загрузить книги, привести их к карточкам, разложить по категориям и дать пользователю понятную страницу скачивания.