diff --git a/build.gradle b/build.gradle index 830fea9..4ae31a8 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,8 @@ implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.flywaydb:flyway-core' + // Thymeleaf Layout Dialect + implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.2.1' runtimeOnly 'org.postgresql:postgresql' diff --git a/sopds.properties b/sopds.properties index 0673300..d9691dd 100644 --- a/sopds.properties +++ b/sopds.properties @@ -1,6 +1,6 @@ #SOPDS Configuration File -#Mon Nov 03 02:18:38 GMT+03:00 2025 -SOPDS_ALPHABET_MENU=true +#Mon Nov 03 02:21:40 GMT+03:00 2025 +SOPDS_ALPHABET_MENU=false SOPDS_LANGUAGE=ru SOPDS_PAGE_SIZE=20 SOPDS_SCAN_ENABLED=true diff --git a/src/main/java/ru/mcs/sopds/controller/WebController.java b/src/main/java/ru/mcs/sopds/controller/WebController.java index 3b2731c..c295828 100644 --- a/src/main/java/ru/mcs/sopds/controller/WebController.java +++ b/src/main/java/ru/mcs/sopds/controller/WebController.java @@ -1,6 +1,8 @@ package ru.mcs.sopds.controller; import jakarta.servlet.http.HttpServletRequest; +import ru.mcs.sopds.dto.CatalogItem; +import ru.mcs.sopds.dto.Paginator; import ru.mcs.sopds.entity.*; import ru.mcs.sopds.service.BookService; import lombok.RequiredArgsConstructor; @@ -12,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import ru.mcs.sopds.service.SettingsService; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -203,23 +206,60 @@ return demoUser; } + // ДОБАВЛЯЕМ МЕТОД CATALOG СЮДА @GetMapping("/catalog") public String catalog( - @RequestParam(required = false) Boolean alphabet, - Model model, - HttpServletRequest request) { + @RequestParam(required = false) Long cat, + @RequestParam(defaultValue = "1") int page, + Model model) { - model.addAttribute("currentPath", request.getRequestURI()); - model.addAttribute("current", "catalog"); - model.addAttribute("alphabet", alphabet != null ? alphabet : false); + // Логика каталога + List catalogItems = createSampleCatalogItems(); - // Заглушка пользователя - User demoUser = createDemoUser(); - model.addAttribute("user", demoUser); + // Пагинация + int pageSize = 20; + int totalItems = catalogItems.size(); + int totalPages = (int) Math.ceil((double) totalItems / pageSize); + + int startIndex = (page - 1) * pageSize; + int endIndex = Math.min(startIndex + pageSize, totalItems); + List currentPageItems = catalogItems.subList(startIndex, endIndex); + + model.addAttribute("items", currentPageItems); + model.addAttribute("catId", cat); + model.addAttribute("paginator", new Paginator(page, totalPages)); return "catalog"; } + private List createSampleCatalogItems() { + List items = new ArrayList<>(); + + // Добавляем каталоги + items.add(new CatalogItem(1L, "Художественная литература", 1, 0)); + items.add(new CatalogItem(2L, "Научная литература", 1, 0)); + items.add(new CatalogItem(3L, "Фантастика", 1, 0)); + items.add(new CatalogItem(4L, "Архив книг 2023", 1, 1)); + items.add(new CatalogItem(5L, "Коллекция INPX", 1, 2)); + + // Добавляем книги + List recentBooks = bookService.getRecentBooks(10000); + for (Book book : recentBooks) { + List authors = book.getAuthors() != null ? + new ArrayList<>(book.getAuthors()) : new ArrayList<>(); + + CatalogItem bookItem = new CatalogItem( + book.getId(), + book.getTitle(), + book.getFormat(), + authors + ); + items.add(bookItem); + } + + return items; + } + @GetMapping("/book/{id}") public String bookDetail(@PathVariable Long id, Model model) { Book book = bookService.getBookById(id); diff --git a/src/main/java/ru/mcs/sopds/dto/CatalogItem.java b/src/main/java/ru/mcs/sopds/dto/CatalogItem.java new file mode 100644 index 0000000..db73430 --- /dev/null +++ b/src/main/java/ru/mcs/sopds/dto/CatalogItem.java @@ -0,0 +1,34 @@ +package ru.mcs.sopds.dto; + +import lombok.Data; +import ru.mcs.sopds.entity.Author; + +import java.util.List; + +@Data +public class CatalogItem { + private Long id; + private String title; + private Integer isCatalog; // 1 - каталог, 0 - книга + private Integer catType; // 0 - папка, 1,3 - ZIP, 2 - INPX + private String format; // Формат книги (fb2, epub и т.д.) + private List authors; + + // Конструкторы + public CatalogItem() {} + + public CatalogItem(Long id, String title, Integer isCatalog, Integer catType) { + this.id = id; + this.title = title; + this.isCatalog = isCatalog; + this.catType = catType; + } + + public CatalogItem(Long id, String title, String format, List authors) { + this.id = id; + this.title = title; + this.isCatalog = 0; // Книга + this.format = format; + this.authors = authors; + } +} \ No newline at end of file diff --git a/src/main/java/ru/mcs/sopds/dto/Paginator.java b/src/main/java/ru/mcs/sopds/dto/Paginator.java new file mode 100644 index 0000000..3c5e5f5 --- /dev/null +++ b/src/main/java/ru/mcs/sopds/dto/Paginator.java @@ -0,0 +1,29 @@ +package ru.mcs.sopds.dto; + +import lombok.Data; +import java.util.List; + +@Data +public class Paginator { + private int number; // Текущая страница + private int numPages; // Всего страниц + private boolean hasPrevious; // Есть предыдущая страница + private boolean hasNext; // Есть следующая страница + private int previousPageNumber; // Номер предыдущей страницы + private int nextPageNumber; // Номер следующей страницы + private List pageRange; // Диапазон страниц для отображения + + public Paginator(int currentPage, int totalPages) { + this.number = currentPage; + this.numPages = totalPages; + this.hasPrevious = currentPage > 1; + this.hasNext = currentPage < totalPages; + this.previousPageNumber = currentPage - 1; + this.nextPageNumber = currentPage + 1; + + // Создаем диапазон страниц от 1 до totalPages + this.pageRange = java.util.stream.IntStream.rangeClosed(1, totalPages) + .boxed() + .collect(java.util.stream.Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/resources/static/images/folder.png b/src/main/resources/static/images/folder.png new file mode 100644 index 0000000..23bd078 --- /dev/null +++ b/src/main/resources/static/images/folder.png Binary files differ diff --git a/src/main/resources/static/images/inpx.png b/src/main/resources/static/images/inpx.png new file mode 100644 index 0000000..2f88124 --- /dev/null +++ b/src/main/resources/static/images/inpx.png Binary files differ diff --git a/src/main/resources/static/images/text.png b/src/main/resources/static/images/text.png new file mode 100644 index 0000000..2f2cb80 --- /dev/null +++ b/src/main/resources/static/images/text.png Binary files differ diff --git a/src/main/resources/static/images/zip.png b/src/main/resources/static/images/zip.png new file mode 100644 index 0000000..2ba31c8 --- /dev/null +++ b/src/main/resources/static/images/zip.png Binary files differ diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index ff45b1a..f3f74ea 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -1,7 +1,7 @@ + layout:decorate="~{main}"> Авторы - SOPDS