최정임 최정임 04-08
250408 최정임 로딩페이지 작업
@5e53558f2800fc7c9d7da6bc3b9eb4b874b89a18
client/resources/css/user/layout.css
--- client/resources/css/user/layout.css
+++ client/resources/css/user/layout.css
@@ -162,4 +162,5 @@
     position: fixed;
     right: 210px;
     bottom: 101px;
+    z-index: 555;
 }
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/user/sub.css
--- client/resources/css/user/sub.css
+++ client/resources/css/user/sub.css
@@ -975,6 +975,7 @@
         .swiper-button-next {
             right: 20px;
         }
+        
 
     }
 
@@ -1044,6 +1045,43 @@
 
 
 }
+.loading-overlay {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.5);
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    z-index: 9999;
+    p{color: #fff;}
+    p:first-of-type {
+        font-size: 30px;
+        font-family: "Pretendard-B";
+        margin-top: 28px;
+    }
+    p:last-of-type {
+        font-size: 22px;
+        font-family: "Pretendard-M";
+        margin-top: 18px;
+    }
+  }
+  .loading-spinner {
+    background: url(../../images/loading.png);
+   width: 178px;
+   height: 178px;
+  }
+  @keyframes spin {
+    0% {
+      transform: rotate(0deg);
+    }
+    100% {
+      transform: rotate(360deg);
+    }
+  }
 
 /* 회원관리,  카테고리 관리 */
 .management {
 
client/resources/images/loading.png (Binary) (added)
+++ client/resources/images/loading.png
Binary file is not shown
client/views/pages/bbsDcry/photo/PicHistoryDetail.vue
--- client/views/pages/bbsDcry/photo/PicHistoryDetail.vue
+++ client/views/pages/bbsDcry/photo/PicHistoryDetail.vue
@@ -26,14 +26,16 @@
       <div>
         <div class="gallery">
           <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 :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, idx) of findResult.files" :key="idx">
                 <img :src="item.filePath" :alt="item.fileNm" />
               </swiper-slide>
             </swiper>
           </div>
           <div class="thumbnail">
-            <swiper @swiper="setThumbsSwiper" :spaceBetween="20" :slidesPerView="4" :freeMode="true" :watchSlidesProgress="true" :modules="modules" :navigation="true" class="mySwiper">
+            <swiper @swiper="setThumbsSwiper" :spaceBetween="20" :slidesPerView="4" :freeMode="true"
+              :watchSlidesProgress="true" :modules="modules" :navigation="true" class="mySwiper">
               <swiper-slide v-for="(item, idx) of findResult.files" :key="idx">
                 <input type="checkbox" :id="'photo_' + idx" :value="item.fileId" v-model="selectedFiles" @click.stop />
                 <img :src="item.filePath" :alt="item.fileNm" />
@@ -44,6 +46,13 @@
         <div class="btn-group">
           <button class="select-down" @click="fnDownload('selected')">선택 다운로드</button>
           <button class="all-down" @click="fnDownload('all')">전체 다운로드</button>
+          <div v-if="loading"  class="loading-overlay">
+            <div class="loading-spinner"></div>
+            <div>
+              <p>다운로드 중입니다</p>
+              <p>잠시만 기다려주세요</p>
+            </div>
+          </div>
         </div>
       </div>
     </form>
@@ -139,6 +148,7 @@
       pageId: null,
       findResult: {},
       selectedFiles: [],
+      loading: false, 
     };
   },
 
@@ -178,10 +188,14 @@
 
     // 파일 다운로드
     async fnDownload(type) {
+      // Set loading to true when download starts
+      this.loading = true;
+
       // 유효성 검사
       if (type === 'selected') {
         if (this.selectedFiles.length === 0) {
           alert("파일을 1개 이상 선택하거나 전체 다운로드를 클릭해주세요.");
+          this.loading = false; // Hide loading if validation fails
           return;
         }
       }
@@ -201,6 +215,7 @@
         let isMultiple = fileList.length > 1;
         let fileIds = isMultiple ? fileList : fileList[0];
 
+        // Call the API to get the file data
         const response = isMultiple ? await multiFileDownloadProc(fileIds) : await fileDownloadProc(fileIds);
 
         // 파일명 추출 부분 수정
@@ -216,17 +231,19 @@
 
         // 파일 다운로드 처리
         const blob = new Blob([response.data]);
-        const url = window.URL.createObjectURL(blob);
-        const link = document.createElement('a');
-        link.href = url;
-        link.setAttribute('download', filename);
-        document.body.appendChild(link);
-        link.click();
+        const downloadUrl = window.URL.createObjectURL(blob);
+        const downloadLink = document.createElement('a');
+        downloadLink.href = downloadUrl;
+        downloadLink.setAttribute('download', filename);
+        document.body.appendChild(downloadLink);
+        downloadLink.click();
       } catch (error) {
         alert('파일 다운로드 중 오류가 발생했습니다.');
       } finally {
-        // 리소스 정리
+        // Hide loading spinner and clean up
         setTimeout(() => {
+          this.loading = false; // Hide loading spinner
+
           if (url) {
             window.URL.revokeObjectURL(url);
           }
client/views/pages/bbsDcry/video/VideoHistoryDetail.vue
--- client/views/pages/bbsDcry/video/VideoHistoryDetail.vue
+++ client/views/pages/bbsDcry/video/VideoHistoryDetail.vue
@@ -62,6 +62,10 @@
       <button type="button" class="blue-line" @click="fnMoveTo('edit', pageId)">수정</button>
       <button type="button" class="gray-line-bg" @click="fnMoveTo('list')">목록</button>
       <button type="button" class="gradient" @click="fnDownload">다운로드</button>
+      <div v-if="loading" class="loading-overlay">
+      <div class="loading-spinner"></div>
+      <p>파일을 다운로드 중입니다...</p>
+    </div>
     </div>
   </div>
 </template>
@@ -93,6 +97,7 @@
       pageId: null,
       findResult: {},
       selectedFiles: [],
+      loading: false, 
     };
   },
 
@@ -134,6 +139,7 @@
     async fnDownload() {
       let url = null;
       let link = null;
+      this.loading = true; // Show loading spinner
 
       try {
         // 파일 ID 수집
@@ -166,6 +172,7 @@
           if (link && link.parentNode) {
             document.body.removeChild(link);
           }
+          this.loading = false;  // Hide loading spinner
         }, 100);
       }
     },
client/views/pages/main/Main.vue
--- client/views/pages/main/Main.vue
+++ client/views/pages/main/Main.vue
@@ -4,22 +4,12 @@
       delay: 2500,
       disableOnInteraction: false,
     }" :pagination="{
-      type: 'progressbar',
-    }" :navigation="true" :modules="modules" @slideChange="onSlideChange" class="mySwiper">
+      type: ['fraction', 'progressbar'],  progressbarOpposite: true,
+    }" :navigation="true" :modules="modules"  class="mySwiper" :allowTouchMove="false">
       <swiper-slide v-for="(item, index) in slides" :key="index">
         <img :src="item.img" :alt="item.alt" />
       </swiper-slide>
-      <div class="pagination">
-        <div class="page-count">{{ currentSlide }} / {{ totalSlides }}</div>
-        <div class="btn-control">
-          <button @click="play">
-            <CaretRightOutlined />
-          </button>
-          <button @click="stop">
-            <PauseOutlined />
-          </button>
-        </div>
-      </div>
+      
     </swiper>
     <div class="search-wrap">
       <div class="search-area">
@@ -31,7 +21,7 @@
           <option value="bodo">보도자료</option>
         </select>
         <div class="line"></div>
-        <input type="text" placeholder="검색어를 입력하세요" v-model="searchText" @keyup.enter="fnMoveTo('TotalSearch')">
+        <div style="width: 60%;"><input type="text" placeholder="검색어를 입력하세요" v-model="searchText" @keyup.enter="fnMoveTo('TotalSearch')"></div>
         <button type="button" class="search-btn" @click="fnMoveTo('TotalSearch')"><img :src="search" alt=""></button>
       </div>
       <div class="total-search">
@@ -51,7 +41,7 @@
         </template>
       </ul>
       <div class="current-banner">
-        <div><span>기록물 현황</span><img :src="direct" alt=""></div>
+        <div><span>기록물 현황</span></div>
       </div>
     </div>
   </div>
@@ -72,7 +62,7 @@
             <div class="new-pic">
               <div v-for="(item, idx2) in tabContent.list" :key="idx2" class="box-wrap">
                 <div class="box" @click="fnMoveTo(tabContent.view, item.dcryId)">
-                  <img :src="item.files[0].filePath" :alt="item.sj" class="tab-image" />
+                  <div class="img-area"><img :src="item.files[0].filePath" :alt="item.sj" class="tab-image" /></div>
                   <div class="info">
                     <p>{{ item.sj }}</p>
                     <span>{{ $dotFormatDate(item.rgsde) }}</span>
@@ -82,7 +72,7 @@
               <!-- 게시물이 없는 경우 -->
               <div v-for="i in Math.max(0, 3 - tabContent.list.length)" :key="`empty-${i}`" class="box-wrap">
                 <div class="box">
-                  <img :src="noimg" class="tab-image" />
+                  <div class="img-area"><img :src="noimg" class="tab-image" /></div>
                   <div class="info">
                     <p>등록된 게시물이 없습니다.</p>
                   </div>
@@ -103,7 +93,7 @@
       <div class="media-wrap">
         <template v-for="(item, idx) of mediaContents" :key="idx">
           <div class="media-box" @click="fnMoveTo('MediaVideoDetail', item.mediaVidoId)">
-            <img :src="item.url" :alt="item.sj" class="media-image" />
+            <div class="img-area"><img :src="item.url" :alt="item.sj" class="media-image" /></div>
             <div class="info">
               <p>{{ item.sj }}</p>
               <span>{{ $dotFormatDate(item.rgsde) }}</span>
@@ -112,7 +102,7 @@
         </template>
         <!-- 게시글이 없는 경우 -->
         <div v-for="i in Math.max(0, 2 - mediaContents.length)" :key="`empty-${i}`" class="media-box">
-          <img :src="nomedia" alt="" class="media-image" />
+          <div class="img-area"><img :src="nomedia" alt="" class="media-image" /></div>
           <div class="info">
             <p>등록된 게시글이 없습니다.</p>
           </div>
@@ -253,30 +243,7 @@
     selectTab(index) {
       this.selectedTab = index; // Update the selected tab index
     },
-    play() {
-      const swiper = this.$refs.swiper.swiper;
-      if (swiper && swiper.autoplay) {
-        swiper.autoplay.start(); // Start autoplay
-      } else {
-        console.warn('Swiper instance or autoplay is not available');
-      }
-    },
-    // Method to stop autoplay
-    stop() {
-      const swiper = this.$refs.swiper.swiper;
-      if (swiper && swiper.autoplay) {
-        swiper.autoplay.stop();  // Stop autoplay
-      } else {
-        console.warn('Swiper instance or autoplay is not available');
-      }
-    },
-    // Method to update the current slide and total slides
-    onSlideChange() {
-      const swiper = this.$refs.swiper.swiper;
-      if (swiper) {
-        this.currentSlide = swiper.realIndex + 1; // Get current slide (1-based index)
-      }
-    },
+   
     // 메인화면 정보 조회
     async fnFindAllSttuses() {
       try {
Add a comment
List