최정임 최정임 03-25
250325 최정임 카테고리, 회원관리 페이지 퍼블
@9e27a44eefa79640e0ea4a19ebffba386760988e
client/resources/css/common/common.css
--- client/resources/css/common/common.css
+++ client/resources/css/common/common.css
@@ -1,6 +1,6 @@
 *{
     padding: 0; margin: 0;  color: #000;
-    font-family: "Pretendard-R";
+    font-family: "Pretendard-R"; box-sizing: border-box;
 }
 html{font-size: 10px;}
 
@@ -19,8 +19,8 @@
     background-color: #f6f6f6 !important; 
     color: #999;
 }
-
-
+select:focus {border: 0;}
+textarea{resize: none;}
 
 
 .w130{width: 130px;}
@@ -62,21 +62,60 @@
     padding: 15px 30px;
     border-radius: 10px;
     font-size: 20px;
-    &.signout{
+   
+}
+.btn-group-small .button{
+    padding: 10px 25px;
+    border-radius: 5px;
+    font-size: 16px;
+    font-family: "Pretendard-M";
+    cursor: pointer;
+    p{
+        font-size: 16px;
+    font-family: "Pretendard-M";
+    }
+}
+
+.button{
+    &.red-line{
         border: 1px solid #ce3e48;
         color: #ce3e48;
     }
-    &.delete{
-        border: 1px solid #ce3e48;
-        color: #ce3e48;
-    }
-    &.update{
+    &.blue-line{
         border: 1px solid #275cbd;
         color: #275cbd;
     }
-    &.list{
+    &.blue-line-bg{
+        border: 1px solid #007ac3;
+        background-color: #eff5f9;
+        color: #0271b3;
+        p{
+            color: #0271b3;
+        }
+    }
+    &.green-line{
+        border: 1px solid #32b31d;
+        color: #2d9b1b;
+    }
+    &.gray-line{
+        border: 1px solid #636364;
+        color: #000;
+    }
+    &.gray-bg{
+        background-color: #636364;
+        color: #fff;
+    }
+    &.gray-line-bg{
         border: 1px solid #636364;
         background-color: #f9f9f9;
         color: #000;
     }
-}
+    &.pink-line-bg{
+        border: 1px solid #a5067b;
+        background-color: #f7ebf4;
+        color: #a5067b;
+        p{
+            color: #a5067b;
+        }
+    }
+}
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/user/sub.css
--- client/resources/css/user/sub.css
+++ client/resources/css/user/sub.css
@@ -39,10 +39,10 @@
         font-size: 18px;
     }
 
-        
+
     /* pagination */
-    .pagination{
-        button{
+    .pagination {
+        button {
             width: 40px;
             height: 40px;
             margin: 0 4px;
@@ -50,7 +50,8 @@
             background-color: #fff;
             border-radius: 50px;
         }
-        button.page-number{
+
+        button.page-number {
             font-size: 20px;
             color: #555555;
             width: 40px;
@@ -58,23 +59,26 @@
             background-color: #f0f1f4;
             border-radius: 50px;
         }
-        button.page-number.clicked{
+
+        button.page-number.clicked {
             background-color: #ce3e48;
             color: #fff;
         }
-        .anticon{
-            svg{
+
+        .anticon {
+            svg {
                 font-size: 17px;
-                path{
+
+                path {
                     color: #636364;
                 }
             }
-            
-        
+
+
         }
     }
-    
-    
+
+
 
 }
 
@@ -125,7 +129,8 @@
         width: 130px;
         background-color: #ce3e48;
         color: #fff;
-        a{
+
+        a {
             color: #fff;
         }
     }
@@ -137,7 +142,8 @@
     border-radius: 20px;
 
     input {
-        padding: 15px;
+        padding: 0 15px;
+        height: 50px;
         border: 1px solid #dddddd;
         border-radius: 5px;
         font-size: 16px;
@@ -147,8 +153,17 @@
     dd {
         display: flex;
         align-items: center;
-        p{font-size: 20px;     font-family: "Pretendard-L"; line-height: 30px;}
-        span{font-size: 20px;     font-family: "Pretendard-SB";}
+
+        p {
+            font-size: 20px;
+            font-family: "Pretendard-L";
+            line-height: 30px;
+        }
+
+        span {
+            font-size: 20px;
+            font-family: "Pretendard-SB";
+        }
     }
 
     label {
@@ -184,7 +199,7 @@
         display: flex;
         justify-content: space-between;
         margin-bottom: 10px;
-      }
+    }
 
     li {
         width: fit-content;
@@ -197,7 +212,7 @@
             color: #a5067b;
             border: 1px solid #a5067b;
         }
-        
+
         &:nth-child(even) {
             color: #007ac3;
             border: 1px solid #007ac3;
@@ -277,10 +292,15 @@
     }
 }
 
-.info-form{
-    dd{
-        img{margin-right: 17px;}
-        span{width: 118px;}
+.info-form {
+    dd {
+        img {
+            margin-right: 17px;
+        }
+
+        span {
+            width: 118px;
+        }
     }
 }
 
@@ -299,6 +319,7 @@
                 width: 180px;
                 flex-shrink: 0;
             }
+
             input[type="text"] {
                 background-color: #f6f6f6;
                 border: 0;
@@ -362,24 +383,28 @@
     }
 
 
-    
+
 
 }
+.select-box {
+    width: 106px;
+    height: 30px;
+    border: 1px solid #cccccc;
+    border-radius: 5px;
+    flex-shrink: 0;
+    padding: 0 10px;
+    line-height: 30px;
+    margin-left: 30px;
 
-.search-result {
-    .select-box{
+    select {
         width: 106px;
-        border: 1px solid #cccccc;
-        border-radius: 5px;
-        flex-shrink: 0;
-        padding: 10px;
-        margin-left: 30px;
-        select {
-            border: 0;
-            font-size: 14px;
-        }
+        border: 0;
+        font-size: 14px;
     }
+}
+.search-result {
     
+
 
     .resultext {
         .main-img {
@@ -413,8 +438,9 @@
         border-radius: 24px;
         padding: 30px;
 
-        
+
     }
+
     .text-box {
 
         p,
@@ -464,70 +490,82 @@
             }
         }
     }
-    .tabs{
-        .tab-box{display: flex;
+
+    .tabs {
+        .tab-box {
+            display: flex;
             justify-content: end;
             gap: 25px;
         }
-        .tab-title{
+
+        .tab-title {
             display: flex;
             align-items: center;
             gap: 13px;
-            p{
+
+            p {
                 cursor: pointer;
                 font-family: "HAPPINESS-SANS-REGULAR";
                 color: #cccccc;
                 font-size: 17px;
-                b{
+
+                b {
                     color: #cccccc;
                 }
             }
-           
+
         }
-        .tab-title.active p{
+
+        .tab-title.active p {
             color: #000;
-            
-            b{
+
+            b {
                 color: #ff4141;
-                
+
             }
-            
+
         }
-        .tab-content{
-            .content-wrap{
+
+        .tab-content {
+            .content-wrap {
                 margin-top: -23px;
             }
-            .box-wrap{
+
+            .box-wrap {
                 width: 454px;
                 height: 370px;
-                .box { 
-                    background-image: linear-gradient(#fff, #fff), 
-                    linear-gradient(-45deg, #fff, #fff);
+
+                .box {
+                    background-image: linear-gradient(#fff, #fff),
+                        linear-gradient(-45deg, #fff, #fff);
                     background-origin: border-box;
                     background-clip: content-box, border-box;
                     border: 3px solid transparent;
                     border-radius: 32px;
                 }
-            
+
                 .box:hover {
-                    background-image: linear-gradient(#fff, #fff), 
-                    linear-gradient(-45deg, #ca3e49, #3d355d);
+                    background-image: linear-gradient(#fff, #fff),
+                        linear-gradient(-45deg, #ca3e49, #3d355d);
                 }
-                .tab-image{
+
+                .tab-image {
                     width: 100%;
                     height: 297px;
                     object-fit: cover;
                     border-radius: 30px;
                 }
-               
+
             }
-            
+
         }
-    
+
     }
-    .list-wrap{
+
+    .list-wrap {
         border-top: 2px solid #000;
-        &>li{
+
+        &>li {
             border-bottom: 2px solid #eeeeee;
             padding: 30px 10px;
         }
@@ -654,7 +692,7 @@
 
 .modal-content {
     background-color: #fff;
-    padding: 50px 35px; 
+    padding: 50px 35px;
     border-radius: 8px;
     max-width: 1000px;
     width: 100%;
@@ -664,20 +702,23 @@
         font-family: "Pretendard-B";
         font-size: 30px;
     }
-    .modal-search{
+
+    .modal-search {
         padding: 13px;
         background-color: rgba(0, 61, 97, 0.05);
         border-radius: 10px;
-        input{
+
+        input {
             padding: 0px 20px;
             background-color: #fff;
-            border-radius:5px;
+            border-radius: 5px;
             width: 300px;
             height: 45px;
             font-size: 16px;
             margin-right: 5px;
         }
-        .search-btn{
+
+        .search-btn {
             display: flex;
             align-items: center;
             justify-content: center;
@@ -685,7 +726,8 @@
             height: 45px;
             gap: 5px;
             border-radius: 5px;
-            p{
+
+            p {
                 font-size: 16px;
                 color: #fff;
                 font-family: "Pretendard-SB";
@@ -702,11 +744,16 @@
         border: none;
         border-radius: 50px;
     }
-    button.closebtn{font-size: 20px;}
+
+    button.closebtn {
+        font-size: 20px;
+    }
+
     button:hover {
         background-color: #0056b3;
     }
-    .register-b{
+
+    .register-b {
         width: 110px;
         height: 40px;
         font-size: 18px;
@@ -714,91 +761,140 @@
         color: #fff;
         font-family: "Pretendard-M";
     }
-    
+
 }
 
 
 /* 사진기록물 상세페이지 */
-.gallery-form{
+.gallery-form {
     border: 0;
-    dl{
+
+    dl {
         padding: 30px 0 0 0;
         border-top: 2px solid #000;
-        dd{
+
+        dd {
             position: relative;
             background: #f6f6f6;
             padding: 25px 0px;
-            p{flex: 1; font-size: 35px; text-align: center; font-family: "Pretendard-B"}
-            .date{
+
+            p {
+                flex: 1;
+                font-size: 35px;
+                text-align: center;
+                font-family: "Pretendard-B"
+            }
+
+            .date {
                 position: absolute;
                 right: 30px;
-                span{ font-family: "Pretendard-R"; font-size: 18px;}
-                img{
-                    
+
+                span {
+                    font-family: "Pretendard-R";
+                    font-size: 18px;
+                }
+
+                img {
+
                     object-fit: contain;
                     margin-right: 10px;
                 }
 
             }
-           
-           
+
+
         }
-    
+
     }
-    .gallery{
+
+    .gallery {
         margin-bottom: 107px;
         position: relative;
-        .main-swiper{
-            .swiper{
+
+        .main-swiper {
+            .swiper {
                 width: 100%;
-                .swiper-slide{
-                    img{
+
+                .swiper-slide {
+                    img {
                         height: 800px;
                         width: 100%;
                         object-fit: contain;
                         background-color: #ddd;
                     }
                 }
-               
+
             }
         }
-        .thumbnail{
+
+        .thumbnail {
             width: 1127px;
             padding: 30px 0px;
-                background-color: #fff;
-                border-radius: 90px;
-                position: absolute;
-                z-index: 1;
-                left: 50%;
+            background-color: #fff;
+            border-radius: 90px;
+            position: absolute;
+            z-index: 1;
+            left: 50%;
             transform: translateX(-50%);
             bottom: -10%;
-            box-shadow:1px 2px 19px 1px rgba(0, 0, 0, 0.04);
-            .swiper{
-                width:940px;
+            box-shadow: 1px 2px 19px 1px rgba(0, 0, 0, 0.04);
+
+            .swiper {
+                width: 940px;
                 position: initial;
                 height: 120px;
                 margin: 0 auto;
-                .swiper-wrapper{
+
+                .swiper-wrapper {
                     margin: 0;
                 }
+
                 .swiper-slide img {
                     width: -webkit-fill-available;
                 }
-    
+
             }
         }
-        .swiper-button-prev, .swiper-button-next{
-            box-shadow: none ;
+
+        .swiper-button-prev,
+        .swiper-button-next {
+            box-shadow: none;
             margin-top: -35px;
         }
-        .swiper-button-prev{left: 20px;}
-        .swiper-button-next{right: 20px;}
-        
+
+        .swiper-button-prev {
+            left: 20px;
+        }
+
+        .swiper-button-next {
+            right: 20px;
+        }
+
     }
-    .btn-group{
+
+    .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;
+
+        dd {
+            background-color: transparent;
+
+            p {
+                font-size: 20px;
+                text-align: left;
+                font-family: "Pretendard-L";
+            }
+        }
+    }
+
+    .btn-group {
         margin-top: 24px;
         text-align: center;
-        button{
+
+        button {
             width: 160px;
             height: 46px;
             font-family: "Pretendard-B";
@@ -807,19 +903,113 @@
             text-align: left;
             margin: 0 5px;
         }
-        .select-down{
+
+        .select-down {
             background-image: url(../../images/downbtn_border.png);
         }
-        .all-down{
+
+        .all-down {
             background-image: url(../../images/downbtn_bg.png);
             color: #fff;
         }
-    } 
-    
-   
+    }
+
+
 }
 
+/* 회원관리,  카테고리 관리 */
+.management{
+    .left-con{width: 350px; margin-right: 55px;}
 
+    .search-area{
+        gap: 5px;
+        padding: 0;
+        height: 40px;
+    }
+    .search-wrap{
+        
+        position: initial;
+        transform: none;
+        
+        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; }
+        }
+        .search-btn{
+            position: relative;
+            flex-shrink: 0;
+            width: 40px;
+            height: 40px;
+            background-color: #000;
+            border-radius: 5px;
+            img{
+                position: absolute;
+                left: 50%;
+                right: 50%;
+                transform: translateX(-50%) translateY(-50%);
+            }
+           
+        }
+    }
+    .btn-group-small{
+        gap: 5px;
+        .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; 
+        }
+    }
+    .switch{
+        label{margin-top: -12px;}
+    }
+    table{
+        border-radius: 10px;
+        overflow: hidden;
+        
+        thead{
+            background-color: #636364;
+            th{color: #fff; border: 1px solid #eee;}
+        }
+        td{border: 1px solid #eee; text-align: center;}
+        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;
+        }
+    }
+    .delete-member {
+        background-color: #f5f8f9; 
+        td{
+            color: #aaaaaa;
+            
+        }
+      }
+      textarea{border-color: #ddd;}
+}
 
 
 
@@ -891,7 +1081,8 @@
     /* Change the label color when checkbox is checked */
 }
 
-input[type="checkbox"]+label, input[type='radio']+label {
+input[type="checkbox"]+label,
+input[type='radio']+label {
     font-size: 17px;
     font-family: "Pretendard-L";
 }
@@ -926,24 +1117,83 @@
     /*라인*/
 }
 
+.switch {
+    input[type="checkbox"] {
+        height: 0;
+        width: 0;
+        visibility: hidden;
+    }
+
+    label {
+        cursor: pointer;
+        text-indent: -9999px;
+        width: 65px;
+        height: 28px;
+        background: #544483;
+        display: block;
+        border-radius: 100px;
+        position: relative;
+        transition: background-color 0.3s ease; /* Added smooth transition for background */
+    }
+
+    label:after {
+        content: '';
+        position: absolute;
+        top: 4px;
+        left: 5px;
+        width: 20px;
+        height: 20px;
+        background: #fff;
+        border-radius: 50%;
+        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:after {
+        left: calc(100% - 5px);
+        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 */
+        height: 20px;
+    }
+}
+
+
 
 
 /* table*/
-table{
+table {
     width: 100%;
     border-collapse: collapse;
     border-top: 2px solid #000;
 }
-thead{background-color: #f6f6f6;}
-th{
+
+thead {
+    background-color: #f6f6f6;
+}
+
+th {
     font-family: "Pretendard-SB";
     font-size: 18px;
 }
-tbody tr{
+
+tbody tr {
     border-bottom: 1px solid #eeeeee;
-    td{
+
+    td {
         font-size: 16px;
         font-family: "Pretendard-L";
     }
 }
-td, th{padding: 10px 0; }
+
+td,
+th {
+    padding: 10px 0;
+}
(파일 끝에 줄바꿈 문자 없음)
 
client/resources/images/checkbox_blue.png (Binary) (added)
+++ client/resources/images/checkbox_blue.png
Binary file is not shown
 
client/resources/images/checkbox_pink.png (Binary) (added)
+++ client/resources/images/checkbox_pink.png
Binary file is not shown
 
client/resources/images/img7.png (Binary) (added)
+++ client/resources/images/img7.png
Binary file is not shown
client/views/layout/Header.vue
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
@@ -9,13 +9,13 @@
                 <nav>
                     <ul>
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
-                            @click="updateMenuStats('MENU_00000001')">기록물</li>
+                            @click="updateMenuStats('MENU_00000001')"><router-link :to="{ path: '/' }" >기록물</router-link></li>
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
-                            @click="updateMenuStats('MENU_00000004')">언론에서 바라본 구미시</li>
+                            @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')">회원관리</li>
+                            @click="updateMenuStats('MENU_00000007')"><router-link :to="{ path: '/MemberManagement.page' }" >회원관리</router-link></li>
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_ADMIN'"
-                            @click="updateMenuStats('MENU_00000008')">카테고리 관리</li>
+                            @click="updateMenuStats('MENU_00000008')"><router-link :to="{ path: '/CategoryManagement.page' }" >카테고리 관리</router-link></li>
 
                         <li v-if="$store.state.roles[0]?.authority === 'ROLE_USER'"
                             @click="updateMenuStats('MENU_00000001')">기록물</li>
@@ -75,7 +75,8 @@
                     this.$store.commit('setStoreReset'); // 오류가 있어도 스토어는 초기화
                     this.$router.push({ path: '/Login.page' }); // 로그인 페이지로 리다이렉트
                 });
-        }
+        },
+        
     },
     watch: {},
     computed: {},
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -11,6 +11,11 @@
 import PicHistorySearch from "./user/PicHistorySearch.vue";
 import PicHistoryInsert from "./user/PicHistoryInsert.vue";
 import PicHistoryDetail from "./user/PicHistoryDetail.vue";
+import BodoDetail from "./user/BodoDetail.vue";
+
+import MemberManagement from "./user/MemberManagement.vue";
+import CategoryManagement from "./user/CategoryManagement.vue";
+
 
 const routes = [
   { path: "/", name: "MainPage", component: Main, meta: { authorization: ['ROLE_ADMIN', 'ROLE_USER']} },
@@ -22,6 +27,10 @@
   { 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: "/MemberManagement.page", name: "MemberManagement", component: MemberManagement },
+  { path: "/CategoryManagement.page", name: "CategoryManagement", component: CategoryManagement },
 
 
 ];
 
client/views/pages/user/BodoDetail.vue (added)
+++ client/views/pages/user/BodoDetail.vue
@@ -0,0 +1,151 @@
+<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>
+                <div>
+                    <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>
+            </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>
+
+
+        <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>
+        </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,
+            },
+            noimg: 'client/resources/images/img7.png',
+            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',
+            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/CategoryManagement.vue (added)
+++ client/views/pages/user/CategoryManagement.vue
@@ -0,0 +1,124 @@
+<template>
+    <div class="content management">
+        <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>
+        <div class="flex-sp-bw">
+            <div class="left-con">
+                <div class="search-wrap mb-20">
+                    <div class="search-area">
+                       <div class="wfull" style="height: 100%;"> <input type="text"  v-model="searchText"></div>
+                        <button class="search-btn"><img :src="searchicon" alt=""></button>
+                    </div>
+                   
+                    
+                </div>
+                <table class="mb-10">
+                        <thead>
+                            <tr>
+                                <th>카테고리명</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr v-for="item in items" :key="item.id" :class="{'delete-member': item.delete}">
+                                <!-- Category 칼럼 -->
+                                <td>
+                                    {{ item.category}}
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+            </div>
+            <div class="righi-con wfull">
+                <div class="btn-group-small flex-end mb-20">
+                    <div class="button green-line">복구</div>
+                    <div class="button red-line">삭제</div>
+                    <div class="button pink-line-bg flex align-center"><img :src="check_pink" alt="">
+                        <p>신규등록</p>
+                    </div>
+                    <div class="button blue-line-bg flex align-center"><img :src="check_blue" alt="">
+                        <p>등록</p>
+                    </div>
+                    <div class="button gray-bg">취소</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" value="admin" readonly></div>
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="use" class="require">사용여부</label>
+                            <div class="switch">
+                                <input type="checkbox" id="switch" checked/>
+                                <label for="switch">Toggle</label>
+
+                            </div>
+
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="text" >설명</label>
+                            <textarea name="" id="text"></textarea>
+                        </dd>
+                      
+                    </dl>
+                </form>
+            </div>
+
+        </div>
+
+    </div>
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+
+export default {
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+
+    data() {
+        return {
+            items: [
+                { id: 1, category: '카테고리 1', delete: false },
+                { id: 2, category: '카테고리 2', delete: false },
+                { id: 3, category: '카테고리 3', delete: true },
+            ],
+            isModalOpen: false,
+            // 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',
+            check_pink: 'client/resources/images/checkbox_pink.png',
+            check_blue: 'client/resources/images/checkbox_blue.png',
+            searchicon: 'client/resources/images/icon/search.png',
+            fileNames: [],
+            selectedCategories: [],
+        };
+    },
+    computed: {
+        filteredItems() {
+            // This could be modified to support filtering based on searchQuery
+            return this.items.filter(item =>
+                item.category.includes(this.searchQuery)
+            );
+        }
+    },
+    methods: {
+    }
+};
+</script>
 
client/views/pages/user/MemberManagement.vue (added)
+++ client/views/pages/user/MemberManagement.vue
@@ -0,0 +1,165 @@
+<template>
+    <div class="content management">
+        <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>
+        <div class="flex-sp-bw">
+            <div class="left-con">
+                <div class="search-wrap mb-20">
+                    <div class="search-area">
+                        <div class="select-box">
+                            <select name="" id="">
+                                <option value="all" selected>전체</option>
+                                <option value="id">아이디</option>
+                                <option value="name">이름</option>
+                            </select>
+                        </div>
+                       <div class="wfull" style="height: 100%;"> <input type="text"  v-model="searchText"></div>
+                        <button class="search-btn"><img :src="searchicon" alt=""></button>
+                    </div>
+                   
+                    
+                </div>
+                <table class="mb-10">
+                        <thead>
+                            <tr>
+                                <th>아이디</th>
+                                <th>이름</th>
+                                <th>권한</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr v-for="item in items" :key="index" :class="{'delete-member': item.delete}">
+                                <!-- Category 칼럼 -->
+                                <td>
+                                    {{ item.id }}
+                                </td>
+                                <!-- Checkbox 칼럼 -->
+                                <td>
+                                    {{ item.name }}
+                                </td>
+                                <td>
+                                    {{ item.gownhan }}
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+            </div>
+            <div class="righi-con wfull">
+                <div class="btn-group-small flex-end mb-20">
+                    <div class="button green-line">복구</div>
+                    <div class="button red-line">회원탈퇴</div>
+                    <div class="button gray-line">비밀번호 초기화</div>
+                    <div class="button pink-line-bg flex align-center"><img :src="check_pink" alt="">
+                        <p>신규등록</p>
+                    </div>
+                    <div class="button blue-line-bg flex align-center"><img :src="check_blue" alt="">
+                        <p>등록</p>
+                    </div>
+                    <div class="button gray-bg">취소</div>
+                </div>
+                <form action="" class="insert-form mb-50">
+                    <dl>
+                        <dd>
+                            <label for="id" class="require">아이디</label>
+                            <input type="text" id="id" value="admin" readonly>
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="pw" class="require">비밀번호</label>
+                            <div class="wfull"><input type="text" id="pw" value=""></div>
+
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="pwcheck" class="require">비밀번호 확인</label>
+                            <div class="wfull"><input type="text" id="pwcheck" value=""></div>
+
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="name" class="require">이름</label>
+                            <input type="text" id="name" value="관리자" readonly>
+
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="gwonhan" class="require">권한</label>
+                            <div class="select-box">
+                                <select>
+                                    <option selected>관리자</option>
+                                    <option></option>
+                                    <option></option>
+                                </select>
+                            </div>
+
+                        </dd>
+                        <div class="hr"></div>
+                        <dd>
+                            <label for="use" class="require">사용여부</label>
+                            <div class="switch">
+                                <input type="checkbox" id="switch" />
+                                <label for="switch">Toggle</label>
+
+                            </div>
+
+                        </dd>
+                    </dl>
+                </form>
+            </div>
+
+        </div>
+
+    </div>
+</template>
+<script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+
+export default {
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+
+    data() {
+        return {
+            items: [
+                { id: 'user1', name: '카테고리 1', gownhan:'관리자',  delete: false },
+                { id: 'user2', name: '카테고리 2', gownhan:'사용자', delete: false },
+                { id: 'user3', name: '카테고리 3', gownhan:'사용자', delete: true },
+            ],
+            isModalOpen: false,
+            // 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',
+            check_pink: 'client/resources/images/checkbox_pink.png',
+            check_blue: 'client/resources/images/checkbox_blue.png',
+            searchicon: 'client/resources/images/icon/search.png',
+            fileNames: [],
+            selectedCategories: [],
+        };
+    },
+    computed: {
+        filteredItems() {
+            // This could be modified to support filtering based on searchQuery
+            return this.items.filter(item =>
+                item.id.includes(this.searchQuery)
+            );
+        }
+    },
+    methods: {
+    }
+};
+</script>
client/views/pages/user/PicHistorySearch.vue
--- client/views/pages/user/PicHistorySearch.vue
+++ client/views/pages/user/PicHistorySearch.vue
@@ -79,7 +79,7 @@
                         <img :src="resulticon" alt="">
                         <p>총 <b>{{ count }}개</b>의 사진 기록물이 검색되었습니다. </p>
                     </div>
-                    <div class="flex">
+                    <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)">
Add a comment
List