IT/Java - Spring Boot

[Spring Boot] νŽ˜μ΄μ§€μ— μ‚¬μ΄λ“œ λ°” μ½”λ”©ν•˜κΈ°

ITyranno 2023. 11. 1. 11:13
728x90
λ°˜μ‘ν˜•

 

ν”„λ‘œκ·Έλž˜λ° 세계λ₯Ό νƒκ΅¬ν•©μ‹œλ‹€.

 

 

Spring Bootλ₯Ό ν™œμš©ν•˜μ—¬ νŽ˜μ΄μ§€μ— μ‚¬μ΄λ“œ λ°”λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

였λ₯Έμͺ½μ— 번개 λͺ¨μ–‘ 이λͺ¨ν‹°μ½˜μ„ λˆ„λ₯΄λ©΄ μ‚¬μ΄λ“œλ°”κ°€ μŠ¬λΌμ΄λ“œ ν˜•μ‹μœΌλ‘œ μ—΄λ¦½λ‹ˆλ‹€. 둜그인 μ „, 후에 μƒμ„±λ˜λŠ” ν•­λͺ©μ΄ λ‹€λ₯΄λ©° ν•˜μœ„ μš”μ†Œκ°€ μžˆλŠ” λͺ©λ‘μ€ 마우슀λ₯Ό μ˜¬λ Έμ„ λ•Œ μ‚¬μ΄λ“œλ°”κ°€ ν•˜λ‚˜ 더 μ—΄λ¦¬λ©΄μ„œ ν•˜μœ„ ν•­λͺ©μ΄ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ‚¬μ΄λ“œ λ°”μ˜ μ›€μ§μž„μ— 따라 번개 λͺ¨μ–‘ 이λͺ¨ν‹°μ½˜λ„ ν•¨κ»˜ μ›€μ§μž…λ‹ˆλ‹€.

 

 

κ΅¬ν˜„ ν™”λ©΄

 

 

 

 

 

 

μž‘μ„± μ½”λ“œ

 

nav.html

 

<!DOCTYPE html>
<html>

<head>
</head>

<style>
  body {
    z-index: 100;
  }
  .menubar a {
    text-decoration: none;
  }

  .container {
    background: none;
  }

  .button {
    font-size: 50px;
    position: relative;
    right: 80px;
    top: 0px;
    width: 40px;
    height: 40px;
    z-index: 99;
    transition: 0.8s ease;
    background: none;
    border: none;
  }

  /* .x {
    align-items: center;
    color: black;
    margin: auto;
  } */

  .content {
    padding: 100px 20px 0 40px;
    position: relative;
    width: 200%;
  }

  .nav-1 {
    display: flex;
  }

  .nav-2 {
    height: 80%;
    width: 100%;
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
  }

  .home {
    display: flex;
    align-items: center;
    height: 22px;
  }

  .my_account {
    margin-top: -15px;
    display: flex;
    align-items: center;
    height: 32px;
    border-radius: 100%;
  }

  @font-face {
    font-family: 'Cafe24Ssurround';
    src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2105_2@1.0/Cafe24Ssurround.woff') format('woff');
    font-weight: normal;
    font-style: normal;
  }

  .word {
    margin-left: 15px;
    margin-top: -12px;
    font-size: 25px;
    font-family: 'Cafe24Ssurround';
    color: black;
    cursor: pointer;
  }

  @media (max-width: 768px) {
    .sidebar {
      right: -300px;
      /* Move sidebar to the right */
    }

    .button {
      right: 10px;
      /* Move button to the right */
    }

    .content {
      padding-right: 20px;
      /* Adjust padding */
    }
  }

  .menubar .submenu {
    display: none;
  }

  .menubar {
    position: relative;
  }

  .submenu {
    display: none;
    position: fixed;
    top: 0;
    right: 300px;
    width: 300px;
    height: 100%;
    background-color: rgb(249, 227, 128);
    padding-top: 11rem;
  }

  .sidebar {
    background-color: rgb(237, 208, 77);
    border-left: 2px solid rgb(237, 208, 77);
    position: fixed;
    top: 0;
    bottom: 0;
    right: 0;
    transition: 0.4s ease;
    color: #202020;
    height: 100%;
    z-index: 99;
  }
</style>

<body>
  <div class="container">
    <div class="sidebar" style="width: 300px; height: 100%;">
      <button class="button">⚑
      </button>
      <div class="content">
        <!-- <nav class="nav">
          <div class="nav-1">
            <div class="head_logo">
              <a href="/">
                <img class="logo_text" src="car.png" alt="둜고" />
              </a>
            </div>
          </div> -->
        <div class="nav-2">
          <div class="menubar">
            <a class="word" th:href="@{/}">ν™ˆ</a>
          </div>
          <div class="menubar">
            <a class="word" th:href="@{/map}">μΆ©μ „μ†Œ μ°ΎκΈ°</a>
            <!-- <div class="submenu">
              <a class="word" th:href="@{/map}">지도</a>
              <a class="word" th:href="@{/map}">λͺ©λ‘ μΆ”κ°€</a>
            </div> -->
          </div>
          <div class="menubar">
            <a class="word">κ²Œμ‹œνŒ</a>
            <div class="submenu">
              <a class="word" th:href="@{/board/list}">곡지사항</a>
              <a class="word" th:href="@{/qna/list}">Q&A</a>
            </div>
          </div>
          <div class="menubar">
            <a class="word">μ •λ³΄λ§ˆλ‹Ή</a>
            <div class="submenu">
              <a class="word" th:href="@{/statistic/chargerStatus}">톡계정보</a>
              <a class="word" th:href="@{/statistic/ChargerExpense}">μ„œλΉ„μŠ€μ•ˆλ‚΄</a>
            </div>
          </div>
          <div class="menubar">
            <a class="word">λ―Έλ””μ–΄</a>
            <div class="submenu">
              <a class="word" th:href="@{/media/news?searchText=μ „κΈ°μ°¨}">μ „κΈ°μ°¨ λ‰΄μŠ€</a>
              <a class="word" th:href="@{/media/reels}">μ „κΈ°μ°¨ μ˜μƒ</a>
              <a class="word" th:href="@{/media/gamepage}">μ „κΈ°μ°¨ κ²Œμž„</a>
            </div>
          </div>
          <div class="menubar">
            <a class="word">멀버십</a>
            <div class="submenu">
              <a class="word" th:href="@{/exchange}">μ½”μΈκ΅ν™˜</a>
              <a class="word" th:href="@{/coupon}">쿠폰함</a>
              <br>
              <a class="word" th:href="@{/membership}">κ°€μž…ν•˜κΈ°</a>
              <a th:if="${session != null and session.user_info != null and session.has_membership}" class="word" th:href="@{/mymembership}">λ‚˜μ˜ 멀버십</a>
            </div>
          </div>
        </div>
        <br>
        <br>
        <div th:if="${session.user_info == null}" class="menubar">
          <a th:href="@{/signin}" class="word">둜그인</a>
          <a th:href="@{/signup}" class="word">νšŒμ›κ°€μž…</a>
        </div>
          <div th:unless="${session.user_info == null}" class="menubar">
            <span class="word">[[ ${session.user_info.name} + 'λ‹˜ λ°˜κ°‘μŠ΅λ‹ˆλ‹€.' ]]</span>
            <br>
              <a class="word" th:href="@{/exchange}">λ‚˜μ˜ 찌리릿: <span th:text="${userCoin}"></span>개</a>
            <br>
            <a th:href="@{/mypage(email=${session.user_info.email})}" class="word">Mypage</a>
            <br>
            <!-- <a th:href="${session.user_info != null and session.user_info.role == 'ADMIN'}"></a> -->
            <a th:if="${session != null and session.user_info != null and session.user_info.role == 'ADMIN'}" th:href="@{/admin}" class="word">
              Admin
            </a>
            <br>
            <a th:href="@{/signout}" class="word">λ‘œκ·Έμ•„μ›ƒ</a>
          </div>
        </div>
      </div>
    </div>

  </div>
  </nav>
  </div>
  </div>
  </div>

  <script>
    const button = document.querySelector(".button");
    const sidebar = document.querySelector(".sidebar");
    let isSidebarOpen = false;
    let timeoutId;

    sidebar.style.width = "0";

    button.addEventListener("click", () => {
      if (!isSidebarOpen) {
        sidebar.style.width = "300px";
        isSidebarOpen = true;
      } else {
        sidebar.style.width = "0";
        button.style.right = "80px";
        closeSubmenus();
        isSidebarOpen = false;
      }
    });

    function closeSubmenus() {
      const submenus = document.querySelectorAll(".submenu");
      submenus.forEach((submenu) => {
        submenu.style.display = "none";
      });

      // If there's no submenu open, move the button back to right.
      if (!document.querySelector('.submenu[style*="block"]')) {
        button.style.right = "80px";
      }
    }

    const menuItems = document.querySelectorAll(".menubar");

    menuItems.forEach((menuItem) => {

      menuItem.addEventListener("mouseover", () => {

        if (isSidebarOpen) {
          closeSubmenus();
          const submenu = menuItem.querySelector(".submenu");

          if (submenu) {
            submenu.style.display = "block";
            button.style.right = "310px"; // If a submenu opens, move the button right.
          }
        }
      });

      menuItem.addEventListener("mouseout", () => {

        if (isSidebarOpen) {
          const submenu = menuItem.querySelector(".submenu");

          if (submenu && submenu.style.display === "block") {
            timeoutId = setTimeout(() => {
              submenu.style.display = "none";
              if (!document.querySelector('.submenu[style*="block"]')) { // check if there's no other opened sub-menu
                button.style.right = "80px"; // If a submenu closes, move the button back to right.
              }
            }, 1000); // wait for one second before closing the submenu
          }
        }
      });

      menuItem.addEventListener("mouseover", () => clearTimeout(timeoutId)); // if mouse comes back on item before timeout ends, clear the timeout

    });
  </script>
</body>

</html>

 

 

 

μœ„μ™€ 같은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ μ‚¬μ΄λ“œ λ°”λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•