JS

2024.08.27 JavaScript 게시판 만들기 JavaScript boardWrite.js 글 쓰기 기능 만들기

정훈5 2024. 8. 27. 11:00

디자인 시안 확인

board-write.html

 

: 비 로그인 시 로그인 페이지로 리다이렉션 처리 됨    : 파일 미리 보기 기능 구현

 

board-write.html

더보기

board-write.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../css/common.css">
    <link rel="stylesheet" href="../css/header.css">
    <link rel="stylesheet" href="../css/boardWrite.css">
</head>
<body>
    <h1>글쓰기 화면</h1>

    <header>
        <nav class="nav-container">

            <div class="nav-item">
                <span class="menu-link" id="board">게시판</span>
            </div>
            
            <div class="nav-item" id="authLinks">
                <span class="menu-link" id="signIn">로그인</span>
                <span class="menu-link" id="signUp">회원가입</span>
            </div>

        </nav>
     </header>

     <main class="content-wrapper">
        <section class="form-title">
            <h1>글쓰기 by JS</h1>
        </section>

        <section>
            <table>
                <tr>
                    <th>제목</th>
                    <td>
                        <input type="text" class="inputs title">
                    </td>
                </tr>

                <tr>
                    <th>작성자</th>
                    <td>
                        <input type="text" class="inputs username" readonly>
                    </td>
                </tr>

                <tr>
                    <th>첨부파일</th>
                    <td>
                        <input type="file" class="file" accept="image/*" > 
                        <!-- 이미지 파일만 받을 수 있도록 설정  accept="image/*" -->
                    </td>
                </tr>

                <tr>
                    <th>내용</th>
                    <td>
                        <div class="img-box">이미지 미리보기</div>
                        <textarea name="" id="" class="content"></textarea>
                    </td>
                </tr>

            </table>

            <div class="btn-area">
                <button type="button" class="btn">글쓰기</button>
            </div>

        </section>

     </main>

     <script src="../js/header.js"></script>
         <script src="../js/boardWrite.js"></script>

</body>
</html>

 

boardWrite.css

더보기

boardWrite.css

.content {
    width: 95%;
    height: 300px;
    font-size:  18px;
    border: none;
    resize: none;
    margin-top: 5px;
}

.img-box {
    width: 100%;
    display: flex;
    justify-content: center;
}

.img-box img {
    width: 100%;
    max-width: 300px;
}

 

header.js 코드 추가

// ... 생략 
// 코드 추가 
// 로그인 상태가 아니면 지정된 페이지로 리다이렉션 
function redirectToPageIfNotLoggedIn(page) {
    // 로컬 스토리지 접근 - user key 값 여부 확인 
    const loggedInUser = localStorage.getItem('user');
    if(loggedInUser === null) {
        location.href = `${page}.html`;
    }
}

 

더보기

header.js  전체 코드

// DOMContentLoaded 이벤트를 사용해 보자.

window.document.addEventListener('DOMContentLoaded', function() {


    // DOM 요소를 가져오기
    const boardMenu = window.document.getElementById('board');    
    const signInMenu = window.document.getElementById('signIn');    
    const signUpMenu = window.document.getElementById('signUp');    
    const authLinks = window.document.getElementById('authLinks');    

    // 로그인 여부 확인
    // F12 눌러서  LocalStorage 에서 user 를 확인할 수 있다.
    const user = localStorage.getItem('user');
    if(user != null) {
        if(authLinks) {
            // 로그인, 회원가입 링크를 로그아웃 링크로 변경
            console.log('authLinks', authLinks);
            authLinks.innerHTML = '<span class="menu-link" id="logoutLink">로그아웃</span>';

            // 로그아웃 클릭 시 처리
            document.getElementById('logoutLink').addEventListener('click', function() {
                localStorage.removeItem('user'); 
                
                // 로그아웃 후 페이지 새로고침 해야 렌더링이 된다.
                window.location.reload(); // 로그아웃 클릭시, 로그인, 회원가입 버튼이 나타난다.
            });
        }
    }

    // 각 메뉴에 클릭 이벤트를 추가 합니다.
    if(boardMenu) {
        boardMenu.addEventListener('click', function() {
            window.location.href = 'board-list.html'; 
        });
    }

    if(signInMenu) {
        signInMenu.addEventListener('click', function() {
            window.location.href = 'sign-in.html'; 
        });
    }

    if(signUpMenu) {
        signUpMenu.addEventListener('click', function() {
            window.location.href = 'sign-up.html'; 
        });
    }
});

// 로그인 상태가 아니면 지정된 페이지로 리다이렉션 
function redirectToPageIfNotLoggedIn(page) {
    // 로컬 스토리지 접근 - user key 값 여부 확인
    const loggedInUser = localStorage.getItem('user');
    if(loggedInUser == null) {
        location.href = `${page}.html`;
    }

}

 

boardWrite.js

더보기

boardWrite.js


// 로그인 상태 여부
redirectToPageIfNotLoggedIn('sign-in');


document.addEventListener('DOMContentLoaded', function() {
    // 사용할 요소에 접근
    const title = document.querySelector('.title');
    const username = document.querySelector('.username');
    const fileInput = document.querySelector('.file');
    const imgViewBox = document.querySelector('.img-box');
    const button = document.querySelector('button');
    const tody = new Date(); 

    // 사용자가 선택한 이미지를 저장할 공간이 필요
    let imageData = null; 

    // 사용자 정보 가져오기
    const getUser = JSON.parse(localStorage.getItem('user'));
    username.value = getUser.username;

     // 파일 미리보기 기능 만들기
    function fileUpload(event) {
        alert('111111');
        const file = event.target.files[0];
        console.log('file', file);

        // 파일 크기 유효성 검사 (5MB 까지 만 허용할 꺼야)
        // 1024 * 1024 * 5 = 5MB (5242880) 이하만 허용
        if(file.size >= 5242880) {
            alert('첨부 파일은 5MB 이하만 가능합니다.');
            event.target.value =""; // 5MB 초과되는 파일이 올라오면 첨부 파일 목록에서 삭제한다.
            return;
        } 

        // 파일 타입 유효성 검사
        const validFileTypes = ["image/jpeg", "image/png", "image/gif"];
        if(!validFileTypes.includes(file.type)) { // 위의 확장자가 아닌경우
            alert("유효한 파일 타입이 아닙니다. ( jpeg, png, gif만 허용 )");
            event.target.value=""; // 파일 확장자가 유효하지 않으면 첨부 파일 목록에서 삭제된다.
        }
    

    // 파일 미리보기 기능
    const reader = new FileReader();
    reader.onload = function(e) {
        console.log('e.target.result', e.target.result);
        console.log('Base64', e.target.result);
        imgViewBox.innerHTML = `<img src="${e.target.result}" alt ="Upload Image"> `;
        // 글 저장시에 로컬스토리지에 바이너리 데이터를 -- 64 인코딩 저장 
        imageData = reader.result;
    }

    reader.readAsDataURL(file); // Base64 인코딩 바이트 단위 데이터를 -- 64개 문자로 표현하는 인코딩 방식
}


    // 글 저장하는 기능 만들기


// 이벤트 리스너 등록 처리 - file change 
fileInput.addEventListener('change', fileUpload);
  

});