최정임 최정임 03-26
250326 최정임 헤더 전체메뉴 추가
@9759c5a031514479febffba4936fe5946e583741
client/resources/css/common/common.css
--- client/resources/css/common/common.css
+++ client/resources/css/common/common.css
@@ -136,4 +136,16 @@
             top: 20px;
         }
     }
-}
(파일 끝에 줄바꿈 문자 없음)
+}
+
+    /* 닫기 버튼 스타일 */
+
+    button.closebtn {
+        font-size: 20px;
+        width: 40px;
+        height: 40px;
+        background-color: #000;
+        color: white;
+        border: none;
+        border-radius: 50px;
+    }
client/resources/css/user/layout.css
--- client/resources/css/user/layout.css
+++ client/resources/css/user/layout.css
@@ -1,98 +1,166 @@
-header{
+header {
     width: 100%;
     position: fixed;
     top: 0;
     z-index: 20;
     background-color: #fff;
 }
-.container{
+
+.container {
     margin: 120px 0;
     position: relative;
 }
-.header-container{
+
+.header-container {
     width: 1500px;
     display: flex;
     align-items: center;
     justify-content: space-between;
     padding: 24px 0;
     position: sticky;
-    .logo img{width: 174px; height: 69px;}
-    .nav-wrap{display: flex;}
 
-    nav{
-        & > ul{display: flex; gap: 102px;}
-        & > ul > li{font-size: 22px; position: relative;}
-        
-    & > ul > li:hover .submenu {
-        opacity: 1; /* hover시 보이도록 */
-        visibility: visible; /* hover시 보이도록 */
+    .logo img {
+        width: 174px;
+        height: 69px;
     }
-        .submenu{
-            position: absolute;
-            top: 51px;
-            left: 50%;
-            transform: translateX(-50%);
-            z-index: 2;
-            width: 180px;
-            padding: 30px 20px;
-            border-radius: 20px;
-            box-shadow: 1px 0px 20px 0px rgba(0, 0, 0, 0.15);
-            background-color: #fff;
-            opacity: 0; /* 기본적으로 숨김 */
-            visibility: hidden; /* 기본적으로 숨김 */
-            transition: opacity 0.3s ease, visibility 0.3s ease;
-            p{
-                padding-left: 10px;
-                font-size: 18px;
-                a{display: contents;}
-            }
-            p:hover{
-                background-color: #f9ebed;
-            }
+
+    .nav-wrap {
+        display: flex;
+    }
+
+    nav {
+        &>ul {
+            display: flex;
+            gap: 102px;
         }
-        .submenu::before{
-            content: "";
-            display: block;
-            width: 0;
-            height: 0;
-            border-left: 17px solid transparent;
-            border-right: 17px solid transparent;
-            border-bottom: 17px solid #fff;
-            position: absolute;
-            top: -15px;
-            left: 50%;
-            transform: translateX(-50%);
+
+        &>ul>li {
+            font-size: 22px;
+            position: relative;
+        }
+
+        &>ul>li:hover .submenu {
+            opacity: 1;
+            /* hover시 보이도록 */
+            visibility: visible;
+            /* hover시 보이도록 */
         }
     }
-    .auth-area{
-        display: flex; align-items: center; gap: 50px;
-        ul{display: flex; align-items: center; gap: 20px;}
-        li{ display: flex; align-items: center;
-            img{margin-right: 6px;}
-            a{font-size: 16px;}
+
+    .submenu {
+        position: absolute;
+        top: 51px;
+        left: 50%;
+        transform: translateX(-50%);
+        z-index: 2;
+        width: 180px;
+        padding: 30px 20px;
+        border-radius: 20px;
+        box-shadow: 1px 0px 20px 0px rgba(0, 0, 0, 0.15);
+        background-color: #fff;
+        opacity: 0;
+        /* 기본적으로 숨김 */
+        visibility: hidden;
+        /* 기본적으로 숨김 */
+        transition: opacity 0.3s ease, visibility 0.3s ease;
+
+        p {
+            padding-left: 10px;
+            font-size: 18px;
+
+            a {
+                display: contents;
+            }
         }
-        .line{width: 2px; height: 16px; background-color: #eeeeee;}
+
+        p:hover {
+            background-color: #f9ebed;
+        }
+    }
+
+    .submenu::before {
+        content: "";
+        display: block;
+        width: 0;
+        height: 0;
+        border-left: 17px solid transparent;
+        border-right: 17px solid transparent;
+        border-bottom: 17px solid #fff;
+        position: absolute;
+        top: -15px;
+        left: 50%;
+        transform: translateX(-50%);
+    }
+
+    .auth-area {
+        display: flex;
+        align-items: center;
+        gap: 50px;
+
+        ul {
+            display: flex;
+            align-items: center;
+            gap: 20px;
+        }
+
+        li {
+            display: flex;
+            align-items: center;
+
+            img {
+                margin-right: 6px;
+            }
+
+            a {
+                font-size: 16px;
+            }
+        }
+
+        .line {
+            width: 2px;
+            height: 16px;
+            background-color: #eeeeee;
+        }
     }
 }
 
-footer{
+footer {
     background-color: #333;
     border-top-left-radius: 50px;
     border-top-right-radius: 50px;
-    .footer-container{
-        display: flex; align-items: center; gap: 80px; padding: 35px 0;
-        ul{display: flex; align-items: center; gap: 20px; margin-bottom: 5px;}
-        li, p{
+
+    .footer-container {
+        display: flex;
+        align-items: center;
+        gap: 80px;
+        padding: 35px 0;
+
+        ul {
+            display: flex;
+            align-items: center;
+            gap: 20px;
+            margin-bottom: 5px;
+        }
+
+        li,
+        p {
             font-size: 18px;
             color: rgba(255, 255, 255, 0.5);
             font-family: "Pretendard-M";
         }
 
-        .line{width: 2px; height: 13px; background-color: rgba(255, 255, 255, 0.3);}
+        .line {
+            width: 2px;
+            height: 13px;
+            background-color: rgba(255, 255, 255, 0.3);
+        }
 
     }
-    
+
 }
 
-.scroll-up{position: fixed;     right: 5%;
-    bottom: 101px;}
(파일 끝에 줄바꿈 문자 없음)
+.scroll-up {
+    position: fixed;
+    right: 210px;
+    bottom: 101px;
+}
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/user/main.css
--- client/resources/css/user/main.css
+++ client/resources/css/user/main.css
@@ -1,3 +1,101 @@
+.overlay {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.4);
+    /* 배경 어두운 투명도 */
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 9999;
+}
+.all-menu{
+    position: absolute;
+    top: 0;
+    left: 0;
+    background-image: url(../../images/allmenu-bg.png);
+    background-repeat: no-repeat;
+    width: 100%;
+    height: 420px;
+    button.closebtn{
+        position: absolute;
+        top: 40px;
+        right: 38px;
+
+    }
+    nav {
+        position: absolute;
+        top: 80px;
+        right: 210px;
+        &>ul {
+            display: flex;
+            gap: 40px;
+        }
+
+        &>ul>li {
+            
+            z-index: 2;
+            width: 270px;
+            height: 237px;
+            padding: 0;
+            border-radius: 30px;
+            background-color: #fbf3f4;
+            position: relative;
+            h6{
+                font-size: 24px;
+                text-align: center;
+                line-height: 70px;
+                width: 270px;
+                height: 70px;
+                background-image: linear-gradient(#fff, #fff), 
+                linear-gradient(-45deg, #ca3e49, #3d355d);
+                background-origin: border-box;
+                background-clip: content-box, border-box;
+                border: 3px solid transparent;
+                border-radius: 15px;
+                font-family: "Pretendard-SB";
+            }
+        
+        }
+    }
+
+    .submenu {
+       padding: 40px 30px;
+    
+
+        p {
+            position: relative;
+            padding-left: 10px;
+            font-size: 20px;
+            color: #c23d4a;
+            a {
+                display: contents;
+                font-family: "Pretendard-M";
+            }
+        }
+
+        p:hover a{
+            color: #c23d4a;
+            font-family: "Pretendard-B";
+            
+        }
+        p:hover a::after{
+            content: '';
+            background-image: url(../../images/hover.png);
+            background-repeat: no-repeat;
+            width: 27px;
+            height: 27px;
+            position: absolute;
+            right: 10px;
+        }
+    }
+    
+
+
+}
+
 .visual{
     position: relative;
     .pagination{
@@ -290,7 +388,7 @@
 /* swiper */
 
 .swiper {
-    width:1620px;
+    width:1600px;
     height: 100%;
   }
   .swiper-wrapper{
client/resources/css/user/sub.css
--- client/resources/css/user/sub.css
+++ client/resources/css/user/sub.css
@@ -4,6 +4,12 @@
     width: 100%;
     height: 1px;
 }
+.hr.pink {
+    background-color: rgba(194, 61, 71, 0.1);
+    margin: 10px 0;
+    width: 100%;
+    height: 1px;
+}
 .content {
     width: 1500px;
     margin: 0 auto;
@@ -445,6 +451,15 @@
         padding: 30px;
         margin-bottom: 30px;
 
+        .main-img{
+            width: 320px;
+            height: 220px;
+            border-radius: 24px;
+            img{
+                width: 100%;
+                height: 100%;
+            }
+        }
     }
 
     .text-box {
@@ -770,7 +785,7 @@
             height: 45px;
             gap: 5px;
             border-radius: 5px;
-
+            background-color: #000;
             p {
                 font-size: 16px;
                 color: #fff;
@@ -779,23 +794,7 @@
         }
     }
 
-    /* 닫기 버튼 스타일 */
-    button {
-        width: 40px;
-        height: 40px;
-        background-color: #000;
-        color: white;
-        border: none;
-        border-radius: 50px;
-    }
 
-    button.closebtn {
-        font-size: 20px;
-    }
-
-    button:hover {
-        background-color: #0056b3;
-    }
 
     .register-b {
         width: 110px;
@@ -804,6 +803,7 @@
         background-color: #000;
         color: #fff;
         font-family: "Pretendard-M";
+        border-radius: 50px;
     }
 
 }
@@ -1205,6 +1205,7 @@
 input[type='radio']+label {
     font-size: 17px;
     font-family: "Pretendard-L";
+    width: 95px;
 }
 
 /* 기본스타일 제거, 버튼 모양 재설정 */
@@ -1321,4 +1322,6 @@
 td,
 th {
     padding: 10px 0;
-}
(파일 끝에 줄바꿈 문자 없음)
+}
+
+
 
client/resources/images/allmenu-bg.png (Binary) (added)
+++ client/resources/images/allmenu-bg.png
Binary file is not shown
 
client/resources/images/hover.png (Binary) (added)
+++ client/resources/images/hover.png
Binary file is not shown
client/views/layout/Header.vue
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
@@ -11,23 +11,25 @@
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
                             @click="updateMenuStats('MENU_00000001')">기록물
                             <div class="submenu">
-                                <p>• <router-link :to="{ path: '/PicHistorySearch.page' }" >사진 기록물</router-link></p>
+                                <p>• <router-link :to="{ path: '/PicHistorySearch.page' }">사진 기록물</router-link></p>
                                 <div class="hr"></div>
-                                <p>• <router-link :to="{ path: '/VideoHistorySearch.page' }" >영상 기록물</router-link></p>
+                                <p>• <router-link :to="{ path: '/VideoHistorySearch.page' }">영상 기록물</router-link></p>
                             </div>
                         </li>
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
                             @click="updateMenuStats('MENU_00000004')">언론에서 바라본 구미시
                             <div class="submenu">
-                                <p>• <router-link :to="{ path: '/MediaVideoSearch.page' }" >미디어 영상</router-link></p>
+                                <p>• <router-link :to="{ path: '/MediaVideoSearch.page' }">미디어 영상</router-link></p>
                                 <div class="hr"></div>
-                                <p>• <router-link :to="{ path: '/NewsReleaseSearch.page' }" >보도자료</router-link></p>
+                                <p>• <router-link :to="{ path: '/NewsReleaseSearch.page' }">보도자료</router-link></p>
                             </div>
                         </li>
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
-                            @click="updateMenuStats('MENU_00000007')"><router-link :to="{ path: '/MemberManagement.page' }" >회원관리</router-link></li>
+                            @click="updateMenuStats('MENU_00000007')"><router-link
+                                :to="{ path: '/MemberManagement.page' }">회원관리</router-link></li>
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
-                            @click="updateMenuStats('MENU_00000008')"><router-link :to="{ path: '/CategoryManagement.page' }" >카테고리 관리</router-link></li>
+                            @click="updateMenuStats('MENU_00000008')"><router-link
+                                :to="{ path: '/CategoryManagement.page' }">카테고리 관리</router-link></li>
 
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'"
                             @click="updateMenuStats('MENU_00000001')">기록물</li>
@@ -48,8 +50,57 @@
                         <a href="#" @click.prevent="logout">로그아웃</a>
                     </li>
                 </ul>
-                <a href="#" class="all-menu"><img src="../../resources/images/allmenu.png" alt=""></a>
+                <a href="#" class="all-menu-btn" @click="toggleMenu"><img src="../../resources/images/allmenu.png"
+                        alt=""></a>
+
             </div>
+        </div>
+        <div class="overlay"  v-if="isMenuOpen">
+            <div class="all-menu">
+    <button @click="closeMenu" class="closebtn">✕</button>
+    <div class="nav-wrap">
+        <nav>
+            <ul>
+                <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @click="updateMenuStats('MENU_00000001')">
+                    <h6>기록물</h6>
+                    <div class="submenu">
+                        <p>• <router-link :to="{ path: '/PicHistorySearch.page' }" @click="closeMenu">사진 기록물</router-link></p>
+                        <div class="hr pink"></div>
+                        <p>• <router-link :to="{ path: '/VideoHistorySearch.page' }" @click="closeMenu">영상 기록물</router-link></p>
+                    </div>
+                </li>
+                <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @click="updateMenuStats('MENU_00000004')">
+                    <h6>언론에서 바라본 구미시</h6>
+                    <div class="submenu">
+                        <p>• <router-link :to="{ path: '/MediaVideoSearch.page' }" @click="closeMenu">미디어 영상</router-link></p>
+                        <div class="hr pink"></div>
+                        <p>• <router-link :to="{ path: '/NewsReleaseSearch.page' }" @click="closeMenu">보도자료</router-link></p>
+                    </div>
+                </li>
+                <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @click="updateMenuStats('MENU_00000007')">
+                    <h6>회원관리</h6>
+                    <div class="submenu">
+                        <p>• <router-link :to="{ path: '/MemberManagement.page' }" @click="closeMenu">회원관리</router-link></p>
+                    </div>
+                </li>
+                <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @click="updateMenuStats('MENU_00000008')">
+                    <h6>카테고리 관리</h6>
+                    <div class="submenu">
+                        <p>• <router-link :to="{ path: '/CategoryManagement.page' }" @click="closeMenu">카테고리 관리</router-link></p>
+                    </div>
+                </li>
+
+                <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'" @click="updateMenuStats('MENU_00000001')">
+                    <router-link :to="{ path: '/PicHistorySearch.page' }" @click="closeMenu">기록물</router-link>
+                </li>
+                <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'" @click="updateMenuStats('MENU_00000004')">
+                    <router-link :to="{ path: '/MediaVideoSearch.page' }" @click="closeMenu">언론에서 바라본 구미시</router-link>
+                </li>
+            </ul>
+        </nav>
+    </div>
+</div>
+
         </div>
     </header>
 </template>
@@ -57,42 +108,50 @@
 import { logOutProc } from "../../resources/api/user"
 import { updateStatsByMenuId } from "../../resources/api/main"
 export default {
-  data() {
-    return {
-      // Define the image sources
-      logo: 'client/resources/images/logo.png',
-    };
-  },
-  methods: {
-    async updateMenuStats(menuId) {
-      try {
-        const response = await updateStatsByMenuId(menuId);
-        if (response.status === 200) {
-          console.log(`메뉴 ID ${menuId} 통계 업데이트 성공`);
-        }
-      } catch (error) {
-        console.error(`메뉴 ID ${menuId} 통계 업데이트 중 오류:`, error);
-      }
+    data() {
+        return {
+            isMenuOpen: false,
+            // Define the image sources
+            logo: 'client/resources/images/logo.png',
+        };
     },
-    logout() {
-      // 백엔드 로그아웃 API 호출
-      logOutProc()
-        .then(() => {
-          console.log('로그아웃 성공 - 서버 측 쿠키 삭제 완료');
-          this.$store.commit('setStoreReset'); // 로그아웃 성공 후 스토어 초기화
-          this.$router.push({ path: '/Login.page' }); // 로그인 페이지로 리다이렉트
-        })
-        .catch(err => {
-          console.error('로그아웃 처리 중 오류:', err);
-          this.$store.commit('setStoreReset'); // 오류가 있어도 스토어는 초기화
-          this.$router.push({ path: '/Login.page' }); // 로그인 페이지로 리다이렉트
-        });
-    },
+    methods: {
+        toggleMenu() {
+            this.isMenuOpen = !this.isMenuOpen;
+        },
+        // 메뉴 닫기
+        closeMenu() {
+            this.isMenuOpen = false;
+        },
+        async updateMenuStats(menuId) {
+            try {
+                const response = await updateStatsByMenuId(menuId);
+                if (response.status === 200) {
+                    console.log(`메뉴 ID ${menuId} 통계 업데이트 성공`);
+                }
+            } catch (error) {
+                console.error(`메뉴 ID ${menuId} 통계 업데이트 중 오류:`, error);
+            }
+        },
+        logout() {
+            // 백엔드 로그아웃 API 호출
+            logOutProc()
+                .then(() => {
+                    console.log('로그아웃 성공 - 서버 측 쿠키 삭제 완료');
+                    this.$store.commit('setStoreReset'); // 로그아웃 성공 후 스토어 초기화
+                    this.$router.push({ path: '/Login.page' }); // 로그인 페이지로 리다이렉트
+                })
+                .catch(err => {
+                    console.error('로그아웃 처리 중 오류:', err);
+                    this.$store.commit('setStoreReset'); // 오류가 있어도 스토어는 초기화
+                    this.$router.push({ path: '/Login.page' }); // 로그인 페이지로 리다이렉트
+                });
+        },
 
-  },
-  watch: {},
-  computed: {},
-  components: {},
-  mounted() { },
+    },
+    watch: {},
+    computed: {},
+    components: {},
+    mounted() { },
 };
 </script>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List