최정임 최정임 03-25
250325 최정임 나머지 페이지 퍼블
@0cf4df45fb29e9121a5cb9dbfc966ba22d59f417
client/resources/css/common/common.css
--- client/resources/css/common/common.css
+++ client/resources/css/common/common.css
@@ -19,7 +19,8 @@
     background-color: #f6f6f6 !important; 
     color: #999;
 }
-select:focus {border: 0;}
+select{background-color: transparent ;}
+select:focus {border: 0; outline: 0;}
 textarea{resize: none;}
 
 
@@ -59,7 +60,8 @@
 
 
 .btn-group button{
-    padding: 15px 30px;
+    width: 130px;
+    padding: 15px 0px;
     border-radius: 10px;
     font-size: 20px;
    
@@ -76,7 +78,7 @@
     }
 }
 
-.button{
+.button, button{
     &.red-line{
         border: 1px solid #ce3e48;
         color: #ce3e48;
@@ -118,4 +120,20 @@
             color: #a5067b;
         }
     }
+    &.gradient{
+        position: relative;
+        background: linear-gradient(132deg, #3e355c, #763954);
+        color: #fff;
+        padding-right: 20px;
+        &::after{
+            content: '';
+            background-image: url(../../images/icon/down.png);
+            width: 15px;
+            height: 15px;
+            display: block;
+            position: absolute;
+            right: 17px;
+            top: 20px;
+        }
+    }
 }
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/user/layout.css
--- client/resources/css/user/layout.css
+++ client/resources/css/user/layout.css
@@ -1,4 +1,13 @@
+header{
+    width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 20;
+    background-color: #fff;
+}
 .container{
+    margin: 120px 0;
+    position: relative;
 }
 .header-container{
     width: 1500px;
@@ -11,8 +20,49 @@
     .nav-wrap{display: flex;}
 
     nav{
-        ul{display: flex; gap: 102px;}
-        li{font-size: 22px;}
+        & > ul{display: flex; gap: 102px;}
+        & > ul > li{font-size: 22px; position: relative;}
+        
+    & > ul > li:hover .submenu {
+        opacity: 1; /* hover시 보이도록 */
+        visibility: visible; /* hover시 보이도록 */
+    }
+        .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;
+            }
+        }
+        .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;
@@ -44,4 +94,5 @@
     
 }
 
-.scroll-up{position: fixed; right: 0; bottom: 0;}
(파일 끝에 줄바꿈 문자 없음)
+.scroll-up{position: fixed;     right: 5%;
+    bottom: 101px;}
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/user/sub.css
--- client/resources/css/user/sub.css
+++ client/resources/css/user/sub.css
@@ -1,3 +1,9 @@
+.hr {
+    background-color: #eeeeee;
+    margin: 10px 0;
+    width: 100%;
+    height: 1px;
+}
 .content {
     width: 1500px;
     margin: 0 auto;
@@ -19,7 +25,7 @@
             content: '';
             background: url(../../images/icon/subtitle.png);
             width: 7px;
-            top: 11px;
+            top: 6px;
             left: 0;
             height: 17px;
             display: block;
@@ -102,6 +108,7 @@
             font-size: 16px;
             color: #000;
             font-family: "Pretendard-L";
+            margin-left: 5px;
         }
 
         &:first-child {
@@ -136,7 +143,7 @@
     }
 }
 
-form {
+form, .form {
     margin: 0 auto;
     border: 1px solid #dddddd;
     border-radius: 20px;
@@ -182,12 +189,7 @@
         }
     }
 
-    .hr {
-        background-color: #eeeeee;
-        margin: 10px 0;
-        width: 100%;
-        height: 1px;
-    }
+   
 }
 
 /* 카테고리 */
@@ -386,6 +388,7 @@
 
 
 }
+
 .select-box {
     width: 106px;
     height: 30px;
@@ -397,13 +400,16 @@
     margin-left: 30px;
 
     select {
-        width: 106px;
+
+        width: 100%;
         border: 0;
         font-size: 14px;
     }
 }
+
 .search-result {
-    
+    margin-top: 40px;
+
 
 
     .resultext {
@@ -437,7 +443,7 @@
         border: 1px solid #ddd;
         border-radius: 24px;
         padding: 30px;
-
+        margin-bottom: 30px;
 
     }
 
@@ -703,6 +709,44 @@
         font-size: 30px;
     }
 
+    /* pagination */
+    .pagination {
+        button {
+            width: 40px;
+            height: 40px;
+            margin: 0 4px;
+            border: 1px solid #f0f1f4;
+            background-color: #fff;
+            border-radius: 50px;
+        }
+
+        button.page-number {
+            font-size: 20px;
+            color: #555555;
+            width: 40px;
+            height: 40px;
+            background-color: #f0f1f4;
+            border-radius: 50px;
+        }
+
+        button.page-number.clicked {
+            background-color: #ce3e48;
+            color: #fff;
+        }
+
+        .anticon {
+            svg {
+                font-size: 17px;
+
+                path {
+                    color: #636364;
+                }
+            }
+
+
+        }
+    }
+
     .modal-search {
         padding: 13px;
         background-color: rgba(0, 61, 97, 0.05);
@@ -811,6 +855,15 @@
         margin-bottom: 107px;
         position: relative;
 
+        &.video {
+            margin-bottom: 50px;
+
+            img {
+                height: 800px;
+                border-radius: 20px;
+            }
+        }
+
         .main-swiper {
             .swiper {
                 width: 100%;
@@ -872,23 +925,45 @@
 
     }
 
+    .img-box {
+        margin-right: 50px;
+        width: 600px;
+        height: 360px;
+    }
+
     .info-form {
         background-image: linear-gradient(#fff, #fff), linear-gradient(-45deg, #ca3e49, #3f355c);
         background-origin: border-box;
         background-clip: content-box, border-box;
         border: 3px solid transparent;
         border-radius: 32px;
+        padding: 0;
+        height: 360px;
 
-        dd {
-            background-color: transparent;
+        .info-box {
+            padding: 50px 40px;
 
-            p {
-                font-size: 20px;
-                text-align: left;
-                font-family: "Pretendard-L";
+            dl {
+                border: 0;
+                padding: 37px;
+                border-radius: 20px;
+                background-color: #f5f6f8;
+
+                dd {
+                    background-color: transparent;
+                    padding: 0;
+
+                    p {
+                        font-size: 20px;
+                        text-align: left;
+                        font-family: "Pretendard-L";
+                    }
+                }
             }
         }
+
     }
+
 
     .btn-group {
         margin-top: 24px;
@@ -918,97 +993,142 @@
 }
 
 /* 회원관리,  카테고리 관리 */
-.management{
-    .left-con{width: 350px; margin-right: 55px;}
+.management {
+    .left-con {
+        width: 350px;
+        margin-right: 55px;
+    }
 
-    .search-area{
+    .search-area {
         gap: 5px;
         padding: 0;
         height: 40px;
     }
-    .search-wrap{
-        
+
+    .search-wrap {
+
         position: initial;
         transform: none;
-        
-        input{
+
+        input {
             width: 100%;
             height: 100%;
             border: 1px solid #000;
             border-radius: 5px;
         }
+
         .select-box {
             border-color: #000;
             width: 100px;
             height: 100%;
-            select{width: 100%; color: #000; }
+
+            select {
+                width: 100%;
+                color: #000;
+            }
         }
-        .search-btn{
+
+        .search-btn {
             position: relative;
             flex-shrink: 0;
             width: 40px;
             height: 40px;
             background-color: #000;
             border-radius: 5px;
-            img{
+
+            img {
                 position: absolute;
                 left: 50%;
                 right: 50%;
                 transform: translateX(-50%) translateY(-50%);
             }
-           
+
         }
     }
-    .btn-group-small{
+
+    .btn-group-small {
         gap: 5px;
-        .button{
-            &.flex{
-                img{text-align: left; margin-right: 10px;}
-                p{text-align: center;}
+
+        .button {
+            &.flex {
+                img {
+                    text-align: left;
+                    margin-right: 10px;
+                }
+
+                p {
+                    text-align: center;
+                }
             }
         }
     }
+
     .select-box {
         width: 230px;
         height: 50px;
         border: 1px solid #ddd;
         padding: 0 15px;
         margin: 0;
+
         select {
             width: 100%;
             height: 100%;
             font-size: 16px;
-            color: #999999; 
+            color: #999999;
         }
     }
-    .switch{
-        label{margin-top: -12px;}
+
+    .switch {
+        label {
+            margin-top: -12px;
+        }
     }
-    table{
+
+    table {
         border-radius: 10px;
         overflow: hidden;
-        
-        thead{
+
+        thead {
             background-color: #636364;
-            th{color: #fff; border: 1px solid #eee;}
+
+            th {
+                color: #fff;
+                border: 1px solid #eee;
+            }
         }
-        td{border: 1px solid #eee; text-align: center;}
-        tr:hover td{
+
+        td {
+            border: 1px solid #eee;
+            text-align: center;
+        }
+
+        tbody tr:hover td {
             background-color: #007ac3;
-    overflow: hidden;
-    width: 100%;
-    border: 2px solid transparent; /* Set a transparent border first */
-    border-image: linear-gradient(-45deg, #ce3e48, #3f355c) 1;
+            /* Change background color of the cell */
+            border: 2px solid transparent;
+            /* Set transparent border to apply gradient */
+            border-image: linear-gradient(-45deg, #ce3e48, #3f355c) 1;
+            /* Apply gradient border */
+        }
+
+        /* Optionally, add hover effect on the whole row */
+        tbody tr:hover {
+            cursor: pointer;
         }
     }
+
     .delete-member {
-        background-color: #f5f8f9; 
-        td{
+        background-color: #f5f8f9;
+
+        td {
             color: #aaaaaa;
-            
+
         }
-      }
-      textarea{border-color: #ddd;}
+    }
+
+    textarea {
+        border-color: #ddd;
+    }
 }
 
 
@@ -1133,7 +1253,8 @@
         display: block;
         border-radius: 100px;
         position: relative;
-        transition: background-color 0.3s ease; /* Added smooth transition for background */
+        transition: background-color 0.3s ease;
+        /* Added smooth transition for background */
     }
 
     label:after {
@@ -1145,22 +1266,26 @@
         height: 20px;
         background: #fff;
         border-radius: 50%;
-        transition: left 0.3s ease, transform 0.3s ease; /* Smooth transition for the toggle ball */
+        transition: left 0.3s ease, transform 0.3s ease;
+        /* Smooth transition for the toggle ball */
     }
 
     /* When the input is checked */
-    input:checked + label {
-        background: #787878; /* Color when active */
+    input:checked+label {
+        background: #787878;
+        /* Color when active */
     }
 
-    input:checked + label:after {
+    input:checked+label:after {
         left: calc(100% - 5px);
-        transform: translateX(-100%); /* Keeps the ball moving smoothly */
+        transform: translateX(-100%);
+        /* Keeps the ball moving smoothly */
     }
 
     /* Optional: Make the toggle ball slightly larger during the click for a better effect */
     label:active:after {
-        width: 20px; /* Slightly increase the ball size */
+        width: 20px;
+        /* Slightly increase the ball size */
         height: 20px;
     }
 }
 
client/resources/images/icon/down.png (Binary) (added)
+++ client/resources/images/icon/down.png
Binary file is not shown
 
client/resources/images/img8.png (Binary) (added)
+++ client/resources/images/img8.png
Binary file is not shown
 
client/resources/images/list_icon01_off.png (Binary) (added)
+++ client/resources/images/list_icon01_off.png
Binary file is not shown
 
client/resources/images/list_icon01_on.png (Binary) (added)
+++ client/resources/images/list_icon01_on.png
Binary file is not shown
 
client/resources/images/list_icon02_off.png (Binary) (added)
+++ client/resources/images/list_icon02_off.png
Binary file is not shown
 
client/resources/images/list_icon02_on.png (Binary) (added)
+++ client/resources/images/list_icon02_on.png
Binary file is not shown
client/resources/images/visual.png (Binary)
--- client/resources/images/visual.png
+++ client/resources/images/visual.png
Binary file is not shown
client/views/layout/Header.vue
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
@@ -1,37 +1,57 @@
 <template>
-  <header>
-    <div class="header-container w1500">
-      <div class="logo-wrap">
-        <router-link :to="{ path: '/' }" class="logo"><img :src="logo" alt=""></router-link>
-      </div>
-      <div class="nav-wrap">
-        <nav>
-          <ul>
-            <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @click="updateMenuStats('MENU_00000001')"><router-link :to="{ path: '/PicHistorySearch.page' }">기록물</router-link></li>
-            <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @click="updateMenuStats('MENU_00000004')"><router-link :to="{ path: '/' }">언론에서 바라본 구미시</router-link></li>
-            <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'" @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>
-            <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'" @click="updateMenuStats('MENU_00000001')">기록물</li>
-            <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'" @click="updateMenuStats('MENU_00000004')">언론에서 바라본 구미시</li>
-          </ul>
-        </nav>
-      </div>
-      <div class="auth-area">
-        <ul v-if="$store.state.userId != null">
-          <li><img src="../../resources/images/icon/user-settings-line.png" alt="">
-            <router-link :to="{ path: '/MyInfo.page' }">{{ $store.state.userNm }}</router-link>
-          </li>
-          <li>
-            <div class="line"></div>
-          </li>
-          <li><img src="../../resources/images/icon/logout-box-line.png" alt="">
-            <a href="#" @click.prevent="logout">로그아웃</a>
-          </li>
-        </ul>
-        <a href="#" class="all-menu"><img src="../../resources/images/allmenu.png" alt=""></a>
-      </div>
-    </div>
-  </header>
+
+    <header>
+        <div class="header-container w1500">
+            <div class="logo-wrap">
+                <router-link :to="{ path: '/' }" class="logo"><img :src="logo" alt=""></router-link>
+            </div>
+            <div class="nav-wrap">
+                <nav>
+                    <ul>
+                        <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>
+                                <div class="hr"></div>
+                                <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>
+                                <div class="hr"></div>
+                                <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>
+                        <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
+                            @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>
+                        <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'"
+                            @click="updateMenuStats('MENU_00000004')">언론에서 바라본 구미시</li>
+                    </ul>
+                </nav>
+            </div>
+            <div class="auth-area">
+                <ul v-if="$store.state.userId != null">
+                    <li><img src="../../resources/images/icon/user-settings-line.png" alt="">
+                        <router-link :to="{ path: '/MyInfo.page' }">{{ $store.state.userNm }}</router-link>
+                    </li>
+                    <li>
+                        <div class="line"></div>
+                    </li>
+                    <li><img src="../../resources/images/icon/logout-box-line.png" alt="">
+                        <a href="#" @click.prevent="logout">로그아웃</a>
+                    </li>
+                </ul>
+                <a href="#" class="all-menu"><img src="../../resources/images/allmenu.png" alt=""></a>
+            </div>
+        </div>
+    </header>
 </template>
 <script>
 import { logOutProc } from "../../resources/api/user"
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -5,16 +5,28 @@
 import Login from "./login/Login.vue";
 import Main from "./main/Main.vue";
 import NotFound from "./etc/NotFound.vue";
+// 회원관리
+import MyInfo from "./user/MyInfo.vue";
 // 통합검색
 import TotalSearch from "./user/TotalSearch.vue";
 // 사진기록물
 import PicHistorySearch from "./user/PicHistorySearch.vue";
 import PicHistoryInsert from "./user/PicHistoryInsert.vue";
 import PicHistoryDetail from "./user/PicHistoryDetail.vue";
+// 영상기록물
+import VideoHistoryInsert from "./user/VideoHistoryInsert.vue";
+import VideoHistoryDetail from "./user/VideoHistoryDetail.vue";
+import VideoHistorySearch from "./user/VideoHistorySearch.vue";
+// 미디어 영상
+import MediaVideoInsert from "./user/MediaVideoInsert.vue";
+import MediaVideoDetail from "./user/MediaVideoDetail.vue";
+import MediaVideoSearch from "./user/MediaVideoSearch.vue";
 // 보도자료
-import BodoDetail from "./user/BodoDetail.vue";
-// 회원관리
-import MyInfo from "./user/MyInfo.vue";
+import NewsReleaseDetail from "./user/NewsReleaseDetail.vue";
+import NewsReleaseInsert from "./user/NewsReleaseInsert.vue";
+import NewsReleaseSearch from "./user/NewsReleaseSearch.vue";
+
+
 import MemberManagement from "./user/MemberManagement.vue";
 // 카테고리관리
 import CategoryManagement from "./user/CategoryManagement.vue";
@@ -27,10 +39,27 @@
   { path: "/notFound.page", name: "NotFoundPage", component: NotFound },
 
   { path: "/TotalSearch.page", name: "TotalSearch", component: TotalSearch },
+  // 사진기록물
   { path: "/PicHistorySearch.page", name: "PicHistorySearch", component: PicHistorySearch },
   { path: "/PicHistoryInsert.page", name: "PicHistoryInsert", component: PicHistoryInsert },
   { path: "/PicHistoryDetail.page", name: "PicHistoryDetail", component: PicHistoryDetail },
-  { path: "/BodoDetail.page", name: "BodoDetail", component: BodoDetail },
+  // 영상기록물
+  { path: "/VideoHistorySearch.page", name: "VideoHistorySearch", component: VideoHistorySearch },
+  { path: "/VideoHistoryInsert.page", name: "VideoHistoryInsert", component: VideoHistoryInsert },
+  { path: "/VideoHistoryDetail.page", name: "VideoHistoryDetail", component: VideoHistoryDetail },
+
+  // 미디어 영상
+  { path: "/MediaVideoSearch.page", name: "MediaVideoSearch", component: MediaVideoSearch },
+  { path: "/MediaVideoInsert.page", name: "MediaVideoInsert", component: MediaVideoInsert },
+  { path: "/MediaVideoDetail.page", name: "MediaVideoDetail", component: MediaVideoDetail },
+
+// 보도자료
+{ path: "/NewsReleaseSearch.page", name: "NewsReleaseSearch", component: NewsReleaseSearch },
+  { path: "/NewsReleaseInsert.page", name: "NewsReleaseInsert", component: NewsReleaseInsert },
+  { path: "/NewsReleaseDetail.page", name: "NewsReleaseDetail", component: NewsReleaseDetail },
+
+
+
   { path: "/MemberManagement.page", name: "MemberManagement", component: MemberManagement },
   { path: "/CategoryManagement.page", name: "CategoryManagement", component: CategoryManagement },
 ];
client/views/pages/main/Main.vue
--- client/views/pages/main/Main.vue
+++ client/views/pages/main/Main.vue
@@ -171,7 +171,7 @@
       nomedia: "client/resources/images/no_media.png",
       nobodo: "client/resources/images/no_bodo.png",
       direct: 'client/resources/images/direct-btn.png',
-      search: 'client/resources/images/icon/search_btn.png',
+      search: 'client/resources/images/search_btn.png',
       selectedTab: "newPhoto", // Set initial tab index to 신규사진기록물 (first tab)
       tabs: [
         {
client/views/pages/user/MediaVideoDetail.vue (copied from client/views/pages/user/BodoDetail.vue)
--- client/views/pages/user/BodoDetail.vue
+++ client/views/pages/user/MediaVideoDetail.vue
@@ -0,0 +1,148 @@
+<template>
+    <div class="content">
+        <div class="sub-title-area mb-30">
+            <h2>미디어 영상</h2>
+            <div class="breadcrumb-list">
+                <ul>
+                    <li><img :src="homeicon" alt="Home Icon">
+                        <p>언론에서 바라본 구미시</p>
+                    </li>
+                    <li><img :src="righticon" alt=""></li>
+                    <li>미디어 영상</li>
+                </ul>
+            </div>
+        </div>
+        <form action="" class="gallery-form mb-40">
+            <dl class="mb-20">
+                <dd>
+                    <p>미디어 영상 제목1
+                    </p>
+                    <div class="date flex align-center">
+                        <img :src="calendaricon" alt="">
+                        <span>2025.02.28</span>
+                    </div>
+                </dd>
+
+            </dl>
+            <div class="gallery video">
+                    <img :src="eximg" alt="">
+                </div>
+        </form>
+
+        <h3>내용</h3>
+        <form action="" class=" info-form mb-50">
+            <dl>
+                <dd>
+                    <p> 대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는
+                        41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어 있습니다.</p>
+
+                </dd>
+            </dl>
+        </form>
+
+        <h3>기본정보</h3>
+        <form action="" class="info-form mb-50">
+            <dl>
+                <dd class="mb-20">
+                    <img :src="addressicon" alt="">
+                    <span>원본주소</span>
+                    <p>https://youtu.be/2F2gWkEnSz4</p>
+                </dd>
+                <dd class="mb-20">
+                    <img :src="yearicon" alt="">
+                    <span>생산연도</span>
+                    <p>2017</p>
+
+                </dd>
+                <dd>
+                    <img :src="categoryicon" alt="">
+                    <span>카테고리</span>
+                    <ul class="category">
+                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                    </ul>
+
+                </dd>
+
+            </dl>
+        </form>
+        <div class="btn-group flex-center">
+            <button class="red-line " type="button" @click="fnDeleteUser">삭제</button>
+            <button class="blue-line " type="button" @click="fnUpdateUser">수정</button>
+            <button class="gray-line-bg " type="button" @click="fnUpdateUser">목록</button>
+        </div>
+    </div>
+</template>
+
+<script>
+import axios from "axios";
+import { ref } from 'vue';
+import { updateUsers, logOutProc, updatePassword } from "../../../resources/api/user"
+// Import Swiper Vue components
+import { CaretRightOutlined, PauseOutlined } from '@ant-design/icons-vue';
+import { Swiper, SwiperSlide } from 'swiper/vue';
+
+// Import Swiper styles
+import 'swiper/css';
+
+import 'swiper/css/free-mode';
+import 'swiper/css/navigation';
+import 'swiper/css/thumbs';
+
+// import required modules
+import { FreeMode, Navigation, Thumbs } from 'swiper/modules';
+
+export default {
+    components: {
+        PauseOutlined,
+        CaretRightOutlined,
+        Swiper,
+        SwiperSlide,
+    },
+    setup() {
+        const thumbsSwiper = ref(null);
+
+        const setThumbsSwiper = (swiper) => {
+            thumbsSwiper.value = swiper;
+        };
+
+        return {
+            thumbsSwiper,
+            setThumbsSwiper,
+            modules: [FreeMode, Navigation, Thumbs],
+        };
+    },
+    data() {
+        return {
+            resultitem: {
+                category1: true,
+                category2: true,
+            },
+            calendaricon: 'client/resources/images/icon/calendaricon.png',
+            homeicon: 'client/resources/images/icon/home.png',
+            erroricon: 'client/resources/images/icon/error.png',
+            righticon: 'client/resources/images/icon/right.png',
+            addressicon: 'client/resources/images/icon/addressicon.png',
+            yearicon: 'client/resources/images/icon/yearicon.png',
+            categoryicon: 'client/resources/images/icon/categoryicon.png',
+            eximg: 'client/resources/images/img8.png',
+            slides: [
+                { img: 'client/resources/images/visual.png', alt: 'Slide 1' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 2' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                // Add more slides as needed
+            ],
+
+        };
+    },
+    methods: {
+    },
+    watch: {},
+    computed: {
+    },
+    mounted() { },
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/user/MediaVideoInsert.vue (added)
+++ client/views/pages/user/MediaVideoInsert.vue
@@ -0,0 +1,181 @@
+<template>
+  <div class="content">
+    <div class="sub-title-area mb-30">
+      <h2>미디어 영상</h2>
+      <div class="breadcrumb-list">
+        <ul>
+          <li><img :src="homeicon" alt="Home Icon">
+            <p>언론에서 바라본 구미시</p>
+          </li>
+          <li><img :src="righticon" alt=""></li>
+          <li>미디어 영상</li>
+        </ul>
+      </div>
+    </div>
+    <form action="" class="insert-form mb-50">
+      <dl>
+        <dd>
+          <label for="id" class="require">제목</label>
+          <div class="wfull"><input type="text" id="id" placeholder="제목을 입력하세요."></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="year">생산연도</label>
+          <input type="text" id="year" placeholder="생산연도를 입력하세요">
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="address">주소</label>
+          <div class="wfull"><input type="text" id="address" placeholder="URL 주소를 입력하세요"></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="text">내용</label>
+          <div class="wfull">
+            <EditorComponent :contents="insertDTO.cn" />
+          </div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="category" class="flex align-center">
+            <p>카테고리</p><button type="button" class="category-add" @click="openModal">추가하기</button>
+          </label>
+          <ul class="category">
+            <li v-for="(category, index) in selectedCtgries" :key="index"> {{ category }} <button type="button" class="cancel" @click="removeCategory(index)"><b>✕</b></button>
+            </li>
+          </ul>
+        </dd>
+      </dl>
+    </form>
+    <div class="btn-group flex-center">
+      <button class="cancel">취소</button>
+      <button class="register">등록</button>
+    </div>
+  </div>
+  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" />
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+// COMPONENT
+import EditorComponent from '../../component/EditorComponent.vue';
+import CategorySelectModal from '../../component/modal/CategorySelectModal.vue';
+
+export default {
+  components: {
+    DoubleLeftOutlined,
+    LeftOutlined,
+    RightOutlined,
+    DoubleRightOutlined,
+    EditorComponent, CategorySelectModal,
+  },
+
+  data() {
+    return {
+      // Define the image sources
+      homeicon: 'client/resources/images/icon/home.png',
+      erroricon: 'client/resources/images/icon/error.png',
+      righticon: 'client/resources/images/icon/right.png',
+      fileicon: 'client/resources/images/icon/file.png',
+      searchicon: 'client/resources/images/icon/search.png',
+
+      isModalOpen: false,
+
+      items: [
+        { id: 1, category: '카테고리 1', selected: false },
+        { id: 2, category: '카테고리 2', selected: false },
+        { id: 3, category: '카테고리 3', selected: false },
+      ],
+      fileNames: [],
+      insertDTO: {
+        sj: null, //제목
+        cn: null, //내용
+        adres: null, // 주소
+        prdctnYear: null, // 생산연도
+        ty: 'P', // 타입 ( P: 사진, V: 영상 )
+        multipartFiles: null, // 첨부파일 정보
+        ctgryIds: null, // 카테고리 정보
+      },
+
+      files: [],
+      selectedCtgries: [], // 카테고리 목록
+    };
+  },
+  computed: {
+    filteredItems() {
+      // This could be modified to support filtering based on searchQuery
+      return this.items.filter(item =>
+        item.category.includes(this.searchQuery)
+      );
+    }
+  },
+  created() {
+  },
+  methods: {
+    registerCategories() {
+      // Add selected categories to the displayed list
+      this.selectedCtgries = this.items
+        .filter(item => item.selected)
+        .map(item => item.category);
+      this.closeModal(); // Close modal after registration
+    },
+    removeCategory(index) {
+      // Remove category from the list
+      this.selectedCtgries.splice(index, 1);
+    },
+    searchCategories() {
+      // You can implement search logic if needed
+    },
+    nextPage() {
+      if (this.currentPage < this.totalPages) {
+        this.currentPage++;
+      }
+    },
+    previousPage() {
+      if (this.currentPage > 1) {
+        this.currentPage--;
+      }
+    },
+    showFileNames(event) {
+      const files = event.target.files;
+      this.fileNames = [];  // Clear previous file names
+
+      for (let i = 0; i < files.length; i++) {
+        const file = files[i];
+        const fileType = file.name.split('.').pop().toLowerCase();  // Get file extension
+
+        // Set default icon
+        let iconPath = this.fileicons;
+
+        // Determine the icon based on file type
+        if (['jpg', 'jpeg', 'png', 'gif'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/imgicon.png';  // Example for image files
+        } else if (['pdf'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/pdficon.png';  // Example for PDF files
+        } else if (['xls'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/excelicon.png';  // Example for audio files
+        } else if (['hwp'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/hwpicon.png';  // Example for video files
+        }
+
+        // Push the file name and corresponding icon to the fileNames array
+        this.fileNames.push({
+          name: file.name,
+          icon: iconPath
+        });
+      }
+    },
+    removeFile(index) {
+      // Remove file from the list
+      this.fileNames.splice(index, 1);
+      console.log(removeFile)
+    },
+    openModal() {
+      this.isModalOpen = true;
+    },
+    // 모달 닫기
+    closeModal() {
+      this.isModalOpen = false;
+    },
+  }
+};
+</script>
 
client/views/pages/user/MediaVideoSearch.vue (added)
+++ client/views/pages/user/MediaVideoSearch.vue
@@ -0,0 +1,414 @@
+<template>
+    <div class="content">
+        <div class="sub-title-area mb-30">
+            <h2>미디어 영상</h2>
+            <div class="breadcrumb-list">
+                <ul>
+                    <!-- Bind the image source dynamically for homeicon -->
+                    <li><img :src="homeicon" alt="Home Icon">
+                        <p>언론에서 바라본 구미시</p>
+                    </li>
+                    <li><img :src="righticon" alt=""></li>
+                    <li>미디어 영상</li>
+                </ul>
+            </div>
+        </div>
+        <div action="search" class="search-form form ">
+            <dl>
+                <dd class="mb-15">
+                    <p>검색범위</p>
+                    <ul>
+                        <li>
+                            <input type="checkbox" id="allScope" v-model="isChkAllScope"
+                                @change="fnChkAllOptions('scope')" />
+                            <label for="allScope">전체</label>
+                        </li>
+                        <li v-for="(scope, idx) in searchType" :key="idx">
+                            <input type="checkbox" :id="idx" :name="searchType" :value="scope.key"
+                                v-model="searchReqDTO.searchType" @change="fnChkOption('scope')" />
+                            <label :for="idx">{{ scope.value }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <dd class="mb-15">
+                    <p>검색어</p>
+                    <div class="wfull"><input type="text" v-model="searchReqDTO.searchText"></div>
+                </dd>
+                <dd class="mb-15">
+                    <p>생산연도</p>
+                    <input type="date" v-model="searchReqDTO.startYear">
+                    <p class="mark">~</p>
+                    <input type="date" v-model="searchReqDTO.endYear">
+                </dd>
+                <dd class="mb-20">
+                    <p>카테고리</p>
+                    <ul>
+                        <li v-for="(category, idx) of categorys" :key="idx">
+                            <input type="checkbox" :id="category.ctgryId" name="categorys" :value="category.ctgryId"
+                                v-model="searchReqDTO.searchCtgry" />
+                            <label :for="category.ctgryId">{{ category.ctgryNm }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <dd class="mb-15">
+                    <p>정렬</p>
+                    <ul>
+                        <li v-for="(order, idx) of orders" :key="idx">
+                            <input type="radio" :id="order.key" name="orders" :value="order.key"
+                                v-model="searchReqDTO.order" />
+                            <label :for="order.key">{{ order.value }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <div class="btn-group">
+                    <button class="reset"><img :src="reseticon" alt="">
+                        <p>초기화</p>
+                    </button>
+                    <button class="search"><img :src="searchicon" alt="">
+                        <p>검색</p>
+                    </button>
+                </div>
+
+            </dl>
+
+        </div>
+        <div class="search-result">
+            <div class="tabs">
+                <div class="flex-sp-bw mb-20 align-center">
+                    <div class="resultext ">
+                        <img :src="resulticon" alt="">
+                        <p>총 <b>{{ count }}개</b>의 미디어 영상이 검색되었습니다. </p>
+                    </div>
+                    <div class="flex ">
+                        <ul class="tab-box mb-20">
+                            <li v-for="(tab, index) in tabs" :key="index" class="tab-title"
+                                :class="{ active: selectedTab === tab.id }" @click="selectTab(tab.id)">
+                                <img :src="selectedTab === tab.id ? tab.activeImage : tab.inactiveImage"
+                                    :alt="tab.title" class="tab-icon" />
+                                <p><b>{{ tab.title }}</b></p>
+                            </li>
+                        </ul>
+                        <div class="select-box">
+                            <select v-model="itemsPerPage" @change="changeItemsPerPage">
+                                <option :value="5" selected>5개</option>
+                                <option :value="10">10개</option>
+                                <option :value="15">15개</option>
+                            </select>
+                        </div>
+                    </div>
+
+                </div>
+
+                <div class="tab-content">
+                    <!-- Loop through tabContents, and only display content that matches selectedTab -->
+                    <div v-for="(tabContent, idx) in tabContents" :key="idx">
+                        <!-- Display content only if the tab's ID matches the selectedTab -->
+                        <div v-show="tabContent.id === selectedTab">
+                            <!-- 카드형 Section (Card Layout) -->
+                            <div v-if="tabContent.viewType === 'card'">
+                                <ul class="card-wrap">
+                                    <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+                                        <div class="result-box">
+                                            <!-- Main Image Section -->
+                                            <div class="main-img">
+                                                <img :src="resultitem.img" alt="" class="tab-image" />
+                                            </div>
+                                            <!-- Text Section -->
+                                            <div class="text-box">
+                                                <router-link :to="{ path: '/MediaVideoDetail.page' }">
+                                                    <h5>{{ resultitem.title }}</h5>
+                                                </router-link>
+
+                                                <p class="address">{{ resultitem.address }}</p>
+                                                <p class="text">{{ resultitem.content }}</p>
+
+                                                <div class="mb-20">
+                                                    <ul class="category">
+                                                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                                    </ul>
+                                                </div>
+
+                                                <div class="date">
+                                                    <ul>
+                                                        <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                                                        <li>|</li>
+                                                        <li>등록 <b>{{ resultitem.date }}</b></li>
+                                                    </ul>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </li>
+                                </ul>
+
+                                <!-- Empty State if no results in paginatedItems -->
+                                <div v-if="paginatedItems.length === 0" class="no-results">
+                                    <p>등록된 게시물이 없습니다.</p>
+                                </div>
+                            </div>
+
+                            <!-- 리스트형 Section (List Layout) -->
+                            <div v-if="tabContent.viewType === 'list'">
+                                <ul class="list-wrap">
+                                    <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+                                        <div class="text-box">
+                                            <router-link :to="{ path: '/MediaVideoDetail.page' }">
+                                                    <h5>{{ resultitem.title }}</h5>
+                                                </router-link>
+                                            <p class="address">{{ resultitem.address }}</p>
+
+                                            <div class="flex-sp-bw">
+                                                <div class="mb-20">
+                                                    <ul class="category">
+                                                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                                    </ul>
+                                                </div>
+
+                                                <div class="date ">
+                                                    <ul>
+                                                        <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                                                        <li>|</li>
+                                                        <li>등록 <b>{{ resultitem.date }}</b></li>
+                                                    </ul>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </li>
+                                </ul>
+
+                                <!-- Empty State if no results in paginatedItems -->
+                                <div v-if="paginatedItems.length === 0" class="no-results">
+                                    <p>등록된 게시물이 없습니다.</p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="btn-group flex-end mt-40"><button class="register"> <router-link
+                        :to="{ path: '/MediaVideoInsert.page' }">등록</router-link></button></div>
+            <div class="pagination flex-center mt-40">
+
+                <!-- Previous and Next Page Buttons -->
+                <button>
+                    <DoubleLeftOutlined />
+                </button>
+                <button @click="previousPage" :disabled="currentPage === 1">
+                    <LeftOutlined />
+                </button>
+                <button class="page-number clicked">1</button>
+                <button @click="nextPage" :disabled="currentPage === totalPages">
+                    <RightOutlined />
+                </button>
+                <button>
+                    <DoubleRightOutlined />
+                </button>
+            </div>
+        </div>
+    </div>
+
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+import { findAllCategoryProc } from "../../../resources/api/category"; // 카테고리 목록 검색
+
+export default {
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+    data() {
+        return {
+            selectedTab: 1,
+            // 검색용 객체
+            searchReqDTO: {
+                searchType: [],
+                searchText: null,
+                startYear: null,
+                endYear: null,
+                searchTy: null,
+                searchCtgry: [],
+                order: "rgsde",
+            },
+            tabs: [
+
+                {
+                    id: 1,
+                    title: "카드형",
+                    activeImage: "client/resources/images/list_icon01_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon01_off.png",
+                },
+                {
+                    id: 2,
+                    title: "리스트형",
+                    activeImage: "client/resources/images/list_icon02_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon02_off.png",
+                },
+            ],
+            tabContents: [
+                { id: 1, viewType: 'card', list: [{ sj: 'Item 1', rgsde: '2025-03-01', files: [{ filePath: 'image1.png' }] }] },
+                { id: 2, viewType: 'list', list: [{ sj: 'Item 2', rgsde: '2025-03-02', files: [{ filePath: 'image2.png' }] }] },
+            ],
+            paginatedItems: [],
+            resultitems: [
+                {
+                    img: 'client/resources/images/img6.png',
+                    title: '미디어 영상 제목',
+                    address: '경상북도 구미시 송정대로 55',
+                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
+                    category1: true,
+                    category2: true,
+                    year: 2020,
+                    date: '2021-01-01'
+                },
+
+            ],
+            currentPage: 1, // Current page number
+            itemsPerPage: 5,
+            resulticon: "client/resources/images/icon/r-check.png",
+            homeicon: 'client/resources/images/icon/home.png',
+            searchicon: 'client/resources/images/icon/search.png',
+            reseticon: 'client/resources/images/icon/reset.png',
+            righticon: 'client/resources/images/icon/right.png',
+            count: 23,
+            checkOptions: [
+                '전체',
+                '사진',
+                '영상',
+                '미디어 영상',
+                '보도자료',
+            ],
+            checkOptions2: [
+                '전체',
+                '제목',
+                '내용',
+                '주소',
+            ],
+            checkOptions3: [
+                '카테고리1',
+                '카테고리2',
+                '카테고리3',
+                '카테고리4',
+                '카테고리5',
+            ],
+            checkOptions4: [
+                '최신',
+                '인기',
+            ],
+            isChkAllScope: false, // 검색범위 전체 체크 여부
+            searchType: [
+                { key: "sj", value: "제목" },
+                { key: "cn", value: "내용" },
+                { key: "adres", value: "주소" },
+            ], // 검색범위 목록
+            categorys: [], // 카테고리 목록
+            orders: [
+                { key: "rgsde", value: "최신" },
+                { key: "rdcnt", value: "인기" },
+            ], // 정렬 목록
+        };
+    },
+    computed: {
+        // Total number of pages
+        totalPages() {
+            return Math.ceil(this.resultitems.length / this.itemsPerPage);
+        },
+
+        // Paginated items based on current page and items per page
+        paginatedItems() {
+            const start = (this.currentPage - 1) * this.itemsPerPage;
+            const end = start + this.itemsPerPage;
+            return this.resultitems.slice(start, end);
+        },
+    },
+    created() {
+        // 초기 데이터 세팅
+        this.isChkAllScope = true;
+        this.searchReqDTO.searchType = this.searchType.map(item => item.key);
+        this.searchReqDTO.order = this.orders[0].key
+
+        this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    },
+    methods: {
+        selectTab(tabId) {
+            this.selectedTab = tabId; // Update the selected tab index
+        },
+        // Change the number of items displayed per page
+        changeItemsPerPage() {
+            this.currentPage = 1; // Reset to first page when changing items per page
+        },
+        previousPage() {
+            if (this.currentPage > 1) {
+                this.currentPage--;
+            }
+        },
+
+        // Go to the next page
+        nextPage() {
+            if (this.currentPage < this.totalPages) {
+                this.currentPage++;
+            }
+        },
+        isChkAllScope: false, // 검색범위 전체 체크 여부
+        searchType: [
+            { key: "sj", value: "제목" },
+            { key: "cn", value: "내용" },
+            { key: "adres", value: "주소" },
+        ], // 검색범위 목록
+        categorys: [], // 카테고리 목록
+        orders: [
+            { key: "rgsde", value: "최신" },
+            { key: "rdcnt", value: "인기" },
+        ], // 정렬 목록
+
+        async fnFindCategorys() {
+            try {
+                const response = await findAllCategoryProc();
+                this.categorys = response.data.data.ctgry;
+            } catch (error) {
+                if (error.response) {
+                    console.log("에러 응답:", error.response.data);
+                }
+                console.error("Error:", error);
+            }
+        },
+
+        // 통합검색
+        async fnFindAllDatas() {
+            try {
+                let params = {};
+                if (this.searchReqDTO.searchRecord.length > 0) {
+                    params.searchRecords = this.searchReqDTO.searchRecord.join(',');
+                }
+                if (this.searchReqDTO.searchType.length > 0) {
+                    params.searchTypes = this.searchReqDTO.searchType.join(',');
+                }
+                if (this.searchReqDTO.searchCtgry.length > 0) {
+                    params.searchCtgries = this.searchReqDTO.searchCtgry.join(',');
+                }
+                params.searchText = this.searchReqDTO.searchText;
+                params.startYear = this.searchReqDTO.startYear;
+                params.endYear = this.searchReqDTO.endYear;
+                params.order = this.searchReqDTO.order;
+
+                // API 호출
+                const response = await findAllDatas(params);
+                this.searchResult = response.data.data.searchResult;
+            } catch (error) {
+                if (error.response) {
+                    console.log("에러 응답:", error.response.data);
+                }
+                console.error("Error:", error);
+            }
+        },
+    },
+
+
+
+};
+</script>
+<style scoped></style>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/user/NewsReleaseDetail.vue (Renamed from client/views/pages/user/BodoDetail.vue)
--- client/views/pages/user/BodoDetail.vue
+++ client/views/pages/user/NewsReleaseDetail.vue
@@ -13,7 +13,7 @@
             </div>
         </div>
         <form action="" class="gallery-form mb-40">
-            <dl class="mb-20">
+            <dl class="mb-60">
                 <dd>
                     <p>보도자료 제목1
                     </p>
@@ -24,35 +24,38 @@
                 </dd>
 
             </dl>
-            <div>
-                <div>
+            <div class="flex-sp-bw mb-50">
+                <div class="img-box">
                     <img :src="noimg" alt="">
                 </div>
-                <div action="" class="info-form mb-50">
-                    <h3>기본정보</h3>
-                    <dl>
-                        <dd class="mb-20">
-                            <img :src="addressicon" alt="">
-                            <span>주소</span>
-                            <p>경상북도 구미시 송정대로 55</p>
-                        </dd>
-                        <dd class="mb-20">
-                            <img :src="yearicon" alt="">
-                            <span>생산정보</span>
-                            <p>2017</p>
-
-                        </dd>
-                        <dd>
-                            <img :src="categoryicon" alt="">
-                            <span>카테고리</span>
-                            <ul class="category">
-                                <li v-if="resultitem.category1" class="category1">카테고리1</li>
-                                <li v-if="resultitem.category2" class="category2">카테고리2</li>
-                            </ul>
-
-                        </dd>
-
-                    </dl>
+                <div class="info-form wfull">
+                   <div class="info-box">
+                        <h3>기본정보</h3>
+                        <dl>
+                            <dd class="mb-20">
+                                <img :src="addressicon" alt="">
+                                <span>링크</span>
+                                <p>https://news.sbs.co.kr/news/endPage.do?news_id=N100800
+                                    9901&plink=STAND&cooper=NAVER</p>
+                            </dd>
+                            <dd class="mb-20">
+                                <img :src="yearicon" alt="">
+                                <span>생산연도</span>
+                                <p>2017</p>
+    
+                            </dd>
+                            <dd>
+                                <img :src="categoryicon" alt="">
+                                <span>카테고리</span>
+                                <ul class="category">
+                                    <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                    <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                </ul>
+    
+                            </dd>
+    
+                        </dl>
+                   </div>
                 </div>
             </div>
         </form>
@@ -70,9 +73,9 @@
 
 
         <div class="btn-group flex-center">
-            <button class="delete w130" type="button" @click="fnDeleteUser">삭제</button>
-            <button class="update w130" type="button" @click="fnUpdateUser">수정</button>
-            <button class="list w130" type="button" @click="fnUpdateUser">목록</button>
+            <button class="red-line w130" type="button" @click="fnDeleteUser">삭제</button>
+            <button class="blue-line w130" type="button" @click="fnUpdateUser">수정</button>
+            <button class="gray-line-bg w130" type="button" @click="fnUpdateUser">목록</button>
         </div>
     </div>
 </template>
 
client/views/pages/user/NewsReleaseInsert.vue (added)
+++ client/views/pages/user/NewsReleaseInsert.vue
@@ -0,0 +1,212 @@
+<template>
+  <div class="content">
+    <div class="sub-title-area mb-30">
+      <h2>영상 기록물</h2>
+      <div class="breadcrumb-list">
+        <ul>
+          <li><img :src="homeicon" alt="Home Icon">
+            <p>기록물</p>
+          </li>
+          <li><img :src="righticon" alt=""></li>
+          <li>영상 기록물</li>
+        </ul>
+      </div>
+    </div>
+    <form action="" class="insert-form mb-50">
+      <dl>
+        <dd>
+          <label for="id" class="require">제목</label>
+          <div class="wfull"><input type="text" id="id" placeholder="제목을 입력하세요."></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="year">생산연도</label>
+          <input type="text" id="year" placeholder="생산연도를 입력하세요">
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="address">주소</label>
+          <div class="wfull"><input type="text" id="address" placeholder="주소를 입력하세요"></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="text">내용</label>
+          <div class="wfull">
+            <EditorComponent :contents="insertDTO.cn" />
+          </div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="category" class="flex align-center">
+            <p>카테고리</p><button type="button" class="category-add" @click="openModal">추가하기</button>
+          </label>
+          <ul class="category">
+            <li v-for="(category, index) in selectedCtgries" :key="index"> {{ category }} <button type="button" class="cancel" @click="removeCategory(index)"><b>✕</b></button>
+            </li>
+          </ul>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="file" class="require">파일</label>
+          <ul class="wfull">
+            <li class="flex align-center">
+              <p>파일첨부</p>
+              <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 10건까지 등록 가능하며, 건당 최대 100MB를 초과할 수 없습니다.</span></div>
+            </li>
+            <li class="file-insert">
+              <input type="file" id="fileInput" class="file-input" multiple @change="showFileNames">
+              <label for="fileInput" class="file-label mb-20">
+                <div class="flex-center align-center"><img :src="fileicon" alt="">
+                  <p>파일첨부하기</p>
+                </div>
+                <p>파일을 첨부하시려면 이 영역으로 파일을 끌고 오거나 클릭해주세요</p>
+              </label>
+              <p class="mb-10">파일목록</p>
+              <div id="fileNames" class="file-names">
+                <span v-if="fileNames.length === 0">선택된 파일이 없습니다.</span>
+                <div v-for="(file, index) in fileNames" :key="index" class="flex-sp-bw mb-5 file-wrap">
+                  <div class="file-name">
+                    <!-- Corrected here: Use file.icon instead of fileicons.img -->
+                    <img :src="file.icon" alt="fileicon">
+                    <p>{{ file.name }}</p>
+                  </div>
+                  <button type="button" class="cancel" @click="removeFile(index)"><b>✕</b></button>
+                </div>
+              </div>
+            </li>
+          </ul>
+        </dd>
+      </dl>
+    </form>
+    <div class="btn-group flex-center">
+      <button class="cancel">취소</button>
+      <button class="register">등록</button>
+    </div>
+  </div>
+  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" />
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+// COMPONENT
+import EditorComponent from '../../component/EditorComponent.vue';
+import CategorySelectModal from '../../component/modal/CategorySelectModal.vue';
+
+export default {
+  components: {
+    DoubleLeftOutlined,
+    LeftOutlined,
+    RightOutlined,
+    DoubleRightOutlined,
+    EditorComponent, CategorySelectModal,
+  },
+
+  data() {
+    return {
+      // Define the image sources
+      homeicon: 'client/resources/images/icon/home.png',
+      erroricon: 'client/resources/images/icon/error.png',
+      righticon: 'client/resources/images/icon/right.png',
+      fileicon: 'client/resources/images/icon/file.png',
+      searchicon: 'client/resources/images/icon/search.png',
+
+      isModalOpen: false,
+
+      items: [
+        { id: 1, category: '카테고리 1', selected: false },
+        { id: 2, category: '카테고리 2', selected: false },
+        { id: 3, category: '카테고리 3', selected: false },
+      ],
+      fileNames: [],
+      insertDTO: {
+        sj: null, //제목
+        cn: null, //내용
+        adres: null, // 주소
+        prdctnYear: null, // 생산연도
+        ty: 'P', // 타입 ( P: 사진, V: 영상 )
+        multipartFiles: null, // 첨부파일 정보
+        ctgryIds: null, // 카테고리 정보
+      },
+
+      files: [],
+      selectedCtgries: [], // 카테고리 목록
+    };
+  },
+  computed: {
+    filteredItems() {
+      // This could be modified to support filtering based on searchQuery
+      return this.items.filter(item =>
+        item.category.includes(this.searchQuery)
+      );
+    }
+  },
+  created() {
+  },
+  methods: {
+    registerCategories() {
+      // Add selected categories to the displayed list
+      this.selectedCtgries = this.items
+        .filter(item => item.selected)
+        .map(item => item.category);
+      this.closeModal(); // Close modal after registration
+    },
+    removeCategory(index) {
+      // Remove category from the list
+      this.selectedCtgries.splice(index, 1);
+    },
+    searchCategories() {
+      // You can implement search logic if needed
+    },
+    nextPage() {
+      if (this.currentPage < this.totalPages) {
+        this.currentPage++;
+      }
+    },
+    previousPage() {
+      if (this.currentPage > 1) {
+        this.currentPage--;
+      }
+    },
+    showFileNames(event) {
+      const files = event.target.files;
+      this.fileNames = [];  // Clear previous file names
+
+      for (let i = 0; i < files.length; i++) {
+        const file = files[i];
+        const fileType = file.name.split('.').pop().toLowerCase();  // Get file extension
+
+        // Set default icon
+        let iconPath = this.fileicons;
+
+        // Determine the icon based on file type
+        if (['jpg', 'jpeg', 'png', 'gif'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/imgicon.png';  // Example for image files
+        } else if (['pdf'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/pdficon.png';  // Example for PDF files
+        } else if (['xls'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/excelicon.png';  // Example for audio files
+        } else if (['hwp'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/hwpicon.png';  // Example for video files
+        }
+
+        // Push the file name and corresponding icon to the fileNames array
+        this.fileNames.push({
+          name: file.name,
+          icon: iconPath
+        });
+      }
+    },
+    removeFile(index) {
+      // Remove file from the list
+      this.fileNames.splice(index, 1);
+      console.log(removeFile)
+    },
+    openModal() {
+      this.isModalOpen = true;
+    },
+    // 모달 닫기
+    closeModal() {
+      this.isModalOpen = false;
+    },
+  }
+};
+</script>
 
client/views/pages/user/NewsReleaseSearch.vue (added)
+++ client/views/pages/user/NewsReleaseSearch.vue
@@ -0,0 +1,414 @@
+<template>
+    <div class="content">
+        <div class="sub-title-area mb-30">
+            <h2>보도자료</h2>
+            <div class="breadcrumb-list">
+                <ul>
+                    <!-- Bind the image source dynamically for homeicon -->
+                    <li><img :src="homeicon" alt="Home Icon">
+                        <p>언론에서 바라본 구미시</p>
+                    </li>
+                    <li><img :src="righticon" alt=""></li>
+                    <li>보도자료</li>
+                </ul>
+            </div>
+        </div>
+        <div action="search" class="search-form form ">
+            <dl>
+                <dd class="mb-15">
+                    <p>검색범위</p>
+                    <ul>
+                        <li>
+                            <input type="checkbox" id="allScope" v-model="isChkAllScope"
+                                @change="fnChkAllOptions('scope')" />
+                            <label for="allScope">전체</label>
+                        </li>
+                        <li v-for="(scope, idx) in searchType" :key="idx">
+                            <input type="checkbox" :id="idx" :name="searchType" :value="scope.key"
+                                v-model="searchReqDTO.searchType" @change="fnChkOption('scope')" />
+                            <label :for="idx">{{ scope.value }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <dd class="mb-15">
+                    <p>검색어</p>
+                    <div class="wfull"><input type="text" v-model="searchReqDTO.searchText"></div>
+                </dd>
+                <dd class="mb-15">
+                    <p>생산연도</p>
+                    <input type="date" v-model="searchReqDTO.startYear">
+                    <p class="mark">~</p>
+                    <input type="date" v-model="searchReqDTO.endYear">
+                </dd>
+                <dd class="mb-20">
+                    <p>카테고리</p>
+                    <ul>
+                        <li v-for="(category, idx) of categorys" :key="idx">
+                            <input type="checkbox" :id="category.ctgryId" name="categorys" :value="category.ctgryId"
+                                v-model="searchReqDTO.searchCtgry" />
+                            <label :for="category.ctgryId">{{ category.ctgryNm }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <dd class="mb-15">
+                    <p>정렬</p>
+                    <ul>
+                        <li v-for="(order, idx) of orders" :key="idx">
+                            <input type="radio" :id="order.key" name="orders" :value="order.key"
+                                v-model="searchReqDTO.order" />
+                            <label :for="order.key">{{ order.value }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <div class="btn-group">
+                    <button class="reset"><img :src="reseticon" alt="">
+                        <p>초기화</p>
+                    </button>
+                    <button class="search"><img :src="searchicon" alt="">
+                        <p>검색</p>
+                    </button>
+                </div>
+
+            </dl>
+
+        </div>
+        <div class="search-result">
+            <div class="tabs">
+                <div class="flex-sp-bw mb-20 align-center">
+                    <div class="resultext ">
+                        <img :src="resulticon" alt="">
+                        <p>총 <b>{{ count }}개</b>의 보도자료가 검색되었습니다. </p>
+                    </div>
+                    <div class="flex ">
+                        <ul class="tab-box mb-20">
+                            <li v-for="(tab, index) in tabs" :key="index" class="tab-title"
+                                :class="{ active: selectedTab === tab.id }" @click="selectTab(tab.id)">
+                                <img :src="selectedTab === tab.id ? tab.activeImage : tab.inactiveImage"
+                                    :alt="tab.title" class="tab-icon" />
+                                <p><b>{{ tab.title }}</b></p>
+                            </li>
+                        </ul>
+                        <div class="select-box">
+                            <select v-model="itemsPerPage" @change="changeItemsPerPage">
+                                <option :value="5" selected>5개</option>
+                                <option :value="10">10개</option>
+                                <option :value="15">15개</option>
+                            </select>
+                        </div>
+                    </div>
+
+                </div>
+
+                <div class="tab-content">
+                    <!-- Loop through tabContents, and only display content that matches selectedTab -->
+                    <div v-for="(tabContent, idx) in tabContents" :key="idx">
+                        <!-- Display content only if the tab's ID matches the selectedTab -->
+                        <div v-show="tabContent.id === selectedTab">
+                            <!-- 카드형 Section (Card Layout) -->
+                            <div v-if="tabContent.viewType === 'card'">
+                                <ul class="card-wrap">
+                                    <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+                                        <div class="result-box">
+                                            <!-- Main Image Section -->
+                                            <div class="main-img">
+                                                <img :src="resultitem.img" alt="" class="tab-image" />
+                                            </div>
+                                            <!-- Text Section -->
+                                            <div class="text-box">
+                                                <router-link :to="{ path: '/NewsReleaseDetail.page' }">
+                                                    <h5>{{ resultitem.title }}</h5>
+                                                </router-link>
+
+                                                <p class="address">{{ resultitem.address }}</p>
+                                                <p class="text">{{ resultitem.content }}</p>
+
+                                                <div class="mb-20">
+                                                    <ul class="category">
+                                                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                                    </ul>
+                                                </div>
+
+                                                <div class="date">
+                                                    <ul>
+                                                        <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                                                        <li>|</li>
+                                                        <li>등록 <b>{{ resultitem.date }}</b></li>
+                                                    </ul>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </li>
+                                </ul>
+
+                                <!-- Empty State if no results in paginatedItems -->
+                                <div v-if="paginatedItems.length === 0" class="no-results">
+                                    <p>등록된 게시물이 없습니다.</p>
+                                </div>
+                            </div>
+
+                            <!-- 리스트형 Section (List Layout) -->
+                            <div v-if="tabContent.viewType === 'list'">
+                                <ul class="list-wrap">
+                                    <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+                                        <div class="text-box">
+                                            <router-link :to="{ path: '/NewsReleaseDetail.page' }">
+                                                    <h5>{{ resultitem.title }}</h5>
+                                                </router-link>
+                                            <p class="address">{{ resultitem.address }}</p>
+
+                                            <div class="flex-sp-bw">
+                                                <div class="mb-20">
+                                                    <ul class="category">
+                                                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                                    </ul>
+                                                </div>
+
+                                                <div class="date ">
+                                                    <ul>
+                                                        <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                                                        <li>|</li>
+                                                        <li>등록 <b>{{ resultitem.date }}</b></li>
+                                                    </ul>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </li>
+                                </ul>
+
+                                <!-- Empty State if no results in paginatedItems -->
+                                <div v-if="paginatedItems.length === 0" class="no-results">
+                                    <p>등록된 게시물이 없습니다.</p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="btn-group flex-end mt-40"><button class="register"> <router-link
+                        :to="{ path: '/PicHistoryInsert.page' }">등록</router-link></button></div>
+            <div class="pagination flex-center mt-40">
+
+                <!-- Previous and Next Page Buttons -->
+                <button>
+                    <DoubleLeftOutlined />
+                </button>
+                <button @click="previousPage" :disabled="currentPage === 1">
+                    <LeftOutlined />
+                </button>
+                <button class="page-number clicked">1</button>
+                <button @click="nextPage" :disabled="currentPage === totalPages">
+                    <RightOutlined />
+                </button>
+                <button>
+                    <DoubleRightOutlined />
+                </button>
+            </div>
+        </div>
+    </div>
+
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+import { findAllCategoryProc } from "../../../resources/api/category"; // 카테고리 목록 검색
+
+export default {
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+    data() {
+        return {
+            selectedTab: 1,
+            // 검색용 객체
+            searchReqDTO: {
+                searchType: [],
+                searchText: null,
+                startYear: null,
+                endYear: null,
+                searchTy: null,
+                searchCtgry: [],
+                order: "rgsde",
+            },
+            tabs: [
+
+                {
+                    id: 1,
+                    title: "카드형",
+                    activeImage: "client/resources/images/list_icon01_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon01_off.png",
+                },
+                {
+                    id: 2,
+                    title: "리스트형",
+                    activeImage: "client/resources/images/list_icon02_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon02_off.png",
+                },
+            ],
+            tabContents: [
+                { id: 1, viewType: 'card', list: [{ sj: 'Item 1', rgsde: '2025-03-01', files: [{ filePath: 'image1.png' }] }] },
+                { id: 2, viewType: 'list', list: [{ sj: 'Item 2', rgsde: '2025-03-02', files: [{ filePath: 'image2.png' }] }] },
+            ],
+            paginatedItems: [],
+            resultitems: [
+                {
+                    img: 'client/resources/images/img6.png',
+                    title: '보도자료 제목',
+                    address: '경상북도 구미시 송정대로 55',
+                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
+                    category1: true,
+                    category2: true,
+                    year: 2020,
+                    date: '2021-01-01'
+                },
+
+            ],
+            currentPage: 1, // Current page number
+            itemsPerPage: 5,
+            resulticon: "client/resources/images/icon/r-check.png",
+            homeicon: 'client/resources/images/icon/home.png',
+            searchicon: 'client/resources/images/icon/search.png',
+            reseticon: 'client/resources/images/icon/reset.png',
+            righticon: 'client/resources/images/icon/right.png',
+            count: 23,
+            checkOptions: [
+                '전체',
+                '사진',
+                '영상',
+                '미디어 영상',
+                '보도자료',
+            ],
+            checkOptions2: [
+                '전체',
+                '제목',
+                '내용',
+                '주소',
+            ],
+            checkOptions3: [
+                '카테고리1',
+                '카테고리2',
+                '카테고리3',
+                '카테고리4',
+                '카테고리5',
+            ],
+            checkOptions4: [
+                '최신',
+                '인기',
+            ],
+            isChkAllScope: false, // 검색범위 전체 체크 여부
+            searchType: [
+                { key: "sj", value: "제목" },
+                { key: "cn", value: "내용" },
+                { key: "adres", value: "주소" },
+            ], // 검색범위 목록
+            categorys: [], // 카테고리 목록
+            orders: [
+                { key: "rgsde", value: "최신" },
+                { key: "rdcnt", value: "인기" },
+            ], // 정렬 목록
+        };
+    },
+    computed: {
+        // Total number of pages
+        totalPages() {
+            return Math.ceil(this.resultitems.length / this.itemsPerPage);
+        },
+
+        // Paginated items based on current page and items per page
+        paginatedItems() {
+            const start = (this.currentPage - 1) * this.itemsPerPage;
+            const end = start + this.itemsPerPage;
+            return this.resultitems.slice(start, end);
+        },
+    },
+    created() {
+        // 초기 데이터 세팅
+        this.isChkAllScope = true;
+        this.searchReqDTO.searchType = this.searchType.map(item => item.key);
+        this.searchReqDTO.order = this.orders[0].key
+
+        this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    },
+    methods: {
+        selectTab(tabId) {
+            this.selectedTab = tabId; // Update the selected tab index
+        },
+        // Change the number of items displayed per page
+        changeItemsPerPage() {
+            this.currentPage = 1; // Reset to first page when changing items per page
+        },
+        previousPage() {
+            if (this.currentPage > 1) {
+                this.currentPage--;
+            }
+        },
+
+        // Go to the next page
+        nextPage() {
+            if (this.currentPage < this.totalPages) {
+                this.currentPage++;
+            }
+        },
+        isChkAllScope: false, // 검색범위 전체 체크 여부
+        searchType: [
+            { key: "sj", value: "제목" },
+            { key: "cn", value: "내용" },
+            { key: "adres", value: "주소" },
+        ], // 검색범위 목록
+        categorys: [], // 카테고리 목록
+        orders: [
+            { key: "rgsde", value: "최신" },
+            { key: "rdcnt", value: "인기" },
+        ], // 정렬 목록
+
+        async fnFindCategorys() {
+            try {
+                const response = await findAllCategoryProc();
+                this.categorys = response.data.data.ctgry;
+            } catch (error) {
+                if (error.response) {
+                    console.log("에러 응답:", error.response.data);
+                }
+                console.error("Error:", error);
+            }
+        },
+
+        // 통합검색
+        async fnFindAllDatas() {
+            try {
+                let params = {};
+                if (this.searchReqDTO.searchRecord.length > 0) {
+                    params.searchRecords = this.searchReqDTO.searchRecord.join(',');
+                }
+                if (this.searchReqDTO.searchType.length > 0) {
+                    params.searchTypes = this.searchReqDTO.searchType.join(',');
+                }
+                if (this.searchReqDTO.searchCtgry.length > 0) {
+                    params.searchCtgries = this.searchReqDTO.searchCtgry.join(',');
+                }
+                params.searchText = this.searchReqDTO.searchText;
+                params.startYear = this.searchReqDTO.startYear;
+                params.endYear = this.searchReqDTO.endYear;
+                params.order = this.searchReqDTO.order;
+
+                // API 호출
+                const response = await findAllDatas(params);
+                this.searchResult = response.data.data.searchResult;
+            } catch (error) {
+                if (error.response) {
+                    console.log("에러 응답:", error.response.data);
+                }
+                console.error("Error:", error);
+            }
+        },
+    },
+
+
+
+};
+</script>
+<style scoped></style>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/user/PicHistoryDetail.vue
--- client/views/pages/user/PicHistoryDetail.vue
+++ client/views/pages/user/PicHistoryDetail.vue
@@ -74,7 +74,7 @@
                 </dd>
                 <dd class="mb-20">
                     <img :src="yearicon" alt="">
-                    <span>생산정보</span>
+                    <span>생산연도</span>
                     <p>2017</p>
 
                 </dd>
@@ -91,9 +91,9 @@
             </dl>
         </form>
         <div class="btn-group flex-center">
-            <button class="delete w130" type="button" @click="fnDeleteUser">삭제</button>
-            <button class="update w130" type="button" @click="fnUpdateUser">수정</button>
-            <button class="list w130" type="button" @click="fnUpdateUser">목록</button>
+            <button class="red-line " type="button" @click="fnDeleteUser">삭제</button>
+            <button class="blue-line " type="button" @click="fnUpdateUser">수정</button>
+            <button class="gray-line-bg " type="button" @click="fnUpdateUser">목록</button>
         </div>
     </div>
 </template>
client/views/pages/user/PicHistorySearch.vue
--- client/views/pages/user/PicHistorySearch.vue
+++ client/views/pages/user/PicHistorySearch.vue
@@ -9,11 +9,11 @@
                         <p>기록물</p>
                     </li>
                     <li><img :src="righticon" alt=""></li>
-                    <li>통합검색</li>
+                    <li>사진 기록물</li>
                 </ul>
             </div>
         </div>
-        <form action="search" class="search-form mb-40">
+        <div action="search" class="search-form form ">
             <dl>
                 <dd class="mb-15">
                     <p>검색범위</p>
@@ -71,7 +71,7 @@
 
             </dl>
 
-        </form>
+        </div>
         <div class="search-result">
             <div class="tabs">
                 <div class="flex-sp-bw mb-20 align-center">
@@ -237,14 +237,14 @@
                 {
                     id: 1,
                     title: "카드형",
-                    activeImage: "client/resources/images/mCont_ico1_on.png", // Active tab image
-                    inactiveImage: "client/resources/images/mCont_ico1_off.png",
+                    activeImage: "client/resources/images/list_icon01_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon01_off.png",
                 },
                 {
                     id: 2,
                     title: "리스트형",
-                    activeImage: "client/resources/images/mCont_ico2_on.png", // Active tab image
-                    inactiveImage: "client/resources/images/mCont_ico2_off.png",
+                    activeImage: "client/resources/images/list_icon02_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon02_off.png",
                 },
             ],
             tabContents: [
client/views/pages/user/TotalSearch.vue
--- client/views/pages/user/TotalSearch.vue
+++ client/views/pages/user/TotalSearch.vue
@@ -13,7 +13,7 @@
         </ul>
       </div>
     </div>
-    <div class="search-form mb-40">
+    <div class="search-form form ">
       <dl>
         <dd class="mb-15">
           <p>기록유형</p>
client/views/pages/user/VideoHistoryDetail.vue (copied from client/views/pages/user/BodoDetail.vue)
--- client/views/pages/user/BodoDetail.vue
+++ client/views/pages/user/VideoHistoryDetail.vue
@@ -0,0 +1,149 @@
+<template>
+    <div class="content">
+        <div class="sub-title-area mb-30">
+            <h2>영상 기록물</h2>
+            <div class="breadcrumb-list">
+                <ul>
+                    <li><img :src="homeicon" alt="Home Icon">
+                        <p>기록물</p>
+                    </li>
+                    <li><img :src="righticon" alt=""></li>
+                    <li>영상 기록물</li>
+                </ul>
+            </div>
+        </div>
+        <form action="" class="gallery-form mb-40">
+            <dl class="mb-20">
+                <dd>
+                    <p>영상 기록물 제목1
+                    </p>
+                    <div class="date flex align-center">
+                        <img :src="calendaricon" alt="">
+                        <span>2025.02.28</span>
+                    </div>
+                </dd>
+
+            </dl>
+            <div class="gallery video">
+                    <img :src="eximg" alt="">
+                </div>
+        </form>
+
+        <h3>내용</h3>
+        <form action="" class=" info-form mb-50">
+            <dl>
+                <dd>
+                    <p> 대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는
+                        41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어 있습니다.</p>
+
+                </dd>
+            </dl>
+        </form>
+
+        <h3>기본정보</h3>
+        <form action="" class="info-form mb-50">
+            <dl>
+                <dd class="mb-20">
+                    <img :src="addressicon" alt="">
+                    <span>주소</span>
+                    <p>경상북도 구미시 송정대로 55</p>
+                </dd>
+                <dd class="mb-20">
+                    <img :src="yearicon" alt="">
+                    <span>생산연도</span>
+                    <p>2017</p>
+
+                </dd>
+                <dd>
+                    <img :src="categoryicon" alt="">
+                    <span>카테고리</span>
+                    <ul class="category">
+                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                    </ul>
+
+                </dd>
+
+            </dl>
+        </form>
+        <div class="btn-group flex-center">
+            <button class="red-line " type="button" @click="fnDeleteUser">삭제</button>
+            <button class="blue-line " type="button" @click="fnUpdateUser">수정</button>
+            <button class="gray-line-bg " type="button" @click="fnUpdateUser">목록</button>
+            <button class="gradient ">다운로드</button>
+        </div>
+    </div>
+</template>
+
+<script>
+import axios from "axios";
+import { ref } from 'vue';
+import { updateUsers, logOutProc, updatePassword } from "../../../resources/api/user"
+// Import Swiper Vue components
+import { CaretRightOutlined, PauseOutlined } from '@ant-design/icons-vue';
+import { Swiper, SwiperSlide } from 'swiper/vue';
+
+// Import Swiper styles
+import 'swiper/css';
+
+import 'swiper/css/free-mode';
+import 'swiper/css/navigation';
+import 'swiper/css/thumbs';
+
+// import required modules
+import { FreeMode, Navigation, Thumbs } from 'swiper/modules';
+
+export default {
+    components: {
+        PauseOutlined,
+        CaretRightOutlined,
+        Swiper,
+        SwiperSlide,
+    },
+    setup() {
+        const thumbsSwiper = ref(null);
+
+        const setThumbsSwiper = (swiper) => {
+            thumbsSwiper.value = swiper;
+        };
+
+        return {
+            thumbsSwiper,
+            setThumbsSwiper,
+            modules: [FreeMode, Navigation, Thumbs],
+        };
+    },
+    data() {
+        return {
+            resultitem: {
+                category1: true,
+                category2: true,
+            },
+            calendaricon: 'client/resources/images/icon/calendaricon.png',
+            homeicon: 'client/resources/images/icon/home.png',
+            erroricon: 'client/resources/images/icon/error.png',
+            righticon: 'client/resources/images/icon/right.png',
+            addressicon: 'client/resources/images/icon/addressicon.png',
+            yearicon: 'client/resources/images/icon/yearicon.png',
+            categoryicon: 'client/resources/images/icon/categoryicon.png',
+            eximg: 'client/resources/images/img8.png',
+            slides: [
+                { img: 'client/resources/images/visual.png', alt: 'Slide 1' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 2' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+                // Add more slides as needed
+            ],
+
+        };
+    },
+    methods: {
+    },
+    watch: {},
+    computed: {
+    },
+    mounted() { },
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/user/VideoHistoryInsert.vue (added)
+++ client/views/pages/user/VideoHistoryInsert.vue
@@ -0,0 +1,212 @@
+<template>
+  <div class="content">
+    <div class="sub-title-area mb-30">
+      <h2>영상 기록물</h2>
+      <div class="breadcrumb-list">
+        <ul>
+          <li><img :src="homeicon" alt="Home Icon">
+            <p>기록물</p>
+          </li>
+          <li><img :src="righticon" alt=""></li>
+          <li>영상 기록물</li>
+        </ul>
+      </div>
+    </div>
+    <form action="" class="insert-form mb-50">
+      <dl>
+        <dd>
+          <label for="id" class="require">제목</label>
+          <div class="wfull"><input type="text" id="id" placeholder="제목을 입력하세요."></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="year">생산연도</label>
+          <input type="text" id="year" placeholder="생산연도를 입력하세요">
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="address">주소</label>
+          <div class="wfull"><input type="text" id="address" placeholder="주소를 입력하세요"></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="text">내용</label>
+          <div class="wfull">
+            <EditorComponent :contents="insertDTO.cn" />
+          </div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="category" class="flex align-center">
+            <p>카테고리</p><button type="button" class="category-add" @click="openModal">추가하기</button>
+          </label>
+          <ul class="category">
+            <li v-for="(category, index) in selectedCtgries" :key="index"> {{ category }} <button type="button" class="cancel" @click="removeCategory(index)"><b>✕</b></button>
+            </li>
+          </ul>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="file" class="require">파일</label>
+          <ul class="wfull">
+            <li class="flex align-center">
+              <p>파일첨부</p>
+              <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 10건까지 등록 가능하며, 건당 최대 100MB를 초과할 수 없습니다.</span></div>
+            </li>
+            <li class="file-insert">
+              <input type="file" id="fileInput" class="file-input" multiple @change="showFileNames">
+              <label for="fileInput" class="file-label mb-20">
+                <div class="flex-center align-center"><img :src="fileicon" alt="">
+                  <p>파일첨부하기</p>
+                </div>
+                <p>파일을 첨부하시려면 이 영역으로 파일을 끌고 오거나 클릭해주세요</p>
+              </label>
+              <p class="mb-10">파일목록</p>
+              <div id="fileNames" class="file-names">
+                <span v-if="fileNames.length === 0">선택된 파일이 없습니다.</span>
+                <div v-for="(file, index) in fileNames" :key="index" class="flex-sp-bw mb-5 file-wrap">
+                  <div class="file-name">
+                    <!-- Corrected here: Use file.icon instead of fileicons.img -->
+                    <img :src="file.icon" alt="fileicon">
+                    <p>{{ file.name }}</p>
+                  </div>
+                  <button type="button" class="cancel" @click="removeFile(index)"><b>✕</b></button>
+                </div>
+              </div>
+            </li>
+          </ul>
+        </dd>
+      </dl>
+    </form>
+    <div class="btn-group flex-center">
+      <button class="cancel">취소</button>
+      <button class="register">등록</button>
+    </div>
+  </div>
+  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" />
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+// COMPONENT
+import EditorComponent from '../../component/EditorComponent.vue';
+import CategorySelectModal from '../../component/modal/CategorySelectModal.vue';
+
+export default {
+  components: {
+    DoubleLeftOutlined,
+    LeftOutlined,
+    RightOutlined,
+    DoubleRightOutlined,
+    EditorComponent, CategorySelectModal,
+  },
+
+  data() {
+    return {
+      // Define the image sources
+      homeicon: 'client/resources/images/icon/home.png',
+      erroricon: 'client/resources/images/icon/error.png',
+      righticon: 'client/resources/images/icon/right.png',
+      fileicon: 'client/resources/images/icon/file.png',
+      searchicon: 'client/resources/images/icon/search.png',
+
+      isModalOpen: false,
+
+      items: [
+        { id: 1, category: '카테고리 1', selected: false },
+        { id: 2, category: '카테고리 2', selected: false },
+        { id: 3, category: '카테고리 3', selected: false },
+      ],
+      fileNames: [],
+      insertDTO: {
+        sj: null, //제목
+        cn: null, //내용
+        adres: null, // 주소
+        prdctnYear: null, // 생산연도
+        ty: 'P', // 타입 ( P: 사진, V: 영상 )
+        multipartFiles: null, // 첨부파일 정보
+        ctgryIds: null, // 카테고리 정보
+      },
+
+      files: [],
+      selectedCtgries: [], // 카테고리 목록
+    };
+  },
+  computed: {
+    filteredItems() {
+      // This could be modified to support filtering based on searchQuery
+      return this.items.filter(item =>
+        item.category.includes(this.searchQuery)
+      );
+    }
+  },
+  created() {
+  },
+  methods: {
+    registerCategories() {
+      // Add selected categories to the displayed list
+      this.selectedCtgries = this.items
+        .filter(item => item.selected)
+        .map(item => item.category);
+      this.closeModal(); // Close modal after registration
+    },
+    removeCategory(index) {
+      // Remove category from the list
+      this.selectedCtgries.splice(index, 1);
+    },
+    searchCategories() {
+      // You can implement search logic if needed
+    },
+    nextPage() {
+      if (this.currentPage < this.totalPages) {
+        this.currentPage++;
+      }
+    },
+    previousPage() {
+      if (this.currentPage > 1) {
+        this.currentPage--;
+      }
+    },
+    showFileNames(event) {
+      const files = event.target.files;
+      this.fileNames = [];  // Clear previous file names
+
+      for (let i = 0; i < files.length; i++) {
+        const file = files[i];
+        const fileType = file.name.split('.').pop().toLowerCase();  // Get file extension
+
+        // Set default icon
+        let iconPath = this.fileicons;
+
+        // Determine the icon based on file type
+        if (['jpg', 'jpeg', 'png', 'gif'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/imgicon.png';  // Example for image files
+        } else if (['pdf'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/pdficon.png';  // Example for PDF files
+        } else if (['xls'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/excelicon.png';  // Example for audio files
+        } else if (['hwp'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/hwpicon.png';  // Example for video files
+        }
+
+        // Push the file name and corresponding icon to the fileNames array
+        this.fileNames.push({
+          name: file.name,
+          icon: iconPath
+        });
+      }
+    },
+    removeFile(index) {
+      // Remove file from the list
+      this.fileNames.splice(index, 1);
+      console.log(removeFile)
+    },
+    openModal() {
+      this.isModalOpen = true;
+    },
+    // 모달 닫기
+    closeModal() {
+      this.isModalOpen = false;
+    },
+  }
+};
+</script>
 
client/views/pages/user/VideoHistorySearch.vue (added)
+++ client/views/pages/user/VideoHistorySearch.vue
@@ -0,0 +1,414 @@
+<template>
+    <div class="content">
+        <div class="sub-title-area mb-30">
+            <h2>영상 기록물</h2>
+            <div class="breadcrumb-list">
+                <ul>
+                    <!-- Bind the image source dynamically for homeicon -->
+                    <li><img :src="homeicon" alt="Home Icon">
+                        <p>기록물</p>
+                    </li>
+                    <li><img :src="righticon" alt=""></li>
+                    <li>영상 기록물</li>
+                </ul>
+            </div>
+        </div>
+        <div action="search" class="search-form form ">
+            <dl>
+                <dd class="mb-15">
+                    <p>검색범위</p>
+                    <ul>
+                        <li>
+                            <input type="checkbox" id="allScope" v-model="isChkAllScope"
+                                @change="fnChkAllOptions('scope')" />
+                            <label for="allScope">전체</label>
+                        </li>
+                        <li v-for="(scope, idx) in searchType" :key="idx">
+                            <input type="checkbox" :id="idx" :name="searchType" :value="scope.key"
+                                v-model="searchReqDTO.searchType" @change="fnChkOption('scope')" />
+                            <label :for="idx">{{ scope.value }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <dd class="mb-15">
+                    <p>검색어</p>
+                    <div class="wfull"><input type="text" v-model="searchReqDTO.searchText"></div>
+                </dd>
+                <dd class="mb-15">
+                    <p>생산연도</p>
+                    <input type="date" v-model="searchReqDTO.startYear">
+                    <p class="mark">~</p>
+                    <input type="date" v-model="searchReqDTO.endYear">
+                </dd>
+                <dd class="mb-20">
+                    <p>카테고리</p>
+                    <ul>
+                        <li v-for="(category, idx) of categorys" :key="idx">
+                            <input type="checkbox" :id="category.ctgryId" name="categorys" :value="category.ctgryId"
+                                v-model="searchReqDTO.searchCtgry" />
+                            <label :for="category.ctgryId">{{ category.ctgryNm }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <dd class="mb-15">
+                    <p>정렬</p>
+                    <ul>
+                        <li v-for="(order, idx) of orders" :key="idx">
+                            <input type="radio" :id="order.key" name="orders" :value="order.key"
+                                v-model="searchReqDTO.order" />
+                            <label :for="order.key">{{ order.value }}</label>
+                        </li>
+                    </ul>
+                </dd>
+                <div class="btn-group">
+                    <button class="reset"><img :src="reseticon" alt="">
+                        <p>초기화</p>
+                    </button>
+                    <button class="search"><img :src="searchicon" alt="">
+                        <p>검색</p>
+                    </button>
+                </div>
+
+            </dl>
+
+        </div>
+        <div class="search-result">
+            <div class="tabs">
+                <div class="flex-sp-bw mb-20 align-center">
+                    <div class="resultext ">
+                        <img :src="resulticon" alt="">
+                        <p>총 <b>{{ count }}개</b>의 영상 기록물이 검색되었습니다. </p>
+                    </div>
+                    <div class="flex ">
+                        <ul class="tab-box mb-20">
+                            <li v-for="(tab, index) in tabs" :key="index" class="tab-title"
+                                :class="{ active: selectedTab === tab.id }" @click="selectTab(tab.id)">
+                                <img :src="selectedTab === tab.id ? tab.activeImage : tab.inactiveImage"
+                                    :alt="tab.title" class="tab-icon" />
+                                <p><b>{{ tab.title }}</b></p>
+                            </li>
+                        </ul>
+                        <div class="select-box">
+                            <select v-model="itemsPerPage" @change="changeItemsPerPage">
+                                <option :value="5" selected>5개</option>
+                                <option :value="10">10개</option>
+                                <option :value="15">15개</option>
+                            </select>
+                        </div>
+                    </div>
+
+                </div>
+
+                <div class="tab-content">
+                    <!-- Loop through tabContents, and only display content that matches selectedTab -->
+                    <div v-for="(tabContent, idx) in tabContents" :key="idx">
+                        <!-- Display content only if the tab's ID matches the selectedTab -->
+                        <div v-show="tabContent.id === selectedTab">
+                            <!-- 카드형 Section (Card Layout) -->
+                            <div v-if="tabContent.viewType === 'card'">
+                                <ul class="card-wrap">
+                                    <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+                                        <div class="result-box">
+                                            <!-- Main Image Section -->
+                                            <div class="main-img">
+                                                <img :src="resultitem.img" alt="" class="tab-image" />
+                                            </div>
+                                            <!-- Text Section -->
+                                            <div class="text-box">
+                                                <router-link :to="{ path: '/VideoHistoryDetail.page' }">
+                                                    <h5>{{ resultitem.title }}</h5>
+                                                </router-link>
+
+                                                <p class="address">{{ resultitem.address }}</p>
+                                                <p class="text">{{ resultitem.content }}</p>
+
+                                                <div class="mb-20">
+                                                    <ul class="category">
+                                                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                                    </ul>
+                                                </div>
+
+                                                <div class="date">
+                                                    <ul>
+                                                        <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                                                        <li>|</li>
+                                                        <li>등록 <b>{{ resultitem.date }}</b></li>
+                                                    </ul>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </li>
+                                </ul>
+
+                                <!-- Empty State if no results in paginatedItems -->
+                                <div v-if="paginatedItems.length === 0" class="no-results">
+                                    <p>등록된 게시물이 없습니다.</p>
+                                </div>
+                            </div>
+
+                            <!-- 리스트형 Section (List Layout) -->
+                            <div v-if="tabContent.viewType === 'list'">
+                                <ul class="list-wrap">
+                                    <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+                                        <div class="text-box">
+                                            <router-link :to="{ path: '/VideoHistoryDetail.page' }">
+                                                    <h5>{{ resultitem.title }}</h5>
+                                                </router-link>
+                                            <p class="address">{{ resultitem.address }}</p>
+
+                                            <div class="flex-sp-bw">
+                                                <div class="mb-20">
+                                                    <ul class="category">
+                                                        <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                                                        <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                                                    </ul>
+                                                </div>
+
+                                                <div class="date ">
+                                                    <ul>
+                                                        <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                                                        <li>|</li>
+                                                        <li>등록 <b>{{ resultitem.date }}</b></li>
+                                                    </ul>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </li>
+                                </ul>
+
+                                <!-- Empty State if no results in paginatedItems -->
+                                <div v-if="paginatedItems.length === 0" class="no-results">
+                                    <p>등록된 게시물이 없습니다.</p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="btn-group flex-end mt-40"><button class="register"> <router-link
+                        :to="{ path: '/VideoHistoryInsert.page' }">등록</router-link></button></div>
+            <div class="pagination flex-center mt-40">
+
+                <!-- Previous and Next Page Buttons -->
+                <button>
+                    <DoubleLeftOutlined />
+                </button>
+                <button @click="previousPage" :disabled="currentPage === 1">
+                    <LeftOutlined />
+                </button>
+                <button class="page-number clicked">1</button>
+                <button @click="nextPage" :disabled="currentPage === totalPages">
+                    <RightOutlined />
+                </button>
+                <button>
+                    <DoubleRightOutlined />
+                </button>
+            </div>
+        </div>
+    </div>
+
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+import { findAllCategoryProc } from "../../../resources/api/category"; // 카테고리 목록 검색
+
+export default {
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+    data() {
+        return {
+            selectedTab: 1,
+            // 검색용 객체
+            searchReqDTO: {
+                searchType: [],
+                searchText: null,
+                startYear: null,
+                endYear: null,
+                searchTy: null,
+                searchCtgry: [],
+                order: "rgsde",
+            },
+            tabs: [
+
+                {
+                    id: 1,
+                    title: "카드형",
+                    activeImage: "client/resources/images/list_icon01_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon01_off.png",
+                },
+                {
+                    id: 2,
+                    title: "리스트형",
+                    activeImage: "client/resources/images/list_icon02_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/list_icon02_off.png",
+                },
+            ],
+            tabContents: [
+                { id: 1, viewType: 'card', list: [{ sj: 'Item 1', rgsde: '2025-03-01', files: [{ filePath: 'image1.png' }] }] },
+                { id: 2, viewType: 'list', list: [{ sj: 'Item 2', rgsde: '2025-03-02', files: [{ filePath: 'image2.png' }] }] },
+            ],
+            paginatedItems: [],
+            resultitems: [
+                {
+                    img: 'client/resources/images/img6.png',
+                    title: '영상 기록물 제목',
+                    address: '경상북도 구미시 송정대로 55',
+                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
+                    category1: true,
+                    category2: true,
+                    year: 2020,
+                    date: '2021-01-01'
+                },
+
+            ],
+            currentPage: 1, // Current page number
+            itemsPerPage: 5,
+            resulticon: "client/resources/images/icon/r-check.png",
+            homeicon: 'client/resources/images/icon/home.png',
+            searchicon: 'client/resources/images/icon/search.png',
+            reseticon: 'client/resources/images/icon/reset.png',
+            righticon: 'client/resources/images/icon/right.png',
+            count: 23,
+            checkOptions: [
+                '전체',
+                '사진',
+                '영상',
+                '미디어 영상',
+                '보도자료',
+            ],
+            checkOptions2: [
+                '전체',
+                '제목',
+                '내용',
+                '주소',
+            ],
+            checkOptions3: [
+                '카테고리1',
+                '카테고리2',
+                '카테고리3',
+                '카테고리4',
+                '카테고리5',
+            ],
+            checkOptions4: [
+                '최신',
+                '인기',
+            ],
+            isChkAllScope: false, // 검색범위 전체 체크 여부
+            searchType: [
+                { key: "sj", value: "제목" },
+                { key: "cn", value: "내용" },
+                { key: "adres", value: "주소" },
+            ], // 검색범위 목록
+            categorys: [], // 카테고리 목록
+            orders: [
+                { key: "rgsde", value: "최신" },
+                { key: "rdcnt", value: "인기" },
+            ], // 정렬 목록
+        };
+    },
+    computed: {
+        // Total number of pages
+        totalPages() {
+            return Math.ceil(this.resultitems.length / this.itemsPerPage);
+        },
+
+        // Paginated items based on current page and items per page
+        paginatedItems() {
+            const start = (this.currentPage - 1) * this.itemsPerPage;
+            const end = start + this.itemsPerPage;
+            return this.resultitems.slice(start, end);
+        },
+    },
+    created() {
+        // 초기 데이터 세팅
+        this.isChkAllScope = true;
+        this.searchReqDTO.searchType = this.searchType.map(item => item.key);
+        this.searchReqDTO.order = this.orders[0].key
+
+        this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    },
+    methods: {
+        selectTab(tabId) {
+            this.selectedTab = tabId; // Update the selected tab index
+        },
+        // Change the number of items displayed per page
+        changeItemsPerPage() {
+            this.currentPage = 1; // Reset to first page when changing items per page
+        },
+        previousPage() {
+            if (this.currentPage > 1) {
+                this.currentPage--;
+            }
+        },
+
+        // Go to the next page
+        nextPage() {
+            if (this.currentPage < this.totalPages) {
+                this.currentPage++;
+            }
+        },
+        isChkAllScope: false, // 검색범위 전체 체크 여부
+        searchType: [
+            { key: "sj", value: "제목" },
+            { key: "cn", value: "내용" },
+            { key: "adres", value: "주소" },
+        ], // 검색범위 목록
+        categorys: [], // 카테고리 목록
+        orders: [
+            { key: "rgsde", value: "최신" },
+            { key: "rdcnt", value: "인기" },
+        ], // 정렬 목록
+
+        async fnFindCategorys() {
+            try {
+                const response = await findAllCategoryProc();
+                this.categorys = response.data.data.ctgry;
+            } catch (error) {
+                if (error.response) {
+                    console.log("에러 응답:", error.response.data);
+                }
+                console.error("Error:", error);
+            }
+        },
+
+        // 통합검색
+        async fnFindAllDatas() {
+            try {
+                let params = {};
+                if (this.searchReqDTO.searchRecord.length > 0) {
+                    params.searchRecords = this.searchReqDTO.searchRecord.join(',');
+                }
+                if (this.searchReqDTO.searchType.length > 0) {
+                    params.searchTypes = this.searchReqDTO.searchType.join(',');
+                }
+                if (this.searchReqDTO.searchCtgry.length > 0) {
+                    params.searchCtgries = this.searchReqDTO.searchCtgry.join(',');
+                }
+                params.searchText = this.searchReqDTO.searchText;
+                params.startYear = this.searchReqDTO.startYear;
+                params.endYear = this.searchReqDTO.endYear;
+                params.order = this.searchReqDTO.order;
+
+                // API 호출
+                const response = await findAllDatas(params);
+                this.searchResult = response.data.data.searchResult;
+            } catch (error) {
+                if (error.response) {
+                    console.log("에러 응답:", error.response.data);
+                }
+                console.error("Error:", error);
+            }
+        },
+    },
+
+
+
+};
+</script>
+<style scoped></style>(파일 끝에 줄바꿈 문자 없음)
Add a comment
List