류윤주 류윤주 04-16
Merge branch 'master' of http://210.180.118.83/jhpark/cms_frontend
@3c776f583545570ccb8390e04cc3e307cd01db6d
client/resources/api/author.js
--- client/resources/api/author.js
+++ client/resources/api/author.js
@@ -1,6 +1,6 @@
 import apiClient from "./index";
 
 // 사용자 권한 목록 조회
-export const findAllSystem = () => {
-  return apiClient.post(`/admin/auth/findAllSystem.json`);
+export const findAllSystem = params => {
+  return apiClient.post(`/admin/auth/findAllSystem.json`, params);
 }
(파일 끝에 줄바꿈 문자 없음)
client/views/component/Breadcrumb/Breadcrumb.vue
--- client/views/component/Breadcrumb/Breadcrumb.vue
+++ client/views/component/Breadcrumb/Breadcrumb.vue
@@ -16,10 +16,20 @@
     };
   },
   watch: {
+    // 페이지 이동 시 동작
     $route: {
       immediate: true,
       handler() {
         this.generateBreadcrumb();
+      }
+    },
+    // 새로고침 시 동작
+    '$store.state.menuList': {
+      immediate: true,
+      handler(val) {
+        if (val && val.length > 0) {
+          this.generateBreadcrumb();
+        }
       }
     }
   },
@@ -27,8 +37,6 @@
     generateBreadcrumb() {
       const menuState = this.$store.state;
       const currentPath = this.$route.path;
-
-      console.log('menuState',menuState)
 
       // 관리자: childList 기반
       const findFromTree = (menus, path, trail = []) => {
client/views/component/comment/CommentItem.vue
--- client/views/component/comment/CommentItem.vue
+++ client/views/component/comment/CommentItem.vue
@@ -19,17 +19,16 @@
       </div>
 
       <div class="layout end btn-wrap pb10">
-        <button v-if="comment.isUpdate != true" :class="{
+        <button  v-if="comment.useYn == 'Y' && comment.isUpdate != true"
+        :class="{
           'green': !showReplyInput[comment.cmntId],
           'gray': showReplyInput[comment.cmntId],
         }" @click="toggleReplyInput(comment.cmntId)">
           {{ showReplyInput[comment.cmntId] ? "취소" : "답글 달기" }}
         </button>
 
-        <button v-if="
-          (roles[0].authority == 'ROLE_ADMIN' || mbrId == comment.rgtr) &&
-          !showReplyInput[comment.cmntId]
-        " :class="{
+        <button v-if="comment.useYn == 'Y' && mbrId == comment.rgtr && !showReplyInput[comment.cmntId]"
+        :class="{
               'ml5 comment-item-btn icon-btn radius pd5': true,
               'dark-gray': pageRole == 'adm',
               'dark-gray':
@@ -38,7 +37,8 @@
           수정
         </button>
 
-        <button v-if="roles[0].authority == 'ROLE_ADMIN' || mbrId == comment.rgtr" @click="fnDeleteCmnt(comment.cmntId)"
+        <button  v-if="comment.useYn == 'Y' && (roles[0].authority == 'ROLE_ADMIN' || mbrId == comment.rgtr)"
+        @click="fnDeleteCmnt(comment.cmntId)"
           class="ml5 icon-btn red radius pd5">
           삭제
         </button>
client/views/component/userInfo/UserAuthorList.vue
--- client/views/component/userInfo/UserAuthorList.vue
+++ client/views/component/userInfo/UserAuthorList.vue
@@ -15,7 +15,7 @@
             >
               <p>{{ auth.authrtNm }}</p>
               <button
-                v-show="editMode != 'view'"
+                v-show="editMode != 'view' && auth.sysPvsnYn == '1'"
                 class="btn-ico sm ico-close"
                 @click="fnAuthDelete(index)"
               >
@@ -121,7 +121,11 @@
     // axios: 사용자권한 목록 조회
     async fnAuthViewList() {
       try {
-        const response = await findAllSystem();
+        let params = {
+          useYn: 'Y',
+          sysPvsnYn: '1',
+        };
+        const response = await findAllSystem(params);
         this.originalList = response.data.data;
       } catch (error) {
         alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
@@ -133,6 +137,7 @@
         mbrId: this.mbrVO.mbrId,
         authrtNm: authrt.authrtNm,
         authrtCd: authrt.authrtCd,
+        sysPvsnYn: authrt.sysPvsnYn,
         rgtr: null,
         regDt: null,
       });
@@ -160,10 +165,10 @@
 
     // 사용자권한 삭제
     fnAuthDelete(index) {
-      if (this.mbrVO.authorList.length < 2) {
-        alert("사용자 권한은 최소 1개 이상 존재해야 합니다.");
-        return;
-      }
+      // if (this.mbrVO.authorList.length < 2) {
+      //   alert("사용자 권한은 최소 1개 이상 존재해야 합니다.");
+      //   return;
+      // }
       this.mbrVO.authorList.splice(index, 1);
     },
   },
client/views/component/userInfo/UserInfoInsert.vue
--- client/views/component/userInfo/UserInfoInsert.vue
+++ client/views/component/userInfo/UserInfoInsert.vue
@@ -588,10 +588,10 @@
             }
           }
           // 사용자 권한
-          if (this.mbrVO.authorList.length < 1) {
-            alert("사용자의 권한을 최소 1개 이상 추가하세요.");
-            return false;
-          }
+          // if (this.mbrVO.authorList.length < 1) {
+          //   alert("사용자의 권한을 최소 1개 이상 추가하세요.");
+          //   return false;
+          // }
         }
       }
 
client/views/layout/AdminMenu.vue
--- client/views/layout/AdminMenu.vue
+++ client/views/layout/AdminMenu.vue
@@ -54,13 +54,20 @@
     },
     created() {
         this.findAll();
-        this.menuCheck();
+        // this.menuCheck();
     },
     methods: {
+        // 새로고침 시 메뉴 체크
         menuCheck() {
-            const menu = store.state.menu;
+            let menu = store.state.menu;
             if (menu) {
-                this.checkMenu = menu.menuId;
+                // this.checkMenu = menu.menuId;
+                this.activeMenus = this.getParentMenus(menu);
+                for (const mu of this.activeMenus) {
+                    if (mu.childList && mu.childList.length > 0) {
+                        mu.isOpen = true; // 하위 메뉴가 있을 시 메뉴 펼치기
+                    }
+                }
             }
         },
         async findAll() {
@@ -85,8 +92,6 @@
 
                     // 전체 메뉴 트리 store에 저장
                     this.$store.commit('setMenuList', this.menuList);
-
-                    console.log("menulist",this.menuList)
                 }
             } catch (error) {
                 alert('에러가 발생했습니다.\n관리자에게 문의하세요.');
@@ -125,24 +130,28 @@
         },
 
         isActive(menuId) {
-            return this.activeMenus.includes(menuId);
+            // return this.activeMenus.includes(menuId);
+            return this.activeMenus.some(menu => menu.menuId === menuId);
         },
 
         getParentMenus(menu) {
             let parents = [];
             while (menu) {
-                parents.push(menu.menuId);
+                // parents.push(menu.menuId);
+                parents.push(menu);
                 menu = this.findParent(menu);
             }
             return parents;
         },
         findParent(menu) {
             for (const parent of this.menuList) {
-                if (parent.childList && parent.childList.includes(menu)) {
-                    return parent;
+                if (parent.childList?.some(child => child.menuId === menu.menuId)) {
+                // if (parent.childList && parent.childList.includes(menu)) {
+                return parent;
                 }
                 for (const child of parent.childList || []) {
-                    if (child.childList && child.childList.includes(menu)) {
+                    if (child.childList?.some(grand => grand.menuId === menu.menuId)) {
+                    // if (child.childList && child.childList.includes(menu)) {
                         return child;
                     }
                 }
@@ -172,11 +181,19 @@
     watch: {
         // 나중에 네비게이션 가드에서 form 받을 수 있으면 form adm/main으로 갈때 sotre.state값0로 바꿔주기
         $route(to) {
-        this.currentPath = to.path;
+            this.currentPath = to.path;
         },
         "$store.state.mbrNm"(newVal) {
             this.mbrNm = newVal;
         },
+        '$store.state.menuList': {
+            immediate: true,
+            handler(val) {
+                if (val && val.length > 0) {
+                    this.menuCheck();
+                }
+            }
+        }
     }
 };
 </script>
client/views/pages/adm/authority/authority/AuthorityInsert.vue
--- client/views/pages/adm/authority/authority/AuthorityInsert.vue
+++ client/views/pages/adm/authority/authority/AuthorityInsert.vue
@@ -5,10 +5,11 @@
         <div class="form-box">
           <div class="form-box-title">
             <p>기본정보</p>
+            <p><span>*</span>필수입력</p>
           </div>
           <div class="form-content">
             <div class="layout">
-              <label class="form-title">권한코드</label>
+              <label class="form-title"><span>*</span>권한코드</label>
               <div class="form-group">
                 <input
                   type="text"
@@ -24,7 +25,7 @@
             </div>
 
             <div class="border-bottom layout">
-              <label class="form-title">권한명</label>
+              <label class="form-title"><span>*</span>권한명</label>
               <input
                 type="text"
                 class="form-control sm"
@@ -154,12 +155,12 @@
       }
     },
     validation() {
-      if (this.authrt.authrtCd == null || this.authrt.authrtCd == "") {
+      if (!this.authrt.authrtCd || this.authrt.authrtCd.trim() === "") {
         alert("권한코드를 입력해주세요.");
         this.$refs.authrtCd.focus();
         return false;
       }
-      if (this.authrt.authrtCd.substr(0, 5) != "ROLE_") {
+      if (this.authrt.authrtCd.trim().substr(0, 5) != "ROLE_") {
         alert("권한코드는 반드시 ROLE_로 시작해야합니다.");
         this.$refs.authrtCd.focus();
         return false;
@@ -170,7 +171,8 @@
         this.$refs.authrtCd.focus();
         return false;
       }
-      if (this.authrt.authrtNm == null || this.authrt.authrtNm == "") {
+      this.authrt.authrtCd = this.authrt.authrtCd.trim(); // 완성된 권한코드 공백 제거
+      if (!this.authrt.authrtNm || this.authrt.authrtNm.trim() === "") {
         alert("권한명을 입력해주세요.");
         this.$refs.authrtNm.focus();
         return false;
client/views/pages/adm/authority/menuAuthority/MenuAuthority.vue
--- client/views/pages/adm/authority/menuAuthority/MenuAuthority.vue
+++ client/views/pages/adm/authority/menuAuthority/MenuAuthority.vue
@@ -129,7 +129,10 @@
     // axios: 권한 조회(목록)
     async fnViewList() {
       try {
-        const res = await findAllSystem();
+        let params = {
+          useYn: "Y",
+        }
+        const res = await findAllSystem(params);
         if (res.status == 200) {
           if (res.data.data.length > 0) {
             let newData = [];
client/views/pages/adm/boardManagement/boardManagement/BoardManagementInsert.vue
--- client/views/pages/adm/boardManagement/boardManagement/BoardManagementInsert.vue
+++ client/views/pages/adm/boardManagement/boardManagement/BoardManagementInsert.vue
@@ -5,10 +5,11 @@
                 <div class="form-box mb30">
                     <div class="form-box-title">
                         <p>기본 설정</p>
+                        <p><span>*</span>필수입력</p>
                     </div>
                     <div class="form-content">
                         <div class="layout">
-                            <label class="form-title">게시판명</label>
+                            <label class="form-title"><span>*</span>게시판명</label>
                             <input type="text" class="form-control sm" v-model="bbsMng.bbsNm"
                                 placeholder="게시판명을 입력하세요." />
                         </div>
@@ -23,7 +24,7 @@
                                 placeholder="게시판 설명을 입력하세요." />
                         </div>
                         <div class="layout">
-                            <label class="form-title">게시판 유형</label>
+                            <label class="form-title"><span>*</span>게시판 유형</label>
                             <select name="" id="" class="form-select sm" @change="typeSelect"
                                 :disabled="bbsMng.bbsMngId != null">
                                 <option :value="null" disabled :selected="bbsMng.bbsTypeId == null">
@@ -35,11 +36,11 @@
                             </select>
                         </div>
                         <div class="layout">
-                            <label class="form-title">목록 개수</label>
+                            <label class="form-title"><span>*</span>목록 개수</label>
                             <input type="number" class="form-control sm" v-model="bbsMng.artclCnt" />
                         </div>
                         <div class="layout">
-                            <label class="form-title">페이지 유형</label>
+                            <label class="form-title"><span>*</span>페이지 유형</label>
                             <select name="" id="" class="form-select sm" v-model="bbsMng.cd">
                                 <option :value="null" disabled>선택해주세요</option>
                                 <option v-for="(item, idx) in pageTypeList" :value="item.cd" :key="idx">
@@ -52,10 +53,11 @@
                 <div class="form-box">
                     <div  class="form-box-title">
                         <p>세부설정</p>
+                        <p><span>*</span>필수입력</p>
                     </div>
                     <div class="form-content">
                         <div class="layout">
-                            <label class="form-title">첨부파일 기능</label>
+                            <label class="form-title"><span>*</span>첨부파일 기능</label>
                             <div class="check-area">
                                 <div class="form-check">
                                     <input type="radio" name="file" id="file-y" class="mr5" value="Y"
@@ -70,7 +72,7 @@
                             </div>
                         </div>
                         <div class="layout">
-                            <label class="form-title">공지글 기능</label>
+                            <label class="form-title"><span>*</span>공지글 기능</label>
                             <div class="check-area">
                                 <div class="form-check">
                                     <input type="radio" name="notice" id="notice-y" class="mr5" value="Y"
@@ -85,7 +87,7 @@
                             </div>
                         </div>
                         <div class="layout">
-                            <label class="form-title">첨부파일 확장자</label>
+                            <label class="form-title"><span>*</span>첨부파일 확장자</label>
                             <div class="form-group">
                                 <div class="layout border-none">
                                     <input type="text" class="form-control sm" v-model="inputExtNm" placeholder="첨부파일 확장자를 입력하세요"
@@ -110,15 +112,15 @@
                             </div>
                         </div>
                         <div class="layout">
-                            <label class="form-title">파일크기 제한</label>
+                            <label class="form-title"><span>*</span>파일크기 제한</label>
                             <div class="input-group">
                                 <input type="number" class="form-control sm" v-model="bbsMng.fileSzLmt"
-                                    placeholder="첨부파일 파일 크기를 입력하세요(0 입력 시 제한 없음)" />
+                                    :placeholder="'첨부파일 파일 크기를 입력하세요(0 입력 시 최대' + maxFileSize + 'MB)'" />
                                 <span>MByte</span>
                             </div>
                         </div>
                         <div class="layout">
-                            <label class="form-title">비밀글 기능</label>
+                            <label class="form-title"><span>*</span>비밀글 기능</label>
                             <div class="check-area">
                                 <div class="form-check">
                                     <input type="radio" name="private" id="private-y" class="mr5" value="Y"
@@ -133,7 +135,7 @@
                             </div>
                         </div>
                         <div class="border-bottom layout">
-                            <label class="form-title">이전글/다음글 기능</label>
+                            <label class="form-title"><span>*</span>이전글/다음글 기능</label>
                             <div class="check-area">
                                 <div class="form-check">
                                     <input type="radio" name="bf" id="bf-y" class="mr5" value="Y"
@@ -148,7 +150,7 @@
                             </div>
                         </div>
                         <div class="layout">
-                            <label class="form-title">댓글 기능</label>
+                            <label class="form-title"><span>*</span>댓글 기능</label>
                             <div class="check-area">
                                 <div class="form-check">
                                     <input type="radio" name="comment" id="comment-y" class="mr5" value="Y"
@@ -187,6 +189,7 @@
             bbsMng: {},
             bbsTypeList: [],
             pageTypeList: [],
+            maxFileSize: null, // 시스템 최대 파일 크기
             inputExtNm: "",
             selectedType: "",
         };
@@ -248,6 +251,7 @@
 
                     this.bbsTypeList = res.data.data.bbsTypeList;
                     this.pageTypeList = res.data.data.pageTypeList;
+                    this.maxFileSize = res.data.data.maxFileSize; // 시스템 최대 파일 크기
                 }
             } catch (error) {
                 alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요.");
@@ -344,12 +348,16 @@
                       alert('댓글 기능을 선택해주세요.');
                       return false;
                   } */
+            if (this.bbsMng.fileSzLmt > this.maxFileSize) {
+                alert('파일크기는 최대 ' + this.maxFileSize + 'MB까지 가능합니다.');
+                return false;
+            }
             if (
                 this.bbsMng.fileSzLmt < 0 ||
                 this.bbsMng.fileSzLmt == null ||
                 this.bbsMng.fileSzLmt == ""
             ) {
-                this.bbsMng.fileSzLmt = 0;
+                this.bbsMng.fileSzLmt = this.maxFileSize; // 시스템 최대 파일 크기
                 /* if (this.bbsMng.atchFileUseYn == 'Y') {
                             alert('파일 크기는 0 이상을 입력해주세요.');
                             return false;
client/views/pages/adm/boardManagement/template/commonTemplate/CommonInsert.vue
--- client/views/pages/adm/boardManagement/template/commonTemplate/CommonInsert.vue
+++ client/views/pages/adm/boardManagement/template/commonTemplate/CommonInsert.vue
@@ -47,11 +47,11 @@
               </div>
               <div class="form-content grid-none overflow-y">
                 <div class="layout">
-                  <label for="" class="form-title">제목</label>
+                  <label for="" class="form-title"><span>*</span>제목</label>
                   <input type="text" class="form-control sm" v-model="bbsCn.bbsNm" placeholder="제목을 입력하세요." />
                 </div>
                 <div class="layout"  ref="first">
-                  <label for="" class="form-title">내용</label>
+                  <label for="" class="form-title"><span>*</span>내용</label>
                   <div class="w_100 h_100">
                     <ckeditorComponent ref="ckeditor5" :bbsCn.sync="bbsCn"></ckeditorComponent>
                   </div>
@@ -324,6 +324,7 @@
         formData.append("multipartImgList", imgFile);
       }
       // axios 호출
+      console.log("등록 Authorization 확인: ", this.$store.state.authorization);
       await defaultAxios({
         url: this.$filters.ctxPath("/sys/bbsCn/saveBbsCn.file"),
         method: "post",
@@ -385,6 +386,7 @@
       for (const imgFile of this.imgFileList) {
         formData.append("multipartImgList", imgFile);
       }
+      console.log("수정 Authorization 확인: ", this.$store.state.authorization);
       // axios 호출
       defaultAxios({
         url: this.$filters.ctxPath("/sys/bbsCn/updateBbsCn.file"),
@@ -412,7 +414,7 @@
     },
     // 유효성 검사
     Validation() {
-      if (this.bbsCn.bbsNm == null || this.bbsCn.bbsNm.trim() == "") {
+      if (!this.bbsCn.bbsNm || this.bbsCn.bbsNm.trim() === "") {
         alert("게시판 제목을 입력해주세요.");
         return false;
       }
client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
--- client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
+++ client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
@@ -9,7 +9,7 @@
           </div>
           <div class="form-content grid-none">
             <div class="layout" ref="first">
-              <label for="" class="form-title">내용</label>
+              <label for="" class="form-title"><span>*</span>내용</label>
               <template v-if="ansPageId != null">
                 <textarea class="form-control area"  placeholder="답변을 입력하세요."   v-model="bbsCn.ansCn" style="height: 100%;"></textarea>
               </template>
@@ -280,7 +280,7 @@
     // 등록
     async fnSave() {
       // 내용 null검사
-      if (this.bbsCn.bbsCn === null || this.bbsCn.bbsCn.trim() == "") {
+      if (!this.bbsCn.bbsCn || this.bbsCn.bbsCn.trim() === "") {
         alert("내용을 입력하세요.");
         return;
       }
client/views/pages/adm/boardManagement/template/galleryTemplate/GalleryInsert.vue
--- client/views/pages/adm/boardManagement/template/galleryTemplate/GalleryInsert.vue
+++ client/views/pages/adm/boardManagement/template/galleryTemplate/GalleryInsert.vue
@@ -9,7 +9,7 @@
           </div>
           <div class="form-content grid-none overflow-y">
             <div class="layout">
-              <label for="" class="form-title">제목</label>
+              <label for="" class="form-title"><span>*</span>제목</label>
               <input
                 type="text"
                 class="form-control sm"
@@ -18,13 +18,13 @@
               />
             </div>
             <div class="layout" ref="first">
-              <label for="" class="form-title">내용</label>
+              <label for="" class="form-title"><span>*</span>내용</label>
               <div class="w_100 h_100">
                 <ckeditorComponent ref="ckeditor5" :bbsCn.sync="bbsCn"></ckeditorComponent>
               </div>
             </div>
             <div class="layout">
-              <label for="" class="form-title">이미지 파일</label>
+              <label for="" class="form-title"><span>*</span>이미지 파일</label>
               <div>
                 <label for="imgFile" class="file-upload">파일찾기</label>
                 <input type="file"  id="imgFile"  ref="imgFile" @change="fnImgFileInsert" multiple accept="image/*"  class="sr-only"/>
@@ -420,7 +420,7 @@
     },
     // 유효성 검사
     Validation() {
-      if (this.bbsCn.bbsNm == null || this.bbsCn.bbsNm.trim() == "") {
+      if (!this.bbsCn.bbsNm || this.bbsCn.bbsNm.trim() === "") {
         alert("게시판 제목을 입력해주세요.");
         return false;
       }
client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
--- client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
+++ client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
@@ -9,7 +9,7 @@
           </div>
           <div class="form-content grid-none overflow-y">
             <div class="layout">
-              <label for="" class="form-title">제목</label>
+              <label for="" class="form-title"><span>*</span>제목</label>
               <input
                 type="text"
                 class="form-control sm"
@@ -18,13 +18,13 @@
               />
             </div>
             <div class="layout" ref="first">
-              <label for="" class="form-title">내용</label>
+              <label for="" class="form-title"><span>*</span>내용</label>
               <div class="w_100 h_100">
                 <ckeditorComponent ref="ckeditor5" :bbsCn.sync="bbsCn"></ckeditorComponent>
               </div>
             </div>
             <div class="layout">
-              <label for="" class="form-title">영상 URL</label>
+              <label for="" class="form-title"><span>*</span>영상 URL</label>
               <input
                 type="text"
                 class="form-control sm"
@@ -746,7 +746,7 @@
     },
     // 유효성 검사
     Validation() {
-      if (this.bbsCn.bbsNm == null || this.bbsCn.bbsNm.trim() == "") {
+      if (!this.bbsCn.bbsNm || this.bbsCn.bbsNm.trim() === "") {
         alert("게시판 제목을 입력해주세요.");
         return false;
       }
@@ -772,7 +772,7 @@
       }
 
       // url null 검사
-      if (this.bbsCn.vdoUrl == null || this.bbsCn.vdoUrl.trim() == "") {
+      if (!this.bbsCn.vdoUrl || this.bbsCn.vdoUrl.trim() === "") {
         alert("영상 URL을 입력해주세요.");
         return false;
       }
client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
--- client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
+++ client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
@@ -146,6 +146,10 @@
         // 금지어 등록
         async fnSave() {
             try {
+                if (this.wordsArr.length == 0) {
+                    alert('등록할 금지어를 추가해주세요.')
+                    return
+                }
                 const param = {
                     wordsArr: this.wordsArr
                 }
client/views/pages/adm/departmentManagement/DepartmentManagement.vue
--- client/views/pages/adm/departmentManagement/DepartmentManagement.vue
+++ client/views/pages/adm/departmentManagement/DepartmentManagement.vue
@@ -38,6 +38,7 @@
             <div class="form-box">
               <div class="form-box-title">
                 <p>부서 정보</p>
+                <p><span>*</span>필수입력</p>
               </div>
               <div class="form-content">
                 <div  class="layout">
@@ -50,7 +51,7 @@
                   />
                 </div>
                 <div  class="layout">
-                  <label class="form-title">부서명</label>
+                  <label class="form-title"><span>*</span>부서명</label>
                   <input
                     type="text"
                     class="form-control sm"
@@ -60,7 +61,7 @@
                   />
                 </div>
                 <div  class="grid-column layout">
-                  <label class="form-title">부서권한</label>
+                  <label class="form-title"><span>*</span>부서권한</label>
                   <select
                     class="form-select sm"
                     :disabled="isFormDisabled"
@@ -266,6 +267,7 @@
         const res = await findByDept(params);
         if (res.status == 200) {
           this.fnReset(); // 초기화
+          this.mblTelnoSplit(res.data.data.deptMbr);
           this.viewDept = res.data.data.dept; // 부서 정보
           this.deptMbr = res.data.data.deptMbr; // 부서에 등록된 사용자 목록
           this.selectedDeptId = this.viewDept.deptId;
@@ -286,9 +288,8 @@
     },
     // 저장
     async fnSave() {
-      // 부서 권한 설정
-      if (!this.fnDeptAuthrt()) {
-        alert("부서 권한을 지정해주세요.");
+      // 유효성 검사
+      if (this.validation() == false) {
         return false;
       }
       // 신규 등록 및 수정 설정
@@ -304,13 +305,15 @@
         alert(error.response.data.message);
       }
     },
-    // 부서권한 설정
-    fnDeptAuthrt() {
-      if (
-        this.selectedAuthrt == null ||
-        this.selectedAuthrt == "" ||
-        this.selectedAuthrt == undefined
-      ) {
+    // 유효성 검사
+    validation() {
+      if (!this.viewDept.deptNm || this.viewDept.deptNm.trim() === "") {
+        alert("부서명을 입력해주세요.");
+        return false;
+      }
+      // 부서권한 검사
+      if (!this.selectedAuthrt) {
+        alert("부서 권한을 지정해주세요.");
         return false;
       }
       let authrtList = [];
@@ -424,6 +427,8 @@
         const res = await findByMbr(params);
         // alert(res.data.message);
         if (res.status == 200) {
+          this.mblTelnoSplit(res.data.data.mbrList);
+          this.mblTelnoSplit(res.data.data.deptMbr);
           this.mbrList = res.data.data.mbrList; // 부서에 등록되지 않은 사용자 목록
           this.deptMbr = res.data.data.deptMbr; // 부서에 등록된 사용자 목록
           this.makeTbody();
@@ -511,6 +516,17 @@
         this.topBoxHeight = this.$refs.topBox.offsetHeight;
       }
     },
+
+    // 휴대폰번호 표기 변환
+    mblTelnoSplit(data) {
+      for (const item of data) {
+        const mblTelno = item["mblTelno"];
+        const start = mblTelno.substring(0, 3);
+        const middle = mblTelno.substring(3, mblTelno.length - 4);
+        const end = mblTelno.substring(mblTelno.length - 4, mblTelno.length);
+        item["mblTelno"] = start + "-" + middle + "-" + end;
+      }
+    },
   },
   watch: {
     topBoxHeight() {
client/views/pages/adm/menuManagement/menuManagement/MenuManagement.vue
--- client/views/pages/adm/menuManagement/menuManagement/MenuManagement.vue
+++ client/views/pages/adm/menuManagement/menuManagement/MenuManagement.vue
@@ -28,6 +28,7 @@
             <div class="form-box sch-full">
               <div class="form-box-title">
                 <p>메뉴 정보</p>
+                <p><span>*</span>필수입력</p>
               </div>
               <div class="form-content"  style="grid-template-rows: auto auto auto auto 1fr auto auto;">
                 <div  class="layout">
@@ -35,12 +36,12 @@
                   <input type="text" class="form-control sm" v-model="viewMenu.upMenuNm" disabled />
                 </div>
                 <div  class="layout">
-                  <label class="form-title">메뉴명</label>
+                  <label class="form-title"><span>*</span>메뉴명</label>
                   <input type="text" class="form-control sm" ref="menuNm" v-model="viewMenu.menuNm"
                     :disabled="!editMode" placeholder="메뉴명을 입력해주세요"/>
                 </div>
                 <div class="grid-column layout">
-                  <label class="form-title">메뉴 타입</label>
+                  <label class="form-title"><span>*</span>메뉴 타입</label>
                   <div class="input-group">
                       <select class="form-select sm" ref="menuType" v-model="viewMenu.menuType" :disabled="!editMode">
                         <option value="">선택</option>
@@ -67,7 +68,7 @@
                   </div>
                 </div>
                 <div  class="layout">
-                  <label class="form-title">메뉴 사용자</label>
+                  <label class="form-title"><span>*</span>메뉴 사용자</label>
                   <div class="check-area">
                     <div class="form-check">
                       <input type="radio" name="menuUser" id="menuUserAdm"  v-model="viewMenu.menuUser"
@@ -82,7 +83,7 @@
                   </div>
                 </div>
                 <div  class="layout">
-                  <label class="form-title">링크유형 </label>
+                  <label class="form-title"><span>*</span>링크유형 </label>
                   <div class="check-area">
                     <div class="form-check">
                       <input type="radio" name="linkType" id="linkTypeY"  v-model="viewMenu.linkType"
@@ -97,7 +98,7 @@
                   </div>
                 </div>
                 <div class="layout">
-                  <label for="" class="form-title">만족도 조사 사용 여부 </label>
+                  <label for="" class="form-title"><span>*</span>만족도 조사 사용 여부 </label>
                   <div class="check-area">
                     <div class="form-check">
                       <input type="radio" name="dgstfnExmnUseYn" id="dgstfnExmnUseY" 
@@ -112,7 +113,7 @@
                   </div>
                 </div>
                 <div  class="layout">
-                  <label class="form-title">메뉴 노출 여부</label>
+                  <label class="form-title"><span>*</span>메뉴 노출 여부</label>
                   <div class="check-area">
                     <div class="form-check">
                       <input type="radio" name="menuExpsrYn" id="menuExpsrY" 
@@ -304,61 +305,49 @@
 
     // 메뉴관리 유효성 검사
     valiadtion() {
+      console.log("this.viewMenu: ", this.viewMenu);
       // 메뉴명 입력 여부
-      if (this.viewMenu["menuNm"] == null || this.viewMenu["menuNm"] == "") {
+      if (!this.viewMenu["menuNm"] || this.viewMenu["menuNm"].trim() === "") {
         alert("메뉴명을 입력하세요.");
         this.$refs.menuNm.focus();
         return false;
       }
       // 메뉴 타입 입력 여부
-      if (
-        this.viewMenu["menuType"] != null &&
-        this.viewMenu["menuType"] != ""
-      ) {
-        if (
-          this.viewMenu["menuType"] == "bbs" ||
-          this.viewMenu["menuType"] == "conts"
-        ) {
-          if (
-            this.viewMenu["menuTypeCtgry"] == null ||
-            this.viewMenu["menuTypeCtgry"] == ""
-          ) {
-            alert("메뉴 타입 항목을 선택하세요.");
-            this.$refs.menuTypeCtgry.focus();
-            return false;
-          }
-        } else if (this.viewMenu["menuType"] == "link") {
-          if (
-            this.viewMenu["linkUrl"] == null ||
-            this.viewMenu["linkUrl"] == ""
-          ) {
-            alert("링크 주소를 입력하세요.");
-            this.$refs.linkUrl.focus();
-            return false;
-          }
+      if (!this.viewMenu["menuType"]) {
+        alert("메뉴 타입을 선택하세요.");
+        return false;
+      }
+      // 메뉴 타입 하위 입력 여부
+      if (this.viewMenu["menuType"] == "bbs" || this.viewMenu["menuType"] == "conts") {
+        if (!this.viewMenu["menuTypeCtgry"]) {
+          alert("메뉴 타입 항목을 선택하세요.");
+          this.$refs.menuTypeCtgry.focus();
+          return false;
+        }
+      } else if (this.viewMenu["menuType"] == "link") {
+        if (!this.viewMenu["linkUrl"]) {
+          alert("링크 주소를 입력하세요.");
+          this.$refs.linkUrl.focus();
+          return false;
         }
       }
+      // 메뉴 사용자
+      if (!this.viewMenu["menuUser"]) {
+        alert("메뉴 사용자를 선택하세요.");
+        return false;
+      }
       // 링크 유형
-      if (
-        this.viewMenu["linkType"] == null ||
-        this.viewMenu["linkType"] == ""
-      ) {
+      if (!this.viewMenu["linkType"]) {
         alert("링크 유형을 선택하세요.");
         return false;
       }
       // 만족도 조사 사용여부
-      if (
-        this.viewMenu["dgstfnExmnUseYn"] == null ||
-        this.viewMenu["dgstfnExmnUseYn"] == ""
-      ) {
+      if (!this.viewMenu["dgstfnExmnUseYn"]) {
         alert("만족도 조사 사용여부를 선택하세요.");
         return false;
       }
       // 메뉴 노출 여부
-      if (
-        this.viewMenu["menuExpsrYn"] == null ||
-        this.viewMenu["menuExpsrYn"] == ""
-      ) {
+      if (!this.viewMenu["menuExpsrYn"]) {
         alert("메뉴 노출 여부를 선택하세요.");
         return false;
       }
client/views/pages/adm/popup/PopupManagementInsert.vue
--- client/views/pages/adm/popup/PopupManagementInsert.vue
+++ client/views/pages/adm/popup/PopupManagementInsert.vue
@@ -5,10 +5,11 @@
         <div class="form-box">
           <div class="form-box-title">
             <p>기본정보</p>
+            <p><span>*</span>필수입력</p>
           </div>
           <div class="form-content">
             <div class="layout">
-              <label class="form-title">제목</label>
+              <label class="form-title"><span>*</span>제목</label>
               <input
                 type="text"
                 class="form-control sm"
@@ -18,7 +19,7 @@
               />
             </div>
             <div class="layout">
-              <label class="form-title">게시일</label>
+              <label class="form-title"><span>*</span>게시일</label>
               <div class="input-group">
                 <div class="form-control sm cal">
                   <VueDatePicker
@@ -44,7 +45,7 @@
               </div>
             </div>
             <div class="layout">
-              <label class="form-title">팝업크기</label>
+              <label class="form-title"><span>*</span>팝업크기</label>
               <div class="input-group">
                 <select class="form-select sm fixed" v-model="popup['popupSizeType']">
                   <option value="fixed">고정값</option>
@@ -90,7 +91,7 @@
               </div>
             </div>
             <div  class="layout">
-              <label class="form-title">업로드 형식</label>
+              <label class="form-title"><span>*</span>업로드 형식</label>
               <div class="check-area">
                 <div class="form-check">
                   <input
@@ -116,7 +117,7 @@
             </div>
             <template v-if="popup['popupType'] == 'image'">
               <div  class="layout">
-                <label class="form-title">이미지 첨부파일</label>
+                <label class="form-title"><span>*</span>이미지 첨부파일</label>
     
                   <div v-for="(file, index) of this.fileList" :key="index" class="input-group" style="height: 100%" >
                     <p v-if="file['fileId'] != null">
@@ -145,7 +146,7 @@
               </div>
           
               <div class="layout">
-                <label class="form-title">링크 URL</label>
+                <label class="form-title"><span>*</span>링크 URL</label>
                 <input
                   type="text"
                   class="form-control sm"
@@ -158,7 +159,7 @@
             </template>
             <template v-if="popup['popupType'] == 'video'">
                 <div  class="layout">
-                  <label class="form-title">동영상 URL</label>
+                  <label class="form-title"><span>*</span>동영상 URL</label>
                   <input
                     type="text"
                     class="form-control sm"
@@ -168,9 +169,10 @@
                     ref="vdoUrl"
                   />
                 </div>
+                <div  class="layout"></div>
             </template>
             <div  class="layout">
-              <label class="form-title">팝업 노출 페이지</label>
+              <label class="form-title"><span>*</span>팝업 노출 페이지</label>
               <select
                 class="form-select sm "
                 v-model="popup['pageType']"
@@ -187,7 +189,7 @@
               </select>
             </div>
             <div  class="layout">
-              <label class="form-title">순서</label>
+              <label class="form-title"><span>*</span>순서</label>
               <select class="form-select sm " v-model="popup['sn']" ref="sn">
                 <option value="0">순서를 선택하세요.</option>
                 <option value="1">1</option>
@@ -338,44 +340,41 @@
 
     // 유효성 검사
     valiadtion() {
-      if (this.popup["popupTtl"] == null || this.popup["popupTtl"] == "") {
+      if (!this.popup["popupTtl"] || this.popup["popupTtl"].trim() === "") {
         alert("제목을 입력해주세요.");
         this.$refs.popupTtl.focus();
         return false;
       }
-      if (this.popup["bgngDt"] == null || this.popup["bgngDt"] == "") {
+      if (!this.popup["bgngDt"]) {
         alert("시작일을 입력해주세요.");
         this.$refs.bgngDt.focus();
         return false;
       }
-      if (this.popup["endDt"] == null || this.popup["endDt"] == "") {
+      if (!this.popup["endDt"]) {
         alert("종료일을 입력해주세요.");
         this.$refs.endDt.focus();
         return false;
       }
-      if (
-        this.popup["popupSizeType"] == "null" ||
-        this.popup["popupSizeType"] == ""
-      ) {
+      if (!this.popup["popupSizeType"]) {
         alert("팝업 크기를 선택해주세요.");
         return false;
       }
       if (this.popup["popupSizeType"] == "fixed") {
-        if (this.popup["popupSize"] == null || this.popup["popupSize"] == "") {
+        if (!this.popup["popupSize"]) {
           alert("팝업 크기를 선택해주세요.");
           return false;
         }
       } else if (this.popup["popupSizeType"] == "custom") {
-        if (this.popup["wdthLen"] == null || this.popup["wdthLen"] == "") {
+        if (!this.popup["wdthLen"]) {
           alert("팝업 가로 크기를 선택해주세요.");
           return false;
         }
-        if (this.popup["vrtcLen"] == null || this.popup["vrtcLen"] == "") {
+        if (!this.popup["vrtcLen"]) {
           alert("팝업 세로 크기를 선택해주세요.");
           return false;
         }
       }
-      if (this.popup["popupType"] == null || this.popup["popupType"] == "") {
+      if (!this.popup["popupType"]) {
         alert("업로드 형식을 선택해주세요.");
         return false;
       }
@@ -384,31 +383,31 @@
           alert("이미지 첨부파일을 선택해주세요.");
           return false;
         }
-        if (this.popup["linkUrl"] == null || this.popup["linkUrl"] == "") {
+        if (!this.popup["linkUrl"]) {
           alert("링크 URL을 선택해주세요.");
           this.$refs.linkUrl.focus();
           return false;
         }
       } else if (this.popup["popupType"] == "video") {
-        if (this.popup["vdoUrl"] == null || this.popup["vdoUrl"] == "") {
+        if (!this.popup["vdoUrl"]) {
           alert("동영상 URL을 선택해주세요.");
           this.$refs.vdoUrl.focus();
           return false;
         }
       }
-      if (this.popup["sn"] == null || this.popup["sn"] == "") {
+      if (!this.popup["sn"]) {
         alert("순서를 선택해주세요.");
         this.$refs.sn.focus();
         return false;
       }
-      if (this.popup["pageType"] == null || this.popup["pageType"] == "") {
+      if (!this.popup["pageType"]) {
         alert("팝업 노출 페이지를 선택해주세요.");
         return false;
       }
-      if (this.popup["popupUseYn"] == null || this.popup["popupUseYn"] == "") {
-        alert("사용 유무를 선택해주세요.");
-        return false;
-      }
+      // if (!this.popup["popupUseYn"]) {
+      //   alert("사용 유무를 선택해주세요.");
+      //   return false;
+      // }
     },
 
     //─────axios─────┐
client/views/pages/adm/preferences/commonCodeManagement/CommonCodeManagement.vue
--- client/views/pages/adm/preferences/commonCodeManagement/CommonCodeManagement.vue
+++ client/views/pages/adm/preferences/commonCodeManagement/CommonCodeManagement.vue
@@ -30,6 +30,7 @@
             <div class="form-box sch-full">
               <div class="form-box-title">
                 <p>공통코드정보</p>
+                <p><span>*</span>필수입력</p>
               </div>
               <div class="form-content" style="grid-template-rows: auto auto auto 1fr;">
                 <div class="layout">
@@ -41,12 +42,12 @@
                   <input type="text" class="form-control sm" disabled v-model="viewCode.upCdNm" />
                 </div>
                 <div class="layout">
-                  <label for="" class="form-title">코드</label>
+                  <label for="" class="form-title"><span>*</span>코드</label>
                   <input type="text" class="form-control sm" :disabled="isFormDisabled || !submitStts"
                     v-model="viewCode.cd" placeholder="코드를 입력해주세요"/>
                 </div>
                 <div class="layout">
-                  <label for="" class="form-title">코드명</label>
+                  <label for="" class="form-title"><span>*</span>코드명</label>
                   <input type="text" class="form-control sm" :disabled="isFormDisabled" v-model="viewCode.cdNm" placeholder="코드명을 입력해주세요"/>
                 </div>
                 <div class="layout">
@@ -54,7 +55,7 @@
                   <input type="text" class="form-control sm" :disabled="isFormDisabled" v-model="viewCode.cdVl" placeholder="코드값을 입력해주세요"/>
                 </div>
                 <div class="border-bottom layout">
-                  <label for="" class="form-title">사용여부</label>
+                  <label for="" class="form-title"><span>*</span>사용여부</label>
                   <div class="check-area">
                     <div class="form-check">
                       <input type="radio" name="code" id="y"  value="Y" :disabled="isFormDisabled"
@@ -240,11 +241,7 @@
       this.submitStts = true;
     },
     validation() {
-      if (
-        this.viewCode.cd == null ||
-        this.viewCode.cd == "" ||
-        this.viewCode.cd == undefined
-      ) {
+      if (!this.viewCode.cd || this.viewCode.cd.trim() === "") {
         alert("코드를 입력해주세요.");
         return false;
       }
@@ -253,11 +250,7 @@
         alert("코드는 영문과 언더바(_)만 사용하여 작성해주세요.");
         return false;
       }
-      if (
-        this.viewCode.cdNm == null ||
-        this.viewCode.cdNm == "" ||
-        this.viewCode.cdNm == undefined
-      ) {
+      if (!this.viewCode.cdNm || this.viewCode.cdNm.trim() === "") {
         alert("코드명을 입력해주세요.");
         return false;
       }
client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementInsert.vue
--- client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementInsert.vue
+++ client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementInsert.vue
@@ -5,11 +5,12 @@
         <div class="form-box">
           <div class="form-box-title">
             <p>기본정보</p>
+            <p><span>*</span>필수입력</p>
           </div>
           <div class="form-content">
             <div class="layout">
                 <label for="" class="form-title">
-                  콘텐츠 한글명
+                  <span>*</span>콘텐츠 한글명
                 </label>
                 <input
                   type="text"
@@ -21,7 +22,7 @@
               </div>
               <div class="layout">
                 <label for="" class="form-title">
-                  콘텐츠 영문명
+                  <span>*</span>콘텐츠 영문명
                 </label>
                 <input
                   type="text"
@@ -35,13 +36,16 @@
                 <label for="" class="form-title">
                   관리자 PATH
                 </label>
-                <input
-                  type="text"
-                  class="form-control sm"
-                  v-model="contsTypeVO.mngrPageCrs"
-                  ref="mngrPageCrs"
-                  placeholder="관리자 path를 입력해주세요"
-                />
+                <div class="form-group">
+                  <input
+                    type="text"
+                    class="form-control sm"
+                    v-model="contsTypeVO.mngrPageCrs"
+                    ref="mngrPageCrs"
+                    placeholder="관리자 path를 입력해주세요"
+                  />
+                  <span><strong>관리자 PATH</strong> 또는 <strong>사용자 PATH</strong> 중 하나는 필수입니다</span>
+                </div>
               </div>
               <div class="layout">
                 <label for="" class="form-title">
@@ -57,7 +61,7 @@
               </div>
               <div class="layout">
                 <label for="" class="form-title">
-                  COMPONENT_URL
+                  <span>*</span>COMPONENT_URL
                 </label>
                 <input
                   type="text"
@@ -69,7 +73,7 @@
               </div>
               <div class="layout">
                 <label for="" class="form-title">
-                  메뉴노출
+                  <span>*</span>메뉴노출
                 </label>
                 <div class="check-area">
                     <div class="form-check">
client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
--- client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
+++ client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
@@ -4,8 +4,8 @@
       <div class="scroll">
         <div open class="form-box">
           <div class="form-box-title">
-            <p class="summary-style pl10">기본 정보</p>
-            <span style="color: red;"> ※ 로그인 정책을 변경하면 전체 사용자가 로그아웃됩니다.</span>
+            <p>기본정보</p>
+            <p><span>*</span>로그인 정책을 변경하면 전체 사용자가 로그아웃됩니다.</p>
           </div>
           <div class="form-content">
             <div class="layout">
client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
@@ -9,7 +9,7 @@
                     </div>
                     <div class="form-content">
                             <div class="layout">
-                                <label for="" class="form-title"><span>*</span> 제어 유형</label>
+                                <label for="" class="form-title"><span>*</span>제어 유형</label>
                                 <select name="selectType" id="selectType" class="form-select sm"
                                     v-model="accesCtrl.cntrlType">
                                     <option value="">전체</option>
@@ -18,14 +18,14 @@
                                 </select>
                             </div>
                             <div class="layout border-bottom">
-                                <label for="" class="form-title"><span>*</span> 제어 IP</label>
+                                <label for="" class="form-title"><span>*</span>제어 IP</label>
                                 <div class="form-group">
                                     <input type="text" class="form-control sm" v-model="accesCtrl.cntrlIp"  placeholder="1~255 범위의 숫자로 구성하여 형식에 맞게 작성해주세요." />
                                     <span>ex) 192.168.0.1 / 192.168.0.*</span>
                                 </div>
                             </div>
                             <div class="layout">
-                                <label for="" class="form-title"><span>*</span> 제어 경로</label>
+                                <label for="" class="form-title"><span>*</span>제어 경로</label>
                                 <input type="text"  class="form-control sm"  v-model="accesCtrl.cntrlCrs" placeholder="제어할 경로 URL을 입력하세요."/>
                             </div>
                     </div>
Add a comment
List