Joshua게시판(SSR)-7-글쓰기(썸머노트) + Board Entity 완료

jaegeunsong97·2023년 8월 14일
0

SSR 기반 JoshuaBlog

목록 보기
7/23
post-thumbnail

깃허브링크

노션링크

  • saveForm
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ include file="../layout/header.jsp" %>

<div class="container my-3">
    <form class="mb-1">
        <div class="form-group">
            <input type="text" class="form-control" placeholder="Enter title" name="title">
        </div>

        <div class="form-group">
            <textarea class="form-control summernote" rows="5" name="content"></textarea>
        </div>
        <button class="btn btn-primary">글쓰기완료</button>
    </form>
</div>

<script>
    $('.summernote').summernote({ // 이 부분!!!!!!!!
        tabsize: 2,
        height: 500
    });
</script>

<%@ include file="../layout/footer.jsp" %>

그리고 썸머노트와 관련된 것은

  • header에 작성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">

<head>
    <title>Blog</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script src="https://kit.fontawesome.com/32aa2b8683.js" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css"/>
    <link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-lite.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-lite.min.js"></script>
    <link rel="stylesheet" href="/css/style.css">
</head>

<body>

<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
    <div class="container-fluid">
        <a class="navbar-brand" href="/">Joshua_Blog 📝</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
                data-bs-target="#collapsibleNavbar">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse justify-content-between" id="collapsibleNavbar">
            <ul class="navbar-nav">

                <li class="nav-item">
                    <a class="nav-link" href="/loginForm">로그인</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="/joinForm">회원가입</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>
            <div>
                <a href="/user/profileUpdate"><img src="/images/profile.jfif" style="width: 35px;"
                                                   class="rounded-circle" alt="Cinque Terre"></a>
            </div>
        </div>

    </div>
</nav>
  • BoardController 추가
package coffee.pastry.joshuablog.controller;

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import coffee.pastry.joshuablog.core.auth.MyUserDetails;
import lombok.RequiredArgsConstructor;

@Controller
@RequiredArgsConstructor
public class BoardController {

     @GetMapping({ "/", "/board" })
     public String main(@AuthenticationPrincipal MyUserDetails myUserDetails) {
          return "board/main";
     }

     @GetMapping("/s/board/saveForm")
     public String saveForm() {
          return "board/saveForm";
     }
}
  • header s 추가(인증 필요해서)

  • board entity
package coffee.pastry.joshuablog.model.board;

import java.time.LocalDateTime;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;

import coffee.pastry.joshuablog.model.user.User;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "board_tb")
@Entity
public class Board {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     @ManyToOne(fetch = FetchType.LAZY)
     private User user; // 1명이 N개의 게시판 작성 가능
     private String title;
     @Lob // 4GB
     private String content;
     @Lob // 4GB
     private String thumbnail; // content에 들어있는 사진중 1개를 자동으로 썸네일로 만듬
     private LocalDateTime createdAt;
     private LocalDateTime updatedAt;

     @PrePersist
     protected void onCreate() {
          this.createdAt = LocalDateTime.now();
     }

     @PreUpdate
     protected void onUpdate() {
          this.updatedAt = LocalDateTime.now();
     }
}

@Lob -> 동영상, 등등 전부 가능

  • BoardRepository
package coffee.pastry.joshuablog.model.board;

import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {

}
  • 문제

로그인을 한 상태 -> 글쓰기, 회원정보, 로그아웃만 보이도록 만들기

profile
현재 블로그 : https://jasonsong97.tistory.com/

0개의 댓글