diff --git a/build.gradle b/build.gradle index a0ac64b..ae49364 100644 --- a/build.gradle +++ b/build.gradle @@ -15,9 +15,16 @@ jar { enabled = false } dependencies { - implementation(project(':front')) implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-devtools' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' + + implementation 'org.webjars:bootstrap:5.1.3' + implementation 'org.webjars:jquery:3.6.0' + implementation 'org.webjars:font-awesome:6.1.0' + implementation 'com.h2database:h2:2.1.210' implementation 'org.hibernate.validator:hibernate-validator' implementation 'org.springdoc:springdoc-openapi-ui:1.6.5' diff --git a/settings.gradle b/settings.gradle index 0eaa5e2..0cdaa80 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ rootProject.name = 'app' -include 'front' diff --git a/src/main/java/com/LabWork/app/MangaStore/controller/CreatorController.java b/src/main/java/com/LabWork/app/MangaStore/controller/CreatorController.java index 5b99465..2aa5371 100644 --- a/src/main/java/com/LabWork/app/MangaStore/controller/CreatorController.java +++ b/src/main/java/com/LabWork/app/MangaStore/controller/CreatorController.java @@ -2,12 +2,13 @@ package com.LabWork.app.MangaStore.controller; import com.LabWork.app.MangaStore.model.Dto.CreatorMangaDto; import com.LabWork.app.MangaStore.service.CreatorService; +import com.LabWork.app.WebConfiguration; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/creator") +@RequestMapping(WebConfiguration.REST_API + "/creator") public class CreatorController { private final CreatorService creatorService; @@ -20,12 +21,12 @@ public class CreatorController { return new CreatorMangaDto(creatorService.findCreator(id)); } - @GetMapping +/* @GetMapping public List getCreators() { return creatorService.findAllCreators().stream() .map(CreatorMangaDto::new) .toList(); - } + }*/ @PostMapping public CreatorMangaDto createCreator(@RequestParam("creatorName") String creatorName, diff --git a/src/main/java/com/LabWork/app/MangaStore/controller/CreatorMvcController.java b/src/main/java/com/LabWork/app/MangaStore/controller/CreatorMvcController.java new file mode 100644 index 0000000..1652064 --- /dev/null +++ b/src/main/java/com/LabWork/app/MangaStore/controller/CreatorMvcController.java @@ -0,0 +1,63 @@ +package com.LabWork.app.MangaStore.controller; + +import com.LabWork.app.MangaStore.model.Dto.CreatorMangaDto; +import com.LabWork.app.MangaStore.service.CreatorService; +import jakarta.validation.Valid; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +@Controller +@RequestMapping("/creator") +public class CreatorMvcController { + private final CreatorService creatorService; + + public CreatorMvcController(CreatorService creatorService) { + this.creatorService = creatorService; + } + + @GetMapping + public String getCreators(Model model) { + model.addAttribute("creators", + creatorService.findAllCreators().stream() + .map(CreatorMangaDto::new) + .toList()); + return "creator"; + } + + @GetMapping(value = {"/edit", "/edit/{id}"}) + public String editCreator(@PathVariable(required = false) Long id, + Model model) { + if (id == null || id <= 0) { + model.addAttribute("CreatorMangaDto", new CreatorMangaDto()); + } else { + model.addAttribute("creatorId", id); + model.addAttribute("CreatorMangaDto", new CreatorMangaDto(creatorService.findCreator(id))); + } + return "creator-edit"; + } + + @PostMapping(value = {"", "/{id}"}) + public String saveCreator(@PathVariable(required = false) Long id, + @ModelAttribute @Valid CreatorMangaDto creatorMangaDto, + BindingResult bindingResult, + Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("errors", bindingResult.getAllErrors()); + return "creator-edit"; + } + if (id == null || id <= 0) { + creatorService.addCreator(creatorMangaDto.getCreatorName(), creatorMangaDto.getHashedPassword()); + } else { + creatorService.updateCreator(id, creatorMangaDto.getCreatorName(), creatorMangaDto.getHashedPassword()); + } + return "redirect:/creator"; + } + + @PostMapping("/delete/{id}") + public String deleteCreator(@PathVariable Long id) { + creatorService.deleteCreator(id); + return "redirect:/creator"; + } +} diff --git a/src/main/java/com/LabWork/app/MangaStore/controller/MangaController.java b/src/main/java/com/LabWork/app/MangaStore/controller/MangaController.java index 58f8724..596a255 100644 --- a/src/main/java/com/LabWork/app/MangaStore/controller/MangaController.java +++ b/src/main/java/com/LabWork/app/MangaStore/controller/MangaController.java @@ -5,13 +5,14 @@ import com.LabWork.app.MangaStore.model.Dto.MangaReaderDto; import com.LabWork.app.MangaStore.model.Dto.ReaderMangaDto; import com.LabWork.app.MangaStore.model.Dto.SupportDto.MangaDto; import com.LabWork.app.MangaStore.service.MangaService; +import com.LabWork.app.WebConfiguration; import jakarta.validation.Valid; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/manga") +@RequestMapping(WebConfiguration.REST_API + "/manga") public class MangaController { private final MangaService mangaService; diff --git a/src/main/java/com/LabWork/app/MangaStore/controller/ReaderController.java b/src/main/java/com/LabWork/app/MangaStore/controller/ReaderController.java index 2d393c3..856861a 100644 --- a/src/main/java/com/LabWork/app/MangaStore/controller/ReaderController.java +++ b/src/main/java/com/LabWork/app/MangaStore/controller/ReaderController.java @@ -4,12 +4,13 @@ package com.LabWork.app.MangaStore.controller; import com.LabWork.app.MangaStore.model.Dto.ReaderMangaDto; import com.LabWork.app.MangaStore.model.Dto.SupportDto.MangaDto; import com.LabWork.app.MangaStore.service.ReaderService; +import com.LabWork.app.WebConfiguration; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/reader") +@RequestMapping(WebConfiguration.REST_API + "/reader") public class ReaderController { private final ReaderService readerService; diff --git a/src/main/java/com/LabWork/app/MangaStore/controller/ReaderMvcController.java b/src/main/java/com/LabWork/app/MangaStore/controller/ReaderMvcController.java new file mode 100644 index 0000000..cba52c4 --- /dev/null +++ b/src/main/java/com/LabWork/app/MangaStore/controller/ReaderMvcController.java @@ -0,0 +1,63 @@ +package com.LabWork.app.MangaStore.controller; + +import com.LabWork.app.MangaStore.model.Dto.ReaderMangaDto; +import com.LabWork.app.MangaStore.service.ReaderService; +import jakarta.validation.Valid; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +@Controller +@RequestMapping("/reader") +public class ReaderMvcController { + private final ReaderService readerService; + + public ReaderMvcController(ReaderService readerService) { + this.readerService = readerService; + } + + @GetMapping + public String getReaders(Model model) { + model.addAttribute("readers", + readerService.findAllReaders().stream() + .map(ReaderMangaDto::new) + .toList()); + return "reader"; + } + + @GetMapping(value = {"/edit", "/edit/{id}"}) + public String editReader(@PathVariable(required = false) Long id, + Model model) { + if (id == null || id <= 0) { + model.addAttribute("ReaderMangaDto", new ReaderMangaDto()); + } else { + model.addAttribute("readerId", id); + model.addAttribute("ReaderMangaDto", new ReaderMangaDto(readerService.findReader(id))); + } + return "reader-edit"; + } + + @PostMapping(value = {"", "/{id}"}) + public String saveReader(@PathVariable(required = false) Long id, + @ModelAttribute @Valid ReaderMangaDto readerMangaDto, + BindingResult bindingResult, + Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("errors", bindingResult.getAllErrors()); + return "reader-edit"; + } + if (id == null || id <= 0) { + readerService.addReader(readerMangaDto.getReaderName(), readerMangaDto.getHashedPassword()); + } else { + readerService.updateReader(id, readerMangaDto.getReaderName(), readerMangaDto.getHashedPassword()); + } + return "redirect:/reader"; + } + + @PostMapping("/delete/{id}") + public String deleteReader(@PathVariable Long id) { + readerService.deleteReader(id); + return "redirect:/reader"; + } +} diff --git a/src/main/java/com/LabWork/app/MangaStore/model/Dto/CreatorMangaDto.java b/src/main/java/com/LabWork/app/MangaStore/model/Dto/CreatorMangaDto.java index 4c8bf5a..c7e0999 100644 --- a/src/main/java/com/LabWork/app/MangaStore/model/Dto/CreatorMangaDto.java +++ b/src/main/java/com/LabWork/app/MangaStore/model/Dto/CreatorMangaDto.java @@ -6,10 +6,13 @@ import com.LabWork.app.MangaStore.model.Dto.SupportDto.MangaDto; import java.util.List; public class CreatorMangaDto { - private final long id; - private final String creatorName; - private final String hashedPassword; - private final List mangas; + private long id; + private String creatorName; + private String hashedPassword; + private List mangas; + + public CreatorMangaDto() { + } public CreatorMangaDto(Creator creator) { this.id = creator.getId(); @@ -33,4 +36,16 @@ public class CreatorMangaDto { } public List getMangas() { return mangas; } + + public void setCreatorName(String creatorName) { + this.creatorName = creatorName; + } + + public void setHashedPassword(String hashedPassword) { + this.hashedPassword = hashedPassword; + } + + public void setMangas(List mangas) { + this.mangas = mangas; + } } diff --git a/src/main/java/com/LabWork/app/MangaStore/model/Dto/MangaReaderDto.java b/src/main/java/com/LabWork/app/MangaStore/model/Dto/MangaReaderDto.java index 476f604..09996a1 100644 --- a/src/main/java/com/LabWork/app/MangaStore/model/Dto/MangaReaderDto.java +++ b/src/main/java/com/LabWork/app/MangaStore/model/Dto/MangaReaderDto.java @@ -3,20 +3,24 @@ package com.LabWork.app.MangaStore.model.Dto; import com.LabWork.app.MangaStore.model.Default.Creator; import com.LabWork.app.MangaStore.model.Default.Manga; import com.LabWork.app.MangaStore.model.Default.Reader; +import com.LabWork.app.MangaStore.model.Dto.SupportDto.MangaDto; import com.LabWork.app.MangaStore.model.Dto.SupportDto.ReaderDto; import java.nio.charset.StandardCharsets; import java.util.List; public class MangaReaderDto { - private final Long id; + private Long id; - private final Long creatorId; - private final String mangaName; - private final Integer chapterCount; - private final List readers; + private Long creatorId; + private String mangaName; + private Integer chapterCount; + private List readers; private String image; + public MangaReaderDto() { + } + public MangaReaderDto(Manga manga, List listReader) { this.id = manga.getId(); this.creatorId = manga.getCreator().getId(); @@ -52,4 +56,21 @@ public class MangaReaderDto { return creatorId; } + public void setImage(String image) { + this.image = image; + } + + public void setMangaName(String mangaName) { + this.mangaName = mangaName; + } + + public void setReaders(List readers) { + this.readers = readers; + } + + public void setChapterCount(Integer chapterCount) { + this.chapterCount = chapterCount; + } + + public void setCreatorIdString(Long creatorId) {this.creatorId = creatorId;} } diff --git a/src/main/java/com/LabWork/app/MangaStore/model/Dto/ReaderMangaDto.java b/src/main/java/com/LabWork/app/MangaStore/model/Dto/ReaderMangaDto.java index f1adc6c..38912cb 100644 --- a/src/main/java/com/LabWork/app/MangaStore/model/Dto/ReaderMangaDto.java +++ b/src/main/java/com/LabWork/app/MangaStore/model/Dto/ReaderMangaDto.java @@ -14,6 +14,9 @@ public class ReaderMangaDto { private List mangas; + public ReaderMangaDto() { + } + public ReaderMangaDto(Reader reader) { this.id = reader.getId(); this.readerName = reader.getReaderName(); @@ -33,4 +36,16 @@ public class ReaderMangaDto { public List getMangas() { return mangas; } + public void setReaderName(String readerName) { + this.readerName = readerName; + } + + public void setHashedPassword(String hashedPassword) { + this.hashedPassword = hashedPassword; + } + + public void setMangas(List mangas) { + this.mangas = mangas; + } + } diff --git a/src/main/java/com/LabWork/app/MangaStore/service/CreatorService.java b/src/main/java/com/LabWork/app/MangaStore/service/CreatorService.java index 999c20d..6c14680 100644 --- a/src/main/java/com/LabWork/app/MangaStore/service/CreatorService.java +++ b/src/main/java/com/LabWork/app/MangaStore/service/CreatorService.java @@ -3,11 +3,8 @@ package com.LabWork.app.MangaStore.service; import com.LabWork.app.MangaStore.model.Default.Creator; import com.LabWork.app.MangaStore.model.Default.Manga; import com.LabWork.app.MangaStore.model.Default.Reader; -import com.LabWork.app.MangaStore.service.Exception.MangaNotFoundException; import com.LabWork.app.MangaStore.service.Repository.CreatorRepository; import com.LabWork.app.MangaStore.service.Exception.CreatorNotFoundException; -import com.LabWork.app.MangaStore.service.Repository.MangaRepository; -import com.LabWork.app.MangaStore.service.Repository.ReaderRepository; import com.LabWork.app.MangaStore.util.validation.ValidatorUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/LabWork/app/WebConfiguration.java b/src/main/java/com/LabWork/app/WebConfiguration.java index fefcfad..79b2cd6 100644 --- a/src/main/java/com/LabWork/app/WebConfiguration.java +++ b/src/main/java/com/LabWork/app/WebConfiguration.java @@ -6,25 +6,26 @@ import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerF import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistration; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.*; @Configuration public class WebConfiguration implements WebMvcConfigurer { + public static final String REST_API = "/api"; + @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedMethods("*"); } + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurer.setUseTrailingSlashMatch(true); + } + @Override public void addViewControllers(ViewControllerRegistry registry) { ViewControllerRegistration registration = registry.addViewController("/notFound"); registration.setViewName("forward:/index.html"); registration.setStatusCode(HttpStatus.OK); - -// Alternative way (404 error hits the console): -// > registry.addViewController("/notFound").setViewName("forward:/index.html"); } - } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index da7b0b1..eb910e4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.main.banner-mode=off -#server.port=8080 +server.port=8079 spring.datasource.url=jdbc:h2:file:./data spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa diff --git a/src/main/resources/public/css/style.css b/src/main/resources/public/css/style.css new file mode 100644 index 0000000..00d4c47 --- /dev/null +++ b/src/main/resources/public/css/style.css @@ -0,0 +1,107 @@ +html, +body { + background-color: #000000; + color: #ffffff; + padding: 0; + margin: 0; + font-family: sans-serif; + line-height: 1.15; + height: 100%; +} +header { + background-color: #3c3c3c; + color: #ffffff; +} +header a { + color: #ffffff; + text-decoration: none; + margin: 0 0.5em; +} +header a:hover { + text-decoration: underline; +} +#logo { + margin-left: 0.5em; +} +article a { + color: #ffffff; + text-decoration: none; + margin: 0.5em 0.5em; +} +header a:hover { + text-decoration: underline; +} + +h2 { + font-size: 1.25em; +} +h3 { + font-size: 1.1em; +} +footer { + background-color: #9c9c9c; + color: #ffffff; + height: 32px; + padding: 0.5em; +} +.manga_pages{ + display: flex; + flex-direction: column; + align-items: center; +} +.catalog_wrapper{ + display: flex; + width: 73%; + flex-direction: column; +} +.catalog_article{ + display: flex; +} +.poster{ + width:140px; +} +th { + border: 0px solid rgb(255, 255, 255); +} +.added_manga{ + display: flex; + flex-direction: column; +} +@media (min-width: 992px) { + .manga_pages img{ + max-width: 900px; + width: auto; + height: auto; + } +} +.flex_grow { + flex-grow: 1; + display: flex; + align-items: center; +} +@media (min-width: 1024px){ + .article_1 { + max-width: -webkit-calc(1600px + (100vw/64*7)*2); + max-width: -moz-calc(1600px + (100vw/64*7)*2); + max-width: calc(1600px + (100vw/64*7)*2); + padding-left: -webkit-calc(100vw/64*7); + padding-left: -moz-calc(100vw/64*7); + padding-left: calc(100vw/64*7); + padding-right: -webkit-calc(100vw/64*7); + padding-right: -moz-calc(100vw/64*7); + padding-right: calc(100vw/64*7); + } +} + + +.registration_div { + width: 100%; + height: 100%; +} + +.slideshow{ + height: 250px; + width: auto;/*maintain aspect ratio*/ + max-width:180px; + border-radius: 7%; +} \ No newline at end of file diff --git a/src/main/resources/public/favicon.svg b/src/main/resources/public/favicon.svg new file mode 100644 index 0000000..c2e8ab2 --- /dev/null +++ b/src/main/resources/public/favicon.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/src/main/resources/templates/creator-edit.html b/src/main/resources/templates/creator-edit.html new file mode 100644 index 0000000..a80d814 --- /dev/null +++ b/src/main/resources/templates/creator-edit.html @@ -0,0 +1,31 @@ + + + + + +
+
+
+
+ + +
+
+ + +
+
+ + + Назад + +
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/creator.html b/src/main/resources/templates/creator.html new file mode 100644 index 0000000..0741a01 --- /dev/null +++ b/src/main/resources/templates/creator.html @@ -0,0 +1,60 @@ + + + + + +
+
+

Creator

+ + Добавить + +
+ + + + + + + + + + + + + + + + +
#CreatorNamePasswordMangas
+ + + + + +
+ + Изменить + + +
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/default.html b/src/main/resources/templates/default.html new file mode 100644 index 0000000..7940c84 --- /dev/null +++ b/src/main/resources/templates/default.html @@ -0,0 +1,49 @@ + + + + + IP Example + + + + + + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html new file mode 100644 index 0000000..0a81607 --- /dev/null +++ b/src/main/resources/templates/error.html @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..a7a11f2 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,13 @@ + + + + + +
+
It's works!
+ ERROR +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/reader-edit.html b/src/main/resources/templates/reader-edit.html new file mode 100644 index 0000000..5ffe594 --- /dev/null +++ b/src/main/resources/templates/reader-edit.html @@ -0,0 +1,31 @@ + + + + + +
+
+
+
+ + +
+
+ + +
+
+ + + Назад + +
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/reader.html b/src/main/resources/templates/reader.html new file mode 100644 index 0000000..78a5598 --- /dev/null +++ b/src/main/resources/templates/reader.html @@ -0,0 +1,60 @@ + + + + + +
+
+

Reader

+ + Добавить + +
+ + + + + + + + + + + + + + + + +
#ReaderNamePasswordMangas
+ + + + + +
+ + Изменить + + +
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/test/java/com/LabWork/app/AppApplicationTests.java b/src/test/java/com/LabWork/app/AppApplicationTests.java index fc10535..5459e6e 100644 --- a/src/test/java/com/LabWork/app/AppApplicationTests.java +++ b/src/test/java/com/LabWork/app/AppApplicationTests.java @@ -1,62 +1,12 @@ package com.LabWork.app; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class AppApplicationTests { - -/* @Autowired - MethodService methodService; - - @Test - void testMethodSumInt() { - final String res = methodService.Sum(1, 2, "int"); - Assertions.assertEquals(3, Integer.parseInt(res)); - } - - @Test - void testMethodSumString() { - final String res = methodService.Sum("1", "2", "string"); - Assertions.assertEquals("12", res); - } - - @Test - void testMethodMinusInt() { - final String res = methodService.Difference(1, 2, "int"); - Assertions.assertEquals(-1, Integer.parseInt(res)); - } - - @Test - void testMethodMinusString() { - final String res = methodService.Difference("214324", "4", "string"); - Assertions.assertEquals("2132", res); - } - - @Test - void testMethodMultInt() { - final String res = methodService.Multiplication(1, 2, "int"); - Assertions.assertEquals(2, Integer.parseInt(res)); - } - - @Test - void testMethodMultString() { - final String res = methodService.Multiplication("1", "2", "string"); - Assertions.assertEquals("11", res); - } - - @Test - void testMethodContainsInt() { - final String res = methodService.Contains(123, 2, "int"); - Assertions.assertEquals(61, Integer.parseInt(res)); - } - - @Test - void testMethodContainsString() { - final String res = methodService.Contains("1", "2", "string"); - Assertions.assertEquals("false", res); - }*/ + public static void main(String[] args) { + SpringApplication.run(AppApplicationTests.class, args); + } }