категории для админа работают вроде адекватно
This commit is contained in:
parent
f1101c99d0
commit
d20e7b620b
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
BIN
data.mv.db
BIN
data.mv.db
Binary file not shown.
Loading…
Reference in New Issue
Block a user