포트폴리오/SPRINGBOOT 옛날

3-11 : 추천

서버관리자 페페 2022. 10. 13. 19:04

단 하나의 맥락
: @ManyToMany 로 추천 기능 작성



Semiflow Bundle

: Question에 Voter 속성 추가
: Answer에 Voter 속성 추가

: 질문 추천 버튼 question_detail에 추가
: 추천 확인 창 Javascript 코드 question_detail에 추가
: QuestionService에 추천인 저장 vote 메서드 추가
: QuestionController에 questionVote 메서드 @GetMapping

: 답변 추천 버튼 question_detail에 추가
: AnswerService에 추천인 저장 vote 메서드 추가
: AnswerController에 answerVote 메서드 추가


질문 추천 기능


> Question Entity와 Answer Entity에

// import java.util.set;
// import javax.persistence.ManyToMany;

  • @ManyToMany
  • @Set<SiteUser> voter;


추가한다

-

질문 추천 버튼을 작성하기 위해
> question_detail에

수정 버튼 위 버튼 작성

  • <a href="javascript:void(0);"
  • class="recommend btn btn-sm btn-outline-secondary"
  • th:data-url="@{|question/vote/${question.id}|}"></a> 내부에
  • 추천 <span class="badge rounded-pill bg-success" th:text="${$lists.size(question.voter)}"></span> 삽입


> 역시 question_detail 삭제 javascript 코드 하단

  • const recommend_elements = document.getElementsByClassName("recommend");
  • Array.from(recommend_elements).forEach(function(element)) {
    • element.addEventListener('click', function() {
      • if (confirm ("정말로 추천하시겠습니까?")) {
        • location.href = this.dataset.uri;
      •  };
    •  });
  •  });


삽입

-

> QuestionService에서

  • M : public void vote
  • S : (Question question, SiteUser siteUser)
    • A1 : question.getVoter().add(siteUser);
    • A2 : this.questionRepository.save(question);


-

> QuestionController에서

  • @PreAuthorize("isAuthenticated()")
  • @GetMapping("/vote/{id}")
  • M : public String questionVote
  • S : (Principal principal, @PathVariable("id") Integer id)
    • A1 : Question question = this.questionService.getQuestion(id);
    • A2 : SiteUser siteUser = this.questionService.getUser(principal.getName());
    • A3 : this.questionService.vote(question, siteUser);
    • R : return String.format("redirect:/question/detail/%s", id);


-

답변 추천


> question_detail.html
답변 수정 위에

  • <a href="javascript:void(0);"
  • class="recommend btn btn-sm btn-outline-secondary"
  • th:data-uri="@{|/answer/vote/${answer.id}|}"></a> 내부
  • 추천 <span class="badge rounded-pill bg-success" th:text="${#lists.size(answer.voter)}"></span>


-

> AnswerService에

  • M : public void vote
  • S : (Answer answer, SiteUser siteUser)
    • A1 : answer.getVoter().add(siteUser);
    • A2 : this.answerRepository.save(answer);


-

> AnswerController에

  • @PreAuthorize("isAuthenticated()")
  • @GetMapping("/vote/{id}")
  • M : public String answerVote
  • S : (Principal principal, @PathVariable("id") Integer id)
    • A1 : Answer answer = this.answerService.getAnswer(id);
    • A2 : SiteUser siteUser = this.answerService.getUser(principal.getName());
    • A3 : this.answerService.vote(answer, siteUser);
    • R : return String.format("redirect:/question/detail/%s", answer.getQuestion().getId());

'포트폴리오 > SPRINGBOOT 옛날' 카테고리의 다른 글

3-13 : 마크다운  (0) 2022.10.13
3-12 : 앵커  (0) 2022.10.13
03 : GetMapping과 PostMapping  (0) 2022.10.13
3-10 수정과 삭제  (0) 2022.10.10
3 - 09 : 글쓴이 표시  (0) 2022.10.10