Question와 Answer에 수정일시 추가
private LocalDateTime modifyDate;// 수정일시
DB확인하기
question_detail.html 추가
<div class="my-3">
<a th:href="@{|/question/modify/${question.id}|}" class="btn btn-sm btn-outline-secondary"
sec:authorize="isAuthenticated()"
th:if="${question.author != null and #authentication.getPrincipal().getUsername() == question.author.username}"
th:text="수정"></a>
</div>
인증된 사람만 볼 수 있고, 글쓴이가 현재 로그인 중 인 user와 같을 때
테스트하기
수정 클릭하면 아래와 같은 오류가 뜸
QuestionController
//질문 수정하기
@PreAuthorize("isAuthenticated()")//인증된 사람만 사용 가능하다
@GetMapping("/modify/{id}")
public String questionModify(QuestionForm questionForm,
@PathVariable("id") int id, Principal principal,Model model) {
Question question = qService.getQuestion(id);
if(!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST,"수정 권한이 없습니다.");
}
//수정 전 페이지에 수정 내용 전달
questionForm.setSubject(question.getSubject());
questionForm.setContent(question.getContent());
model.addAttribute("modify", true);
return "question_form";
}
question_form.html
<div class="container my-3">
<h5 th:if="${modify!=true}" class="border-bottom pb-2">질문등록</h5>
<h5 th:if="${modify==true}" class="border-bottom pb-2">질문수정</h5>
<form th:object="${questionForm}" method="post">
<input
type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}"
/>
<div th:replace="layout::formErrors"></div>
<div class="mb-3">
<label for="subject" class="form-label" s>제목</label>
<input type="text" th:field="*{subject}" class="form-control" />
</div>
<div class="mb-3">
<label for="content" class="form-label">내용</label>
<textarea
th:field="*{content}"
class="form-control"
rows="10"
></textarea>
</div>
<input type="submit" value="저장하기" class="btn btn-primary my-2" />
</form>
</div>
수정페이지랑 등록페이지랑 같이 사용하고 싶은데,
action이 지정되어있으면 안된다.
주소가 없을 경우에는 지금 현재 주소에서 post로 간다.
대신
th:action을 삭제하게되면 csrf 토큰을 자동생성을 해주지 않기 때문에
수동으로 생성해야함
QuestionService
//질문 수정 처리
public void modify(Question question, String subject, String content) {
question.setSubject(subject);
question.setContent(content);
question.setModifyDate(LocalDateTime.now());
this.qRepo.save(question);
}
QuestionController
//질문 수정 처리
@PreAuthorize("isAuthenticated()")
@PostMapping("/modify/{id}")
public String questionModify(@Valid QuestionForm questionForm, BindingResult result, Principal principal, @PathVariable("id") int id) {
if(result.hasErrors()) {
return "question_form";
}
Question question = qService.getQuestion(id);
if(!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST,"수정권한이 없습니다.");
}
//DB에 질문 수정
qService.modify(question, questionForm.getSubject() ,questionForm.getContent());
return String.format("redirect:/question/detail/%s", id);
}
Question_form을
질문등록과, 질문수정 두 개를 같이 사용한다
그래서 if문을 사용하여 modify 라면 질문수정으로 출력되게하고 아니면 질문등록으로 출력되게한다.
'BACKEND > SpringBoot' 카테고리의 다른 글
답변 수정 (0) | 2023.11.13 |
---|---|
질문 삭제 처리 (0) | 2023.11.10 |
엔티티 변경 글쓴이 추가 및 글 목록,상세보기,답변에 반영하기 (0) | 2023.11.10 |
로그아웃 처리 (0) | 2023.11.10 |
로그인 구현 (0) | 2023.11.10 |