최정임 최정임 03-24
250324 최정임 병합
@d51bd36e568147a92bc080efd16c4c7c4903406e
client/resources/css/common/common.css
--- client/resources/css/common/common.css
+++ client/resources/css/common/common.css
@@ -19,21 +19,10 @@
     background-color: #f6f6f6 !important; 
     color: #999;
 }
-select{
- border: 0;
- font-size: 20px;
- font-family: "Pretendard-L";
- color: #555;
- appearance: none; 
- background-image: url(../../images/icon/select.png);
- background-repeat: no-repeat;
- background-position: right 0px center;
- background-size: 17px;
- option{
-    
- font-family: "Pretendard-L";
- }
-}
+
+
+
+
 
 .w1500{width: 1500px; margin: 0 auto;}
 .wfull{width: -webkit-fill-available;}
@@ -54,6 +43,8 @@
 }
 
 .mt-5{margin-top: 5px;}
+.mt-20{margin-top: 20px;}
+.mt-40{margin-top: 40px;}
 
 .mb-5{margin-bottom: 5px;}
 .mb-10{margin-bottom: 10px;}
client/resources/css/user/main.css
--- client/resources/css/user/main.css
+++ client/resources/css/user/main.css
@@ -13,6 +13,21 @@
             font-size: 20px;  color: #fff;
         }
     }
+    select{
+        border: 0;
+        font-size: 20px;
+        font-family: "Pretendard-L";
+        color: #555;
+        appearance: none; 
+        background-image: url(../../images/icon/select.png);
+        background-repeat: no-repeat;
+        background-position: right 0px center;
+        background-size: 17px;
+        option{
+           
+        font-family: "Pretendard-L";
+        }
+       }
 }
 
 .search-wrap{
@@ -51,11 +66,11 @@
         width: 150px;
         height: 75px;
         background: linear-gradient(-45deg,#1865c8, #4037aa );
-        a{
+        
         font-family: "Pretendard-B";
         color: #fff;
         font-size: 20px;
-        }
+        
     }
 
 }
@@ -122,6 +137,69 @@
     }
 }
 .new-update{
+    .tabs{
+        ul{display: flex;
+            justify-content: center;
+         li:first-child::after{
+            content: ''; width: 3px; height: 30px; background-color: rgba(173, 176, 177, 0.2);
+            margin: 0 38px 0 25px;
+            
+        }
+        }
+        .tab-title{
+            display: flex;
+            align-items: center;
+            gap: 13px;
+            p{
+                cursor: pointer;
+                font-family: "HAPPINESS-SANS-REGULAR";
+                color: #cccccc;
+                font-size: 26px;
+                b{
+                    color: #cccccc;
+                }
+            }
+           
+        }
+        .tab-title.active p{
+            color: #000;
+            b{
+                color: #ff4141;
+            }
+            
+        }
+        .tab-content{
+            .content-wrap{
+                margin-top: -23px;
+            }
+            .box-wrap{
+                width: 454px;
+                height: 370px;
+                .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);
+                }
+                .tab-image{
+                    width: 100%;
+                    height: 297px;
+                    object-fit: cover;
+                    border-radius: 30px;
+                }
+               
+            }
+            
+        }
+    
+    }
     .title{
         display: flex;
         align-items: flex-end;
@@ -204,68 +282,7 @@
     }
    }
 }
-.tabs{
-    ul{display: flex;
-        justify-content: center;
-     li:first-child::after{
-        content: ''; width: 3px; height: 30px; background-color: rgba(173, 176, 177, 0.2);
-        margin: 0 38px 0 25px;
-        
-    }
-    }
-    .tab-title{
-        display: flex;
-        align-items: center;
-        gap: 13px;
-        p{
-            cursor: pointer;
-            font-family: "HAPPINESS-SANS-REGULAR";
-            color: #cccccc;
-            font-size: 26px;
-            b{
-                color: #cccccc;
-            }
-        }
-       
-    }
-    .tab-title.active p{
-        b{
-            color: #ff4141;
-        }
-        
-    }
-    .tab-content{
-        .content-wrap{
-            margin-top: -23px;
-        }
-        .box-wrap{
-            width: 454px;
-            height: 370px;
-            .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);
-            }
-            .tab-image{
-                width: 100%;
-                height: 297px;
-                object-fit: cover;
-                border-radius: 30px;
-            }
-           
-        }
-        
-    }
 
-}
 
 
 
@@ -310,8 +327,10 @@
 }
 .swiper-button-prev {
     background-image: url(../../images/prev-btn.png);
-    width: 94px !important;
-    height: 94px !important;
+    width: 70px !important;
+    height: 70px !important;
+    border-radius: 50%;
+    box-shadow: 1px 2px 8px 1px rgba(0, 0, 0, 0.08);
 }
 
 .swiper-button-prev:after, .swiper-rtl .swiper-button-prev:after{
@@ -319,9 +338,11 @@
 }
 .swiper-button-next {
     background-image: url(../../images/next-btn.png);
-    width: 94px !important;
-    height: 94px !important;
+    width: 70px !important;
+    height: 70px !important;
     right: 66px;
+    border-radius: 50%;
+    box-shadow: 1px 2px 8px 1px rgba(0, 0, 0, 0.08);
 }
 
 .swiper-button-next:after, .swiper-rtl .swiper-button-prev:after{
client/resources/css/user/sub.css
--- client/resources/css/user/sub.css
+++ client/resources/css/user/sub.css
@@ -4,7 +4,7 @@
     padding-top: 56px;
 
     h2 {
-        font-family: "HAPPINESSSANSVF";
+        font-family: "HAPPINESS-SANS-title";
         font-size: 40px;
     }
 
@@ -39,26 +39,43 @@
         font-size: 18px;
     }
 
-    .pagination {
-        margin-top: 20px;
-        display: flex;
-        align-items: center;
+        
+    /* 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;
+                }
+            }
+            
+        
+        }
     }
+    
+    
 
-    .pagination select {
-        margin-right: 10px;
-    }
-
-    .pagination button {
-        padding: 5px 10px;
-        margin: 0 5px;
-        cursor: pointer;
-    }
-
-    .pagination button:disabled {
-        background-color: #ccc;
-        cursor: not-allowed;
-    }
 }
 
 .sub-title-area {
@@ -97,17 +114,23 @@
 
 .btn-group {
     gap: 10px;
-    button.cancel{
+
+    button.cancel {
         width: 130px;
         background-color: #f9f9f9;
         border: 1px solid #636364;
     }
-    button.register{
+
+    button.register {
         width: 130px;
         background-color: #ce3e48;
         color: #fff;
+        a{
+            color: #fff;
+        }
     }
 }
+
 form {
     margin: 0 auto;
     border: 1px solid #dddddd;
@@ -124,6 +147,8 @@
     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";}
     }
 
     label {
@@ -155,6 +180,12 @@
     display: flex;
     gap: 5px;
 
+    .category-item {
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: 10px;
+      }
+
     li {
         width: fit-content;
         border-radius: 3px;
@@ -162,12 +193,12 @@
         font-family: "Pretendard-SB" !important;
         font-size: 14px;
 
-        &.category1 {
+        &:nth-child(odd) {
             color: #a5067b;
             border: 1px solid #a5067b;
         }
-
-        &.category2 {
+        
+        &:nth-child(even) {
             color: #007ac3;
             border: 1px solid #007ac3;
         }
@@ -246,7 +277,12 @@
     }
 }
 
-
+.info-form{
+    dd{
+        img{margin-right: 17px;}
+        span{width: 118px;}
+    }
+}
 
 /* 통합검색 */
 .search-form {
@@ -262,6 +298,10 @@
                 font-family: "Pretendard-SB";
                 width: 180px;
                 flex-shrink: 0;
+            }
+            input[type="text"] {
+                background-color: #f6f6f6;
+                border: 0;
             }
         }
 
@@ -322,118 +362,24 @@
     }
 
 
-    input[type="text"] {
-        background-color: #f6f6f6;
-        border: 0;
-    }
-
-    input[type="date"] {
-        position: relative;
-        width: 158px;
-        border-radius: 8px;
-        background: url(../../images/icon/calendar.png) no-repeat right 10px center / auto;
-    }
-
-    input[type="date"]::placeholder {
-        color: #fff;
-        ;
-    }
-
-    input[type='date']::-webkit-calendar-picker-indicator {
-        position: absolute;
-        left: 0;
-        top: 0;
-        width: 100%;
-        height: 100%;
-        background: transparent;
-        color: transparent;
-        cursor: pointer;
-    }
-
-    input[type="checkbox"] {
-        position: relative;
-        width: 22px;
-        height: 22px;
-        padding: 0;
-        accent-color: #544483;
-        /* This will change the checkbox color when checked */
-        border: 1px solid #cccccc;
-        /* This controls the border color */
-        border-radius: 4px;
-        /* Optional: rounded corners */
-        background-color: #fff;
-        /* Default background */
-        appearance: none;
-        /* Remove the default checkbox appearance */
-        cursor: pointer;
-    }
-
-    /* Checked state of the checkbox */
-    input[type="checkbox"]:checked {
-        background-color: #544483;
-        /* Custom background when checked */
-        border-color: #544483;
-        /* Custom border color when checked */
-    }
-
-    input[type="checkbox"]:checked::before {
-        content: '';
-        background-image: url(../../images/check.png);
-        background-repeat: no-repeat;
-        position: absolute;
-        left: 2px;
-        top: 5px;
-        width: 15px;
-        height: 11px;
-    }
-
-    input[type="checkbox"]:checked+label {
-        color: rgba(0, 0, 0, 0.12);
-        /* Change the label color when checkbox is checked */
-    }
-
-    label {
-        font-size: 17px;
-        font-family: "Pretendard-L";
-    }
-
-    /* 기본스타일 제거, 버튼 모양 재설정 */
-    input[type='radio'] {
-        flex-shrink: 0;
-        -webkit-appearance: none;
-        /* 웹킷 브라우저에서 기본 스타일 제거*/
-        -moz-appearance: none;
-        /* 모질라 브라우저에서 기본 스타일 제거*/
-        appearance: none;
-        /*기본 브라우저에서 기본 스타일 제거*/
-        width: 22px;
-        height: 22px;
-        padding: 0;
-        border: 1px solid #ccc;
-        /*체크되지 않았을 때의 테두리 색상*/
-        border-radius: 50%;
-        outline: none;
-        /*focus 시에 나타나는 기본 스타일 제거*/
-        cursor: pointer;
-    }
-
-    /* 체크 시 버튼 모양 스타일*/
-    input[type='radio']:checked {
-        background-color: #544483;
-        /*체크 시 내부 원 색상*/
-        border: 4px solid #fff;
-        /*라인이 아닌, 라인과 원 사이 색상*/
-        box-shadow: 0 0 0 1px #ccc;
-        /*라인*/
-    }
-
+    
 
 }
 
 .search-result {
-    select {
-        width: 72px;
+    .select-box{
+        width: 106px;
+        border: 1px solid #cccccc;
+        border-radius: 5px;
+        flex-shrink: 0;
+        padding: 10px;
+        margin-left: 30px;
+        select {
+            border: 0;
+            font-size: 14px;
+        }
     }
+    
 
     .resultext {
         .main-img {
@@ -443,6 +389,7 @@
         }
 
         display: flex;
+        align-items: center;
 
         p {
             width: max-content;
@@ -466,60 +413,130 @@
         border-radius: 24px;
         padding: 30px;
 
-        .text-box {
+        
+    }
+    .text-box {
 
-            p,
+        p,
+        li {
+            font-family: "Pretendard-L";
+        }
+
+        .text {
+            width: 1048px;
+            font-size: 16px;
+            color: #555555;
+            overflow: hidden;
+            /* Hide any overflow */
+            text-overflow: ellipsis;
+            /* Add an ellipsis at the end */
+            display: -webkit-box;
+            -webkit-line-clamp: 2;
+            /* Limit to 2 lines */
+            -webkit-box-orient: vertical;
+            margin-bottom: 20px;
+        }
+
+        h5 {
+            font-family: "Pretendard-B";
+            font-size: 25px;
+            margin-bottom: 20px;
+
+        }
+
+        .address {
+            font-size: 20px;
+            margin-bottom: 18px;
+        }
+
+        .date {
+            ul {
+                display: flex;
+                gap: 20px;
+            }
+
             li {
-                font-family: "Pretendard-L";
-            }
+                font-size: 17px;
 
-            .text {
-                width: 1048px;
-                font-size: 16px;
-                color: #555555;
-                overflow: hidden;
-                /* Hide any overflow */
-                text-overflow: ellipsis;
-                /* Add an ellipsis at the end */
-                display: -webkit-box;
-                -webkit-line-clamp: 2;
-                /* Limit to 2 lines */
-                -webkit-box-orient: vertical;
-                margin-bottom: 20px;
-            }
-
-            h5 {
-                font-family: "Pretendard-B";
-                font-size: 25px;
-                margin-bottom: 20px;
-            }
-
-            .address {
-                font-size: 20px;
-                margin-bottom: 18px;
-            }
-
-            .date {
-                ul {
-                    display: flex;
-                    gap: 20px;
-                }
-
-                li {
-                    font-size: 17px;
-
-                    b {
-                        margin-left: 5px;
-                    }
+                b {
+                    margin-left: 5px;
                 }
             }
         }
-
     }
-
+    .tabs{
+        .tab-box{display: flex;
+            justify-content: end;
+            gap: 25px;
+        }
+        .tab-title{
+            display: flex;
+            align-items: center;
+            gap: 13px;
+            p{
+                cursor: pointer;
+                font-family: "HAPPINESS-SANS-REGULAR";
+                color: #cccccc;
+                font-size: 17px;
+                b{
+                    color: #cccccc;
+                }
+            }
+           
+        }
+        .tab-title.active p{
+            color: #000;
+            
+            b{
+                color: #ff4141;
+                
+            }
+            
+        }
+        .tab-content{
+            .content-wrap{
+                margin-top: -23px;
+            }
+            .box-wrap{
+                width: 454px;
+                height: 370px;
+                .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);
+                }
+                .tab-image{
+                    width: 100%;
+                    height: 297px;
+                    object-fit: cover;
+                    border-radius: 30px;
+                }
+               
+            }
+            
+        }
+    
+    }
+    .list-wrap{
+        border-top: 2px solid #000;
+        &>li{
+            border-bottom: 2px solid #eeeeee;
+            padding: 30px 10px;
+        }
+    }
 }
 
-/* 등록페이지 */
+
+
+/*사진 기록물 등록페이지 */
 .insert-form {
     padding: 10px 0;
     border-top: 2px solid #000;
@@ -580,29 +597,40 @@
     cursor: pointer;
     text-align: center;
     transition: background-color 0.3s ease;
-    
+
 }
-.file-label > div p {
+
+.file-label>div p {
     font-family: "Pretendard-B" !important;
     font-size: 20px !important;
 }
+
 /* Style the label on hover */
 .file-label:hover {}
 
 /* Style for the file names display */
 .file-names {
-    display: block; /* Make each file name appear on a new line */
+    display: block;
+    /* Make each file name appear on a new line */
     font-size: 16px;
     color: #333;
-    span{color: #dadada;}
-    .file-wrap{
+
+    span {
+        color: #dadada;
+    }
+
+    .file-wrap {
         border: 1px solid #dadada;
         border-radius: 10px;
         padding: 12px;
-        .file-name{
+
+        .file-name {
             display: flex;
             align-items: center;
-            img{margin-right: 10px;}
+
+            img {
+                margin-right: 10px;
+            }
 
         }
     }
@@ -610,44 +638,269 @@
 
 
 /* 모달 */
-/* 모달 배경 스타일 */
 .modal-overlay {
     position: fixed;
     top: 0;
     left: 0;
     width: 100%;
     height: 100%;
-    background-color: rgba(0, 0, 0, 0.5); /* 배경 어두운 투명도 */
+    background-color: rgba(0, 0, 0, 0.5);
+    /* 배경 어두운 투명도 */
     display: flex;
     justify-content: center;
     align-items: center;
     z-index: 9999;
-  }
-  
-  /* 모달 콘텐츠 스타일 */
-  .modal-content {
+}
+
+.modal-content {
     background-color: #fff;
-    padding: 20px;
+    padding: 50px 35px; 
     border-radius: 8px;
-    max-width: 400px;
+    max-width: 1000px;
     width: 100%;
     text-align: center;
-    h2{
-        
+
+    h2 {
+        font-family: "Pretendard-B";
+        font-size: 30px;
     }
-      /* 닫기 버튼 스타일 */
-  button {
-    padding: 10px;
-    margin-top: 10px;
-    background-color: #007bff;
-    color: white;
-    border: none;
-    border-radius: 5px;
+    .modal-search{
+        padding: 13px;
+        background-color: rgba(0, 61, 97, 0.05);
+        border-radius: 10px;
+        input{
+            padding: 0px 20px;
+            background-color: #fff;
+            border-radius:5px;
+            width: 300px;
+            height: 45px;
+            font-size: 16px;
+            margin-right: 5px;
+        }
+        .search-btn{
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            width: 80px;
+            height: 45px;
+            gap: 5px;
+            border-radius: 5px;
+            p{
+                font-size: 16px;
+                color: #fff;
+                font-family: "Pretendard-SB";
+            }
+        }
+    }
+
+    /* 닫기 버튼 스타일 */
+    button {
+        width: 40px;
+        height: 40px;
+        background-color: #000;
+        color: white;
+        border: none;
+        border-radius: 50px;
+    }
+    button.closebtn{font-size: 20px;}
+    button:hover {
+        background-color: #0056b3;
+    }
+    .register-b{
+        width: 110px;
+        height: 40px;
+        font-size: 18px;
+        background-color: #000;
+        color: #fff;
+        font-family: "Pretendard-M";
+    }
+    
+}
+
+
+/* 사진기록물 상세페이지 */
+.gallery{
+    border: 0;
+    dl{
+        padding: 30px 0 0 0;
+        border-top: 2px solid #000;
+        dd{
+            position: relative;
+            background: #f6f6f6;
+            padding: 25px 0px;
+            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{
+                    
+                    object-fit: contain;
+                    margin-right: 10px;
+                }
+
+            }
+           
+           
+        }
+    
+    }
+    .main-swiper{
+        .swiper{
+            width: 100%;
+            .swiper-slide{
+                img{
+                    height: 800px;
+                    width: 100%;
+                    object-fit: contain;
+                }
+            }
+           
+        }
+    }
+    .thumbnail{
+        padding: 30px 95px;
+            background-color: #fff;
+        .swiper{
+            width: 940px;
+            height: 120px;
+            .swiper-slide img {
+                width: -webkit-fill-available;
+            }
+        }
+    }
+    .swiper-button-prev, .swiper-button-next{
+        box-shadow: none ;
+    }
+
+   
+}
+
+
+
+
+
+/* 인풋 커스텀 */
+
+
+input[type="date"] {
+    position: relative;
+    width: 158px;
+    border-radius: 8px;
+    background: url(../../images/icon/calendar.png) no-repeat right 10px center / auto;
+}
+
+input[type="date"]::placeholder {
+    color: #fff;
+    ;
+}
+
+input[type='date']::-webkit-calendar-picker-indicator {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background: transparent;
+    color: transparent;
     cursor: pointer;
-  }
-  
-  button:hover {
-    background-color: #0056b3;
-  }
-  }
-  
+}
+
+input[type="checkbox"] {
+    position: relative;
+    width: 22px;
+    height: 22px;
+    padding: 0;
+    accent-color: #544483;
+    /* This will change the checkbox color when checked */
+    border: 1px solid #cccccc;
+    /* This controls the border color */
+    border-radius: 4px;
+    /* Optional: rounded corners */
+    background-color: #fff;
+    /* Default background */
+    appearance: none;
+    /* Remove the default checkbox appearance */
+    cursor: pointer;
+}
+
+/* Checked state of the checkbox */
+input[type="checkbox"]:checked {
+    background-color: #544483;
+    /* Custom background when checked */
+    border-color: #544483;
+    /* Custom border color when checked */
+}
+
+input[type="checkbox"]:checked::before {
+    content: '';
+    background-image: url(../../images/check.png);
+    background-repeat: no-repeat;
+    position: absolute;
+    left: 2px;
+    top: 5px;
+    width: 15px;
+    height: 11px;
+}
+
+input[type="checkbox"]:checked+label {
+    color: rgba(0, 0, 0, 0.12);
+    /* Change the label color when checkbox is checked */
+}
+
+input[type="checkbox"]+label, input[type='radio']+label {
+    font-size: 17px;
+    font-family: "Pretendard-L";
+}
+
+/* 기본스타일 제거, 버튼 모양 재설정 */
+input[type='radio'] {
+    flex-shrink: 0;
+    -webkit-appearance: none;
+    /* 웹킷 브라우저에서 기본 스타일 제거*/
+    -moz-appearance: none;
+    /* 모질라 브라우저에서 기본 스타일 제거*/
+    appearance: none;
+    /*기본 브라우저에서 기본 스타일 제거*/
+    width: 22px;
+    height: 22px;
+    padding: 0;
+    border: 1px solid #ccc;
+    /*체크되지 않았을 때의 테두리 색상*/
+    border-radius: 50%;
+    outline: none;
+    /*focus 시에 나타나는 기본 스타일 제거*/
+    cursor: pointer;
+}
+
+/* 체크 시 버튼 모양 스타일*/
+input[type='radio']:checked {
+    background-color: #544483;
+    /*체크 시 내부 원 색상*/
+    border: 4px solid #fff;
+    /*라인이 아닌, 라인과 원 사이 색상*/
+    box-shadow: 0 0 0 1px #ccc;
+    /*라인*/
+}
+
+
+
+/* table*/
+table{
+    width: 100%;
+    border-collapse: collapse;
+    border-top: 2px solid #000;
+}
+thead{background-color: #f6f6f6;}
+th{
+    font-family: "Pretendard-SB";
+    font-size: 18px;
+}
+tbody tr{
+    border-bottom: 1px solid #eeeeee;
+    td{
+        font-size: 16px;
+        font-family: "Pretendard-L";
+    }
+}
+td, th{padding: 10px 0; }
 
client/resources/images/icon/addressicon.png (Binary) (added)
+++ client/resources/images/icon/addressicon.png
Binary file is not shown
 
client/resources/images/icon/calendaricon.png (Binary) (added)
+++ client/resources/images/icon/calendaricon.png
Binary file is not shown
 
client/resources/images/icon/categoryicon.png (Binary) (added)
+++ client/resources/images/icon/categoryicon.png
Binary file is not shown
 
client/resources/images/icon/yearicon.png (Binary) (added)
+++ client/resources/images/icon/yearicon.png
Binary file is not shown
client/resources/images/next-btn.png (Binary)
--- client/resources/images/next-btn.png
+++ client/resources/images/next-btn.png
Binary file is not shown
client/resources/images/prev-btn.png (Binary)
--- client/resources/images/prev-btn.png
+++ client/resources/images/prev-btn.png
Binary file is not shown
 
client/resources/images/search_btn.png (Binary) (added)
+++ client/resources/images/search_btn.png
Binary file is not shown
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -10,6 +10,7 @@
 import TotalSearch from "./user/TotalSearch.vue";
 import PicHistorySearch from "./user/PicHistorySearch.vue";
 import PicHistoryInsert from "./user/PicHistoryInsert.vue";
+import PicHistoryDetail from "./user/PicHistoryDetail.vue";
 
 const routes = [
   { path: "/", name: "MainPage", component: Main, meta: { authorization: ['ROLE_ADMIN', 'ROLE_USER']} },
@@ -20,6 +21,7 @@
   { 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 },
 
 
 ];
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.png',
+      search: 'client/resources/images/icon/search_btn.png',
       selectedTab: "newPhoto", // Set initial tab index to 신규사진기록물 (first tab)
       tabs: [
         {
 
client/views/pages/user/PicHistoryDetail.vue (added)
+++ client/views/pages/user/PicHistoryDetail.vue
@@ -0,0 +1,167 @@
+<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">
+            <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 class="main-swiper">
+                    <swiper :style="{
+                        '--swiper-navigation-color': '#fff',
+                        '--swiper-pagination-color': '#fff',
+                    }" :loop="true" :spaceBetween="10"  :thumbs="{ swiper: thumbsSwiper }" :modules="modules"
+                        class="mySwiper2">
+                        <swiper-slide v-for="(item, index) in slides" :key="index">
+                            <img :src="item.img" :alt="item.alt" />
+                        </swiper-slide>
+                    </swiper>
+             </div>
+                <div class="thumbnail">
+                    <swiper @swiper="setThumbsSwiper" :spaceBetween="10" :slidesPerView="4" :freeMode="true"
+                        :watchSlidesProgress="true" :modules="modules" class="mySwiper" :navigation="{
+        nextEl: '.swiper-button-next',
+        prevEl: '.swiper-button-prev'
+      }">
+                        <swiper-slide v-for="(item, index) in slides" :key="index" >
+                            <img :src="item.img" :alt="item.alt" />
+                        </swiper-slide>
+                    </swiper>
+                </div>
+                <div class="swiper-button-next"></div>
+                <div class="swiper-button-prev"></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>
+
+        <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-end">
+            <button class="signout" type="button" @click="fnDeleteUser">회원탈퇴</button>
+            <button class="update" 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',
+            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' },
+                // Add more slides as needed
+            ],
+
+        };
+    },
+    methods: {
+    },
+    watch: {},
+    computed: {
+    },
+    mounted() { },
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/user/PicHistoryInsert.vue
--- client/views/pages/user/PicHistoryInsert.vue
+++ client/views/pages/user/PicHistoryInsert.vue
@@ -1,85 +1,147 @@
 <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" value="" placeholder="제목을 입력하세요."></div>
-        </dd>
-        <div class="hr"></div>
-        <dd>
-          <label for="year">생산연도</label>
-          <input type="text" id="year" value="" placeholder="생산연도를 입력하세요">
-        </dd>
-        <div class="hr"></div>
-        <dd>
-          <label for="address">주소</label>
-          <div class="wfull"><input type="text" id="address" value="" placeholder="주소를 입력하세요"></div>
-        </dd>
-        <div class="hr"></div>
-        <dd>
-          <label for="text">내용</label>
-          <textarea name="" id=""></textarea>
-        </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 class="category1">카테고리1 <button class="cancel"><b>✕</b></button></li>
-            <li class="category2">카테고리2 <button class="cancel"><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 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" value="" placeholder="제목을 입력하세요."></div>
+                </dd>
+                <div class="hr"></div>
+                <dd>
+                    <label for="year">생산연도</label>
+                    <input type="text" id="year" value="" placeholder="생산연도를 입력하세요">
+
+                </dd>
+                <div class="hr"></div>
+                <dd>
+                    <label for="address">주소</label>
+                    <div class="wfull"><input type="text" id="address" value="" placeholder="주소를 입력하세요"></div>
+
+                </dd>
+                <div class="hr"></div>
+                <dd>
+                    <label for="text">내용</label>
+                    <textarea name="" id=""></textarea>
+
+                </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 selectedCategories" :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 v-if="isModalOpen" class="modal-overlay" @click="closeModal">
+            <div class="modal-content" @click.stop>
+                <div class="flex-sp-bw mb-20">
+                    <h2>카테고리 조회</h2>
+                    <button @click="closeModal" class="closebtn">✕</button>
                 </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 class="modal-search flex-center mb-20">
+                    <input type="text" placeholder="카테고리명을 입력하세요.">
+                    <button class="search-btn"><img :src="searchicon" alt="">
+                        <p>검색</p>
+                    </button>
                 </div>
-              </div>
-            </li>
-          </ul>
-        </dd>
-      </dl>
-    </form>
-    <div class="btn-group flex-center">
-      <button class="cancel">취소</button>
-      <button class="register">등록</button>
-    </div>
+                <table class="mb-10">
+                    <thead>
+                        <tr>
+                            <th>카테고리 항목</th>
+                            <th>선택</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <tr v-for="item in items" :key="item.id">
+                            <!-- Category 칼럼 -->
+                            <td>
+                                {{ item.category }}
+                            </td>
+                            <!-- Checkbox 칼럼 -->
+                            <td>
+                                <input type="checkbox" v-model="item.selected" />
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+                <div class="flex-end mb-30"><button class="register-b " @click="registerCategories">등록</button></div>
+                <div class="pagination">
+    
+                    <!-- 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>
   </div>
   <div v-if="isModalOpen" class="modal-overlay" @click="closeModal">
     <div class="modal-content" @click.stop>
@@ -90,22 +152,70 @@
   </div>
 </template>
 <script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+
 export default {
-  data() {
-    return {
-      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',
-      fileicon: 'client/resources/images/icon/file.png',
-      fileNames: [],
-    };
-  },
-  methods: {
-    showFileNames(event) {
-      const files = event.target.files;
-      this.fileNames = [];  // Clear previous file names
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+
+    data() {
+        return {
+            items: [
+                { id: 1, category: '카테고리 1', selected: false },
+                { id: 2, category: '카테고리 2', selected: false },
+                { id: 3, category: '카테고리 3', selected: false },
+            ],
+            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',
+            fileicon: 'client/resources/images/icon/file.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: {
+        registerCategories() {
+            // Add selected categories to the displayed list
+            this.selectedCategories = this.items
+                .filter(item => item.selected)
+                .map(item => item.category);
+            this.closeModal(); // Close modal after registration
+        },
+        removeCategory(index) {
+            // Remove category from the list
+            this.selectedCategories.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];
client/views/pages/user/PicHistorySearch.vue
--- client/views/pages/user/PicHistorySearch.vue
+++ client/views/pages/user/PicHistorySearch.vue
@@ -1,256 +1,412 @@
 <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>
-    <form action="search" class="search-form mb-40">
-      <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>
-    </form>
-    <div class="search-result">
-      <ul>
-        <div class="flex-sp-bw mb-20">
-          <div class="resultext wfull">
-            <img :src="resulticon" alt="">
-            <p>총 <b>{{ count }}개</b>의 사진 기록물이 검색되었습니다. </p>
-          </div>
-          <select v-model="itemsPerPage" @change="changeItemsPerPage">
-            <option :value="5" selected>5개</option>
-            <option :value="10">10개</option>
-            <option :value="15">15개</option>
-          </select>
-        </div>
-        <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
-          <div class="result-box">
-            <div class="main-img"><img :src="resultitem.img" alt=""></div>
-            <div class="text-box">
-              <h5>{{ resultitem.title }}</h5>
-              <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">
+    <div class="content">
+        <div class="sub-title-area mb-30">
+            <h2>사진 기록물</h2>
+            <div class="breadcrumb-list">
                 <ul>
-                  <li>생산연도 <b>{{ resultitem.year }}</b></li>
-                  <li>|</li>
-                  <li>등록 <b>{{ resultitem.date }}</b></li>
+                    <!-- 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>
-        </li>
-      </ul>
-      <button> <router-link :to="{ path: '/PicHistoryInsert.page' }" class="insert">등록</router-link></button>
-      <div class="pagination">
-        <!-- Previous and Next Page Buttons -->
-        <button @click="previousPage" :disabled="currentPage === 1">Prev</button>
-        <span>{{ currentPage }} / {{ totalPages }}</span>
-        <button @click="nextPage" :disabled="currentPage === totalPages">Next</button>
-      </div>
+        </div>
+        <form action="search" class="search-form mb-40">
+            <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>
+
+        </form>
+        <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: '/PicHistoryDetail.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">
+                                            <h5>{{ resultitem.title }}</h5>
+                                            <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>
-  </div>
+
 </template>
 <script>
+import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
 import { findAllCategoryProc } from "../../../resources/api/category"; // 카테고리 목록 검색
 
 export default {
-  data() {
-    return {
-      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',
+    components: {
+        DoubleLeftOutlined,
+        LeftOutlined,
+        RightOutlined,
+        DoubleRightOutlined,
+    },
+    data() {
+        return {
+            selectedTab: 1,
+            // 검색용 객체
+            searchReqDTO: {
+                searchType: [],
+                searchText: null,
+                startYear: null,
+                endYear: null,
+                searchTy: null,
+                searchCtgry: [],
+                order: "rgsde",
+            },
+            tabs: [
 
-      // 검색용 객체
-      searchReqDTO: {
-        searchType: [],
-        searchText: null,
-        startYear: null,
-        endYear: null,
-        searchTy: null,
-        searchCtgry: [],
-        order: "rgsde",
-      },
+                {
+                    id: 1,
+                    title: "카드형",
+                    activeImage: "client/resources/images/mCont_ico1_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/mCont_ico1_off.png",
+                },
+                {
+                    id: 2,
+                    title: "리스트형",
+                    activeImage: "client/resources/images/mCont_ico2_on.png", // Active tab image
+                    inactiveImage: "client/resources/images/mCont_ico2_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'
+                },
 
-      isChkAllScope: false, // 검색범위 전체 체크 여부
-      searchType: [
-        { key: "sj", value: "제목" },
-        { key: "cn", value: "내용" },
-        { key: "adres", value: "주소" },
-      ], // 검색범위 목록
-      categorys: [], // 카테고리 목록
-      orders: [
-        { key: "rgsde", value: "최신" },
-        { key: "rdcnt", value: "인기" },
-      ], // 정렬 목록
-
-      searchResult: [], // 검색결과
-      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);
         },
-      ]
-    };
-  },
 
-  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);
+            }
+        },
     },
 
-    // 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: {
-    // Change the number of items displayed per page
-    changeItemsPerPage() {
-      this.currentPage = 1; // Reset to first page when changing items per page
-    },
-
-    // Go to the previous page
-    previousPage() {
-      if (this.currentPage > 1) {
-        this.currentPage--;
-      }
-    },
-
-    // Go to the next page
-    nextPage() {
-      if (this.currentPage < this.totalPages) {
-        this.currentPage++;
-      }
-    },
-
-    // 카테고리 목록 조회
-    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