자바스크립트 -프로젝트(add)

index에 구현했던 addBook이라는 버튼을 누르면 책을 추가할수 있는 정보를 입력하는 사이트를 만든다.
add.html

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

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>My Faborite Books</title>

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
        integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" />

    <link rel="stylesheet" type="text/css" href="css/add.css" />
</head>

<body class="bg-light">
    <div class="container">
        <div class="py-5 text-center">
            <h2>Book Save Form</h2>
            <p class="lead">
                Below is an example of a form that stores book information. Each
                required group of forms has a validation status that can be triggered
                by an attempt to submit a form without completing it.
            </p>
        </div>

        <div class="row">
            <div class="col-md-12 order-md-1">
                <h4 class="mb-3">Book Info</h4>
                <form id="form-add-book" class="needs-validation" novalidate>
                    <div class="mb-3">
                        <label for="title">Title <span class="text-muted">책 제목</span></label>
                        <input type="text" class="form-control" id="title" placeholder="책 제목을 입력하세요" required />
                    </div>

                    <div class="mb-3">
                        <label for="comment">Comment <span class="text-muted">한 줄 코멘트</span></label>
                        <input type="text" class="form-control" id="message" placeholder="한 줄 감상평을 입력하세요" required />
                    </div>

                    <div class="mb-3">
                        <label for="author">Author <span class="text-muted">글쓴이</span></label>
                        <input type="text" class="form-control" id="author" placeholder="글쓴이를 입력하세요" required />
                    </div>

                    <div class="mb-3">
                        <label for="link">Link <span class="text-muted">링크</span></label>
                        <input type="text" class="form-control" id="url" placeholder="URL 을 입력하세요" required />
                    </div>

                    <hr class="mb-4" />

                    <button class="btn btn-primary btn-lg btn-block" type="submit">
                        Save
                    </button>
                </form>
            </div>
        </div>

        <footer class="my-5 pt-5 text-muted text-center text-small">
            <p class="mb-1">&copy; 2019 Marktube</p>
        </footer>
    </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
    </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
        integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous">
    </script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
        integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous">
    </script>

    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="js/add.js"></script>
</body>

</html>

책 제목, 코멘트, 글쓴이,링크를 모두 작성한뒤 save를 누르면 해당 정보가 들어있는 정보가 indes화면에 출력된다.

add.js
사용된 함수

getToken() - localStorage에 있는 token을 불러온다.

getUserByToken(token) token 값으로 사용자의 정보를 받아온다.

save(event) add.html에서 입력한 정보를 api에 등록한다.

bindSaveButton() save 버튼을 눌렀을때의 이벤트가 발생할수 있도록 연결한다.

function getToken() {
    return localStorage.getItem('token');
}

async function getUserByToken(token) {
    try {
        const res = await axios.get('https://api.marktube.tv/v1/me', {
            headers: {
                Authorization: `Bearer ${token}`,
            },
        });
        return res.data;
    } catch (error) {
        console.log('getUserByToken error', error);
        return null;
    }
}

async function save(event) {
    event.preventDefault();
    event.stopPropagation(); //상위로 이벤트가 전달되지 않게 해준다.
    console.log('save');
    event.target.classList.add('was-validated'); //비어있으면 빨갛게 나옴

    const titleElement = document.querySelector('#title');
    const messageElement = document.querySelector('#message');
    const authorElement = document.querySelector('#author');
    const urlElement = document.querySelector('#url');


    const title = titleElement.value;
    const message = messageElement.value;
    const author = authorElement.value;
    const url = urlElement.value;

    if (title === '' || message === "" || author === "" || url === "") {
        return;
    } //유효성검사

    //토큰 가져오기 어떤사람이 책을 추가하는지 알기 위해선 토큰을 가져와야한다.
    const token = getToken();
    if (token === null) {
        location.assign('/login')
        return;
    }

    try {
        await axios.post('https://api.marktube.tv/v1/book', {
            title,
            message,
            author,
            url
        }, {
            headers: {
                Authorization: `Bearer ${token}`
            }
        });
        location.assign('/');
    } catch (error) {
        console.log('save error', error);
        alert('책 추가 실패')
    }


}






function bindSaveButton() {
    const form = document.querySelector('#form-add-book');
    form.addEventListener('submit', save);


}

async function main() {
    //버튼에 이벤트 연결
    bindSaveButton();
    //토큰 체크
    const token = getToken();
    if (token === null) {
        location.assign('/login');
        return;
    }
    //토큰으로 서버에서 나의 정보 받아오기

    const user = await getUserByToken(token);
    if (user === null) {
        localStorage.clear();
        location.assign('/login');
        return;
    }
    console.log(user);
}


document.addEventListener('DOMContentLoaded', main);

결과 화면

좋은 웹페이지 즐겨찾기