категории для админа работают вроде адекватно

This commit is contained in:
Елена Бакальская 2024-06-04 22:58:05 +04:00
parent f1101c99d0
commit d20e7b620b
7 changed files with 97 additions and 38 deletions

View File

@ -8,7 +8,6 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.example.backend.categories.model.CategorieEntity; import com.example.backend.categories.model.CategorieEntity;
import com.example.backend.categories.repository.CategorieRepository;
import com.example.backend.categories.service.CategorieService; import com.example.backend.categories.service.CategorieService;
import com.example.backend.core.configurations.Constants; import com.example.backend.core.configurations.Constants;
@ -18,34 +17,24 @@ import org.springframework.ui.Model;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Controller @Controller
@RequestMapping(CategorieController.URL) @RequestMapping(CategorieController.URL)
public class CategorieController { public class CategorieController {
public static final String URL = Constants.ADMIN_PREFIX + "/categories"; public static final String URL = Constants.ADMIN_PREFIX + "/categories";
private static final String CATEGORIE_VIEW = "categories"; private static final String CATEGORIE_VIEW = "categories";
private static final String CATEGORIE_ATTRIBUTE = "categories"; private static final String CATEGORIE_ATTRIBUTE = "categorie";
private static final String CATEGORIE_EDIT_VIEW = "categorie-edit"; private static final String CATEGORIE_EDIT_VIEW = "categorie-edit";
private final CategorieService categorieService; private final CategorieService categorieService;
public final CategorieRepository categorieRepository;
private final ModelMapper modelMapper; private final ModelMapper modelMapper;
private static String UPLOAD_DIR = System.getProperty("user.dir") + "/uploads"; public CategorieController(CategorieService categorieService, ModelMapper modelMapper) {
public CategorieController(CategorieService categorieService, ModelMapper modelMapper,
CategorieRepository categorieRepository) {
this.categorieService = categorieService; this.categorieService = categorieService;
this.modelMapper = modelMapper; this.modelMapper = modelMapper;
this.categorieRepository = categorieRepository;
} }
private CategorieDTO toDto(CategorieEntity entity) { private CategorieDTO toDto(CategorieEntity entity) {
@ -75,21 +64,44 @@ public class CategorieController {
@PostMapping("/edit/") @PostMapping("/edit/")
public String create(@ModelAttribute(name = CATEGORIE_ATTRIBUTE) @Valid CategorieDTO categorieDTO, public String create(@ModelAttribute(name = CATEGORIE_ATTRIBUTE) @Valid CategorieDTO categorieDTO,
BindingResult bindingResult, RedirectAttributes redirectAttributes, BindingResult bindingResult, RedirectAttributes redirectAttributes,
@RequestParam("image") MultipartFile imageFile) { @RequestParam("imageFile") MultipartFile imageFile) {
try { if (bindingResult.hasErrors()) {
if (bindingResult.hasErrors()) { return CATEGORIE_EDIT_VIEW;
return CATEGORIE_EDIT_VIEW;
}
CategorieEntity category = toEntity(categorieDTO);
if (!imageFile.isEmpty()) {
Path fileNameAndPath = Paths.get(UPLOAD_DIR, imageFile.getOriginalFilename());
Files.write(fileNameAndPath, imageFile.getBytes());
// category.setImage("/uploads/" + imageFile.getOriginalFilename());
}
categorieService.create(category);
} catch (IOException e) {
e.printStackTrace();
} }
CategorieEntity category = toEntity(categorieDTO);
categorieService.create(category);
return Constants.REDIRECT_VIEW + URL;
}
@GetMapping("/edit/{id}")
public String update(@PathVariable(name = "id") Integer id, Model model) {
if (id <= 0) {
throw new IllegalArgumentException();
}
model.addAttribute(CATEGORIE_ATTRIBUTE, toDto(categorieService.get(id)));
return CATEGORIE_EDIT_VIEW;
}
@PostMapping("/edit/{id}")
public String update(@PathVariable(name = "id") Integer id,
@ModelAttribute(name = CATEGORIE_ATTRIBUTE) @Valid CategorieDTO categorieDTO,
BindingResult bindingResult, RedirectAttributes redirectAttributes,
@RequestParam("imageFile") MultipartFile imageFile) {
if (bindingResult.hasErrors()) {
return CATEGORIE_EDIT_VIEW;
}
CategorieEntity category = toEntity(categorieDTO);
category.setImage(categorieService.get(id).getImage());
categorieService.update(id, category);
return Constants.REDIRECT_VIEW + URL;
}
@PostMapping("delete/{id}")
public String delete(@PathVariable(name = "id") Integer id) {
categorieService.delete(id);
return Constants.REDIRECT_VIEW + URL; return Constants.REDIRECT_VIEW + URL;
} }
} }

View File

@ -14,7 +14,6 @@ public class CategorieDTO {
@Size(min = 5, max = 50) @Size(min = 5, max = 50)
private String name; private String name;
@Size(min = 5, max = 50)
private String image; private String image;
@JsonProperty(access = JsonProperty.Access.READ_ONLY) @JsonProperty(access = JsonProperty.Access.READ_ONLY)

View File

@ -140,4 +140,24 @@
html { html {
height: 100%; height: 100%;
}
.bi-edit-pen {
color: rgb(72, 108, 16);
height: 25px;
transition: transform 0.3s;
}
.bi-edit-pen:hover {
transform: scale(1.2);
}
.bi-cart-delete {
color: red;
height: 25px;
transition: transform 0.3s;
}
.bi-cart-delete:hover {
transform: scale(1.2);
} }

View File

@ -2,23 +2,23 @@
<html lang="ru" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{index}"> <html lang="ru" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{index}">
<head> <head>
<title>Создать категорию</title> <title>Редактирование категории</title>
</head> </head>
<body> <body>
<main layout:fragment="content"> <main layout:fragment="content">
<h1>Редактирование/Создание категории</h1>
<form action="#" th:action="@{/admin/categories/edit/{id}(id=${categorie.id})}" th:object="${categorie}" <form action="#" th:action="@{/admin/categories/edit/{id}(id=${categorie.id})}" th:object="${categorie}"
method="post"> method="post" enctype="multipart/form-data">
<div class="mb-3"> <div class="mb-3">
<label for="id" class="form-label">ID</label> <label for="id" class="form-label">ID</label>
<input type="text" th:value="*{id}" id="id" class="form-control" readonly disabled> <input type="text" th:value="*{id}" id="id" class="form-control" readonly disabled>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="name" class="form-label">Имя пользователя</label> <label class="form-label" for="name">Название:</label>
<input type="text" th:field="*{name}" id="login" class="form-control"> <input class="form-control" type="text" id="name" th:field="*{name}" />
<div th:if="${#fields.hasErrors('name')}" th:errors="*{name}" class="invalid-feedback"></div> <div th:if="${#fields.hasErrors('name')}" th:errors="*{name}" class="invalid-feedback"></div>
</div> </div>
<div class="mb-3 d-flex flex-row"> <div class="mb-3 d-flex flex-row">
<button class="btn btn-primary me-2 button-fixed-width" type="submit">Сохранить</button> <button class="btn btn-primary me-2 button-fixed-width" type="submit">Сохранить</button>
<a class="btn btn-secondary button-fixed-width" th:href="@{/admin/categories}">Отмена</a> <a class="btn btn-secondary button-fixed-width" th:href="@{/admin/categories}">Отмена</a>

View File

@ -28,19 +28,47 @@
<th:block th:switch="${categories.size()}"> <th:block th:switch="${categories.size()}">
<h2 th:case="0">Данные отсутствуют</h2> <h2 th:case="0">Данные отсутствуют</h2>
<th:block th:case="*"> <th:block th:case="*">
<div class="categories-container d-flex flex-row justify-content-center mt-3"> <div class="categories-container d-flex flex-row justify-content-center mt-3 mb-3">
<div class="category-item d-flex flex-column justify-content-center align-items-center mb-5 mb-md-0" <div class="category-item d-flex flex-column justify-content-center align-items-center mb-5 mb-md-0"
th:each="categorie : ${categories}"> th:each="categorie : ${categories}">
<div class="category-card"> <div class="category-card">
<img class="card-img-top rounded-3" <img class="card-img-top rounded-3"
src="https://live.funnelmates.com/wp-content/uploads/2021/08/placeholder-200x200-1-1-1.jpeg" /> th:src="${categorie.image != null ? 'data:image/jpeg;base64,' + categorie.image : 'https://live.funnelmates.com/wp-content/uploads/2021/08/placeholder-200x200-1-1-1.jpeg'}" />
<div class="card-body"> <div class="card-body">
<h5 class="card-title" th:text="${categorie.name}"></h5> <h5 class="card-title" th:text="${categorie.name}"></h5>
</div> </div>
</div> </div>
<div class="d-flex flex-row me-ms-mt-2">
<form th:action="@{/admin/categories/edit/{id}(id=${categorie.id})}" method="get">
<button type="submit" class="btn btn-link button-link">
<svg class="bi-edit-pen" viewBox="0 0 127 127" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M105.5 26L37 114.5C34.5 117 16.3 121.7 7.5 122.5C79.1 34.1 101 5.5 102 4C104.833 4.5 119.3 14.6 122.5 21C105 44 98.5 55 111.5 58.5"
stroke="#008315" stroke-width="6" stroke-linecap="round" />
</svg>
</button>
</form>
<form th:action="@{/admin/categories/delete/{id}(id=${categorie.id})}" method="post">
<button type="submit" class="btn btn-link button-link"
onclick="return confirm('Вы уверены?')">
<svg class="bi-cart-delete" viewBox="0 0 154 164" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M44.5 123C4.99995 119.5 -11.8431 56.4293 24 19.5C40.5 2.50001 72.5 -5.5 101.5 27.5L115.5 14.5"
stroke="#D10000" stroke-width="8" stroke-linecap="round" />
<path
d="M65.2123 159.963L56 60.0001C88.0236 76.3307 119.521 77.4194 149 60.0001C141.63 142.346 140.08 160.953 140.226 159.963H65.2123Z"
stroke="#D10000" stroke-width="8" />
<path d="M121 36L101.582 55L75 31" stroke="#D10000" stroke-width="8"
stroke-linecap="round" />
</svg>
</button>
</form>
</div>
</div> </div>
</div> </div>
<div> <div class="d-flex flex-row me-2 justify-content-center mt-3 mb-3">
<a th:href="@{/admin/categories/edit/}" class="btn btn-primary">Добавить категорию</a> <a th:href="@{/admin/categories/edit/}" class="btn btn-primary">Добавить категорию</a>
</div> </div>
</th:block> </th:block>

View File

@ -2,7 +2,7 @@
<html lang="ru" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{index}"> <html lang="ru" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{index}">
<head> <head>
<title>Редакторовать пользователя</title> <title>Редакторовать/Создать пользователя</title>
</head> </head>
<body> <body>

Binary file not shown.