웹사이트 2일차

148june 2025. 2. 18. 21:02
<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>방명록</title>
    <style>
        .guest-book-container {
            width: 80%;
            max-width: 600px;
            margin: 20px auto;
            padding: 20px;
            background-color: #f9f9f9;
            border-radius: 12px;
            box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
            border: 2px solid #ddd;
        }


        .guest-book ul {
            list-style-type: none;
        }

        .guest-book li {
            margin-bottom: 10px;
        }

        textarea {
            width: 80%;
            padding: 8px;
            font-size: 16px;
            margin-bottom: 10px;
            box-sizing: border-box;
        }

        input[type="text"] {
            width: 30%;
            padding: 8px;
            font-size: 16px;
            margin-bottom: 10px;
            box-sizing: border-box;
        }

        button {
            margin-top: 10px;
            padding: 10px 20px;
            background-color: #000000;
            color: white;
            border: none;
            cursor: pointer;
        }

        button:hover {
            background-color: #333;
        }

        .button-group {
            display: flex;
            justify-content: flex-end; /* 오른쪽 끝으로 정렬 */
            gap: 5px;
        }

        .edit-btn {
            background-color: #0067A3;
        }

        .delete-btn {
            background-color: #e74c3c;
        }

        .message-box {
            width: 80%;
            /* 너비 조정 */
            max-width: 600px;
            /* 최대 너비 설정 */
            border: 2px solid #333;
            /* 테두리 두껍게 */
            padding: 30px;
            /* 내부 여백 */
            border-radius: 12px;
            /* 둥근 모서리 */
            background-color: #fdf6e3;
            /* 연한 노란색 배경 */
            box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
            /* 그림자 효과 */
            text-align: left;
        }
    </style>
</head>

<body>
    <div class="guest-book-container">
        <div class="guest-book">
            <h3>방명록</h3>
            <form id="guestBookForm">
                <label for="name">이름:</label>
                <br>
                <input type="text" id="name" name="name" required placeholder="이름을 입력하세요">
                <br>
                <label for="message">내용:</label>
                <br>
                <textarea id="message" name="message" required placeholder="방명록 내용을 입력하세요"></textarea>
                <button type="submit">저장</button>
            </form>

            <h4>방명록 내용</h4>
            <ul id="guestMessages"></ul>
        </div>
    </div>

    <script>
        let db;

        // IndexedDB 연결 함수
        const openDb = () => {
            const request = indexedDB.open('GuestBookDB', 1);

            request.onupgradeneeded = (event) => {
                db = event.target.result;
                if (!db.objectStoreNames.contains('messages')) {
                    db.createObjectStore('messages', { keyPath: 'id' });
                }
            };

            request.onsuccess = (event) => {
                db = event.target.result;
                console.log("Database opened successfully.");
                loadMessages(); // DB가 완전히 열린 후에 실행
            };

            request.onerror = (event) => {
                console.error("Database error:", event.target.errorCode);
            };
        };

        const loadMessages = () => {
            if (!db) {
                console.error("Database is not initialized yet.");
                return;
            }

            const transaction = db.transaction('messages', 'readonly');
            const store = transaction.objectStore('messages');
            const cursorRequest = store.openCursor();

            const messagesList = document.getElementById('guestMessages');

            if (messagesList.children.length > 0) {
                console.log("Messages are already loaded.");
                return; // 메시지가 이미 로드되었으면 중복 로딩 방지
            }
            messagesList.innerHTML = "";

            cursorRequest.onsuccess = (event) => {
                const cursor = event.target.result;
                if (cursor) {
                    // 커서의 값을 별도의 변수에 저장
                    const { id, name, message } = cursor.value;

                    // 메시지 박스 추가
                    const messageBox = document.createElement('div');
                    messageBox.className = 'message-box';

                    // 메시지 리스트 아이템 추가
                    const listItem = document.createElement('div');
                    listItem.setAttribute('data-id', id);

                    // 별도의 요소를 사용하면 텍스트와 버튼을 구분하기 쉽습니다.
                    const textSpan = document.createElement('span');
                    textSpan.textContent = `${name}: ${message}`;
                    listItem.appendChild(textSpan);

                    // 수정 버튼 생성
                    const editButton = document.createElement('button');
                    editButton.className = 'edit-btn';
                    editButton.textContent = '수정';
                    // 이벤트 핸들러에서 별도의 변수 사용
                    editButton.onclick = () => editMessage(id, name, message);
                    listItem.appendChild(editButton);

                    // 삭제 버튼 생성
                    const deleteButton = document.createElement('button');
                    deleteButton.className = 'delete-btn';
                    deleteButton.textContent = '삭제';
                    deleteButton.onclick = () => deleteMessage(id);
                    listItem.appendChild(deleteButton);

                    //이번 메세지 부분
                    messageBox.appendChild(listItem);

                    messagesList.appendChild(messageBox);

                    cursor.continue();
                }
            };

            // 방명록 메시지 추가 (기존 데이터 덮어쓰지 않도록 add 사용)
            const addMessage = (name, message) => {
                if (!db) {
                    console.error("Database not initialized.");
                    return;
                }

                const transaction = db.transaction('messages', 'readwrite');
                const store = transaction.objectStore('messages');

                const newEntry = { id: Date.now(), name, message };

                const request = store.add(newEntry);

                request.onsuccess = () => {
                    window.location.reload();
                };

                request.onerror = (event) => {
                    console.error("Error adding message:", event.target.error);
                };
            };

            const editMessage = (id, currentName, currentMessage) => {
                const newName = prompt("이름을 수정하세요", currentName);
                const newMessage = prompt("내용을 수정하세요", currentMessage);

                if (newName && newMessage) {
                    const transaction = db.transaction('messages', 'readwrite');
                    const store = transaction.objectStore('messages');

                    store.get(id).onsuccess = (event) => {
                        const existingMessage = event.target.result;
                        if (existingMessage) {
                            existingMessage.name = newName;
                            existingMessage.message = newMessage;

                            store.put(existingMessage); // 기존 ID 유지한 채로 수정
                            transaction.oncomplete = () => {
                                // 수정된 메시지만 화면에서 업데이트
                                const messageBox = document.querySelector(`[data-id="${id}"]`);
                                if (messageBox) {
                                    const textSpan = messageBox.querySelector('span');
                                    textSpan.textContent = `${newName}: ${newMessage}`;
                                }
                                window.location.reload();
                            };
                        }
                    };
                }
            };

            // 방명록 메시지 삭제 (id 기준으로 정확한 데이터 삭제)
            const deleteMessage = (id) => {
                const transaction = db.transaction('messages', 'readwrite');
                const store = transaction.objectStore('messages');
                store.delete(id);

                transaction.oncomplete = () => {
                    // 데이터베이스에서 삭제가 완료되면 페이지 새로고침
                    window.location.reload()
                };
            };

            // 폼 제출 처리
            document.getElementById('guestBookForm').addEventListener('submit', (event) => {
                event.preventDefault();

                const name = document.getElementById('name').value;
                const message = document.getElementById('message').value;

                addMessage(name, message);

                document.getElementById('name').value = '';
                document.getElementById('message').value = '';
            });
        }
        // DB 열기
        openDb();
    </script>
</body>

</html>

 

방명록




방명록 내용

    이번에 크게 변경점은

    방명록을 창으로 덮은것과

    방명록을 남겻을시 그부분에 색과 그림자를 입힌것이라 볼수있겠다.

     

    노란색방명록부분

    .message-box {
                width: 80%;
                /* 너비 조정 */
                max-width: 600px;
                /* 최대 너비 설정 */
                border: 2px solid #333;
                /* 테두리 두껍게 */
                padding: 30px;
                /* 내부 여백 */
                border-radius: 12px;
                /* 둥근 모서리 */
                background-color: #fdf6e3;
                /* 연한 노란색 배경 */
                box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
                /* 그림자 효과 */
                text-align: left;
            }

     

    전체바탕부분

    .guest-book-container {
                width: 80%;
                max-width: 600px;
                margin: 20px auto;
                padding: 20px;
                background-color: #f9f9f9;
                border-radius: 12px;
                box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
                border: 2px solid #ddd;
            }

     

    현재 문제점

    .button-group {
                display: flex;
                justify-content: flex-end; /* 오른쪽 끝으로 정렬 */
                gap: 5px;
            }

    오른쪽 끝으로 정렬하고 5px 정도만띄워서 놓을려고하는데 작동시 그부분에서 현재 어려움을 겪고 잇음

    flex부분확인및 다시 정렬부분 찾아볼 생각중

    '' 카테고리의 다른 글

    웹페이지  (0) 2025.02.19
    웹페이지  (0) 2025.02.19
    indexed db  (0) 2025.02.18
    웹페이지 만들기 방명록  (0) 2025.02.18
    웹사이트  (0) 2025.02.17