박정하 박정하 04-11
250411 박정하 오류 수정
@23e3fce9b75d01fbdb89f9d574cfc8f03c08e841
client/views/component/listLayout/CardStyleComponent.vue
--- client/views/component/listLayout/CardStyleComponent.vue
+++ client/views/component/listLayout/CardStyleComponent.vue
@@ -4,7 +4,7 @@
       <div class="result-box">
         <div class="main-img">
           <img v-if="name === 'M'" :src="getYouTubeThumbnail(item.link)" alt="영상 썸네일">
-          <img v-else-if="!$isEmpty(item.thumbnail)" :src="item.thumbnail.filePath" :alt="item.sj + ' 썸네일'" loading="lazy">
+          <img v-else-if="!$isEmpty(item.thumbnail)" :src="item.thumbnail.filePath" :alt="item.sj + ' 썸네일'">
           <img v-else src="client/resources/images/img6.png" alt="Not found image">
         </div>
         <div class="text-box">
client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
--- client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
+++ client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
@@ -113,6 +113,13 @@
     </div>
   </div>
   <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" @addCtgries="fnAddCtgries" />
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>등록 중입니다</p>
+      <p>잠시만 기다려주세요</p>
+    </div>
+  </div>
 </template>
 <script>
 import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
@@ -165,6 +172,8 @@
       selectedCtgries: [], // 카테고리 목록
 
       selectedThumb: null,
+
+      loading: false, // 로딩 상태 추가
     };
   },
 
@@ -378,6 +387,7 @@
         return;
       }
 
+      this.loading = true; // 로딩 시작
       try {
         const formData = new FormData();
 
@@ -447,6 +457,8 @@
           alert("에러가 발생했습니다.");
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       };
     },
 
client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
--- client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
+++ client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
@@ -53,7 +53,7 @@
               <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 건당 최대 10GB를 초과할 수 없습니다.</span></div>
             </li>
             <li class="file-insert">
-              <input type="file" id="fileInput" class="file-input" accept="video/mp4,video/quicktime,video/x-msvideo,video/x-ms-wmv,video/webm,video/x-matroska" @change="handleFileSelect">
+              <input type="file" id="fileInput" ref="fileInput" class="file-input" accept="video/mp4,video/quicktime,video/x-msvideo,video/x-ms-wmv,video/webm,video/x-matroska" @change="handleFileSelect">
               <label for="fileInput" class="file-label mb-20" @dragover.prevent="handleDragOver" @dragleave.prevent="handleDragLeave" @drop.prevent="handleDrop" :class="{ 'drag-over': isDragging }">
                 <div class="flex-center align-center">
                   <img :src="fileicon" alt="">
@@ -91,6 +91,13 @@
         <span v-if="$isEmpty(pageId)">등록</span>
         <span v-else>수정</span>
       </button>
+    </div>
+  </div>
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>등록 중입니다</p>
+      <p>잠시만 기다려주세요</p>
     </div>
   </div>
   <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" @addCtgries="fnAddCtgries" />
@@ -144,6 +151,8 @@
 
       multipartFiles: [],
       selectedCtgries: [], // 카테고리 목록
+
+      loading: false, // 로딩 상태 추가
     };
   },
 
@@ -240,6 +249,7 @@
       // 유효성 검사
       if ((files.length + this.multipartFiles.length + this.requestDTO.files.length) > 1) {
         alert("영상 파일은 한 개만 등록 가능합니다.");
+        this.resetFileInput();
         return;
       }
 
@@ -249,16 +259,25 @@
         // 파일 타입 검증
         if (!allowedTypes.includes(fileType)) {
           alert(`${file.name} 파일은 허용되지 않는 형식입니다. 영상 파일(mp4, mov, avi, wmv, mkv, webm)만 업로드 가능합니다.`);
+          this.resetFileInput();
           return;
         }
 
         // 파일 크기 제한 검증
         if (file.size > maxSize) {
           alert(`${file.name} 파일이 10GB를 초과합니다.`);
+          this.resetFileInput();
           return;
         }
 
         this.multipartFiles.push(file);
+      }
+    },
+
+    // 파일 입력 초기화 메서드 추가
+    resetFileInput() {
+      if (this.$refs.fileInput) {
+        this.$refs.fileInput.value = '';
       }
     },
 
@@ -298,6 +317,7 @@
         return;
       }
 
+      this.loading = true; // 로딩 시작
       try {
         const formData = new FormData();
 
@@ -362,6 +382,8 @@
           alert("에러가 발생했습니다.");
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       };
     },
 
client/views/pages/bbsNesDta/NewsReleaseInsert.vue
--- client/views/pages/bbsNesDta/NewsReleaseInsert.vue
+++ client/views/pages/bbsNesDta/NewsReleaseInsert.vue
@@ -54,7 +54,7 @@
               <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 건당 최대 10GB를 초과할 수 없습니다.</span></div>
             </li>
             <li class="file-insert">
-              <input type="file" id="fileInput" class="file-input" accept="image/jpeg,image/png,image/gif,image/jpg" @change="handleFileSelect">
+              <input type="file" id="fileInput" ref="fileInput" class="file-input" accept="image/jpeg,image/png,image/gif,image/jpg" @change="handleFileSelect">
               <label for="fileInput" class="file-label mb-20" @dragover.prevent="handleDragOver" @dragleave.prevent="handleDragLeave" @drop.prevent="handleDrop" :class="{ 'drag-over': isDragging }">
                 <div class="flex-center align-center">
                   <img :src="fileicon" alt="">
@@ -232,12 +232,9 @@
       const maxSize = 10 * 1024 * 1024 * 1024; // 10GB
 
       // 유효성 검사
-      let count = files.length + this.multipartFiles.length
-      if (!this.$isEmpty(this.pageId)) {
-        count += this.requestDTO.files.length
-      }
-      if (count > 1) {
+      if ((files.length + this.multipartFiles.length + this.requestDTO.files.length) > 1) {
         alert("썸네일은 한 개만 등록 가능합니다.");
+        this.resetFileInput();
         return;
       }
 
@@ -247,12 +244,14 @@
         // 파일 타입 검증
         if (!allowedTypes.includes(fileType)) {
           alert(`${file.name} 파일은 허용되지 않는 형식입니다. 이미지 파일(jpg, jpeg, png, gif)만 업로드 가능합니다.`);
+          this.resetFileInput();
           return;
         }
 
         // 파일 크기 제한 검증
         if (file.size > maxSize) {
           alert(`${file.name} 파일이 10GB를 초과합니다.`);
+          this.resetFileInput();
           return;
         }
 
@@ -260,6 +259,13 @@
       }
     },
 
+    // 파일 입력 초기화 메서드 추가
+    resetFileInput() {
+      if (this.$refs.fileInput) {
+        this.$refs.fileInput.value = '';
+      }
+    },
+
     // 파일 삭제
     fnDelFile(type, separator) {
       if (type === 'new') {
Add a comment
List