Skip to content
Open
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
2 changes: 2 additions & 0 deletions src/main/java/com/study/joiner/JoinerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class JoinerApplication {

public static void main(String[] args) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/study/joiner/domain/user/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public class Board extends BaseTimeEntity {
@Column(length = 100, nullable = false)
private String title;

@Column(length = 255, nullable = false)
@Lob
private String content;

@Enumerated(EnumType.STRING)
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/study/joiner/service/BoardService.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ public void addBoard(SocialUser user, BoardDto boardDto) {
public Page<BoardDto> getBoardList(int pageNum, Pageable pageable) {
pageable = PageRequest.of(pageNum, pageable.getPageSize());
Page<Board> boardList = boardRepository.findAllDesc(pageable);
Page<BoardDto> boardDtos = boardList.map(BoardDto::new);
return boardDtos;
return boardList.map(BoardDto::new);
}

@Transactional(readOnly = true)
Expand Down
12 changes: 4 additions & 8 deletions src/main/java/com/study/joiner/web/BoardController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.study.joiner.service.BoardService;
import com.study.joiner.web.dto.BoardDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
Expand All @@ -21,6 +22,7 @@

@RequiredArgsConstructor
@Controller
@Slf4j
public class BoardController {
private final BoardService boardService;
private final UserRepository userRepository;
Expand Down Expand Up @@ -67,17 +69,11 @@ public String detail(@PathVariable Long id, @LoginUser SessionUser user, Model m
return "view/detail";
}

// 글 수정 조회
@GetMapping("/edit/{id}")
public String userBoardEdit(@PathVariable Long id, @LoginUser SessionUser user, Model model) {
BoardDto boardDto = boardService.getEditBoard(id, user.getEmail());
return "view/edit";
}

// 글 수정 처리
@PutMapping("/edit/{id}")
@GetMapping("/edit/{id}")
public String userBoardUpdate(@PathVariable Long id, @LoginUser SessionUser user, @ModelAttribute BoardDto boardDto) {
SocialUser socialUser = userRepository.findByEmailFetchBL(user.getEmail()).orElseThrow();
log.info("boardDto = {}", boardDto);
boardService.updateBoard(id, socialUser, boardDto);
return "view/detail";
}
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/study/joiner/web/IndexController.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,24 @@ public class IndexController {
private final UserRepository userRepository;

// 메인페이지 -- 완
// @GetMapping("/")
// public String index(Model model, @LoginUser SessionUser user,
// @RequestParam(value="page", defaultValue = "0") int pageNum,
// @PageableDefault(size = 9) Pageable pageable) {
// Page<BoardDto> boardList = boardService.getBoardList(pageNum, pageable);
// int startPage = Math.max(1, boardList.getPageable().getPageNumber() - 4);
// int endPage = Math.min(boardList.getTotalPages(), boardList.getPageable().getPageNumber() + 4);
// model.addAttribute("startPage", startPage);
// model.addAttribute("endPage", endPage);
//// model.addAttribute("previous", pageable.previousOrFirst().getPageNumber());
//// model.addAttribute("next", pageable.next().getPageNumber());
// model.addAttribute("boardList", boardList);
// if(user != null) {
// model.addAttribute("user", user);
// }
// return "index";
// }

@GetMapping("/")
public String index(Model model, @LoginUser SessionUser user) {
// Page<BoardDto> boardList = boardService.getBoardList(pageNum, pageable);
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/study/joiner/web/dto/BoardDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class BoardDto {
private String content;
private SocialUser socialUser;
private List<Comment> commentList;
private Long writerId;

public BoardDto(Board entity) {
this.id = entity.getId();
Expand All @@ -40,6 +41,7 @@ public BoardDto(Board entity) {
this.content = entity.getContent();
this.socialUser = entity.getSocialUser();
this.commentList = entity.getCommentList();
this.writerId = entity.getSocialUser().getId();
}

public Board toEntity() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Together</title>
<title>Joiner</title>

<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
Expand Down
213 changes: 104 additions & 109 deletions src/main/resources/templates/view/board.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,139 +5,134 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Together</title>
<title>Document</title>
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<style>
select option[value=""][disabled] {
display: none;
display: none;
}

.ck-editor__editable {
.ck-editor__editable {
height: 400px;
}
}
</style>
<script src="https://cdn.ckeditor.com/ckeditor5/35.4.0/classic/ckeditor.js"></script>
<script src="https://cdn.ckeditor.com/ckeditor5/34.0.0/classic/translations/ko.js"></script>

</head>
<body>
<nav class="navbar navbar-expand-lg" style="height: 85px;">
<div class="container-fluid">
<a class="navbar-brand text-primary ms-4" href="/" th:href="@{/}">Together</a>

<button class="navbar-toggler border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-list"></i>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" href="./view/login.html" th:href="@{/member/login}" sec:authorize="isAnonymous()"><span style="font-weight: bold;">로그인</span></a>
</li>
<li class="nav-item" sec:authorize="isAuthenticated()">
<a href="/logout" class="nav-link active"><span style="font-weight: bold;">로그아웃</span></a>
</li>
<li class="nav-item" sec:authorize="isAuthenticated()">
<a th:href="@{/list}"><i class="bi bi-list nav-link"></i></a>
</li>
<li class="nav-item" sec:authorize="isAuthenticated()">
<a th:href="@{/user/update}"><i class="bi bi-gear nav-link"></i></a>
</li>
</ul>
</div>
<nav class="navbar navbar-expand-lg" style="height: 85px;">
<div class="container-fluid">
<a class="navbar-brand text-primary ms-4" href="/" th:href="@{/}">Logo</a>

<button class="navbar-toggler border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-list"></i>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" href="./view/login.html" th:href="@{/member/login}" sec:authorize="isAnonymous()"><span style="font-weight: bold;">로그인</span></a>
</li>
<li class="nav-item">
<i class="bi bi-bell nav-link"></i>
</li>
<li class="nav-item">
<i class="bi bi-gear nav-link"></i>
</li>
</ul>
</div>
</nav>


<form th:action method="post" th:object="${board}">
<div class="container-lg mx-auto mt-5 p-4">
<div class="container-lg"><h3>모집에 필요한 정보를 입력해주세요</h3></div>
<hr class="border border-primary">

<div class="row m-4">
<div class="col-md-5 m-4">
<label for="inputState" class="form-label">모집 구분</label>
<select id="inputState" class="form-select" th:field="*{postRecruit}">
<option value="" disabled selected>프로젝트 / 스터디</option>
<option value="프로젝트">프로젝트</option>
<option value="스터디">스터디</option>
</select>
</div>

<div class="col-md-5 m-4">
<label for="inputState0" class="form-label">모집 인원</label>
<input type="number" id="inputState0" class="form-control" th:field="*{recruitNum}">
</div>

<div class="col-md-5 m-4">
<label for="inputState1" class="form-label">진행 방식</label>
<select id="inputState1" class="form-select" th:field="*{progressWay}">
<option value="" disabled selected>온라인 / 오프라인</option>
<option value="온라인">온라인</option>
<option value="오프라인">오프라인</option>
</select>
</div>

<div class="col-md-5 m-4">
<label for="inputState2" class="form-label">진행 기한</label>
<select id="inputState2" class="form-select" th:field="*{duration}">
<option value="" disabled selected>진행기한</option>
<option value="1개월">1개월</option>
<option value="2개월">2개월</option>
<option value="3개월">3개월</option>
<option value="4개월">4개월</option>
<option value="5개월">5개월</option>
<option value="6개월 이상">6개월 이상</option>
</select>
</div>

<div class="col-md-5 m-4">
<label for="inputState3" class="form-check-label">기술 스택</label>
<input class="form-control" id="inputState3" type="text" th:field="*{skill}">
</div>

<div class="col-md-5 m-4">
<label for="inputState4" class="form-label">시작 예정일</label>
<input class="form-control" id="inputState4" type="date" th:field="*{date}">
</div>

<div class="col-md-5 m-4">
<label for="inputState5" class="form-label">연락 방법</label>
<select id="inputState5" class="form-select" th:field="*{contactWay}">
<option value="" disabled selected>연락 방법</option>
<option value="카카오톡 오픈채팅">카카오톡 오픈채팅</option>
<option value="구글 폼">구글 폼</option>
</select>
</div>
</div>
</nav>

<form th:action method="post" th:object="${board}">
<div class="container-lg mx-auto mt-5 p-4">
<div class="container-lg"><h3>모집에 필요한 정보를 입력해주세요</h3></div>
<hr class="border border-primary">

<div class="row m-4">
<div class="col-md-5 m-4">
<label for="inputState" class="form-label">모집 구분</label>
<select id="inputState" class="form-select" th:field="*{postRecruit}">
<option value="" disabled selected>프로젝트 / 스터디</option>
<option value="프로젝트">프로젝트</option>
<option value="스터디">스터디</option>
</select>
</div>
</div>
</div>

<div class="container-lg mx-auto mt-3 p-4">
<div class="container-lg"><h3>프로젝트에 대해 설명해주세요</h3></div>
<hr class="border border-primary">
<div class="col-md-5 m-4">
<label for="inputState0" class="form-label">모집 인원</label>
<input type="number" id="inputState0" class="form-control" th:field="*{recruitNum}">
</div>

<div class="p-3 m-4 mx-auto">
<input type="text" class="form-control mb-3" placeholder="제목을 입력하세요" th:field="*{title}">
<div class="col-md-5 m-4">
<label for="inputState1" class="form-label">진행 방식</label>
<select id="inputState1" class="form-select" th:field="*{progressWay}">
<option value="" disabled selected>온라인 / 오프라인</option>
<option value="온라인">온라인</option>
<option value="오프라인">오프라인</option>
</select>
</div>

<textarea id="editor" th:field="*{content}"></textarea>
<div class="col-md-5 m-4">
<label for="inputState2" class="form-label">진행 기한</label>
<select id="inputState2" class="form-select" th:field="*{duration}">
<option value="" disabled selected>진행기한</option>
<option value="1개월">1개월</option>
<option value="2개월">2개월</option>
<option value="3개월">3개월</option>
<option value="4개월">4개월</option>
<option value="5개월">5개월</option>
<option value="6개월 이상">6개월 이상</option>
</select>
</div>

<div class="m-3 d-grid gap-2 d-md-flex justify-content-md-end">
<button class="btn btn-primary" type="submit">모집하기</button>
</div>
<div class="col-md-5 m-4">
<label for="inputState3" class="form-check-label">기술 스택</label>
<input class="form-control" id="inputState3" type="text" th:field="*{skill}">
</div>

<div class="col-md-5 m-4">
<label for="inputState4" class="form-label">시작 예정일</label>
<input class="form-control" id="inputState4" type="date" th:field="*{date}">
</div>

<div class="col-md-5 m-4">
<label for="inputState5" class="form-label">연락 방법</label>
<select id="inputState5" class="form-select" th:field="*{contactWay}">
<option value="" disabled selected>연락 방법</option>
<option value="카카오톡 오픈채팅">카카오톡 오픈채팅</option>
<option value="구글 폼">구글 폼</option>
</select>
</div>
</div>
</form>
</div>
</div>

<div class="container-lg mx-auto mt-3 p-4">
<div class="container-lg"><h3>프로젝트에 대해 설명해주세요</h3></div>
<hr class="border border-primary">

<div class="p-3 m-4 mx-auto">
<input type="text" class="form-control mb-3" placeholder="제목을 입력하세요" th:field="*{title}">

<script src="/js/bootstrap.js"></script>
<script>
ClassicEditor
.create( document.querySelector( '#editor' ), { language: "ko" } )
.catch( error => {
<textarea id="editor" th:field="*{content}"></textarea>

<div class="m-3 d-grid gap-2 d-md-flex justify-content-md-end">
<button class="btn btn-primary" type="submit">모집하기</button>
</div>
</div>
</div>
</form>

<script src="/js/bootstrap.js"></script>
<script>
ClassicEditor
.create( document.querySelector( '#editor' ), { language: "ko" } )
.catch( error => {
console.error( error );
} );
</script>
} );
</script>

</body>
</html>
5 changes: 4 additions & 1 deletion src/main/resources/templates/view/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Together</title>
<title>Document</title>
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">

</head>
<body>
<nav class="navbar navbar-expand-lg" style="height: 85px;">
Expand Down Expand Up @@ -42,6 +43,8 @@ <h2 class="text-center" th:text="${board.title}"></h2>
<div class="row justify-content-end mt-4">
작성자 : <span class="col-2" th:text="${user.name}"></span>
작성일 : <span class="col-2" th:text="${board.date}"></span>
<button th:if="${user.id == board.writerId}" class="btn btn-outline-primary col-1 m-2" th:onclick="|location.href='/edit/${board.id}'|">수정</button>
<button th:if="${user.id == board.writerId}" class="btn btn-outline-primary col-1 m-2" th:onclick="|location.href='/delete/${board.id}'|">삭제</button>
</div>
<hr class="border border-primary my-4">

Expand Down
Loading