
250507 하석형 게시판관리/팝업관리 상세 코드 -> 한글코드값 표시, 관리자 메인 팝업 표시, 팝업관리 사용유무 추가
@a39c1e2090cb97ff1aa5b559521ee78df0e4729e
--- client/views/component/userInfo/UserInfoInsert.vue
+++ client/views/component/userInfo/UserInfoInsert.vue
... | ... | @@ -9,18 +9,18 @@ |
9 | 9 |
</div> |
10 | 10 |
<div class="form-content"> |
11 | 11 |
<div class="layout"> |
12 |
- <label class="form-title"><span>*</span> 아이디</label> |
|
12 |
+ <label class="form-title"><span>*</span>아이디</label> |
|
13 | 13 |
<input type="text" class="form-control sm" v-model="mbrVO.lgnId" ref="mbrId" minlength="5" maxlength="50" |
14 | 14 |
placeholder="아이디를 입력하세요." :disabled="mbrVO.mbrId != null" /> |
15 | 15 |
</div> |
16 | 16 |
<div class="layout"> |
17 |
- <label class="form-title"><span>*</span> 이름</label> |
|
17 |
+ <label class="form-title"><span>*</span>이름</label> |
|
18 | 18 |
<input type="text" class="form-control sm" ref="mbrNm" v-model="mbrVO.mbrNm" minlength="2" maxlength="50" |
19 | 19 |
placeholder="이름을 입력하세요." /> |
20 | 20 |
</div> |
21 | 21 |
<div class="layout"> |
22 | 22 |
<label class="form-title"> |
23 |
- <p v-if="pageId == null"><span>*</span> 비밀번호</p> |
|
23 |
+ <p v-if="pageId == null"><span>*</span>비밀번호</p> |
|
24 | 24 |
<p v-else>비밀번호변경</p> |
25 | 25 |
</label> |
26 | 26 |
<div class="form-group"> |
... | ... | @@ -35,7 +35,7 @@ |
35 | 35 |
</div> |
36 | 36 |
<div class="layout"> |
37 | 37 |
<label class="form-title"> |
38 |
- <p v-if="pageId == null"><span>*</span> 비밀번호확인</p> |
|
38 |
+ <p v-if="pageId == null"><span>*</span>비밀번호확인</p> |
|
39 | 39 |
<p v-else>비밀번호변경 확인</p> |
40 | 40 |
</label> |
41 | 41 |
<input type="password" :class="{ 'form-control sm': true, 'error': pswd.pswdChk }" ref="newPswdChk" |
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 |
</div> |
47 | 47 |
<!-- <template v-if="showOpt.isMblNo || showOpt.isTelNo"> --> |
48 | 48 |
<div v-if="showOpt.isMblNo" class="layout"> |
49 |
- <label class="form-title"><span>*</span> 휴대폰번호</label> |
|
49 |
+ <label class="form-title"><span>*</span>휴대폰번호</label> |
|
50 | 50 |
<input type="text" class="form-control sm" ref="mblTelno" v-model="mbrVO.mblTelno" minlength="10" |
51 | 51 |
maxlength="11" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\.*)/g, '');" |
52 | 52 |
placeholder="휴대폰번호를 입력하세요." /> |
... | ... | @@ -60,7 +60,7 @@ |
60 | 60 |
</div> |
61 | 61 |
<!-- <template v-if="showOpt.isEml || showOpt.isSmsAgree || showOpt.isEmlAgree"> --> |
62 | 62 |
<div v-if="showOpt.isEml" class="layout"> |
63 |
- <label class="form-title"><span>*</span> 이메일</label> |
|
63 |
+ <label class="form-title"><span>*</span>이메일</label> |
|
64 | 64 |
<div class="check-area"> |
65 | 65 |
<input type="text" class="form-control sm" ref="emailId" v-model="email.id" oninput="this.value = |
66 | 66 |
this.value.replace(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/g, '');" placeholder="이메일을 입력하세요." /> |
... | ... | @@ -80,9 +80,7 @@ |
80 | 80 |
</div> |
81 | 81 |
</div> |
82 | 82 |
<div v-if="showOpt.isSmsAgree" class="layout"> |
83 |
- <label class="form-title"><span>*</span> |
|
84 |
- 문자수신 |
|
85 |
- </label> |
|
83 |
+ <label class="form-title"><span>*</span>문자수신</label> |
|
86 | 84 |
<div class="check-area"> |
87 | 85 |
<div class="form-check"> |
88 | 86 |
<input type="radio" name="smsRcptnAgreYn" id="smsY" class="mr5" v-model="mbrVO.smsRcptnAgreYn" |
... | ... | @@ -97,9 +95,7 @@ |
97 | 95 |
</div> |
98 | 96 |
</div> |
99 | 97 |
<div v-if="showOpt.isEmlAgree" class="layout"> |
100 |
- <label class="form-title"><span>*</span> |
|
101 |
- 이메일수신 |
|
102 |
- </label> |
|
98 |
+ <label class="form-title"><span>*</span>이메일수신</label> |
|
103 | 99 |
<div class="check-area"> |
104 | 100 |
<div class="form-check"> |
105 | 101 |
<input type="radio" name="emlRcptnAgreYn" id="y" class="mr5" v-model="mbrVO.emlRcptnAgreYn" |
... | ... | @@ -116,7 +112,7 @@ |
116 | 112 |
<!-- </template> --> |
117 | 113 |
<template v-if="showOpt.isAddr"> |
118 | 114 |
<div class="layout"> |
119 |
- <label class="form-title"><span>*</span> 우편번호</label> |
|
115 |
+ <label class="form-title"><span>*</span>우편번호</label> |
|
120 | 116 |
<input type="text" class="form-control sm" v-model="mbrVO.zip" readonly /> |
121 | 117 |
|
122 | 118 |
<button :class="{ |
... | ... | @@ -128,7 +124,7 @@ |
128 | 124 |
</button> |
129 | 125 |
</div> |
130 | 126 |
<div class="layout"> |
131 |
- <label class="form-title"><span>*</span> 주소</label> |
|
127 |
+ <label class="form-title"><span>*</span>주소</label> |
|
132 | 128 |
<input type="text" class="form-control sm" v-model="mbrVO.addr" readonly /> |
133 | 129 |
</div> |
134 | 130 |
<div class="layout"> |
... | ... | @@ -144,7 +140,7 @@ |
144 | 140 |
</div> |
145 | 141 |
<!-- <template v-if="showOpt.isStts && pageRole == 'adm' && pageId != null"> --> |
146 | 142 |
<div class="layout" v-if="showOpt.isStts && pageRole == 'adm' && pageId != null"> |
147 |
- <label class="form-title"><span>*</span> 회원상태</label> |
|
143 |
+ <label class="form-title"><span>*</span>회원상태</label> |
|
148 | 144 |
<select class="form-select sm" v-model="mbrVO.mbrStts"> |
149 | 145 |
<option value="1">승인</option> |
150 | 146 |
<option value="2">승인대기</option> |
--- client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
+++ client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
... | ... | @@ -73,7 +73,7 @@ |
73 | 73 |
</div> |
74 | 74 |
<div class="layout"> |
75 | 75 |
<p class="form-title">페이지 유형</p> |
76 |
- <p>{{ bbsMng.cd }}</p> |
|
76 |
+ <p>{{ pageTypeName }}</p> |
|
77 | 77 |
<!-- <select |
78 | 78 |
name="" |
79 | 79 |
id="" |
... | ... | @@ -376,7 +376,12 @@ |
376 | 376 |
}, |
377 | 377 |
}, |
378 | 378 |
watch: {}, |
379 |
- computed: {}, |
|
379 |
+ computed: { |
|
380 |
+ pageTypeName() { |
|
381 |
+ const match = this.pageTypeList.find(item => item.cd === this.bbsMng.cd); |
|
382 |
+ return match ? match.cdNm : this.bbsMng.cd; |
|
383 |
+ } |
|
384 |
+ }, |
|
380 | 385 |
components: {}, |
381 | 386 |
mounted() {}, |
382 | 387 |
}; |
--- client/views/pages/adm/main/Main.vue
+++ client/views/pages/adm/main/Main.vue
... | ... | @@ -96,10 +96,9 @@ |
96 | 96 |
import cntnStatsSave from "../../../../resources/js/cntnStatsSave"; |
97 | 97 |
|
98 | 98 |
// API |
99 |
-import { |
|
100 |
- adminMainProc |
|
101 |
-} from "../../../../resources/api/main"; |
|
99 |
+import { adminMainProc } from "../../../../resources/api/main"; |
|
102 | 100 |
import { findBySysMenu } from "../../../../resources/api/menu"; |
101 |
+import { sysListByPageProc } from "../../../../resources/api/popup"; |
|
103 | 102 |
|
104 | 103 |
const App = { |
105 | 104 |
mixins: [queryParams, cntnStatsSave], |
... | ... | @@ -134,6 +133,16 @@ |
134 | 133 |
}; |
135 | 134 |
}, |
136 | 135 |
created() { |
136 |
+ // 쿠키 초기화 |
|
137 |
+ const today = new Date(); |
|
138 |
+ let tomorrow = new Date(today.setDate(today.getDate() + 1)); |
|
139 |
+ tomorrow.setHours(0, 0, 0, 0); |
|
140 |
+ tomorrow = new Date(tomorrow); |
|
141 |
+ if (this.$cookies.get("popup") == null) { |
|
142 |
+ this.$cookies.set("popup", [], tomorrow); |
|
143 |
+ } |
|
144 |
+ this.fnPopupList(); |
|
145 |
+ |
|
137 | 146 |
this.reSetMenu(); |
138 | 147 |
this.fnMenuList(); |
139 | 148 |
this.fnAdminMain(); |
... | ... | @@ -284,6 +293,49 @@ |
284 | 293 |
} |
285 | 294 |
}, |
286 | 295 |
|
296 |
+ // 팝업조회(상세) |
|
297 |
+ async fnPopupList() { |
|
298 |
+ let data = { |
|
299 |
+ pageType: this.$store.state.userType, |
|
300 |
+ }; |
|
301 |
+ try { |
|
302 |
+ const response = await sysListByPageProc(data); |
|
303 |
+ let popupList = response.data.data; |
|
304 |
+ if (popupList != null && popupList.length > 0) { |
|
305 |
+ this.fnShowPopup(popupList); |
|
306 |
+ } |
|
307 |
+ } catch (error) { |
|
308 |
+ const errorData = error.response.data; |
|
309 |
+ if (errorData.message != null && errorData.message != "") { |
|
310 |
+ alert(error.response.data.message); |
|
311 |
+ } else { |
|
312 |
+ alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); |
|
313 |
+ } |
|
314 |
+ } |
|
315 |
+ }, |
|
316 |
+ // 팝업 표시 |
|
317 |
+ fnShowPopup(popupList) { |
|
318 |
+ for (let popup of popupList) { |
|
319 |
+ let count = false; |
|
320 |
+ const popupCookies = this.$cookies.get("popup"); |
|
321 |
+ if (popupCookies.length > 0) { |
|
322 |
+ for (let cookie of popupCookies) { |
|
323 |
+ if (popup.popupId == cookie) { |
|
324 |
+ count = true; |
|
325 |
+ } |
|
326 |
+ } |
|
327 |
+ } |
|
328 |
+ if (!count) { |
|
329 |
+ let size = "width=" + popup.wdthLen + ", height=" + popup.vrtcLen; |
|
330 |
+ window.open( |
|
331 |
+ "/cmmn/popup.page?popupId=" + popup.popupId, |
|
332 |
+ "_blank", |
|
333 |
+ size + ", scrollbars=no, resizable=no, toolbars=no, menubar=no" |
|
334 |
+ ); |
|
335 |
+ } |
|
336 |
+ } |
|
337 |
+ }, |
|
338 |
+ |
|
287 | 339 |
}, |
288 | 340 |
}; |
289 | 341 |
|
--- client/views/pages/adm/popup/PopupManagementInsert.vue
+++ client/views/pages/adm/popup/PopupManagementInsert.vue
... | ... | @@ -146,11 +146,11 @@ |
146 | 146 |
</div> |
147 | 147 |
|
148 | 148 |
<div class="layout"> |
149 |
- <label class="form-title"><span>*</span>링크 URL</label> |
|
149 |
+ <label class="form-title">링크 URL</label> |
|
150 | 150 |
<input |
151 | 151 |
type="text" |
152 | 152 |
class="form-control sm" |
153 |
- placeholder="이미지 주소를 입력하세요." |
|
153 |
+ placeholder="이미지 주소를 입력해주세요." |
|
154 | 154 |
v-model="popup['linkUrl']" |
155 | 155 |
:disabled="popup['popupType'] != 'image'" |
156 | 156 |
ref="linkUrl" |
... | ... | @@ -198,6 +198,31 @@ |
198 | 198 |
<option value="4">4</option> |
199 | 199 |
<option value="5">5</option> |
200 | 200 |
</select> |
201 |
+ </div> |
|
202 |
+ <div class="layout"> |
|
203 |
+ <label class="form-title"><span>*</span>사용 유무</label> |
|
204 |
+ <div class="check-area"> |
|
205 |
+ <div class="form-check"> |
|
206 |
+ <input |
|
207 |
+ type="radio" |
|
208 |
+ id="useY" |
|
209 |
+ class="mr5" |
|
210 |
+ v-model="popup['popupUseYn']" |
|
211 |
+ value="Y" |
|
212 |
+ /> |
|
213 |
+ <label for="useY">사용</label> |
|
214 |
+ </div> |
|
215 |
+ <div class="form-check"> |
|
216 |
+ <input |
|
217 |
+ type="radio" |
|
218 |
+ id="useN" |
|
219 |
+ class="mr5" |
|
220 |
+ v-model="popup['popupUseYn']" |
|
221 |
+ value="N" |
|
222 |
+ /> |
|
223 |
+ <label for="useN">미사용</label> |
|
224 |
+ </div> |
|
225 |
+ </div> |
|
201 | 226 |
</div> |
202 | 227 |
</div> |
203 | 228 |
</div> |
... | ... | @@ -383,13 +408,13 @@ |
383 | 408 |
alert("이미지 첨부파일을 추가하세요."); |
384 | 409 |
return false; |
385 | 410 |
} |
386 |
- if (!this.popup["linkUrl"]) { |
|
387 |
- alert("링크 URL을 입력하세요."); |
|
388 |
- this.$refs.linkUrl.focus(); |
|
389 |
- return false; |
|
390 |
- } |
|
411 |
+ // if (this.popup["linkUrl"].trim() == '') { |
|
412 |
+ // alert("링크 URL을 입력하세요."); |
|
413 |
+ // this.$refs.linkUrl.focus(); |
|
414 |
+ // return false; |
|
415 |
+ // } |
|
391 | 416 |
} else if (this.popup["popupType"] == "video") { |
392 |
- if (!this.popup["vdoUrl"]) { |
|
417 |
+ if (this.popup["vdoUrl"].trim() == '') { |
|
393 | 418 |
alert("동영상 URL을 입력하세요."); |
394 | 419 |
this.$refs.vdoUrl.focus(); |
395 | 420 |
return false; |
... | ... | @@ -404,10 +429,10 @@ |
404 | 429 |
alert("팝업 노출 페이지를 선택하세요."); |
405 | 430 |
return false; |
406 | 431 |
} |
407 |
- // if (!this.popup["popupUseYn"]) { |
|
408 |
- // alert("사용 유무를 선택해주세요."); |
|
409 |
- // return false; |
|
410 |
- // } |
|
432 |
+ if (!this.popup["popupUseYn"]) { |
|
433 |
+ alert("사용 유무를 선택해주세요."); |
|
434 |
+ return false; |
|
435 |
+ } |
|
411 | 436 |
}, |
412 | 437 |
|
413 | 438 |
//─────axios─────┐ |
--- client/views/pages/adm/popup/PopupManagementSelectListOne.vue
+++ client/views/pages/adm/popup/PopupManagementSelectListOne.vue
... | ... | @@ -20,7 +20,7 @@ |
20 | 20 |
</div> |
21 | 21 |
<div class="layout"> |
22 | 22 |
<p class="form-title">게시일</p> |
23 |
- <p>{{ popup['bgngDt'] +"-"+ popup['endDt'] }}</p> |
|
23 |
+ <p>{{ popup['bgngDt'] +" ~ "+ popup['endDt'] }}</p> |
|
24 | 24 |
|
25 | 25 |
<!-- <input |
26 | 26 |
type="datetime" |
... | ... | @@ -107,8 +107,8 @@ |
107 | 107 |
</div> --> |
108 | 108 |
</div> |
109 | 109 |
<div class="layout"> |
110 |
- <p class="form-title">업로드 형식 </p> |
|
111 |
- <p>{{ popup['popupType'] }}</p> |
|
110 |
+ <p class="form-title">업로드 형식</p> |
|
111 |
+ <p>{{ popupTypeName }}</p> |
|
112 | 112 |
<!-- <div class="flex align-center no-gutters"> |
113 | 113 |
<div class="gd-5"> |
114 | 114 |
<input |
... | ... | @@ -193,8 +193,8 @@ |
193 | 193 |
</div> |
194 | 194 |
</template> |
195 | 195 |
<div class="layout"> |
196 |
- <p class="form-title point-font2 mb10"> 팝업 노출 페이지</p> |
|
197 |
- <p>{{ popup['pageType'] }}</p> |
|
196 |
+ <p class="form-title point-font2 mb10">팝업 노출 페이지</p> |
|
197 |
+ <p>{{ pageTypeName }}</p> |
|
198 | 198 |
<!-- <select |
199 | 199 |
class="full-input" |
200 | 200 |
v-model="popup['pageType']" |
... | ... | @@ -227,6 +227,10 @@ |
227 | 227 |
<option value="4">4</option> |
228 | 228 |
<option value="5">5</option> |
229 | 229 |
</select> --> |
230 |
+ </div> |
|
231 |
+ <div class="layout"> |
|
232 |
+ <p class="form-title">사용 유무</p> |
|
233 |
+ <p>{{ popup['popupUseYn'] }}</p> |
|
230 | 234 |
</div> |
231 | 235 |
</div> |
232 | 236 |
</div> |
... | ... | @@ -368,7 +372,22 @@ |
368 | 372 |
//─────axios─────┘ |
369 | 373 |
}, |
370 | 374 |
watch: {}, |
371 |
- computed: {}, |
|
375 |
+ computed: { |
|
376 |
+ popupTypeName() { |
|
377 |
+ // 팝업 타입 |
|
378 |
+ const popupTypeList = [ |
|
379 |
+ { cd: "image", cdNm: "이미지" }, |
|
380 |
+ { cd: "video", cdNm: "영상" }, |
|
381 |
+ ]; |
|
382 |
+ const match = popupTypeList.find(item => item.cd === this.popup['popupType']); |
|
383 |
+ return match ? match.cdNm : this.popup['popupType']; |
|
384 |
+ }, |
|
385 |
+ |
|
386 |
+ pageTypeName() { |
|
387 |
+ const match = this.codeList.find(item => item.cd === this.popup['pageType']); |
|
388 |
+ return match ? match.cdNm : this.popup['pageType']; |
|
389 |
+ } |
|
390 |
+ }, |
|
372 | 391 |
components: {}, |
373 | 392 |
mounted() {}, |
374 | 393 |
}; |
--- client/views/pages/popup/PopUp.vue
+++ client/views/pages/popup/PopUp.vue
... | ... | @@ -91,7 +91,12 @@ |
91 | 91 |
this.downloadFile(); |
92 | 92 |
} |
93 | 93 |
} catch (error) { |
94 |
- alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요."); |
|
94 |
+ const errorData = error.response.data; |
|
95 |
+ if (errorData.message != null && errorData.message != "") { |
|
96 |
+ alert(error.response.data.message); |
|
97 |
+ } else { |
|
98 |
+ alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); |
|
99 |
+ } |
|
95 | 100 |
} |
96 | 101 |
}, |
97 | 102 |
// 팝업 닫기 |
... | ... | @@ -139,10 +144,18 @@ |
139 | 144 |
new Blob([response.data], { type: "image/" + file.extnNm }) |
140 | 145 |
); |
141 | 146 |
} catch (error) { |
142 |
- alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요."); |
|
147 |
+ const errorData = error.response.data; |
|
148 |
+ if (errorData.message != null && errorData.message != "") { |
|
149 |
+ alert(error.response.data.message); |
|
150 |
+ } else { |
|
151 |
+ alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); |
|
152 |
+ } |
|
143 | 153 |
} |
144 | 154 |
}, |
145 | 155 |
fnMove() { |
156 |
+ if(this.popup.linkUrl.trim() == "") { |
|
157 |
+ return; |
|
158 |
+ } |
|
146 | 159 |
window.opener.location = this.popup.linkUrl; |
147 | 160 |
this.fnClose(); |
148 | 161 |
}, |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?