Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ public void run(String... args) throws Exception {
for (int i = 1; i <= 300; i++) {
String subject = String.format("테스트 데이터입니다:[%03d]", i);
String content = "내용무";
questionService.create(subject, content, user1);
questionService.create(subject, content, user1, 0);
}

Question question1 = questionService.create("질문입니닷", "질문이에요!", user2);
Question question2 = questionService.create("질문입니닷22", "질문이에요!22", user2);
Question question1 = questionService.create("질문입니닷", "질문이에요!", user2, 0);
Question question2 = questionService.create("질문입니닷22", "질문이에요!22", user2, 0);

Answer answer1 = answerService.create(question1, "답변1", user1);
Answer answer2 = answerService.create(question1, "답변2", user1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
public class HomeController {
@GetMapping("/")
public String root() {
return "redirect:/question/list";
return "redirect:/question/list/qna";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.ll.spring_additional.boundedContext.answer.service.AnswerService;
import com.ll.spring_additional.boundedContext.question.entity.Question;
import com.ll.spring_additional.boundedContext.question.form.QuestionForm;
import com.ll.spring_additional.boundedContext.question.questionEnum.QuestionEnum;
import com.ll.spring_additional.boundedContext.question.service.QuestionService;
import com.ll.spring_additional.boundedContext.user.entity.SiteUser;
import com.ll.spring_additional.boundedContext.user.service.UserService;
Expand All @@ -37,10 +38,18 @@ public class QuestionController {

private final AnswerService answerService;

@GetMapping("/list")
public String list(Model model, @RequestParam(value = "page", defaultValue = "0") int page
@GetMapping("/list/{type}")
public String list(Model model, @PathVariable String type, @RequestParam(value = "page", defaultValue = "0") int page
, @RequestParam(value = "kw", defaultValue = "") String kw) {
Page<Question> paging = questionService.getList(page, kw);
int category = switch (type) {
case "qna" -> QuestionEnum.QNA.getStatus();
case "free" -> QuestionEnum.FREE.getStatus();
case "bug" -> QuestionEnum.BUG.getStatus();
default -> throw new RuntimeException("올바르지 않은 접근입니다.");
};

model.addAttribute("boardName", category);
Page<Question> paging = questionService.getList(category, page, kw);
model.addAttribute("paging", paging);
return "question/question_list";
}
Expand Down Expand Up @@ -108,29 +117,52 @@ public String increaseHit(Integer questionId, @RequestParam(required = false) Bo
}

@PreAuthorize("isAuthenticated()")
@GetMapping("/create")
public String questionCreate(QuestionForm questionForm) {
@GetMapping("/create/{type}")
public String showCreate(@PathVariable String type, QuestionForm questionForm, Model model) {
switch (type) {
case "qna" -> model.addAttribute("boardName", "질문과답변 작성");
case "free" -> model.addAttribute("boardName", "자유게시판 작성");
case "bug" -> model.addAttribute("boardName", "버그및건의 작성");
default -> throw new RuntimeException("올바르지 않은 접근입니다.");
}

return "question/question_form";
}

@PreAuthorize("isAuthenticated()")
@PostMapping("/create")
public String questionCreate(@Valid QuestionForm questionForm, BindingResult bindingResult, Principal principal) {
@PostMapping("/create/{type}")
public String questionCreate(@Valid QuestionForm questionForm, @PathVariable String type, BindingResult bindingResult, Principal principal) {
if (bindingResult.hasErrors()) {
return "question/question_form";
}

int category = switch (type) {
case "qna" -> QuestionEnum.QNA.getStatus();
case "free" -> QuestionEnum.FREE.getStatus();
case "bug" -> QuestionEnum.BUG.getStatus();
default -> throw new RuntimeException("올바르지 않은 접근입니다.");
};

SiteUser siteUser = userService.getUser(principal.getName());
questionService.create(questionForm.getSubject(), questionForm.getContent(), siteUser);
return "redirect:/question/list";
questionService.create(questionForm.getSubject(), questionForm.getContent(), siteUser, category);
return "redirect:/question/list/%s".formatted(type);
}

@PreAuthorize("isAuthenticated()")
@GetMapping("/modify/{id}")
public String questionModify(QuestionForm questionForm, @PathVariable("id") Integer id, Principal principal) {
public String questionModify(QuestionForm questionForm, @PathVariable("id") Integer id, Principal principal, Model model) {
Question question = questionService.getQuestion(id);
if (!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}

switch (question.getCategoryAsEnum()) {
case QNA-> model.addAttribute("boardName", "질문과답변 수정");
case FREE -> model.addAttribute("boardName", "자유게시판 수정");
case BUG -> model.addAttribute("boardName", "버그및건의 수정");
default -> throw new RuntimeException("올바르지 않은 접근입니다.");
}

questionForm.setSubject(question.getSubject());
questionForm.setContent(question.getContent());
return "question/question_form";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.ll.spring_additional.boundedContext.answer.entity.Answer;
import com.ll.spring_additional.boundedContext.question.questionEnum.QuestionEnum;
import com.ll.spring_additional.boundedContext.user.entity.SiteUser;

import jakarta.persistence.CascadeType;
Expand Down Expand Up @@ -73,4 +74,38 @@ public void updateView() {
this.view++;
}

/* 게시판 분류
0 : 질문답변
1 : 강좌
2 : 자유게시판
*/
private int category;

public QuestionEnum getCategoryAsEnum() {
switch (this.category) {
case 0:
return QuestionEnum.QNA;
case 1:
return QuestionEnum.FREE;
case 2:
return QuestionEnum.BUG;
default:
throw new RuntimeException("올바르지 않은 접근입니다.");
}
}

public String getCategoryAsString() {
switch (this.category) {
case 0:
return "질문과답변";
case 1:
return "자유게시판";
case 2:
return "버그및건의";
default:
throw new RuntimeException("올바르지 않은 접근입니다.");
}
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.ll.spring_additional.boundedContext.question.questionEnum;

import lombok.Getter;

@Getter
public enum QuestionEnum {
QNA(0),
FREE(1),
BUG(2);

private int status;

QuestionEnum(int status) {
this.status = status;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,15 @@ public interface QuestionRepository extends JpaRepository<Question, Integer> {
+ "left outer join Answer a on a.question=q "
+ "left outer join SiteUser u2 on a.author=u2 "
+ "where "
+ " (q.category = :category) "
+ " and ( "
+ " q.subject like %:kw% "
+ " or q.content like %:kw% "
+ " or u1.username like %:kw% "
+ " or a.content like %:kw% "
+ " or u2.username like %:kw% ")
Page<Question> findAllByKeyword(@Param("kw") String kw, Pageable pageable);
+ " or u2.username like %:kw% "
+ " )")
Page<Question> findAllByKeywordAndType(@Param("kw") String kw, @Param("category") Integer category, Pageable pageable);

Long countByAuthor(SiteUser author);

Expand Down Expand Up @@ -65,4 +68,5 @@ public interface QuestionRepository extends JpaRepository<Question, Integer> {
+ " or u2.username like %:kw% "
+ " )")
Page<Question> findAllByKeywordAndAnswer_AuthorId(@Param("kw") String kw, @Param("authorId") Long authorId, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

import com.ll.spring_additional.base.exception.DataNotFoundException;
import com.ll.spring_additional.boundedContext.question.entity.Question;
import com.ll.spring_additional.boundedContext.question.questionEnum.QuestionEnum;
import com.ll.spring_additional.boundedContext.user.entity.SiteUser;
import com.ll.spring_additional.boundedContext.question.repository.QuestionRepository;

Expand All @@ -24,11 +25,11 @@
public class QuestionService {
private final QuestionRepository questionRepository;

public Page<Question> getList(int page, String kw) {
public Page<Question> getList(int category, int page, String kw) {
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createDate"));
Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts)); //페이지 번호, 개수
return questionRepository.findAllByKeyword(kw, pageable);
return questionRepository.findAllByKeywordAndType(kw, category, pageable);
}

public Question getQuestion(Integer id) {
Expand All @@ -48,11 +49,12 @@ public Question updateQuestionView(Question question) {
}

@Transactional
public Question create(String subject, String content, SiteUser user) {
public Question create(String subject, String content, SiteUser user, int category) {
Question q = new Question();
q.setSubject(subject);
q.setContent(content);
q.setAuthor(user);
q.setCategory(category);
questionRepository.save(q);
return q;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/answer/recent_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ <h5 class="text-secondary">가장 최근에 달린 답변 15개까지 나타납
</thead>
<tbody>
<tr class="text-center" th:each="answer, loop : ${answerList}">
<td>-</td> <!-- TODO : 카테고리 후 수정 필요 -->
<td th:text="${answer.question.categoryAsString}">-</td>
<td th:text="${answer.author.username}"></td>
<td class="text-start">
<a th:href="@{|/question/detail/${answer.question.id}#answer_${answer.id}|}">
Expand Down
9 changes: 9 additions & 0 deletions src/main/resources/templates/common/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@
<link rel="stylesheet" type="text/css" th:href="@{/style.css}">
<!-- 폰트어썸 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw==" crossorigin="anonymous" referrerpolicy="no-referrer" />

<style>
a {
color:inherit;
text-decoration:inherit;
}
</style>


</head>
<body>
<!-- 네비게이션바 -->
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/question/question_form.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<html layout:decorate="~{common/layout}">
<main layout:fragment="content" class="container">
<h5 class="my-3 border-bottom pb-2">질문등록</h5>
<h5 class="my-3 border-bottom pb-2" th:text="${boardName}"></h5>
<form th:action th:object="${questionForm}" method="post">
<div th:replace="~{common/form_errors :: formErrorsFragment}"></div>
<div class="mb-3">
Expand Down
Loading