<form th:action="@{|/review/create/${book.id}|}" method="post">
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="리뷰등록">
</form>
<div>
<ul>
<li th:if="${not #lists.isEmpty(book.reviewList)}" th:each="review : ${book.reviewList}" th:text="${review.content}"></li>
<li th:if="${#lists.isEmpty(book.reviewList)}">리뷰가 없습니다.</li>
</ul>
</div>
<a th:href="@{|/review/delete/${book.id}|}"
class="delete btn btn-sm btn-outline-secondary"
th:text="삭제">
</a>```
코드를 입력하세요
private final BookService bookService;
@PreAuthorize("isAuthenticated()")
@PostMapping("/create/{id}")
public String reviewCreate(@PathVariable("id") Integer id, @Valid ReviewForm reviewForm,
BindingResult bindingResult, Principal principal, org.springframework.ui.Model model){
Book books = this.bookService.getBookById(id);
if (books == null) {
// 책이 존재하지 않는 경우에 대한 처리
return "redirect:/books/list"; // 예시로 책 목록 페이지로 리다이렉트
}
if (bindingResult.hasErrors()) {
model.addAttribute("books",books);
return "book_detail";
}
Member author = this.memberService.findByUsername(principal.getName());
if (author == null) {
// 작성자를 찾을 수 없는 경우에 대한 처리
return "redirect:/book/list"; // 예시로 홈 페이지로 리다이렉트
}
this.reviewService.create(books,reviewForm.getContent(), author);
return String.format("redirect:/book/detail/%d", id);
}
@GetMapping("/modify/{id}")
public String reviewModify(@PathVariable("id") Integer id, Model model){
Book book = this.bookService.getBookById(id);
model.addAttribute("book",book);
return "review_modify_form";
}
@PostMapping("/modify")
public String reviewModify(@Valid ReviewForm reviewForm, BindingResult bindingResult, Principal principal){
if (bindingResult.hasErrors()) {
return "book_detail";
}
Book book = this.bookService.getBookById(reviewForm.getBookId());
this.reviewService.modify(book, reviewForm.getContent());
return String.format("redirect:/book/detail/%d", reviewForm.getBookId());
}
@GetMapping("/delete/{id}")
public String reviewDelete(Principal principal, @PathVariable("id") Integer id) {
Review review = this.reviewService.getReview(id);
this.reviewService.delete(review);
return "redirect:/book/list";
}
private final BookRepository bookRepository;
public Review getReview(Integer id) {
Optional<Review> review = this.reviewRepository.findById(id);
if (review.isEmpty()) {
return null;
}
return review.get();
}
public void create(Book book, String content, Member author) {
Review review = Review.builder()
.book(book)
.content(content)
.author(author)
.build();
reviewRepository.save(review);
}
public void modify(Book book, String content){
Review reviewModify = Review.builder()
.content(content)
.build();
reviewRepository.save(reviewModify);
}
public void delete(Review review) {
reviewRepository.delete(review);
}
class="book_middle-section" ----세로로 빨간줄 길어서 끝없이 내려감
style="margin-bottom:5px" ----아무것도 없음
class="book_bottom-section"-----파란줄 세로 길지만 도중에 끊김
class="card-body btn btn-light"----회색으로 표시
class="book_top-section"-----가로로 정렬
.a_re-comment {
margin-top: 30px; margin-bottom: 30px;
padding-top: 10px; padding-bottom: 10px;
box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.25);
width: 100%;
}
a_re-comment_top
.a_re-comment_top {
display: flex;
flex-wrap: wrap;
justify-content:space-between;
}
comment-time
.comment-time {
text-decoration: none;
margin-right: auto;
padding-top: 3px;
padding-bottom: 5px;
padding-left: 10px;
font-size: 14px;
color: #969696;
}