From c7b8f30077e0bf73735e95974884f6e3f4950f8f Mon Sep 17 00:00:00 2001 From: parap Date: Mon, 1 May 2023 23:05:23 +0400 Subject: [PATCH] lab 5 main part --- data.mv.db | Bin 106496 -> 155648 bytes .../films/controller/ActorMvcController.java | 52 ++++++++ .../films/controller/FilmMvcController.java | 70 ++++++++++ .../films/controller/GenreMvcController.java | 52 ++++++++ .../ru/ip/labs/labs/films/dto/FilmDTO.java | 8 ++ src/main/resources/static/css/Table.css | 3 + .../resources/templates/actors-catalog.html | 110 ++++++++++++++++ src/main/resources/templates/catalogs.html | 6 +- .../resources/templates/films-catalog.html | 120 ++++++++++++++++++ .../resources/templates/genres-catalog.html | 101 +++++++++++++++ 10 files changed, 519 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/ip/labs/labs/films/controller/ActorMvcController.java create mode 100644 src/main/java/ru/ip/labs/labs/films/controller/FilmMvcController.java create mode 100644 src/main/java/ru/ip/labs/labs/films/controller/GenreMvcController.java create mode 100644 src/main/resources/static/css/Table.css create mode 100644 src/main/resources/templates/actors-catalog.html create mode 100644 src/main/resources/templates/films-catalog.html create mode 100644 src/main/resources/templates/genres-catalog.html diff --git a/data.mv.db b/data.mv.db index e070829a67208c78dcab9d8276654961c1553b74..c3014e005eb6ee4b4e435ae1af131a3f0c7a4e18 100644 GIT binary patch literal 155648 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 literal 106496 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 diff --git a/src/main/java/ru/ip/labs/labs/films/controller/ActorMvcController.java b/src/main/java/ru/ip/labs/labs/films/controller/ActorMvcController.java new file mode 100644 index 0000000..571918d --- /dev/null +++ b/src/main/java/ru/ip/labs/labs/films/controller/ActorMvcController.java @@ -0,0 +1,52 @@ +package ru.ip.labs.labs.films.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import ru.ip.labs.labs.films.dto.ActorDTO; +import ru.ip.labs.labs.films.service.ActorService; + +import javax.validation.Valid; + +@Controller +@RequestMapping("/actor") +public class ActorMvcController { + private ActorService actorService; + public ActorMvcController(ActorService actorService) { + this.actorService = actorService; + } + @GetMapping + public String getActors(Model model) { + model.addAttribute("actors", + actorService.findAllActors().stream() + .map(ActorDTO::new).toList()); + + model.addAttribute("actorDTO", new ActorDTO()); + + return "actors-catalog"; + } + + @PostMapping(value = {"", "/{id}"}) + public String saveActor(@PathVariable(required = false) Long id, + @ModelAttribute @Valid ActorDTO actorDTO, + BindingResult bindingResult, + Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("errors", bindingResult.getAllErrors()); + return "actors-catalog"; + } + if (id == null || id <= 0) { + actorService.addActor(actorDTO.getName(), actorDTO.getSurname()); + } else { + actorService.updateActor(id, actorDTO.getName(), actorDTO.getSurname()); + } + return "redirect:/actor"; + } + + @PostMapping("/delete/{id}") + public String deleteGenre(@PathVariable Long id) { + actorService.deleteActor(id); + return "redirect:/actor"; + } +} diff --git a/src/main/java/ru/ip/labs/labs/films/controller/FilmMvcController.java b/src/main/java/ru/ip/labs/labs/films/controller/FilmMvcController.java new file mode 100644 index 0000000..399ac93 --- /dev/null +++ b/src/main/java/ru/ip/labs/labs/films/controller/FilmMvcController.java @@ -0,0 +1,70 @@ +package ru.ip.labs.labs.films.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import ru.ip.labs.labs.films.dto.FilmDTO; +import ru.ip.labs.labs.films.models.Film; +import ru.ip.labs.labs.films.service.ActorService; +import ru.ip.labs.labs.films.service.FilmsService; +import ru.ip.labs.labs.films.service.GenreService; + +import javax.validation.Valid; + +@Controller +@RequestMapping("/film") +public class FilmMvcController { + private FilmsService filmService; + private GenreService genreService; + private ActorService actorService; + public FilmMvcController(FilmsService filmService, GenreService genreService, ActorService actorService) { + this.filmService = filmService; + this.genreService = genreService; + this.actorService = actorService; + } + @GetMapping + public String getFilms(Model model) { + model.addAttribute("films", + filmService.findAllFilms().stream() + .map(FilmDTO::new).toList()); + + model.addAttribute("filmDTO", new FilmDTO()); + model.addAttribute("allGenres", + genreService.findAllGenres().stream() + .map(g -> g.getName()).toList()); + model.addAttribute("allActors", + actorService.findAllActors().stream() + .map(a -> a.getName() + " " + a.getSurname()).toList()); + + return "films-catalog"; + } + + @PostMapping(value = {"", "/{id}"}) + public String saveFilm(@PathVariable(required = false) Long id, + @ModelAttribute @Valid FilmDTO filmDTO, + BindingResult bindingResult, + Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("errors", bindingResult.getAllErrors()); + return "films-catalog"; + } + Long filmId = filmDTO.getId(); + + if (id == null || id <= 0) { + Film result = filmService.addFilm(filmDTO.getName()); + filmId = result.getId(); + } else { + filmService.updateFilm(id, filmDTO.getName()); + } + filmService.updateGenres(filmId, filmDTO.getGenre()); + filmService.updateActors(filmId, filmDTO.getFullNames()); + return "redirect:/film"; + } + + @PostMapping("/delete/{id}") + public String deleteGenre(@PathVariable Long id) { + filmService.deleteFilm(id); + return "redirect:/film"; + } +} diff --git a/src/main/java/ru/ip/labs/labs/films/controller/GenreMvcController.java b/src/main/java/ru/ip/labs/labs/films/controller/GenreMvcController.java new file mode 100644 index 0000000..68ec859 --- /dev/null +++ b/src/main/java/ru/ip/labs/labs/films/controller/GenreMvcController.java @@ -0,0 +1,52 @@ +package ru.ip.labs.labs.films.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import ru.ip.labs.labs.films.dto.GenreDTO; +import ru.ip.labs.labs.films.service.GenreService; + +import javax.validation.Valid; + +@Controller +@RequestMapping("/genre") +public class GenreMvcController { + private GenreService genreService; + public GenreMvcController(GenreService genreService) { + this.genreService = genreService; + } + @GetMapping + public String getGenres(Model model) { + model.addAttribute("genres", + genreService.findAllGenres().stream() + .map(GenreDTO::new).toList()); + + model.addAttribute("genreDTO", new GenreDTO()); + + return "genres-catalog"; + } + + @PostMapping(value = {"", "/{id}"}) + public String saveGenre(@PathVariable(required = false) Long id, + @ModelAttribute @Valid GenreDTO genreDTO, + BindingResult bindingResult, + Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("errors", bindingResult.getAllErrors()); + return "genres-catalog"; + } + if (id == null || id <= 0) { + genreService.addGenre(genreDTO.getName()); + } else { + genreService.updateGenre(id, genreDTO.getName()); + } + return "redirect:/genre"; + } + + @PostMapping("/delete/{id}") + public String deleteGenre(@PathVariable Long id) { + genreService.deleteGenre(id); + return "redirect:/genre"; + } +} diff --git a/src/main/java/ru/ip/labs/labs/films/dto/FilmDTO.java b/src/main/java/ru/ip/labs/labs/films/dto/FilmDTO.java index 3cdd2cd..b2ca5ad 100644 --- a/src/main/java/ru/ip/labs/labs/films/dto/FilmDTO.java +++ b/src/main/java/ru/ip/labs/labs/films/dto/FilmDTO.java @@ -52,10 +52,18 @@ public class FilmDTO { return fullNames; } + public void setFullNames(List fullNames) { + this.fullNames = fullNames; + } + public List getGenre() { return genre; } + public void setGenre(List genre) { + this.genre = genre; + } + @Override public String toString() { String res = "\nFilm{" + diff --git a/src/main/resources/static/css/Table.css b/src/main/resources/static/css/Table.css new file mode 100644 index 0000000..ab885e0 --- /dev/null +++ b/src/main/resources/static/css/Table.css @@ -0,0 +1,3 @@ +.selected { + background: #2150de; +} \ No newline at end of file diff --git a/src/main/resources/templates/actors-catalog.html b/src/main/resources/templates/actors-catalog.html new file mode 100644 index 0000000..fa306dd --- /dev/null +++ b/src/main/resources/templates/actors-catalog.html @@ -0,0 +1,110 @@ + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + +
#ИмяФамилия
+ +
+ +
+ + + + + + diff --git a/src/main/resources/templates/catalogs.html b/src/main/resources/templates/catalogs.html index 118fb42..6704252 100644 --- a/src/main/resources/templates/catalogs.html +++ b/src/main/resources/templates/catalogs.html @@ -6,9 +6,9 @@
\ No newline at end of file diff --git a/src/main/resources/templates/films-catalog.html b/src/main/resources/templates/films-catalog.html new file mode 100644 index 0000000..480e06a --- /dev/null +++ b/src/main/resources/templates/films-catalog.html @@ -0,0 +1,120 @@ + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
#НазваниеЖанрыАктеры
+ +
+ +
+ + + + + + diff --git a/src/main/resources/templates/genres-catalog.html b/src/main/resources/templates/genres-catalog.html new file mode 100644 index 0000000..f5a694a --- /dev/null +++ b/src/main/resources/templates/genres-catalog.html @@ -0,0 +1,101 @@ + + + + + + +
+
+
+ + + +
+ + + + + + + + + + + + + + +
#Жанр
+ +
+ +
+ + + + + +