jpablog : write form(summernote), api

This commit is contained in:
kim
2021-01-30 21:19:02 +09:00
parent 34a5f77013
commit c6c8fbe0d7
11 changed files with 144 additions and 8 deletions

View File

@@ -1,12 +1,14 @@
package com.example.jpablog.config.auth;
import com.example.jpablog.model.User;
import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayDeque;
import java.util.Collection;
@Getter
public class PrincipalDetail implements UserDetails {
private final User user;

View File

@@ -1,7 +1,5 @@
package com.example.jpablog.controller;
import com.example.jpablog.config.auth.PrincipalDetail;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@@ -13,4 +11,9 @@ public class BoardController {
public String index() {
return "index";
}
@GetMapping("/board/saveForm")
public String save() {
return "board/saveForm";
}
}

View File

@@ -0,0 +1,40 @@
package com.example.jpablog.controller.api;
import com.example.jpablog.config.auth.PrincipalDetail;
import com.example.jpablog.dto.ResponseDto;
import com.example.jpablog.model.Board;
import com.example.jpablog.model.User;
import com.example.jpablog.service.BoardService;
import com.example.jpablog.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.security.Principal;
@RestController
@RequiredArgsConstructor
public class BoardApiController {
private final BoardService boardService;
@PostMapping("/api/board")
public ResponseDto<Integer> save(@RequestBody Board board, @AuthenticationPrincipal PrincipalDetail principal, Principal p) {
System.out.println(p.getName());
boardService.글쓰기(board, principal.getUser());
return new ResponseDto<>(1, HttpStatus.OK.value());
}
/*// 기본 로그인
@PostMapping("/user/login")
public ResponseDto<Integer> login(@RequestBody User user, HttpSession session) {
User principal = userService.로그인(user);
if (principal != null) {
session.setAttribute("principal", principal);
}
return new ResponseDto<>(1, HttpStatus.OK.value());
}*/
}

View File

@@ -28,7 +28,6 @@ public class Board {
@Lob // 대용량 데이터
private String content;
@ColumnDefault("0")
private int count;
@ManyToOne(fetch = FetchType.LAZY)

View File

@@ -0,0 +1,9 @@
package com.example.jpablog.repository;
import com.example.jpablog.model.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
}

View File

@@ -0,0 +1,27 @@
package com.example.jpablog.service;
import com.example.jpablog.config.auth.PrincipalDetail;
import com.example.jpablog.model.Board;
import com.example.jpablog.model.User;
import com.example.jpablog.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.security.Principal;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class BoardService {
private final BoardRepository boardRepository;
@Transactional
public void 글쓰기(Board board, User user) {
board.setUser(user);
board.setCount(0);
boardRepository.save(board);
}
}

View File

@@ -0,0 +1,27 @@
let index = {
init : function () {
$("#btn-save").on("click", () => {
this.save();
});
},
save : function () {
let data = {
title: $("#title").val(),
content: $("#content").val(),
};
$.ajax({
type: "post",
url: "/api/board",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).done(function (resp){
alert("글쓰기 완료!");
location.href = "/";
}).fail(function (error){
alert(JSON.stringify(error));
});
},
}
index.init();

View File

@@ -7,7 +7,7 @@ let index = {
save : function () {
let data = {
username: $("#username").val(),
password: $("#pwd").val(),
password: $("#password").val(),
email: $("#email").val(),
};
$.ajax({

View File

@@ -0,0 +1,26 @@
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@include file="../layout/header.jsp"%>
<div class="container">
<form>
<div class="form-group">
<label for="title">Title:</label>
<input type="text" class="form-control" placeholder="Enter title" id="title">
</div>
<div class="form-group">
<label for="content">Content:</label>
<textarea class="form-control summernote" rows="5" id="content"></textarea>
</div>
<button id="btn-save" type="button" class="btn btn-primary">글쓰기</button>
</form>
</div>
<script>
$('.summernote').summernote({
placeholder: '글쓰기 ㅎㅎ',
tabsize: 2,
height: 300
});
</script>
<script src="/js/board.js"></script>
<%@include file="../layout/footer.jsp"%>

View File

@@ -14,6 +14,9 @@
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
@@ -31,8 +34,8 @@
</c:when>
<c:otherwise>
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link" href="/board/form">글쓰기</a></li>
<li class="nav-item"><a class="nav-link" href="/user/form">회원정보</a></li>
<li class="nav-item"><a class="nav-link" href="/board/saveForm">글쓰기</a></li>
<li class="nav-item"><a class="nav-link" href="/user/updateForm">회원정보</a></li>
<li class="nav-item"><a class="nav-link" href="/logout">로그아웃</a></li>
</ul>
</c:otherwise>

View File

@@ -9,8 +9,8 @@
<input type="text" class="form-control" placeholder="Enter username" id="username">
</div>
<div class="form-group">
<label for="pwd">Password:</label>
<input type="password" class="form-control" placeholder="Enter password" id="pwd">
<label for="password">Password:</label>
<input type="password" class="form-control" placeholder="Enter password" id="password">
</div>
<div class="form-group">
<label for="email">Email:</label>