하석형 하석형 05-07
250507 하석형 게시판관리/팝업관리 상세 코드 -> 한글코드값 표시, 관리자 메인 팝업 표시, 팝업관리 사용유무 추가
@a39c1e2090cb97ff1aa5b559521ee78df0e4729e
client/views/component/userInfo/UserInfoInsert.vue
--- client/views/component/userInfo/UserInfoInsert.vue
+++ client/views/component/userInfo/UserInfoInsert.vue
@@ -9,18 +9,18 @@
           </div>
           <div class="form-content">
             <div class="layout">
-              <label class="form-title"><span>*</span> 아이디</label>
+              <label class="form-title"><span>*</span>아이디</label>
               <input type="text" class="form-control sm" v-model="mbrVO.lgnId" ref="mbrId" minlength="5" maxlength="50"
                 placeholder="아이디를 입력하세요." :disabled="mbrVO.mbrId != null" />
             </div>
             <div class="layout">
-              <label class="form-title"><span>*</span> 이름</label>
+              <label class="form-title"><span>*</span>이름</label>
               <input type="text" class="form-control sm" ref="mbrNm" v-model="mbrVO.mbrNm" minlength="2" maxlength="50"
                 placeholder="이름을 입력하세요." />
             </div>
             <div class="layout">
               <label class="form-title">
-                <p v-if="pageId == null"><span>*</span> 비밀번호</p>
+                <p v-if="pageId == null"><span>*</span>비밀번호</p>
                 <p v-else>비밀번호변경</p>
               </label>
               <div class="form-group">
@@ -35,7 +35,7 @@
             </div>
             <div class="layout">
               <label class="form-title">
-                <p v-if="pageId == null"><span>*</span> 비밀번호확인</p>
+                <p v-if="pageId == null"><span>*</span>비밀번호확인</p>
                 <p v-else>비밀번호변경 확인</p>
               </label>
               <input type="password" :class="{ 'form-control sm': true, 'error': pswd.pswdChk }" ref="newPswdChk"
@@ -46,7 +46,7 @@
             </div>
             <!-- <template v-if="showOpt.isMblNo || showOpt.isTelNo"> -->
               <div v-if="showOpt.isMblNo" class="layout">
-                <label class="form-title"><span>*</span> 휴대폰번호</label>
+                <label class="form-title"><span>*</span>휴대폰번호</label>
                 <input type="text" class="form-control sm" ref="mblTelno" v-model="mbrVO.mblTelno" minlength="10"
                   maxlength="11" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\.*)/g, '');"
                   placeholder="휴대폰번호를 입력하세요." />
@@ -60,7 +60,7 @@
             </div>
             <!-- <template v-if="showOpt.isEml || showOpt.isSmsAgree || showOpt.isEmlAgree"> -->
               <div v-if="showOpt.isEml" class="layout">
-                <label class="form-title"><span>*</span> 이메일</label>
+                <label class="form-title"><span>*</span>이메일</label>
                 <div class="check-area">
                   <input type="text" class="form-control sm" ref="emailId" v-model="email.id" oninput="this.value =
                         this.value.replace(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/g, '');" placeholder="이메일을 입력하세요." />
@@ -80,9 +80,7 @@
                 </div>
               </div>
               <div v-if="showOpt.isSmsAgree" class="layout">
-                <label class="form-title"><span>*</span>
-                  문자수신
-                </label>
+                <label class="form-title"><span>*</span>문자수신</label>
                 <div class="check-area">
                   <div class="form-check">
                     <input type="radio" name="smsRcptnAgreYn" id="smsY" class="mr5" v-model="mbrVO.smsRcptnAgreYn"
@@ -97,9 +95,7 @@
                 </div>
               </div>
               <div v-if="showOpt.isEmlAgree" class="layout">
-                <label class="form-title"><span>*</span>
-                  이메일수신
-                </label>
+                <label class="form-title"><span>*</span>이메일수신</label>
                 <div class="check-area">
                   <div class="form-check">
                     <input type="radio" name="emlRcptnAgreYn" id="y" class="mr5" v-model="mbrVO.emlRcptnAgreYn"
@@ -116,7 +112,7 @@
             <!-- </template> -->
             <template v-if="showOpt.isAddr">
               <div class="layout">
-                <label class="form-title"><span>*</span> 우편번호</label>
+                <label class="form-title"><span>*</span>우편번호</label>
                 <input type="text" class="form-control sm" v-model="mbrVO.zip" readonly />
 
                 <button :class="{
@@ -128,7 +124,7 @@
                 </button>
               </div>
               <div class="layout">
-                <label class="form-title"><span>*</span> 주소</label>
+                <label class="form-title"><span>*</span>주소</label>
                 <input type="text" class="form-control sm" v-model="mbrVO.addr" readonly />
               </div>
               <div class="layout">
@@ -144,7 +140,7 @@
             </div>
             <!-- <template v-if="showOpt.isStts && pageRole == 'adm' && pageId != null"> -->
               <div class="layout" v-if="showOpt.isStts && pageRole == 'adm' && pageId != null">
-                <label class="form-title"><span>*</span> 회원상태</label>
+                <label class="form-title"><span>*</span>회원상태</label>
                 <select class="form-select sm" v-model="mbrVO.mbrStts">
                   <option value="1">승인</option>
                   <option value="2">승인대기</option>
client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
--- client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
+++ client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
@@ -73,7 +73,7 @@
               </div>
               <div class="layout">
                 <p class="form-title">페이지 유형</p>
-                <p>{{ bbsMng.cd }}</p>
+                <p>{{ pageTypeName }}</p>
                 <!-- <select
                   name=""
                   id=""
@@ -376,7 +376,12 @@
     },
   },
   watch: {},
-  computed: {},
+  computed: {
+    pageTypeName() {
+      const match = this.pageTypeList.find(item => item.cd === this.bbsMng.cd);
+      return match ? match.cdNm : this.bbsMng.cd;
+    }
+  },
   components: {},
   mounted() {},
 };
client/views/pages/adm/main/Main.vue
--- client/views/pages/adm/main/Main.vue
+++ client/views/pages/adm/main/Main.vue
@@ -96,10 +96,9 @@
 import cntnStatsSave from "../../../../resources/js/cntnStatsSave";
 
 // API
-import {
-  adminMainProc
-} from "../../../../resources/api/main";
+import { adminMainProc } from "../../../../resources/api/main";
 import { findBySysMenu } from "../../../../resources/api/menu";
+import { sysListByPageProc } from "../../../../resources/api/popup";
 
 const App = {
   mixins: [queryParams, cntnStatsSave],
@@ -134,6 +133,16 @@
     };
   },
   created() {
+    // 쿠키 초기화
+    const today = new Date();
+      let tomorrow = new Date(today.setDate(today.getDate() + 1));
+      tomorrow.setHours(0, 0, 0, 0);
+      tomorrow = new Date(tomorrow);
+      if (this.$cookies.get("popup") == null) {
+        this.$cookies.set("popup", [], tomorrow);
+      }
+    this.fnPopupList();
+
     this.reSetMenu();
     this.fnMenuList();
     this.fnAdminMain();
@@ -284,6 +293,49 @@
       }
     },
 
+    // 팝업조회(상세)
+    async fnPopupList() {
+      let data = {
+        pageType: this.$store.state.userType,
+      };
+      try {
+        const response = await sysListByPageProc(data);
+        let popupList = response.data.data;
+        if (popupList != null && popupList.length > 0) {
+          this.fnShowPopup(popupList);
+        }
+      } catch (error) {
+        const errorData = error.response.data;
+        if (errorData.message != null && errorData.message != "") {
+          alert(error.response.data.message);
+        } else {
+          alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
+        }
+      }
+    },
+    // 팝업 표시
+    fnShowPopup(popupList) {
+      for (let popup of popupList) {
+        let count = false;
+        const popupCookies = this.$cookies.get("popup");
+        if (popupCookies.length > 0) {
+          for (let cookie of popupCookies) {
+            if (popup.popupId == cookie) {
+              count = true;
+            }
+          }
+        }
+        if (!count) {
+          let size = "width=" + popup.wdthLen + ", height=" + popup.vrtcLen;
+          window.open(
+            "/cmmn/popup.page?popupId=" + popup.popupId,
+            "_blank",
+            size + ", scrollbars=no, resizable=no, toolbars=no, menubar=no"
+          );
+        }
+      }
+    },
+
   },
 };
 
client/views/pages/adm/popup/PopupManagementInsert.vue
--- client/views/pages/adm/popup/PopupManagementInsert.vue
+++ client/views/pages/adm/popup/PopupManagementInsert.vue
@@ -146,11 +146,11 @@
               </div>
           
               <div class="layout">
-                <label class="form-title"><span>*</span>링크 URL</label>
+                <label class="form-title">링크 URL</label>
                 <input
                   type="text"
                   class="form-control sm"
-                  placeholder="이미지 주소를 입력하세요."
+                  placeholder="이미지 주소를 입력해주세요."
                   v-model="popup['linkUrl']"
                   :disabled="popup['popupType'] != 'image'"
                   ref="linkUrl"
@@ -198,6 +198,31 @@
                 <option value="4">4</option>
                 <option value="5">5</option>
               </select>
+            </div>
+            <div  class="layout">
+              <label class="form-title"><span>*</span>사용 유무</label>
+              <div class="check-area">
+                <div class="form-check">
+                  <input
+                    type="radio"
+                    id="useY"
+                    class="mr5"
+                    v-model="popup['popupUseYn']"
+                    value="Y"
+                  />
+                  <label for="useY">사용</label>
+                </div>
+                <div class="form-check">
+                  <input
+                    type="radio"
+                    id="useN"
+                    class="mr5"
+                    v-model="popup['popupUseYn']"
+                    value="N"
+                  />
+                  <label for="useN">미사용</label>
+                </div>
+              </div>
             </div>
           </div>
         </div>
@@ -383,13 +408,13 @@
           alert("이미지 첨부파일을 추가하세요.");
           return false;
         }
-        if (!this.popup["linkUrl"]) {
-          alert("링크 URL을 입력하세요.");
-          this.$refs.linkUrl.focus();
-          return false;
-        }
+        // if (this.popup["linkUrl"].trim() == '') {
+        //   alert("링크 URL을 입력하세요.");
+        //   this.$refs.linkUrl.focus();
+        //   return false;
+        // }
       } else if (this.popup["popupType"] == "video") {
-        if (!this.popup["vdoUrl"]) {
+        if (this.popup["vdoUrl"].trim() == '') {
           alert("동영상 URL을 입력하세요.");
           this.$refs.vdoUrl.focus();
           return false;
@@ -404,10 +429,10 @@
         alert("팝업 노출 페이지를 선택하세요.");
         return false;
       }
-      // if (!this.popup["popupUseYn"]) {
-      //   alert("사용 유무를 선택해주세요.");
-      //   return false;
-      // }
+      if (!this.popup["popupUseYn"]) {
+        alert("사용 유무를 선택해주세요.");
+        return false;
+      }
     },
 
     //─────axios─────┐
client/views/pages/adm/popup/PopupManagementSelectListOne.vue
--- client/views/pages/adm/popup/PopupManagementSelectListOne.vue
+++ client/views/pages/adm/popup/PopupManagementSelectListOne.vue
@@ -20,7 +20,7 @@
             </div>
             <div class="layout">
               <p class="form-title">게시일</p>
-              <p>{{ popup['bgngDt'] +"-"+  popup['endDt'] }}</p>
+              <p>{{ popup['bgngDt'] +" ~ "+  popup['endDt'] }}</p>
          
                   <!-- <input
                     type="datetime"
@@ -107,8 +107,8 @@
               </div> -->
             </div>
             <div class="layout">
-              <p class="form-title">업로드 형식 </p>
-              <p>{{ popup['popupType'] }}</p>
+              <p class="form-title">업로드 형식</p>
+              <p>{{ popupTypeName }}</p>
               <!-- <div class="flex align-center no-gutters">
                 <div class="gd-5">
                   <input
@@ -193,8 +193,8 @@
                 </div>
             </template>
               <div class="layout">
-                <p class="form-title point-font2 mb10"> 팝업 노출 페이지</p>
-                <p>{{ popup['pageType'] }}</p>
+                <p class="form-title point-font2 mb10">팝업 노출 페이지</p>
+                <p>{{ pageTypeName }}</p>
                 <!-- <select
                   class="full-input"
                   v-model="popup['pageType']"
@@ -227,6 +227,10 @@
                   <option value="4">4</option>
                   <option value="5">5</option>
                 </select> -->
+              </div>
+              <div class="layout">
+                <p class="form-title">사용 유무</p>
+                <p>{{ popup['popupUseYn'] }}</p>
               </div>
           </div>
         </div>
@@ -368,7 +372,22 @@
     //─────axios─────┘
   },
   watch: {},
-  computed: {},
+  computed: {
+    popupTypeName() {
+      // 팝업 타입
+      const popupTypeList = [
+        { cd: "image", cdNm: "이미지" },
+        { cd: "video", cdNm: "영상" },
+      ];
+      const match = popupTypeList.find(item => item.cd === this.popup['popupType']);
+      return match ? match.cdNm : this.popup['popupType'];
+    },
+
+    pageTypeName() {
+      const match = this.codeList.find(item => item.cd === this.popup['pageType']);
+      return match ? match.cdNm : this.popup['pageType'];
+    }
+  },
   components: {},
   mounted() {},
 };
client/views/pages/popup/PopUp.vue
--- client/views/pages/popup/PopUp.vue
+++ client/views/pages/popup/PopUp.vue
@@ -91,7 +91,12 @@
           this.downloadFile();
         }
       } catch (error) {
-        alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요.");
+        const errorData = error.response.data;
+        if (errorData.message != null && errorData.message != "") {
+            alert(error.response.data.message);
+        } else {
+            alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
+        }
       }
     },
     // 팝업 닫기
@@ -139,10 +144,18 @@
           new Blob([response.data], { type: "image/" + file.extnNm })
         );
       } catch (error) {
-        alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요.");
+        const errorData = error.response.data;
+        if (errorData.message != null && errorData.message != "") {
+            alert(error.response.data.message);
+        } else {
+            alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
+        }
       }
     },
     fnMove() {
+      if(this.popup.linkUrl.trim() == "") {
+        return;
+      }
       window.opener.location = this.popup.linkUrl;
       this.fnClose();
     },
Add a comment
List