류윤주 류윤주 04-02
250402 류윤주 수정
@a33aed2da5018fd61b5ca9e1190b42c95a05d3f1
client/resources/scss/admin/content.scss
--- client/resources/scss/admin/content.scss
+++ client/resources/scss/admin/content.scss
@@ -15,12 +15,9 @@
             .scroll {
                 height: 100%;
                 overflow-y: auto;
-
-
             }
 
         }
-
         &.full-page {
             height: 100%;
         }
@@ -39,7 +36,6 @@
 .page-title {
     font-size: var(--tk-fz-title-xlg);
     font-weight: 700;
-    margin-bottom: 1rem;
 }
 
 .box-title,
@@ -48,8 +44,6 @@
     font-weight: 700;
     margin-bottom: 1rem;
 }
-
-
 
 .search-bar {
     @include flex-layout(flex, center, end);
@@ -96,9 +90,9 @@
         padding: 1rem;
         border-bottom: 1px solid var(--tk-gray-10);
 
-        &:last-child {
-            align-items: flex-start;
-        }
+        // &:last-child {
+        //     align-items: flex-start;
+        // }
 
         .form-title {
             width: 180px;
@@ -180,12 +174,6 @@
         }
 
     }
-
-    .check-area {
-        @include flex-layout(flex, center);
-        gap: 3rem;
-    }
-
 
 }
 
@@ -399,4 +387,9 @@
     .dp__action_button{
         font-size: 1.5rem;
     }
+}
+
+.check-area {
+    @include flex-layout(flex, center);
+    gap: 3rem;
 }
(파일 끝에 줄바꿈 문자 없음)
client/resources/scss/admin/layout.scss
--- client/resources/scss/admin/layout.scss
+++ client/resources/scss/admin/layout.scss
@@ -2,7 +2,7 @@
     background-color: #eaeff4;
     display: grid;
     grid-template-columns: clamp(240px, 10vw, 450px) minmax(1020px, 1fr);
-    grid-template-rows: auto minmax(864px, auto);
+    grid-template-rows: auto minmax(864px, 1226px);
     grid-template-areas:
         "sidebar header "
         "sidebar main ";
@@ -12,26 +12,30 @@
 
     .admin-header {
         grid-area: header;
+        @include flex-layout(flex, center, space-between);
+        padding: 1rem 3rem;
         border-bottom: 1px solid var(--tk-gray-30);
 
-        .top-menu ul {
-            @include flex-layout(flex, center, space-between);
-
-            li {
-                cursor: pointer;
-                padding: 1rem 2rem;
-            }
-
-            li.main-active {
-                border-bottom: 3px solid var(--tk-gray-70);;
-                // @include radius(25);
-                font-weight: 700;
+        .info-wrap {
+            .info {
+                @include flex-layout(flex, center, flex-end);
+                .info-name{
+                    padding: .8rem
+                }
+                ul.info-btn{
+                    @include flex-layout(flex, center);
+                    li{
+                        @include flex-layout(flex, center, center);
+                        padding: 1rem;
+                    }
+                }
             }
         }
 
     }
 
-    .sub-menu {
+    .side-bar{
+    // .sub-menu {
         grid-area: sidebar;
         height: 100%;
         background-color: #f7f9fb;
@@ -45,25 +49,7 @@
             text-align: center;
         }
 
-        .info-wrap {
-            background-color: var(--tk-gray-10);
-
-            .info {
-                @include flex-layout(flex, center, space-between);
-                .info-name{
-                    padding: .8rem
-                }
-                ul.info-btn{
-                    @include flex-layout(flex, center);
-                    li{
-                        @include flex-layout(flex, center, center);
-                        background-color: var(--tk-gray-20);
-                        padding: 1rem;
-                        border-left: 1px solid var(--tk-gray-30);
-                    }
-                }
-            }
-        }
+       
         .menu-zone{
             p{
                 font-size: var(--tk-fz-title-sm);
client/views/component/userInfo/UserAuthorList.vue
--- client/views/component/userInfo/UserAuthorList.vue
+++ client/views/component/userInfo/UserAuthorList.vue
@@ -1,43 +1,29 @@
 <template>
-  <div class="gd-12 pl0 pr0">
-    <div class="flex justify-between align-center mb10">
-      <label for="" class="point-font2 mb10">사용자 권한</label>
-      <div v-show="editMode != 'view'" class="gd-1 pr0">
-        <button
+
+  <label class="form-title">사용자 권한</label>
+  <div class="form-group">
+    <button  v-show="editMode != 'view'" class="btn sm ico-plus" @click="fnAuthAddModalOpen">권한 추가</button>
+    <template v-if="mbrVO.authorList != null && mbrVO.authorList != []">
+        <div v-for="(auth, index) of mbrVO.authorList" :key="index"
           :class="{
-            'large-btn': true,
-            'blue-border-btn': pageRole == 'adm',
-            'green-border-btn': pageRole == 'portal',
+            'flex align-center border radius pd10 inline-block': true,
+            ml10: index != 0,
           }"
-          @click="fnAuthAddModalOpen"
         >
-          권한 추가
-        </button>
-      </div>
-    </div>
-  </div>
-  <template v-if="mbrVO.authorList != null && mbrVO.authorList != []">
-    <template v-for="(auth, index) of mbrVO.authorList" :key="index">
-      <div
-        :class="{
-          'flex align-center border radius pd10 inline-block': true,
-          ml10: index != 0,
-        }"
-      >
-        <span>{{ auth.authrtNm }}</span>
-        <button
-          v-show="editMode != 'view'"
-          class="icon-btn"
-          @click="fnAuthDelete(index)"
-        >
-          <svg-icon type="mdi" :width="15" :height="15" :path="path"></svg-icon>
-        </button>
-      </div>
+          <span>{{ auth.authrtNm }}</span>
+          <button
+            v-show="editMode != 'view'"
+            class="icon-btn"
+            @click="fnAuthDelete(index)"
+          >
+            <svg-icon type="mdi" :width="15" :height="15" :path="path"></svg-icon>
+          </button>
+        </div>
     </template>
-  </template>
-  <template>
-    <p class="data-none">등록된 정보가 존재하지 않습니다.</p>
-  </template>
+    <template v-else>
+      <p class="data-none">등록된 정보가 존재하지 않습니다.</p>
+    </template>
+  </div>
 
   <Modal :showModal="editMode != 'view' && isOpen">
     <template v-slot:header>
client/views/component/userInfo/UserInfoView.vue
--- client/views/component/userInfo/UserInfoView.vue
+++ client/views/component/userInfo/UserInfoView.vue
@@ -46,7 +46,7 @@
                       disabled
                     /> -->
                   </div>
-                  <div v-if="showOpt.isTelNo">
+                  <div v-if="showOpt.isTelNo" class="border-bottom">
                     <p class="form-title">전화번호</p>
                     <p>{{ mbrVO.telno }}</p>
                     <!-- <input
client/views/index.html
--- client/views/index.html
+++ client/views/index.html
@@ -11,13 +11,8 @@
   <!-- 공통css -->
   <link rel="stylesheet" href="/client/resources/lib/swiper/swiper-bundle.min.css">
   <link rel="stylesheet" href="/client/build/assets/css/app.css">
-  
-
-
-  <!-- 테마 v2 css -->
-  <!-- <link rel="stylesheet" href="/client/theme/tema_v2/css/component.css">
-  <link rel="stylesheet" href="/client/theme/tema_v2/css/style.css"> -->
  
+  <!-- 스크립트 -->
   <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
   <script src="/client/resources/lib/swiper/swiper-element-bundle.min.js"></script>
   <script type="text/javascript" charset="utf-8" src="../client/ckeditor/build/ckeditor.js"></script>
 
client/views/layout/AdminHeader copy.vue (added)
+++ client/views/layout/AdminHeader copy.vue
@@ -0,0 +1,85 @@
+<template>
+    <header class="admin-header">
+        <div class="header-wrap">
+            <nav class="top-menu">
+                <ul class="main-menu">
+                    <li v-for="(menu, idx) in menuList" :key="idx" @click="subMenuShow(menu)"
+                        :class="{ 'main-active': checkMenu == menu.menuId }">
+                        {{ menu.menuNm }}
+                    </li>
+                </ul>
+            </nav>
+        </div>
+    </header>
+</template>
+
+<script>
+import store from "../../views/pages/AppStore";
+import queryParams from '../../resources/js/queryParams';
+import { defaultSearchParams } from '../../resources/js/defaultSearchParams';
+import { findBySysMenu } from '../../resources/api/menu';
+
+export default {
+    mixins: [queryParams],
+    components: {
+
+    },
+    data() {
+        return {
+            checkMenu: null,
+            resetSearch: { ...defaultSearchParams },
+            menuList: [],
+        }
+    },
+    created() {
+        this.findAll();
+        this.menuCheck();
+    },
+    methods: {
+        menuCheck() {
+            const menu = store.state.menu;
+            if(menu != null && menu != '' && menu != undefined) {
+                this.checkMenu = menu.menuId;
+            }
+        },
+        // 목록 조회
+        async findAll() {
+            try {
+                const params = {
+                    roles : store.state.roles.map(auth => auth.authority),
+                    menuType : store.state.userType
+                };
+                const res = await findBySysMenu(params);
+                if(res.status == 200) {
+                    this.menuList = res.data.data.menuList;
+                     // 전체 메뉴 트리 store에 저장
+                    this.$store.commit('setMenuList', this.menuList);
+                }
+            } catch(error) {
+                alert('에러가 발생했습니다.\n관리자에게 문의하세요.');
+            }
+        },
+        async subMenuShow(menu) {
+            this.saveQueryParams('queryParams', this.resetSearch); // 검색조건 초기화
+            this.$store.commit('setMenu', menu);
+        },
+
+    },
+    watch: {
+        '$store.state.menu': function (newValue, oldValue) {
+            if(newValue == null || newValue == '' || newValue == undefined) {
+                this.checkMenu = null;
+            } else {
+                this.checkMenu = newValue.menuId;
+            }
+        },
+
+    },
+    computed: {
+
+    },
+    mounted() {
+
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/layout/AdminHeader.vue
--- client/views/layout/AdminHeader.vue
+++ client/views/layout/AdminHeader.vue
@@ -1,14 +1,17 @@
 <template>
     <header class="admin-header">
-        <div class="header-wrap">
-            <nav class="top-menu">
-                <ul class="main-menu">
-                    <li v-for="(menu, idx) in menuList" :key="idx" @click="subMenuShow(menu)"
-                        :class="{ 'main-active': checkMenu == menu.menuId }">
-                        {{ menu.menuNm }}
-                    </li>
+        <div class="page-title">
+            {{ pgNm }} 
+        </div>
+        <div class="info-wrap">
+            <div class="info">
+                <p class="info-name">{{ mbrNm }} 님</p>
+                <ul class="info-btn">
+                    <li><button class="btn-ico xsm ico-logout"  @click="fnlogOut" title="로그아웃"></button></li>
+                    <li><button class="btn-ico xsm ico-go"  @click="fnSiteMove" title="사이트이동"></button></li>
+                    <li><button class="btn-ico xsm ico-reset"  @click="cacheClean()" title="변경사항 적용"></button></li>
                 </ul>
-            </nav>
+            </div>
         </div>
     </header>
 </template>
@@ -16,8 +19,8 @@
 <script>
 import store from "../../views/pages/AppStore";
 import queryParams from '../../resources/js/queryParams';
-import { defaultSearchParams } from '../../resources/js/defaultSearchParams';
-import { findBySysMenu } from '../../resources/api/menu';
+import { mapActions } from "vuex";
+import { cacheReSet } from "../../resources/api/cacheReSet";
 
 export default {
     mixins: [queryParams],
@@ -26,52 +29,38 @@
     },
     data() {
         return {
-            checkMenu: null,
-            resetSearch: { ...defaultSearchParams },
-            menuList: [],
+            mbrNm: store.state.mbrNm,
+            pgNm: store.state.menu.menuNm,
         }
     },
     created() {
-        this.findAll();
-        this.menuCheck();
     },
     methods: {
-        menuCheck() {
-            const menu = store.state.menu;
-            if(menu != null && menu != '' && menu != undefined) {
-                this.checkMenu = menu.menuId;
-            }
+        // 사이트 이동
+        fnSiteMove() {
+            this.$router.push({
+                path: "/",
+            });
         },
-        // 목록 조회
-        async findAll() {
-            try {
-                const params = {
-                    roles : store.state.roles.map(auth => auth.authority),
-                    menuType : store.state.userType
-                };
-                const res = await findBySysMenu(params);
-                if(res.status == 200) {
-                    this.menuList = res.data.data.menuList;
-                     // 전체 메뉴 트리 store에 저장
-                    this.$store.commit('setMenuList', this.menuList);
-                }
-            } catch(error) {
-                alert('에러가 발생했습니다.\n관리자에게 문의하세요.');
-            }
+        ...mapActions(["logout"]),
+        // 로그 아웃
+        async fnlogOut() {
+            await this.logout();
+            this.$router.push({
+                path: "/login.page",
+            });
         },
-        async subMenuShow(menu) {
-            this.saveQueryParams('queryParams', this.resetSearch); // 검색조건 초기화
-            this.$store.commit('setMenu', menu);
+        // 캐시 초기화
+        async cacheClean() {
+            if (!confirm("변경사항을 적용하시겠습니까?")) return;
+            const res = await cacheReSet();
+            alert(res.data.message);
         },
 
     },
     watch: {
-        '$store.state.menu': function (newValue, oldValue) {
-            if(newValue == null || newValue == '' || newValue == undefined) {
-                this.checkMenu = null;
-            } else {
-                this.checkMenu = newValue.menuId;
-            }
+        '$store.state.menu'(newValue) {
+            this.pgNm = newValue.menuNm
         },
 
     },
 
client/views/layout/AdminMenu copy.vue (added)
+++ client/views/layout/AdminMenu copy.vue
@@ -0,0 +1,144 @@
+<template>
+  <nav class="sub-menu">
+    <div class="logo">
+        <router-link :to="{path : '/adm/main.page'}">ADMINISTRATOR</router-link>
+    </div>
+    <div class="info-wrap">
+      <div class="info">
+        <p class="info-name">{{ mbrNm }}</p>
+        <ul class="info-btn">
+            <li><button class="btn-ico xsm ico-logout"  @click="fnlogOut" title="로그아웃"></button></li>
+            <li><button class="btn-ico xsm ico-go"  @click="fnSiteMove" title="사이트이동"></button></li>
+            <li><button class="btn-ico xsm ico-reset"  @click="cacheClean()" title="변경사항 적용"></button></li>
+        </ul>
+      </div>
+    </div>
+    <div class="menu-zone">
+      <p>MENU</p>
+      <ul class="side-menu">
+        <template v-if="menuList.length > 0">
+          <li v-for="(sub, subidx) in menuList" :key="subidx" :class="{ 'sub-active': isActive(sub.routerUrl) }">
+            <div  @click="
+              menuClick(
+                sub.routerUrl != '' && sub.routerUrl != null
+                  ? sub
+                  : sub.childList[0]
+              )
+              ">
+              <span>{{ sub.menuNm }}</span>
+            </div>
+            <ul v-show="sub.childList.length > 0">
+              <li v-for="(third, thirdIdx) in sub.childList" :key="thirdIdx" :class="{
+                'sub-active': isActive(third.routerUrl),
+              }" @click="menuClick(third)">
+                <span>{{ third.menuNm }}</span>
+              </li>
+            </ul>
+          </li>
+        </template>
+      </ul>
+    </div>
+  </nav>
+</template>
+<script>
+import store from "../pages/AppStore";
+import queryParams from "../../resources/js/queryParams";
+import { defaultSearchParams } from "../../resources/js/defaultSearchParams";
+import { mapActions } from "vuex";
+import cntnStatsSave from "../../resources/js/cntnStatsSave";
+import { cacheReSet } from "../../resources/api/cacheReSet";
+
+export default {
+  mixins: [queryParams, cntnStatsSave],
+  components: {},
+  props: {},
+  data() {
+    return {
+      mbrNm: store.state.mbrNm,
+      currentPath: this.$route.path,
+      resetSearch: { ...defaultSearchParams },
+      menuList: [],
+    };
+  },
+  created() {
+    this.menuCheck();
+  },
+  methods: {
+    menuCheck() {
+      const menu = store.state.menu;
+      if (menu != null && menu != "" && menu != undefined) {
+        this.menuList = menu.childList;
+      }
+    },
+    async menuClick(menu) {
+      this.saveQueryParams("queryParams", this.resetSearch); // 검색조건 초기화
+      await this.cntnStatsSave(menu.menuId);
+      if (menu.linkType === "0") {
+        // 현재창
+        this.$router.push({
+          path: menu.routerUrl,
+        });
+      } else if (menu.linkType === "1") {
+        // 새창
+        window.open(menu.routerUrl, "_blank");
+      }
+    },
+    isActive(subPath) {
+      const checkUrl = this.currentPath.substring(
+        0,
+        this.currentPath.lastIndexOf("/") + 1
+      );
+      return subPath.startsWith(checkUrl);
+    },
+    // 사이트 이동
+    fnSiteMove() {
+      this.$router.push({
+        path: "/",
+      });
+    },
+    ...mapActions(["logout"]),
+    // 로그 아웃
+    async fnlogOut() {
+      await this.logout();
+      this.$router.push({
+        path: "/login.page",
+      });
+    },
+    // 캐시 초기화
+    async cacheClean() {
+      if (!confirm("변경사항을 적용하시겠습니까?")) return;
+      const res = await cacheReSet();
+      alert(res.data.message);
+    },
+  },
+  watch: {
+    // 나중에 네비게이션 가드에서 form 받을 수 있으면 form adm/main으로 갈때 sotre.state값0로 바꿔주기
+    $route(to) {
+      this.currentPath = to.path;
+    },
+    async "$store.state.menu"(newVal) {
+      if (newVal == null || newVal == "" || newVal == undefined) {
+        this.menuList = [];
+      } else {
+        this.menuList = newVal.childList;
+        if (newVal && this.menuList.length > 0) {
+          await this.cntnStatsSave(this.menuList[0].menuId);
+          if (
+            newVal.menuId == "MENU_000000000000010" &&
+            this.$store.state.path.includes("BBS_MNG_")
+          ) {
+            return;
+          } else {
+            this.$router.push(this.menuList[0].routerUrl);
+          }
+        }
+      }
+    },
+    "$store.state.mbrNm"(newVal) {
+      this.mbrNm = newVal;
+    },
+  },
+  computed: {},
+  mounted() { },
+};
+</script>
client/views/layout/AdminMenu.vue
--- client/views/layout/AdminMenu.vue
+++ client/views/layout/AdminMenu.vue
@@ -1,144 +1,177 @@
 <template>
-  <nav class="sub-menu">
-    <div class="logo">
-        <router-link :to="{path : '/adm/main.page'}">ADMINISTRATOR</router-link>
-    </div>
-    <div class="info-wrap">
-      <div class="info">
-        <p class="info-name">{{ mbrNm }}</p>
-        <ul class="info-btn">
-            <li><button class="btn-ico xsm ico-logout"  @click="fnlogOut" title="로그아웃"></button></li>
-            <li><button class="btn-ico xsm ico-go"  @click="fnSiteMove" title="사이트이동"></button></li>
-            <li><button class="btn-ico xsm ico-reset"  @click="cacheClean()" title="변경사항 적용"></button></li>
-        </ul>
-      </div>
-    </div>
-    <div class="menu-zone">
-      <p>MENU</p>
-      <ul class="side-menu">
-        <template v-if="menuList.length > 0">
-          <li v-for="(sub, subidx) in menuList" :key="subidx" :class="{ 'sub-active': isActive(sub.routerUrl) }">
-            <div  @click="
-              menuClick(
-                sub.routerUrl != '' && sub.routerUrl != null
-                  ? sub
-                  : sub.childList[0]
-              )
-              ">
-              <span>{{ sub.menuNm }}</span>
-            </div>
-            <ul v-show="sub.childList.length > 0">
-              <li v-for="(third, thirdIdx) in sub.childList" :key="thirdIdx" :class="{
-                'sub-active': isActive(third.routerUrl),
-              }" @click="menuClick(third)">
-                <span>{{ third.menuNm }}</span>
-              </li>
+    <div class="side-bar">
+        <div class="logo">
+            <router-link :to="{path : '/adm/main.page'}">ADMINISTRATOR</router-link>
+        </div>
+        <nav>
+            <ul class="main-menu">
+                <li v-for="(menu, idx) in menuList" :key="idx" class="menu-item"
+                    @click.stop="toggleSubMenu(menu)">
+                    <span :class="{ 'main-active': checkMenu == menu.menuId }">
+                        {{ menu.menuNm }}
+                    </span>
+                    <!-- 드롭다운 메뉴 -->
+                    <ul v-if="menu.isOpen" class="sub-menu">
+                        <li v-for="(subMenu, subIdx) in menu.childList" :key="subIdx"  :class="{ 'sub-active': isActive(subMenu.routerUrl) }"
+                        @click.stop="menuClick( subMenu.routerUrl != '' && subMenu.routerUrl != null ? subMenu : subMenu.childList[0])">
+                            {{ subMenu.menuNm }}
+                            <ul v-show="subMenu.childList.length > 0">
+                                <li v-for="(third, thirdIdx) in subMenu.childList" :key="thirdIdx" :class="{
+                                    'ss-active': isActive(third.routerUrl),
+                                }" @click.stop="menuClick(third)">
+                                    <span>{{ third.menuNm }}</span>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+                </li>
             </ul>
-          </li>
-        </template>
-      </ul>
+        </nav>
     </div>
-  </nav>
 </template>
+
 <script>
-import store from "../../views/pages/AppStore";
-import queryParams from "../../resources/js/queryParams";
-import { defaultSearchParams } from "../../resources/js/defaultSearchParams";
-import { mapActions } from "vuex";
+import store from "../pages/AppStore";
+import queryParams from '../../resources/js/queryParams';
+import { defaultSearchParams } from '../../resources/js/defaultSearchParams';
 import cntnStatsSave from "../../resources/js/cntnStatsSave";
-import { cacheReSet } from "../../resources/api/cacheReSet";
+import { findBySysMenu } from '../../resources/api/menu';
 
 export default {
-  mixins: [queryParams, cntnStatsSave],
-  components: {},
-  props: {},
-  data() {
-    return {
-      mbrNm: store.state.mbrNm,
-      currentPath: this.$route.path,
-      resetSearch: { ...defaultSearchParams },
-      menuList: [],
-    };
-  },
-  created() {
-    this.menuCheck();
-  },
-  methods: {
-    menuCheck() {
-      const menu = store.state.menu;
-      if (menu != null && menu != "" && menu != undefined) {
-        this.menuList = menu.childList;
-      }
+    mixins: [queryParams, cntnStatsSave],
+    data() {
+        return {
+            checkMenu: null,
+            currentPath: this.$route.path,
+            resetSearch: { ...defaultSearchParams },
+            menuList: [],
+        };
     },
-    async menuClick(menu) {
-      this.saveQueryParams("queryParams", this.resetSearch); // 검색조건 초기화
-      await this.cntnStatsSave(menu.menuId);
-      if (menu.linkType === "0") {
-        // 현재창
-        this.$router.push({
-          path: menu.routerUrl,
-        });
-      } else if (menu.linkType === "1") {
-        // 새창
-        window.open(menu.routerUrl, "_blank");
-      }
+    created() {
+        this.findAll();
+        this.menuCheck();
     },
-    isActive(subPath) {
-      const checkUrl = this.currentPath.substring(
-        0,
-        this.currentPath.lastIndexOf("/") + 1
-      );
-      return subPath.startsWith(checkUrl);
+    methods: {
+        menuCheck() {
+            const menu = store.state.menu;
+            if (menu) {
+                this.checkMenu = menu.menuId;
+            }
+        },
+        async findAll() {
+            try {
+                const params = {
+                    roles: store.state.roles.map(auth => auth.authority),
+                    menuType: store.state.userType
+                };
+                const res = await findBySysMenu(params);
+                if (res.status === 200) {
+                    // `isOpen` 속성을 추가하여 초기 상태 설정
+                    this.menuList = res.data.data.menuList.map(menu => ({
+                        ...menu,
+                        isOpen: false,
+                    }));
+                    // 전체 메뉴 트리 store에 저장
+                    this.$store.commit('setMenuList', this.menuList);
+                }
+            } catch (error) {
+                alert('에러가 발생했습니다.\n관리자에게 문의하세요.');
+            }
+        },
+        async menuClick(menu) {
+            this.saveQueryParams("queryParams", this.resetSearch); // 검색조건 초기화
+            this.$store.commit('setMenu', menu);
+            await this.cntnStatsSave(menu.menuId);
+            if (menu.linkType === "0") {
+                // 현재창
+                this.$router.push({
+                path: menu.routerUrl,
+                });
+            } else if (menu.linkType === "1") {
+                // 새창
+                window.open(menu.routerUrl, "_blank");
+            }
+        },
+        toggleSubMenu(menu) {
+            menu.isOpen = !menu.isOpen;
+            this.checkMenu = menu.menuId;
+            // this.saveQueryParams('queryParams', this.resetSearch); // 검색조건 초기화
+        },
+
+        isActive(subPath) {
+            const checkUrl = this.currentPath.substring(
+                0,
+                this.currentPath.lastIndexOf("/") + 1
+            );
+            return subPath.startsWith(checkUrl);
+        },
     },
-    // 사이트 이동
-    fnSiteMove() {
-      this.$router.push({
-        path: "/",
-      });
-    },
-    ...mapActions(["logout"]),
-    // 로그 아웃
-    async fnlogOut() {
-      await this.logout();
-      this.$router.push({
-        path: "/login.page",
-      });
-    },
-    // 캐시 초기화
-    async cacheClean() {
-      if (!confirm("변경사항을 적용하시겠습니까?")) return;
-      const res = await cacheReSet();
-      alert(res.data.message);
-    },
-  },
-  watch: {
-    // 나중에 네비게이션 가드에서 form 받을 수 있으면 form adm/main으로 갈때 sotre.state값0로 바꿔주기
-    $route(to) {
-      this.currentPath = to.path;
-    },
-    async "$store.state.menu"(newVal) {
-      if (newVal == null || newVal == "" || newVal == undefined) {
-        this.menuList = [];
-      } else {
-        this.menuList = newVal.childList;
-        if (newVal && this.menuList.length > 0) {
-          await this.cntnStatsSave(this.menuList[0].menuId);
-          if (
-            newVal.menuId == "MENU_000000000000010" &&
-            this.$store.state.path.includes("BBS_MNG_")
-          ) {
-            return;
-          } else {
-            this.$router.push(this.menuList[0].routerUrl);
-          }
-        }
-      }
-    },
-    "$store.state.mbrNm"(newVal) {
-      this.mbrNm = newVal;
-    },
-  },
-  computed: {},
-  mounted() { },
+    watch: {
+        // '$store.state.menu'(newValue) {
+        //     this.checkMenu = newValue ? newValue.menuId : null;
+        // },
+        // 나중에 네비게이션 가드에서 form 받을 수 있으면 form adm/main으로 갈때 sotre.state값0로 바꿔주기
+        $route(to) {
+        this.currentPath = to.path;
+        },
+        // async "$store.state.menu"(newVal) {
+        //     console.log(newVal)
+        //     if (newVal == null || newVal == "" || newVal == undefined) {
+        //         this.menuList = [];
+        //     } else {
+        //         this.menuList = newVal.childList;
+        //         if (newVal && this.menuList.length > 0) {
+        //         await this.cntnStatsSave(this.menuList[0].menuId);
+        //             if (
+        //                 newVal.menuId == "MENU_000000000000010" &&
+        //                 this.$store.state.path.includes("BBS_MNG_")
+        //             ) {
+        //                 return;
+        //             } else {
+        //                 this.$router.push(this.menuList[0].routerUrl);
+        //             }
+        //         }
+        //     }
+        // },
+        "$store.state.mbrNm"(newVal) {
+            this.mbrNm = newVal;
+        },
+    }
 };
 </script>
+
+<style scoped>
+/* 메뉴 스타일 */
+.main-menu {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+.menu-item {
+    position: relative;
+    cursor: pointer;
+    padding: 10px;
+    border-bottom: 1px solid #ccc;
+}
+
+/* 서브메뉴 스타일 */
+.sub-menu {
+    list-style: none;
+    padding: 5px 0;
+    margin: 0;
+    background: white;
+    border: 1px solid #ccc;
+    display: block;
+    width: 100%;
+}
+
+.sub-menu li {
+    padding: 8px 15px;
+    cursor: pointer;
+}
+
+.sub-menu li:hover {
+    background-color: #f0f0f0;
+}
+</style>
 
client/views/pages/adm/boardManagement/template/commonTemplate/CommonInsert copy.vue (added)
+++ client/views/pages/adm/boardManagement/template/commonTemplate/CommonInsert copy.vue
@@ -0,0 +1,657 @@
+<template>
+  <div
+    :class="{
+      content: true,
+      'admin-style overflow-y': pageRole === 'adm',
+      'w1400 pt50 pb50': pageRole === 'portal',
+    }"
+  >
+    <div
+      :class="{
+        'admin-page-title point-font2 mb30': pageRole == 'adm',
+        'page-title point-font mb30':
+          pageRole == 'portal',
+      }"
+    >
+      <p>{{ bbsMng.bbsNm }}</p>
+    </div>
+    <table class="form-table mb30">
+      <colgroup>
+        <col width="10%" />
+        <col width="90%" />
+      </colgroup>
+      <tbody>
+        <tr>
+          <th
+            :class="{
+              'text-lf': true,
+              'point-font2': pageRole == 'adm',
+              'point-font': pageRole == 'portal',
+            }"
+          >
+            <span>제목</span>
+          </th>
+          <td>
+            <input
+              type="text"
+              class="full-input"
+              v-model="bbsCn.bbsNm"
+              placeholder="제목을 입력하세요."
+            />
+          </td>
+        </tr>
+        <tr class="border-top">
+          <th
+            colspan="4"
+            :class="{
+              'text-lf': true,
+              'point-font2': pageRole == 'adm',
+              'point-font': pageRole == 'portal',
+            }"
+          >
+            <span>내용</span>
+          </th>
+        </tr>
+        <tr style="max-height: 600px">
+          <td colspan="4" style="height: 100%">
+            <!-- <textarea name="smart" id="smart" style="width:100%"></textarea> -->
+            <!-- <textarea name="editor4" id="editor4" style="width:100%"></textarea> -->
+            <ckeditorComponent
+              ref="ckeditor5"
+              :bbsCn.sync="bbsCn"
+            ></ckeditorComponent>
+          </td>
+        </tr>
+        <tr v-if="bbsMng.atchFileUseYn === 'Y'" class="border-top">
+          <th
+            :class="{
+              'text-lf': true,
+              'point-font2': pageRole == 'adm',
+              'point-font': pageRole == 'portal',
+            }"
+          >
+            첨부파일
+          </th>
+          <td colspan="2">
+            <div class="gd-12 pr0">
+              <div class="gd-2 pl0 pr0">
+                <label
+                  for="file"
+                  :class="{
+                    'large-btn text-ct': true,
+                    'blue-border-btn': pageRole == 'adm',
+                    'green-border-btn':
+                      pageRole == 'portal',
+                  }"
+                  >파일찾기</label
+                >
+                <input
+                  type="file"
+                  id="file"
+                  ref="file"
+                  @change="fnFileInsert"
+                  multiple
+                />
+              </div>
+              <div class="gd-12 pl0 pr0" v-if="fileList.length > 0">
+                <ul>
+                  <li
+                    v-for="(file, idx) in fileList"
+                    :key="idx"
+                    class="pd10 mt10 border radius"
+                  >
+                    <div
+                      v-if="file['fileId'] != null"
+                      class="flex align-center justify-between file-wrap"
+                    >
+                      <p>{{ file["fileNm"] }}.{{ file["extnNm"] }}</p>
+                      <button class="del-btn" @click="fnFileDelete(file, idx)">
+                        X
+                      </button>
+                    </div>
+                    <div
+                      v-else
+                      class="flex align-center justify-between file-wrap"
+                    >
+                      <p>{{ file.name }}</p>
+                      <button class="del-btn" @click="fnFileDelete(file, idx)">
+                        X
+                      </button>
+                    </div>
+                  </li>
+                </ul>
+              </div>
+            </div>
+          </td>
+        </tr>
+        <tr v-if="bbsMng.ntcUseYn === 'Y'" class="border-top">
+          <th
+            :class="{
+              'text-lf': true,
+              'point-font2': pageRole == 'adm',
+              'point-font': pageRole == 'portal',
+            }"
+          >
+            공지글
+          </th>
+          <td colspan="3">
+            <div class="flex align-center no-gutters">
+              <div class="gd-4">
+                <input
+                  type="radio"
+                  name="notice"
+                  id="notice-y"
+                  class="mr5"
+                  value="Y"
+                  v-model="bbsCn.ntcPstYn"
+                />
+                <label for="notice-y">사용</label>
+              </div>
+              <div class="gd-4">
+                <input
+                  type="radio"
+                  name="notice"
+                  id="notice-n"
+                  class="mr5"
+                  value="N"
+                  v-model="bbsCn.ntcPstYn"
+                />
+                <label for="notice-n">미사용</label>
+              </div>
+            </div>
+          </td>
+        </tr>
+        <tr v-if="bbsCn.ntcPstYn === 'Y'" class="border-top">
+          <th
+            :class="{
+              'text-lf': true,
+              'point-font2': pageRole == 'adm',
+              'point-font': pageRole == 'portal',
+            }"
+          >
+            공지글 게시기간
+          </th>
+          <td colspan="3">
+            <div class="flex align-center no-gutters">
+              <div class="gd-4">
+                <input
+                  type="datetime-local"
+                  class="full-input ml0"
+                  v-model="bbsCn.ntcBgngDt"
+                  @change="checkDateValidity('ntcBgngDt', $event)"
+                />
+              </div>
+              <div class="pd10">-</div>
+              <div class="gd-4">
+                <input
+                  type="datetime-local"
+                  class="full-input ml0"
+                  v-model="bbsCn.ntcEndDt"
+                  @change="checkDateValidity('ntcEndDt', $event)"
+                />
+              </div>
+            </div>
+          </td>
+        </tr>
+        <tr v-if="bbsMng.prvtPstUseYn === 'Y'" class="border-top">
+          <th
+            :class="{
+              'text-lf': true,
+              'point-font2': pageRole == 'adm',
+              'point-font': pageRole == 'portal',
+            }"
+          >
+            비밀글
+          </th>
+          <td colspan="3">
+            <div class="flex align-center no-gutters">
+              <div class="gd-4">
+                <input
+                  type="radio"
+                  name="private"
+                  id="private-y"
+                  class="mr5"
+                  value="Y"
+                  v-model="bbsCn.prvtPstYn"
+                />
+                <label for="private-y">사용</label>
+              </div>
+              <div class="gd-4">
+                <input
+                  type="radio"
+                  name="private"
+                  id="private-n"
+                  class="mr5"
+                  value="N"
+                  v-model="bbsCn.prvtPstYn"
+                />
+                <label for="private-n">미사용</label>
+              </div>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <div class="flex justify-end align-center no-gutters">
+      <div class="gd-1 mr10">
+        <button
+          :class="{
+            'large-btn': true,
+            'blue-btn': pageRole == 'adm',
+            'green-btn': pageRole == 'portal',
+          }"
+          @click="fnInsert"
+        >
+          {{ bbsCn.bbsId == null ? "등록" : "수정" }}
+        </button>
+      </div>
+      <div class="gd-1">
+        <button class="large-btn gray-btn" @click="fnCancel">취소</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mdiClose } from "@mdi/js";
+import { findByBbsCn } from "../../../../../../resources/api/bbsCn.js";
+import queryParams from "../../../../../../resources/js/queryParams";
+import defaultAxios from "../../../../../../resources/js/defaultAxios";
+// ckditor5
+import ckeditorComponent from "../../../../../component/ckeditor5/ckeditorComponent.vue";
+
+export default {
+  mixins: [queryParams],
+  data() {
+    return {
+      file: null,
+      iconPath: mdiClose,
+      pageRole: this.$store.state.userType,
+      path: this.$store.state.path,
+      pageAuth: this.$store.state.pageAuth,
+      bbsMngId: null,
+      bbsCn: {},
+      bbsMng: {},
+
+      // 파일 업로드
+      files: null,
+      fileList: [],
+      deleteFileList: [],
+
+      //이미지 업로드
+      imgFiles: null,
+      imgFileList: [],
+      deleteImgFileList: [],
+
+      //스마트 에디터
+      editor: null,
+    };
+  },
+  created() {
+    this.fnBbsIdExtraction();
+    this.fnSelectOne();
+  },
+  methods: {
+    test() {
+      this.Validation();
+    },
+
+    // 취소 버튼 동작
+    fnCancel() {
+      if (!confirm("등록을 취소하시겠습니까?")) {
+        return;
+      }
+      if (this.bbsCn.bbsId == null || this.bbsCn.bbsId == 0) {
+        this.$router.push({
+          path: this.path + "/list.page",
+        });
+      } else {
+        this.$router.push({
+          path: this.path + "/view.page",
+          query: {
+            pageId: this.bbsCn.bbsId,
+          },
+        });
+      }
+    },
+    // 상세조회
+    async fnSelectOne() {
+      try {
+        const params = {
+          bbsId: this.$route.query.pageId,
+          bbsMngId: this.bbsMngId,
+        };
+        const res = await findByBbsCn(params);
+        if (res.status == 200) {
+          this.bbsCn = res.data.data.bbsCn;
+          this.bbsMng = res.data.data.bbsMng;
+          this.bbsMng.byteLmt = res.data.data.bbsMng.fileSzLmt * 1024 * 1024;
+          this.fileList = res.data.data.fileList;
+
+          this.$refs.ckeditor5.createEditor();
+        }
+      } catch (error) {
+        alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요.");
+      }
+    },
+    // 첨부파일 등록
+    fnFileInsert() {
+      // files 개수 만큼 반복해서 type, size 체크
+      this.files = this.$refs.file.files;
+      for (let i = 0; i < this.files.length; i++) {
+        const file = this.files[i];
+        const extnNm = file.name.split(".").pop();
+        if (this.bbsMng.fileExtnNmList.length >= 1) {
+          if (!this.bbsMng.fileExtnNmList.includes(extnNm)) {
+            alert(
+              "첨부파일 확장자를 확인해주세요.\n등록가능 확장자: " +
+                this.bbsMng.fileExtnNmList
+            );
+            return;
+          }
+        }
+        if (this.bbsMng.byteLmt != 0 && this.bbsMng.byteLmt != null) {
+          if (file.size > this.bbsMng.byteLmt) {
+            alert(this.bbsMng.fileSzLmt + "MB 이하의 파일만 등록 가능합니다.");
+            return;
+          }
+        }
+      }
+      this.fileList = [...this.fileList, ...Array.from(this.files)];
+    },
+    // 첨부파일 삭제
+    fnFileDelete(file, index) {
+      if (file["fileId"] != null) {
+        this.deleteFileList.push(file);
+      }
+      this.fileList.splice(index, 1);
+    },
+    fnInsert() {
+      if (this.bbsCn.bbsId == null || this.bbsCn.bbsId == 0) {
+        this.fnSave();
+      } else {
+        this.fnUpdate();
+      }
+    },
+    // 등록
+    async fnSave() {
+      if (!this.Validation()) {
+        return;
+      }
+      // 폼데이터 생성
+      this.bbsCn.bbsMngId = this.bbsMngId;
+      var formData = new FormData();
+      const paramsToBlob = new Blob([JSON.stringify(this.bbsCn)], {
+        type: "application/json; charset=UTF-8",
+      });
+      formData.append("bbsCn", paramsToBlob);
+      for (const file of this.fileList) {
+        formData.append("multipartFileList", file);
+      }
+      for (const imgFile of this.imgFileList) {
+        formData.append("multipartImgList", imgFile);
+      }
+      // axios 호출
+      await defaultAxios({
+        url: "/sys/bbsCn/saveBbsCn.file",
+        method: "post",
+        headers: {
+          "Content-Type": "multipart/form-data; charset=UTF-8",
+          Authorization: this.$store.state.authorization,
+        },
+        data: formData,
+      })
+        .then((response) => {
+          const bbsId = response.data.data.bbsId;
+          alert("게시글이 등록되었습니다.");
+          this.$router.push({
+            // name: 'BoardManagementSelectListOne',
+            path: this.path + "/view.page",
+            query: {
+              pageId: bbsId,
+            },
+          });
+        })
+        .catch((error) => {
+          const message = error.response.data.message;
+          alert(message);
+        });
+    },
+    // 수정
+    async fnUpdate() {
+      if (!this.Validation()) {
+        return;
+      }
+      // 폼데이터 생성
+      this.bbsCn.bbsMngId = this.bbsMngId;
+      var formData = new FormData();
+      const paramsToBlob = new Blob([JSON.stringify(this.bbsCn)], {
+        type: "application/json; charset=UTF-8",
+      });
+      formData.append("params", paramsToBlob);
+      const deleteFileListToBlob = new Blob(
+        [JSON.stringify(this.deleteFileList)],
+        {
+          type: "application/json; charset=UTF-8",
+        }
+      );
+      formData.append("deleteFileList", deleteFileListToBlob);
+      // 추가 첨부파일
+      for (const file of this.fileList) {
+        if (file["fileId"] == null) {
+          formData.append("multipartFileList", file);
+        }
+      }
+      // 이미지 파일
+      const deleteImgFileListToBlob = new Blob(
+        [JSON.stringify(this.deleteImgFileList)],
+        {
+          type: "application/json; charset=UTF-8",
+        }
+      );
+      formData.append("deleteImgFileList", deleteImgFileListToBlob);
+      for (const imgFile of this.imgFileList) {
+        formData.append("multipartImgList", imgFile);
+      }
+      // axios 호출
+      defaultAxios({
+        url: "/sys/bbsCn/updateBbsCn.file",
+        method: "post",
+        headers: {
+          "Content-Type": "multipart/form-data; charset=UTF-8",
+          Authorization: this.$store.state.authorization,
+        },
+        data: formData,
+      })
+        .then((response) => {
+          const bbsId = response.data.data;
+          this.$router.push({
+            // name: 'BoardManagementSelectListOne',
+            path: this.path + "/view.page",
+            query: {
+              pageId: bbsId,
+            },
+          });
+        })
+        .catch((error) => {
+          const message = error.response.data.message;
+          alert(message);
+        });
+    },
+    // 유효성 검사
+    Validation() {
+      if (this.bbsCn.bbsNm == null || this.bbsCn.bbsNm.trim() == "") {
+        alert("게시판 제목을 입력해주세요.");
+        return false;
+      }
+
+      // const oEditors = this.oEditors;
+      // oEditors.getById["smart"].exec("UPDATE_CONTENTS_FIELD", []);
+      // // 스마트에디터의 iframe에 있는 내용을 textarea로.
+      // this.bbsCn.bbsCn = document.getElementById("smart").value;
+
+      // 내용 null검사
+      // if (!this.tagChecked() && (this.isEmpty(this.bbsCn.bbsCn) || this.removeHtmlAndSpace(this.bbsCn.bbsCn) === '')) {
+      //     alert("내용을 입력하세요.");
+      //     document.getElementById("smart").focus();
+      //     return false;
+      // }
+
+      if (
+        !this.tagChecked() &&
+        (this.isEmpty(this.bbsCn.bbsCn) ||
+          this.removeHtmlAndSpace(this.bbsCn.bbsCn) === "")
+      ) {
+        alert("게시판 내용을 입력해주세요.");
+        return false;
+      }
+      if (
+        this.bbsCn.ntcPstYn === "Y" &&
+        (this.bbsCn.ntcBgngDt === null || this.bbsCn.ntcEndDt === null)
+      ) {
+        alert("공지기간을 올바르게 설정해주세요.");
+        return false;
+      }
+
+      return true;
+    },
+
+    // 태그 체크
+    tagChecked() {
+      const tag = this.bbsCn.bbsCn;
+      if (tag.indexOf("<img") != -1) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+
+    /**
+     * 빈 객체 여부
+     */
+    isEmpty: function (data) {
+      if (
+        data === undefined ||
+        data === null ||
+        data === "" ||
+        data.length === 0 ||
+        (data.constructor == Object && Object.keys(data).length === 0)
+      ) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+
+    removeHtmlAndSpace: function (str) {
+      return str
+        .replace(/<[^>]*>/g, "") // HTML 태그 제거
+        .replace(/&nbsp;/gi, " ") // &nbsp;를 공백으로 변환
+        .replace(/\s/g, ""); // 모든 공백 제거
+    },
+    // 공지기간 유효성 체크
+    checkDateValidity(changeDate, event) {
+      const val = event.target.value; // 변경된 날짜 값
+      // 시작일 변경 시
+      if (changeDate === "ntcBgngDt") {
+        if (this.bbsCn.ntcEndDt !== null && this.bbsCn.ntcEndDt < val) {
+          alert("시작일은 종료일보다 클 수 없습니다.");
+          this.bbsCn.ntcBgngDt = null; // 유효하지 않은 경우, 시작일을 초기화
+        } else {
+          this.bbsCn.ntcBgngDt = val;
+        }
+      }
+      // 종료일 변경 시
+      else if (changeDate === "ntcEndDt") {
+        if (this.bbsCn.ntcBgngDt !== null && this.bbsCn.ntcBgngDt > val) {
+          alert("종료일은 시작일보다 작을 수 없습니다.");
+          this.bbsCn.ntcEndDt = null; // 유효하지 않은 경우, 종료일을 초기화
+        } else {
+          this.bbsCn.ntcEndDt = val;
+        }
+      }
+    },
+
+    // // 에디터 생성
+    // createEditor: function () {
+    //     // ck에디터 적용
+    //     ClassicEditor
+    //         .create(document.querySelector('#editor4'), {
+    //             extraPlugins: [this.MyCustomUploadAdapterPlugin],
+    //             removePlugins: ['MediaEmbedToolbar'],
+    //             image: {
+    //                 toolbar: ['imageTextAlternative', '|', 'imageStyle:alignLeft', 'imageStyle:alignCenter', 'imageStyle:alignRight','|','resizeImage:50','resizeImage:75', 'resizeImage:original','resizeImage:custom',],
+    //                 resizeOptions: [
+    //                     {
+    //                         name: 'resizeImage:original',
+    //                         value: null,
+    //                         icon: 'original'
+    //                     },
+    //                     {
+    //                         name: 'resizeImage:custom',
+    //                         value: 'custom',
+    //                         icon: 'custom'
+    //                     },
+    //                     {
+    //                         name: 'resizeImage:50',
+    //                         value: '50',
+    //                         icon: 'medium'
+    //                     },
+    //                     {
+    //                         name: 'resizeImage:75',
+    //                         value: '75',
+    //                         icon: 'large'
+    //                     }
+    //                 ],
+    //             },
+
+    //         })
+    //         .then(editor => {
+    //             this.editor = editor;
+    //             editor.setData(this.bbsCn.bbsCn);
+    //             editor.model.document.on('change', () => {
+    //                 this.bbsCn.bbsCn = editor.getData();
+    //             });
+    //         })
+    //         .catch(error => {
+    //             console.error('There was a problem initializing the editor.', error);
+    //         });
+    // },
+
+    // beforeDestroy: function() {
+    //     if (this.editor) {
+    //         this.editor.destroy()
+    //             .then(() => {
+    //                 this.editor = null;
+    //             });
+    //     }
+    // },
+
+    // MyCustomUploadAdapterPlugin: function(editor) {
+    //     editor.plugins.get('FileRepository').createUploadAdapter = (loader) => {
+    //         console.log('loader', loader);
+    //         return new UploadAdapter(loader);
+    //     }
+    // }
+  },
+  watch: {
+    "bbsCn.ntcPstYn": function (val) {
+      if (val === "Y") {
+        const offset = new Date().getTimezoneOffset() * 60000;
+        const now = new Date(Date.now() - offset).toISOString().slice(0, 16);
+        this.bbsCn.ntcBgngDt =
+          this.bbsCn.ntcBgngDt == null ? now : this.bbsCn.ntcBgngDt;
+        this.bbsCn.ntcEndDt =
+          this.bbsCn.ntcEndDt == null ? now : this.bbsCn.ntcEndDt;
+      }
+    },
+  },
+  computed: {},
+  components: {
+    ckeditorComponent,
+  },
+  mounted() {},
+};
+</script>
+<style scoped>
+</style>
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
@@ -1,255 +1,219 @@
 <template>
-  <div
-    :class="{
-      content: true,
-      'admin-style overflow-y': pageRole === 'adm',
-      'w1400 pt50 pb50': pageRole === 'portal',
-    }"
-  >
-    <div
-      :class="{
-        'admin-page-title point-font2 mb30': pageRole == 'adm',
-        'page-title point-font mb30':
-          pageRole == 'portal',
-      }"
-    >
-      <p>{{ bbsMng.bbsNm }}</p>
-    </div>
-    <table class="form-table mb30">
-      <colgroup>
-        <col width="10%" />
-        <col width="90%" />
-      </colgroup>
-      <tbody>
-        <tr>
-          <th
-            :class="{
-              'text-lf': true,
-              'point-font2': pageRole == 'adm',
-              'point-font': pageRole == 'portal',
-            }"
-          >
-            <span>제목</span>
-          </th>
-          <td>
-            <input
-              type="text"
-              class="full-input"
-              v-model="bbsCn.bbsNm"
-              placeholder="제목을 입력하세요."
-            />
-          </td>
-        </tr>
-        <tr class="border-top">
-          <th
-            colspan="4"
-            :class="{
-              'text-lf': true,
-              'point-font2': pageRole == 'adm',
-              'point-font': pageRole == 'portal',
-            }"
-          >
-            <span>내용</span>
-          </th>
-        </tr>
-        <tr style="max-height: 600px">
-          <td colspan="4" style="height: 100%">
-            <!-- <textarea name="smart" id="smart" style="width:100%"></textarea> -->
-            <!-- <textarea name="editor4" id="editor4" style="width:100%"></textarea> -->
-            <ckeditorComponent
-              ref="ckeditor5"
-              :bbsCn.sync="bbsCn"
-            ></ckeditorComponent>
-          </td>
-        </tr>
-        <tr v-if="bbsMng.atchFileUseYn === 'Y'" class="border-top">
-          <th
-            :class="{
-              'text-lf': true,
-              'point-font2': pageRole == 'adm',
-              'point-font': pageRole == 'portal',
-            }"
-          >
-            첨부파일
-          </th>
-          <td colspan="2">
-            <div class="gd-12 pr0">
-              <div class="gd-2 pl0 pr0">
-                <label
-                  for="file"
-                  :class="{
-                    'large-btn text-ct': true,
-                    'blue-border-btn': pageRole == 'adm',
-                    'green-border-btn':
-                      pageRole == 'portal',
-                  }"
-                  >파일찾기</label
-                >
-                <input
-                  type="file"
-                  id="file"
-                  ref="file"
-                  @change="fnFileInsert"
-                  multiple
-                />
-              </div>
-              <div class="gd-12 pl0 pr0" v-if="fileList.length > 0">
-                <ul>
-                  <li
-                    v-for="(file, idx) in fileList"
-                    :key="idx"
-                    class="pd10 mt10 border radius"
-                  >
-                    <div
-                      v-if="file['fileId'] != null"
-                      class="flex align-center justify-between file-wrap"
-                    >
-                      <p>{{ file["fileNm"] }}.{{ file["extnNm"] }}</p>
-                      <button class="del-btn" @click="fnFileDelete(file, idx)">
-                        X
-                      </button>
-                    </div>
-                    <div
-                      v-else
-                      class="flex align-center justify-between file-wrap"
-                    >
-                      <p>{{ file.name }}</p>
-                      <button class="del-btn" @click="fnFileDelete(file, idx)">
-                        X
-                      </button>
-                    </div>
-                  </li>
-                </ul>
-              </div>
-            </div>
-          </td>
-        </tr>
-        <tr v-if="bbsMng.ntcUseYn === 'Y'" class="border-top">
-          <th
-            :class="{
-              'text-lf': true,
-              'point-font2': pageRole == 'adm',
-              'point-font': pageRole == 'portal',
-            }"
-          >
-            공지글
-          </th>
-          <td colspan="3">
-            <div class="flex align-center no-gutters">
-              <div class="gd-4">
-                <input
-                  type="radio"
-                  name="notice"
-                  id="notice-y"
-                  class="mr5"
-                  value="Y"
-                  v-model="bbsCn.ntcPstYn"
-                />
-                <label for="notice-y">사용</label>
-              </div>
-              <div class="gd-4">
-                <input
-                  type="radio"
-                  name="notice"
-                  id="notice-n"
-                  class="mr5"
-                  value="N"
-                  v-model="bbsCn.ntcPstYn"
-                />
-                <label for="notice-n">미사용</label>
-              </div>
-            </div>
-          </td>
-        </tr>
-        <tr v-if="bbsCn.ntcPstYn === 'Y'" class="border-top">
-          <th
-            :class="{
-              'text-lf': true,
-              'point-font2': pageRole == 'adm',
-              'point-font': pageRole == 'portal',
-            }"
-          >
-            공지글 게시기간
-          </th>
-          <td colspan="3">
-            <div class="flex align-center no-gutters">
-              <div class="gd-4">
-                <input
-                  type="datetime-local"
-                  class="full-input ml0"
-                  v-model="bbsCn.ntcBgngDt"
-                  @change="checkDateValidity('ntcBgngDt', $event)"
-                />
-              </div>
-              <div class="pd10">-</div>
-              <div class="gd-4">
-                <input
-                  type="datetime-local"
-                  class="full-input ml0"
-                  v-model="bbsCn.ntcEndDt"
-                  @change="checkDateValidity('ntcEndDt', $event)"
-                />
-              </div>
-            </div>
-          </td>
-        </tr>
-        <tr v-if="bbsMng.prvtPstUseYn === 'Y'" class="border-top">
-          <th
-            :class="{
-              'text-lf': true,
-              'point-font2': pageRole == 'adm',
-              'point-font': pageRole == 'portal',
-            }"
-          >
-            비밀글
-          </th>
-          <td colspan="3">
-            <div class="flex align-center no-gutters">
-              <div class="gd-4">
-                <input
-                  type="radio"
-                  name="private"
-                  id="private-y"
-                  class="mr5"
-                  value="Y"
-                  v-model="bbsCn.prvtPstYn"
-                />
-                <label for="private-y">사용</label>
-              </div>
-              <div class="gd-4">
-                <input
-                  type="radio"
-                  name="private"
-                  id="private-n"
-                  class="mr5"
-                  value="N"
-                  v-model="bbsCn.prvtPstYn"
-                />
-                <label for="private-n">미사용</label>
-              </div>
-            </div>
-          </td>
-        </tr>
-      </tbody>
-    </table>
-    <div class="flex justify-end align-center no-gutters">
-      <div class="gd-1 mr10">
-        <button
-          :class="{
-            'large-btn': true,
-            'blue-btn': pageRole == 'adm',
-            'green-btn': pageRole == 'portal',
-          }"
-          @click="fnInsert"
-        >
-          {{ bbsCn.bbsId == null ? "등록" : "수정" }}
-        </button>
+
+    <!-- 사용자 -->
+    <template v-if="pageRole === 'portal'" > 
+      <div class="content w1400 pt50 pb50">
+        <div class="page-title point-font mb30">
+          <p>{{ bbsMng.bbsNm }}</p>
+        </div>
+        <table class="form-table mb30">
+          <colgroup>
+            <col width="10%" />
+            <col width="90%" />
+          </colgroup>
+          <tbody>
+            <tr>
+              <th class="text-lf point-font">
+                <span>제목</span>
+              </th>
+              <td>
+                <input type="text" class="full-input" v-model="bbsCn.bbsNm" placeholder="제목을 입력하세요." />
+              </td>
+            </tr>
+            <tr class="border-top">
+              <th colspan="4" class="text-lf point-font">
+                <span>내용</span>
+              </th>
+            </tr>
+            <tr style="max-height: 600px">
+              <td colspan="4" style="height: 100%">
+                <ckeditorComponent ref="ckeditor5" :bbsCn.sync="bbsCn"></ckeditorComponent>
+              </td>
+            </tr>
+          </tbody>
+        </table>
       </div>
-      <div class="gd-1">
-        <button class="large-btn gray-btn" @click="fnCancel">취소</button>
+    </template>
+
+    <!-- 관리자 -->
+    <template v-else>
+      <div  class="content-zone">
+        <div class="content">
+          <div class="scroll">
+            <div class="title-zone">
+              <div class="page-title">
+                <p>{{ bbsMng.bbsNm }}</p>
+              </div>
+            </div>
+            <div class="tbl-wrap">
+              <table class="tbl data">
+                <colgroup>
+                  <col width="10%" />
+                  <col width="90%" />
+                </colgroup>
+                <tbody>
+                  <tr>
+                    <th class="text-lf">
+                      <span>제목</span>
+                    </th>
+                    <td>
+                      <input type="text" class="form-control sm" v-model="bbsCn.bbsNm" placeholder="제목을 입력하세요." />
+                    </td>
+                  </tr>
+                  <tr>
+                    <th class="text-lf" style="vertical-align: top;">
+                      <span>내용</span>
+                    </th>
+                    <td>
+                      <ckeditorComponent ref="ckeditor5" :bbsCn.sync="bbsCn"></ckeditorComponent>
+                    </td>
+                  </tr>
+                  <tr v-if="bbsMng.atchFileUseYn === 'Y'">
+                    <th>첨부파일</th>
+                    <td>
+                      <label for="file" >파일찾기</label>
+                      <input
+                        type="file"
+                        id="file"
+                        ref="file"
+                        @change="fnFileInsert"
+                        multiple
+                      />
+                      <div  v-if="fileList.length > 0">
+                        <ul>
+                          <li v-for="(file, idx) in fileList" :key="idx">
+                            <div v-if="file['fileId'] != null" class="file-wrap">
+                              <p>{{ file["fileNm"] }}.{{ file["extnNm"] }}</p>
+                              <button class="del-btn" @click="fnFileDelete(file, idx)">X</button>
+                            </div>
+                            <div v-else class="file-wrap">
+                              <p>{{ file.name }}</p>
+                              <button class="del-btn" @click="fnFileDelete(file, idx)">X</button>
+                            </div>
+                          </li>
+                        </ul>
+                      </div>
+                    </td>
+                  </tr>
+                  <tr v-if="bbsMng.ntcUseYn === 'Y'" class="border-top">
+                    <th>공지글</th>
+                    <td>
+                      <div class="check-area">
+                        <div class="form-check">
+                          <input
+                            type="radio"
+                            name="notice"
+                            id="notice-y"
+                            class="mr5"
+                            value="Y"
+                            v-model="bbsCn.ntcPstYn"
+                          />
+                          <label for="notice-y">사용</label>
+                        </div>
+                        <div class="form-check">
+                          <input
+                            type="radio"
+                            name="notice"
+                            id="notice-n"
+                            class="mr5"
+                            value="N"
+                            v-model="bbsCn.ntcPstYn"
+                          />
+                          <label for="notice-n">미사용</label>
+                        </div>
+                      </div>
+                    </td>
+                  </tr>
+                  <tr v-if="bbsCn.ntcPstYn === 'Y'" class="border-top">
+                    <th>공지글 게시기간</th>
+                    <td>
+                      <div class="input-form">
+                        <div class="form-control sm cal">
+                          <VueDatePicker
+                            InlineOptions
+                            placeholder="시작일"
+                            locale="ko"
+                            :enable-time-picker="false"
+                            :format="formatDate"
+                            v-model="bbsCn.ntcBgngDt"
+                            @update:model-value="checkDateValidity('ntcBgngDt',$event)"
+                          />
+                          <!-- <input
+                            type="datetime-local"
+                            class="full-input ml0"
+                            v-model="bbsCn.ntcBgngDt"
+                            @change="checkDateValidity('ntcBgngDt', $event)"
+                          /> -->
+                        </div>
+                        <div class="mark">-</div>
+                        <div class="form-control sm cal">
+                          <VueDatePicker
+                            InlineOptions
+                            placeholder="종료일"
+                            locale="ko"
+                            :enable-time-picker="false"
+                            :format="formatDate"
+                            v-model="bbsCn.ntcEndDt"
+                            @update:model-value="checkDateValidity('ntcEndDt',$event)"
+                          />
+                          <!-- <input
+                            type="datetime-local"
+                            class="full-input ml0"
+                            v-model="bbsCn.ntcEndDt"
+                            @change="checkDateValidity('ntcEndDt', $event)"
+                          /> -->
+                        </div>
+                      </div>
+                    </td>
+                  </tr>
+                  <tr v-if="bbsMng.prvtPstUseYn === 'Y'" class="border-top">
+                    <th
+                      :class="{
+                        'text-lf': true,
+                        'point-font2': pageRole == 'adm',
+                        'point-font': pageRole == 'portal',
+                      }"
+                    >
+                      비밀글
+                    </th>
+                    <td colspan="3">
+                      <div class="flex align-center no-gutters">
+                        <div class="gd-4">
+                          <input
+                            type="radio"
+                            name="private"
+                            id="private-y"
+                            class="mr5"
+                            value="Y"
+                            v-model="bbsCn.prvtPstYn"
+                          />
+                          <label for="private-y">사용</label>
+                        </div>
+                        <div class="gd-4">
+                          <input
+                            type="radio"
+                            name="private"
+                            id="private-n"
+                            class="mr5"
+                            value="N"
+                            v-model="bbsCn.prvtPstYn"
+                          />
+                          <label for="private-n">미사용</label>
+                        </div>
+                      </div>
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>
       </div>
-    </div>
-  </div>
+      <div class="btn-wrap">
+        <button class="btn sm primary" @click="fnInsert">{{ bbsCn.bbsId == null ? "등록" : "수정" }}</button>
+        <button class="btn sm tertiary" @click="fnCancel">취소</button>
+      </div>
+    </template>
 </template>
 
 <script>
@@ -551,7 +515,26 @@
     },
     // 공지기간 유효성 체크
     checkDateValidity(changeDate, event) {
-      const val = event.target.value; // 변경된 날짜 값
+      // const val = event.target.value; // 변경된 날짜 값
+      let val;
+
+      // 값이 Date 객체인지 확인
+      if (event instanceof Date) {
+        const year = event.getFullYear();
+        const month = ('00' + (event.getMonth() + 1)).slice(-2);
+        const day = ('00' + event.getDate()).slice(-2);
+
+        val = `${year}-${month}-${day}`;
+      }
+      // 값이 Event 객체인지 확인
+      else if (event instanceof Event) {
+        val = event.target.value; // input에서 직접 입력된 값
+      }
+      // 그 외의 경우 처리 불필요 (예외 처리)
+      else {
+        console.error("Invalid date input:", event);
+        return;
+      }
       // 시작일 변경 시
       if (changeDate === "ntcBgngDt") {
         if (this.bbsCn.ntcEndDt !== null && this.bbsCn.ntcEndDt < val) {
client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectList.vue
--- client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectList.vue
+++ client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectList.vue
@@ -1,104 +1,137 @@
 <template>
-  <div
-    :class="{
-      content: true,
-      '': pageRole === 'adm',
-      'w1400 pt50 pb50': pageRole === 'portal',
-    }"
-  >
-    <div
-      :class="{
-        'admin-page-title point-font2 mb30': pageRole == 'adm',
-        'page-title point-font mb30':
-          pageRole == 'portal',
-      }"
-    >
-      <p>{{ bbsMng.bbsNm }}</p>
+  <!-- 사용자 -->
+   <template v-if="pageRole === 'portal'">
+    <div  class="content w1400 pt50 pb50">
+      <div class="page-title point-font mb30">
+        <p>{{ bbsMng.bbsNm }}</p>
+      </div>
+      <div class="search-bar mb15">
+        <div class="flex justify-end align-center no-gutters">
+          <div class="gd-4">
+            <div class="border">
+              <select
+                class="border-none gd-3"
+                v-model="search.searchType"
+              >
+                <option value="">전체</option>
+                <option v-for="(item, idx) in codeList" :key="idx" :value="item.cd">
+                  {{ item.cdNm }}
+                </option>
+              </select>
+              <input
+                type="text"
+                class="full-input border-none gd-9 condition-input"
+                placeholder="검색어를 입력하세요."
+                v-model="search.searchText"
+                @keyup.enter="findAll"
+              />
+            </div>
+          </div>
+          <div class="flex gd-3">
+            <div class="gd-6 pr0">
+              <button class="large-btn green-border-btn" @click="findAll">
+                검색
+              </button>
+            </div>
+            <div class="gd-6 pr0">
+              <button class="large-btn darkg-border-btn" @click="fnSearchReset">
+                <svg-icon type="mdi" :path="refreshPath"></svg-icon> 초기화
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+      <ListTable
+        class="cmmn-table"
+        :colgroup="colgroup"
+        :thead="thead"
+        :tbody="tbody"
+        @listClick="fnView"
+        :lockList="lockList"
+        :ntcList="ntcList"
+      />
+      <div class="flex justify-between align-center no-gutters">
+        <div class="gd-1"></div>
+        <div class="gd-10">
+          <PaginationButton
+            class="cmmn-table"
+            v-model:currentPage="search.currentPage"
+            :pagination="search"
+            :click="findAll"
+          />
+        </div>
+        <div v-if="pageAuth.regAuthrt == 'Y'" class="gd-1">
+          <button class="large-btn green-btn" @click="fnAdd">
+            등록
+          </button>
+        </div>
+      </div>
     </div>
-    <div class="search-bar mb15">
-      <div class="flex justify-end align-center no-gutters">
-        <div class="gd-4">
-          <div class="border">
+   </template>
+
+  <!-- 관리자 -->
+  <template v-else>
+    <div  class="content-zone">
+      <div class="content">
+        <div class="scroll">
+          <div class="title-zone">
+            <div  class="page-title">
+              <p>{{ bbsMng.bbsNm }}</p>
+            </div>
+          </div>
+          <div class="search-bar">
             <select
-              name=""
-              id=""
-              class="border-none gd-3"
+              class="form-select sm"
               v-model="search.searchType"
             >
               <option value="">전체</option>
-              <option
-                v-for="(item, idx) in codeList"
-                :key="idx"
-                :value="item.cd"
-              >
+              <option v-for="(item, idx) in codeList" :key="idx" :value="item.cd">
                 {{ item.cdNm }}
               </option>
             </select>
             <input
               type="text"
-              class="full-input border-none gd-9 condition-input"
+              class="form-control sm"
               placeholder="검색어를 입력하세요."
               v-model="search.searchText"
               @keyup.enter="findAll"
             />
-          </div>
-        </div>
-        <div class="flex gd-3">
-          <div class="gd-6 pr0">
-            <button
-              :class="{
-                'large-btn': true,
-                'blue-border-btn': pageRole == 'adm',
-                'green-border-btn':
-                  pageRole == 'portal',
-              }"
-              @click="findAll"
-            >
+            <button class="btn sm ico-before ico-sch" @click="findAll">
               검색
             </button>
+            <button class="btn-ico md ico-refresh" @click="fnSearchReset"></button>
           </div>
-          <div class="gd-6 pr0">
-            <button class="large-btn darkg-border-btn" @click="fnSearchReset">
-              <svg-icon type="mdi" :path="refreshPath" ></svg-icon> 초기화
-            </button>
+          <div class="tbl-wrap">
+            <ListTable
+              class="data cursor"
+              :colgroup="colgroup"
+              :thead="thead"
+              :tbody="tbody"
+              @listClick="fnView"
+              :lockList="lockList"
+              :ntcList="ntcList"
+            />
           </div>
         </div>
       </div>
     </div>
-    <ListTable
-      :className="`cmmn-table ${pageRole == 'adm' ? 'admin-list' : ''}`"
-      :colgroup="colgroup"
-      :thead="thead"
-      :tbody="tbody"
-      @listClick="fnView"
-      :lockList="lockList"
-      :ntcList="ntcList"
-    >
-    </ListTable>
-    <div class="flex justify-between align-center no-gutters">
-      <div class="gd-1"></div>
-      <div class="gd-10">
-        <PaginationButton
-          :className="pageRole === 'adm' ? 'admin-pagination' : 'cmmn-table'"
-          v-model:currentPage="search.currentPage"
-          :pagination="search"
-          :click="findAll"
-        />
-      </div>
-      <div v-if="pageAuth.regAuthrt == 'Y'" class="gd-1">
-        <button
-          :class="{
-            'large-btn': true,
-            'blue-border-btn': pageRole == 'adm',
-            'green-btn': pageRole == 'portal',
-          }"
-          @click="fnAdd"
-        >
+    <div class="btn-wrap list">
+      <div></div>
+      <PaginationButton
+        class="admin-pagination"
+        v-model:currentPage="search.currentPage"
+        :pagination="search"
+        :click="findAll"
+      />
+      <template v-if="pageAuth.regAuthrt == 'Y'">
+        <button class="btn sm primary" @click="fnAdd">
           등록
         </button>
-      </div>
+      </template>
     </div>
-  </div>
+  </template>
+
+  
 </template>
 
 <script>
client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue
--- client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue
@@ -1,192 +1,289 @@
 <template>
-  <div
-    :class="{
-      content: true,
-      'admin-style overflow-y': pageRole === 'adm',
-      'w1400 pt50 pb50': pageRole === 'portal',
-    }"
-  >
-    <div
-      :class="{
-        'admin-page-title point-font2 mb30': pageRole == 'adm',
-        'page-title point-font mb30': pageRole == 'portal',
-      }"
-    >
-      <p>{{ bbsMng.bbsNm }}</p>
-    </div>
-    <div>
-      <table
-        class="detail-table mb30"
-        :class="{ 'admin-detail': pageRole === 'adm' }"
-      >
-        <colgroup>
-          <col width="10%" />
-          <col width="90%" />
-        </colgroup>
-        <tbody>
-          <tr class="detail-title">
-            <td colspan="2">
-              <p
-                :class="{
-                  'detail-table-title point-font2 mb10': pageRole == 'adm',
-                  'detail-table-title point-font mb10':
-                    pageRole == 'portal',
-                }"
-              >
-                {{ bbsCn.bbsNm }}
-              </p>
-              <p>
-                <span>등록일시 | {{ bbsCn.regDt }}</span>
-              </p>
-            </td>
-          </tr>
-          <tr>
-            <td colspan="2" class="pd15">
-              <div
-                class="editor5"
-                style="width: 100%; min-height: 35rem"
-                v-html="sanitizedContent"
-              ></div>
-            </td>
-          </tr>
-          <tr class="border-top">
-            <td
-              :class="{
-                'pd15 point-font2': pageRole == 'adm',
-                'pd15 point-font': pageRole == 'portal',
-              }"
-            >
-              첨부파일
-            </td>
-            <td>
-              <div v-if="fileList.length == 0">
-                <label>첨부된 파일이 없습니다.</label>
-              </div>
-
-              <ul v-else class="pd10">
-                <li
-                  v-for="(item, idx) in fileList"
-                  :key="idx"
-                  @click="downloadFile(item)"
-                  class="cursor pd5 border radius mb5 flex justify-between align-center"
-                >
-                  <p>{{ item.fileNm + "." + item.extnNm }}</p>
-                  <svg-icon type="mdi" :path="downloadFilePath"></svg-icon>
-                </li>
-              </ul>
-            </td>
-          </tr>
-        </tbody>
-      </table>
-      <div class="flex justify-end align-center mb30">
-        <div class="gd-1 pr0">
-          <button class="large-btn gray-border-btn" @click="fnList">
-            목록
-          </button>
-        </div>
-        <div
-          v-if="pageAuth.mdfcnAuthrt == 'Y' || mbrId == bbsCn.rgtr"
-          class="gd-1 pr0"
-        >
-          <button
-            :class="{
-              'large-btn': true,
-              'blue-border-btn': pageRole == 'adm',
-              'green-border-btn':
-                pageRole == 'portal',
-            }"
-            @click="fnUpdate"
-          >
-            수정
-          </button>
-        </div>
-        <div
-          v-if="pageAuth.delAuthrt == 'Y' || mbrId == bbsCn.rgtr"
-          class="gd-1 pr0"
-        >
-          <button class="large-btn red-border-btn" @click="fnDelete">
-            삭제
-          </button>
-        </div>
+  <!-- 사용자 -->
+  <template v-if="pageRole === 'portal'">
+    <div class="content w1400 pt50 pb50">
+      <div class="page-title point-font mb30">
+        <p>{{ bbsMng.bbsNm }}</p>
       </div>
-      <table v-if="bbsMng.bfrAftrPstUseYn == 'Y'" class="content-navigate mb30">
-        <colgroup>
-          <col width="10%" />
-          <col width="90%" />
-        </colgroup>
-        <tbody>
-          <tr>
-            <td class="pd10 text-ct">이전글</td>
-            <td
-              v-if="prevBbsCn != null"
-              class="pd10 cursor"
-              @click="fnMoveBbsCn(prevBbsCn.bbsId)"
-            >
-              {{ prevBbsCn.bbsNm }}
-            </td>
-            <td v-else class="pd10">이전글이 없습니다</td>
-          </tr>
-          <tr>
-            <td class="pd10 text-ct">다음글</td>
-            <td
-              v-if="nextBbsCn != null"
-              class="pd10 cursor"
-              @click="fnMoveBbsCn(nextBbsCn.bbsId)"
-            >
-              {{ nextBbsCn.bbsNm }}
-            </td>
-            <td v-else class="pd10">다음글이 없습니다</td>
-          </tr>
-        </tbody>
-      </table>
-      <div
-        v-if="bbsMng.cmntUseYn == 'Y'"
-        :class="{
-          pd30: true,
-          'comment-zone': pageRole == 'adm',
-          'comment-zone2': pageRole == 'portal',
-        }"
-      >
-        <div class="flex justify-start align-start mb30">
-          <div class="gd-10 pl0">
-            <textarea
-              name="InputCmnt"
-              id="InputCmnt"
-              style="width: 100%; min-height: 4rem"
-              v-model="InputCmnt"
-            ></textarea>
-          </div>
-          <div class="gd-2 pr0">
-            <button
-              :class="{
-                'large-btn comment-btn radius': true,
-                'blue-btn': pageRole == 'adm',
-                'green-btn': pageRole == 'portal',
-              }"
-              @click="fnInsertCmnt"
-            >
-              등록
+      <div>
+        <div class="tbl-wrap">
+          <table class="tbl data">
+            <colgroup>
+              <col width="10%" />
+              <col width="90%" />
+            </colgroup>
+            <tbody>
+              <tr class="detail-title">
+                <td colspan="2">
+                  <p class="detail-table-title point-font mb10">
+                    {{ bbsCn.bbsNm }}
+                  </p>
+                  <p>
+                    <span>등록일시 | {{ bbsCn.regDt }}</span>
+                  </p>
+                </td>
+              </tr>
+              <tr>
+                <td colspan="2">
+                  <div
+                    class="editor5"
+                    style="width: 100%; min-height: 35rem"
+                    v-html="sanitizedContent"
+                  ></div>
+                </td>
+              </tr>
+              <tr>
+                <td>첨부파일</td>
+                <td>
+                  <div v-if="fileList.length == 0">
+                    <label>첨부된 파일이 없습니다.</label>
+                  </div>
+
+                  <ul v-else>
+                    <li
+                      v-for="(item, idx) in fileList"
+                      :key="idx"
+                      @click="downloadFile(item)"
+                      class="cursor pd5 border radius mb5 flex justify-between align-center"
+                    >
+                      <p>{{ item.fileNm + "." + item.extnNm }}</p>
+                      <svg-icon type="mdi" :path="downloadFilePath"></svg-icon>
+                    </li>
+                  </ul>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="flex justify-end align-center mb30">
+          <div class="gd-1 pr0">
+            <button class="large-btn gray-border-btn" @click="fnList">
+              목록
             </button>
           </div>
         </div>
-        <div class="comment-wrap">
-          <template v-if="cmntList.length > 0">
-            <CommentItem
-              :comments="cmntList"
-              :pageAuth="pageAuth"
-              :pageId="pageId"
-              @isReply="isReply"
-            />
-          </template>
-          <template v-else>
-            <p class="comment-text text-ct data-none">
-              등록된 댓글이 없습니다.
-            </p>
-          </template>
+        <table v-if="bbsMng.bfrAftrPstUseYn == 'Y'" class="content-navigate mb30">
+          <colgroup>
+            <col width="10%" />
+            <col width="90%" />
+          </colgroup>
+          <tbody>
+            <tr>
+              <td class="pd10 text-ct">이전글</td>
+              <td
+                v-if="prevBbsCn != null"
+                class="pd10 cursor"
+                @click="fnMoveBbsCn(prevBbsCn.bbsId)"
+              >
+                {{ prevBbsCn.bbsNm }}
+              </td>
+              <td v-else class="pd10">이전글이 없습니다</td>
+            </tr>
+            <tr>
+              <td class="pd10 text-ct">다음글</td>
+              <td
+                v-if="nextBbsCn != null"
+                class="pd10 cursor"
+                @click="fnMoveBbsCn(nextBbsCn.bbsId)"
+              >
+                {{ nextBbsCn.bbsNm }}
+              </td>
+              <td v-else class="pd10">다음글이 없습니다</td>
+            </tr>
+          </tbody>
+        </table>
+        <div
+          v-if="bbsMng.cmntUseYn == 'Y'"
+          :class="{
+            pd30: true,
+            'comment-zone': pageRole == 'adm',
+            'comment-zone2': pageRole == 'portal',
+          }"
+        >
+          <div class="flex justify-start align-start mb30">
+            <div class="gd-10 pl0">
+              <textarea
+                name="InputCmnt"
+                id="InputCmnt"
+                style="width: 100%; min-height: 4rem"
+                v-model="InputCmnt"
+              ></textarea>
+            </div>
+            <div class="gd-2 pr0">
+              <button
+                :class="{
+                  'large-btn comment-btn radius': true,
+                  'blue-btn': pageRole == 'adm',
+                  'green-btn': pageRole == 'portal',
+                }"
+                @click="fnInsertCmnt"
+              >
+                등록
+              </button>
+            </div>
+          </div>
+          <div class="comment-wrap">
+            <template v-if="cmntList.length > 0">
+              <CommentItem
+                :comments="cmntList"
+                :pageAuth="pageAuth"
+                :pageId="pageId"
+                @isReply="isReply"
+              />
+            </template>
+            <template v-else>
+              <p class="comment-text text-ct data-none">
+                등록된 댓글이 없습니다.
+              </p>
+            </template>
+          </div>
         </div>
       </div>
     </div>
-  </div>
+  </template>
+  <!-- 관리자 -->
+  <template v-else>
+    <div class="content-zone">
+      <div class="content">
+        <div class="scroll">
+          <div class="title-zone">
+            <div class="page-title">
+              <p>{{ bbsMng.bbsNm }}</p>
+            </div>
+          </div>
+          <div class="tbl-wrap">
+            <table class="tbl data">
+              <colgroup>
+                <col width="10%" />
+                <col width="90%" />
+              </colgroup>
+              <tbody>
+                <tr class="detail-title">
+                  <td colspan="2">
+                    <p>{{ bbsCn.bbsNm }}</p>
+                    <p><span>등록일시 | {{ bbsCn.regDt }}</span></p>
+                  </td>
+                </tr>
+                <tr>
+                  <td colspan="2">
+                    <div
+                      class="editor5"
+                      style="width: 100%; min-height: 35rem"
+                      v-html="sanitizedContent"
+                    ></div>
+                  </td>
+                </tr>
+                <tr>
+                  <td colspan="2">
+                    <div v-if="fileList.length == 0">
+                      <label>첨부된 파일이 없습니다.</label>
+                    </div>
+
+                    <ul v-else class="pd10">
+                      <li
+                        v-for="(item, idx) in fileList"
+                        :key="idx"
+                        @click="downloadFile(item)">
+                        <p>{{ item.fileNm + "." + item.extnNm }}</p>
+                        <svg-icon type="mdi" :path="downloadFilePath"></svg-icon>
+                      </li>
+                    </ul>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+            <table v-if="bbsMng.bfrAftrPstUseYn == 'Y'" class="content-navigate">
+              <colgroup>
+                <col width="10%" />
+                <col width="90%" />
+              </colgroup>
+              <tbody>
+                <tr>
+                  <td class="pd10 text-ct">이전글</td>
+                  <td
+                    v-if="prevBbsCn != null"
+                    class="pd10 cursor"
+                    @click="fnMoveBbsCn(prevBbsCn.bbsId)"
+                  >
+                    {{ prevBbsCn.bbsNm }}
+                  </td>
+                  <td v-else class="pd10">이전글이 없습니다</td>
+                </tr>
+                <tr>
+                  <td class="pd10 text-ct">다음글</td>
+                  <td
+                    v-if="nextBbsCn != null"
+                    class="pd10 cursor"
+                    @click="fnMoveBbsCn(nextBbsCn.bbsId)"
+                  >
+                    {{ nextBbsCn.bbsNm }}
+                  </td>
+                  <td v-else class="pd10">다음글이 없습니다</td>
+                </tr>
+              </tbody>
+            </table>
+            <div
+              v-if="bbsMng.cmntUseYn == 'Y'"
+              :class="{
+                pd30: true,
+                'comment-zone': pageRole == 'adm',
+                'comment-zone2': pageRole == 'portal',
+              }"
+            >
+              <div class="flex justify-start align-start mb30">
+                <div class="gd-10 pl0">
+                  <textarea
+                    name="InputCmnt"
+                    id="InputCmnt"
+                    style="width: 100%; min-height: 4rem"
+                    v-model="InputCmnt"
+                  ></textarea>
+                </div>
+                <div class="gd-2 pr0">
+                  <button
+                    :class="{
+                      'large-btn comment-btn radius': true,
+                      'blue-btn': pageRole == 'adm',
+                      'green-btn': pageRole == 'portal',
+                    }"
+                    @click="fnInsertCmnt"
+                  >
+                    등록
+                  </button>
+                </div>
+              </div>
+              <div class="comment-wrap">
+                <template v-if="cmntList.length > 0">
+                  <CommentItem
+                    :comments="cmntList"
+                    :pageAuth="pageAuth"
+                    :pageId="pageId"
+                    @isReply="isReply"
+                  />
+                </template>
+                <template v-else>
+                  <p class="comment-text text-ct data-none">
+                    등록된 댓글이 없습니다.
+                  </p>
+                </template>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="btn-wrap">
+        <button class="btn sm tertiary" @click="fnList">
+          목록
+        </button>
+      <template v-if="pageAuth.mdfcnAuthrt == 'Y' || mbrId == bbsCn.rgtr">
+        <button class="btn sm primary" @click="fnUpdate">수정</button>
+      </template>
+      <template v-if="pageAuth.delAuthrt == 'Y' || mbrId == bbsCn.rgtr">
+        <button class="btn sm red" @click="fnDelete">삭제</button>
+      </template>
+    </div>
+  </template>
 </template>
 
 <script>
client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectList.vue
--- client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectList.vue
+++ client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectList.vue
@@ -1,82 +1,115 @@
 <template>
-    <div :class="{ 
-        'content gall-template': true, 
-        '': pageRole === 'adm', 
-        'w1400 pt50 pb50': pageRole === 'portal' 
-    }">
-        <div :class="{
-          'admin-page-title point-font2 mb30': pageRole == 'adm',
-          'page-title point-font mb30': pageRole == 'portal',
-        }">
-            <p>{{ bbsMng.bbsNm }}</p>
-        </div>
-        <div class="search-bar mb15">
-            <div class="flex justify-end align-center no-gutters">
-                <div class="gd-4">
-                    <div class="border">
-                        <select name="" id="" class="border-none gd-3" v-model="search.searchType">
-                            <option value="">전체</option>
-                            <option v-for="(item, idx) in codeList" :key="idx" :value="item.cd">{{ item.cdNm }}</option>
-                        </select>
-                        <input type="text" class="full-input border-none gd-9 condition-input"
-                            placeholder="검색어를 입력하세요." v-model="search.searchText" @keyup.enter="findAll">
-                    </div>
-                </div>
-                <div class="flex gd-3">
-                    <div class="gd-6 pr0">
-                        <button :class="{
-                'large-btn': true,
-                'blue-border-btn': pageRole == 'adm',
-                'green-border-btn': pageRole == 'portal',
-              }" @click="findAll">검색</button>
-                    </div>
-                    <div class="gd-6 pr0">
-                        <button class="large-btn darkg-border-btn" @click="fnSearchReset"><svg-icon type="mdi" :path="refreshPath"></svg-icon> 초기화</button>
-                    </div>
-                </div>
+    <!-- 사용자 -->
+    <template v-if="pageRole === 'portal'">
+        <div>
+            <div>
+                <p>{{ bbsMng.bbsNm }}</p>
             </div>
-        </div>
-        <div class="gall-content flex justify-start align-center">
-            <div v-for="(item, idx) in list" :key="idx" @click="fnView(idx)" class="gd-3 pt10 pb10 cursor gall-item">
-                <div class="gall-img mb20">
-                    <img :src="item.absltPath" class="inline-block" />
-                </div>
-                <div class="gall-title mb10">
-                    <p class="detail-bold">
-                        <svg-icon type="mdi" :path="pinPath" :width="20" :height="20" v-if="item.nowNtcYn == 'Y'"></svg-icon>
-                        <svg-icon type="mdi" :path="lockPath" :width="20" :height="20"
-                            v-else-if="item.prvtPstYn == 'Y'"></svg-icon>
-                        <template v-if="item.prvtPstYn == 'Y'">
-                            {{ item.rgtr == mbrId || roles == 'ROLE_ADMIN' ? item.bbsNm : '비밀글입니다' }}
-                        </template>
-                        <template v-else>
-                            {{ item.bbsNm }}
-                        </template>
-                    </p>
-                </div>
-                <div class="gall-info">
-                    <div class="flex justify-end align-center">
+            <div class="search-bar">
+                <select name="" id="" class="border-none gd-3" v-model="search.searchType">
+                    <option value="">전체</option>
+                    <option v-for="(item, idx) in codeList" :key="idx" :value="item.cd">{{ item.cdNm }}</option>
+                </select>
+                <input type="text" class="full-input border-none gd-9 condition-input"
+                    placeholder="검색어를 입력하세요." v-model="search.searchText" @keyup.enter="findAll">
+
+
+                <button @click="findAll">검색</button>
+        
+                <!-- <button class="large-btn darkg-border-btn" @click="fnSearchReset"><svg-icon type="mdi" :path="refreshPath"></svg-icon> 초기화</button> -->
+            </div>
+            <div class="gall-content">
+                <div v-for="(item, idx) in list" :key="idx" @click="fnView(idx)" class="gall-item">
+                    <div class="gall-img">
+                        <img :src="item.absltPath"  />
+                    </div>
+                    <div class="gall-title">
+                        <p class="detail-bold">
+                            <svg-icon type="mdi" :path="pinPath" :width="20" :height="20" v-if="item.nowNtcYn == 'Y'"></svg-icon>
+                            <svg-icon type="mdi" :path="lockPath" :width="20" :height="20"
+                                v-else-if="item.prvtPstYn == 'Y'"></svg-icon>
+                            <template v-if="item.prvtPstYn == 'Y'">
+                                {{ item.rgtr == mbrId || roles == 'ROLE_ADMIN' ? item.bbsNm : '비밀글입니다' }}
+                            </template>
+                            <template v-else>
+                                {{ item.bbsNm }}
+                            </template>
+                        </p>
+                    </div>
+                    <div class="gall-info">
                         <p class="pl5 pr5 border-r date-text">{{ item.rgtrNm }}</p>
                         <p class="pl5 date-text">{{ item.regDt }}</p>
                     </div>
                 </div>
             </div>
+            <!-- <div class="btn-wrap list">
+                <div class="gd-1"></div>
+                    <PaginationButton :className="'pagination'" v-model:currentPage="search.currentPage"
+                        :pagination='search' :click="findAll" />
+                <template v-if="pageAuth.regAuthrt == 'Y'" >
+                    <button class="btn sm primary" @click="fnAdd">등록</button>
+                </template>
+            </div> -->
         </div>
-        <div class="flex justify-between align-center no-gutters">
+    </template>
+    <template v-else>
+        <div class="content-zone">
+            <div class="content">
+                <div class="scroll">
+                    <div class="title-zone">
+                        <div  class="page-title">
+                        <p>{{ bbsMng.bbsNm }}</p>
+                        </div>
+                    </div>
+                    <div class="search-bar">
+                        <select name="" id="" class="form-select sm" v-model="search.searchType">
+                            <option value="">전체</option>
+                            <option v-for="(item, idx) in codeList" :key="idx" :value="item.cd">{{ item.cdNm }}</option>
+                        </select>
+                        <input type="text" class="form-control sm"
+                            placeholder="검색어를 입력하세요." v-model="search.searchText" @keyup.enter="findAll">
+
+
+                        <button @click="findAll">검색</button>
+                
+                        <!-- <button class="large-btn darkg-border-btn" @click="fnSearchReset"><svg-icon type="mdi" :path="refreshPath"></svg-icon> 초기화</button> -->
+                    </div>
+                    <div class="gall-content">
+                        <div v-for="(item, idx) in list" :key="idx" @click="fnView(idx)" class="gall-item">
+                            <div class="gall-img">
+                                <img :src="item.absltPath"  />
+                            </div>
+                            <div class="gall-title">
+                                <p class="detail-bold">
+                                    <svg-icon type="mdi" :path="pinPath" :width="20" :height="20" v-if="item.nowNtcYn == 'Y'"></svg-icon>
+                                    <svg-icon type="mdi" :path="lockPath" :width="20" :height="20"
+                                        v-else-if="item.prvtPstYn == 'Y'"></svg-icon>
+                                    <template v-if="item.prvtPstYn == 'Y'">
+                                        {{ item.rgtr == mbrId || roles == 'ROLE_ADMIN' ? item.bbsNm : '비밀글입니다' }}
+                                    </template>
+                                    <template v-else>
+                                        {{ item.bbsNm }}
+                                    </template>
+                                </p>
+                            </div>
+                            <div class="gall-info">
+                                <p class="pl5 pr5 border-r date-text">{{ item.rgtrNm }}</p>
+                                <p class="pl5 date-text">{{ item.regDt }}</p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="btn-wrap list">
             <div class="gd-1"></div>
-            <div class="gd-10">
-                <PaginationButton :className="pageRole === 'adm' ? 'admin-pagination':''" v-model:currentPage="search.currentPage"
+                <PaginationButton :className="'pagination'" v-model:currentPage="search.currentPage"
                     :pagination='search' :click="findAll" />
-            </div>
-            <div v-if="pageAuth.regAuthrt == 'Y'" class="gd-1">
-                <button :class="{
-                'large-btn': true,
-                'blue-border-btn': pageRole == 'adm',
-                'green-btn': pageRole == 'portal' ,
-              }" @click="fnAdd">등록</button>
-            </div>
+            <template v-if="pageAuth.regAuthrt == 'Y'" >
+                <button class="btn sm primary" @click="fnAdd">등록</button>
+            </template>
         </div>
-    </div>
+    </template>
 </template>
 
 <script>
client/views/pages/adm/preferences/commonCodeManagement/CommonCodeManagement.vue
--- client/views/pages/adm/preferences/commonCodeManagement/CommonCodeManagement.vue
+++ client/views/pages/adm/preferences/commonCodeManagement/CommonCodeManagement.vue
@@ -59,7 +59,7 @@
                   <label for="" class="form-title">코드값</label>
                   <input type="text" class="form-control sm" :disabled="isFormDisabled" v-model="viewCode.cdVl" />
                 </div>
-                <div>
+                <div class="border-bottom">
                   <label for="" class="form-title">사용여부</label>
                   <div class="check-area">
                     <div class="form-check">
@@ -74,7 +74,7 @@
                     </div>
                   </div>
                 </div>
-                <div>
+                <div class="grid-column">
                   <label for="textarea" class="form-title">코드설명</label>
                   <textarea class="form-control" id="textarea" :disabled="isFormDisabled" v-model="viewCode.cdExpln"></textarea>
                 </div>
client/views/pages/adm/statistics/BbsStatistics.vue
--- client/views/pages/adm/statistics/BbsStatistics.vue
+++ client/views/pages/adm/statistics/BbsStatistics.vue
@@ -6,7 +6,6 @@
           <div class="page-title">
             <p>게시판 접속 통계</p>
           </div>
-
         </div>
         <div class="search-bar mb30">
           <div class="form-control sm cal">
client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
@@ -23,7 +23,7 @@
                                     </option>
                                 </select>
                             </div>
-                            <div>
+                            <div class="border-bottom">
                                 <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 범위의 숫자로 구성하여 형식에 맞게 작성해주세요." />
client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectListOne.vue
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectListOne.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectListOne.vue
@@ -17,7 +17,7 @@
               <p class="form-title">제어유형</p>
               <p>{{ accesCtrl.cntrlTypeNm }}</p>
             </div>
-            <div>
+            <div class="border-bottom">
               <p class="form-title">제어 IP</p>
               <p>{{ accesCtrl.cntrlIp }}</p>
             </div>
client/views/theme/tema_v1/css/component.css (Renamed from client/theme/tema_v1/css/component.css)
--- client/theme/tema_v1/css/component.css
+++ client/views/theme/tema_v1/css/component.css
No changes
client/views/theme/tema_v1/css/main.css (Renamed from client/theme/tema_v1/css/main.css)
--- client/theme/tema_v1/css/main.css
+++ client/views/theme/tema_v1/css/main.css
No changes
client/views/theme/tema_v1/css/style.css (Renamed from client/theme/tema_v1/css/style.css)
--- client/theme/tema_v1/css/style.css
+++ client/views/theme/tema_v1/css/style.css
No changes
client/views/theme/tema_v1/img/A00.svg (Renamed from client/theme/tema_v1/img/A00.svg)
--- client/theme/tema_v1/img/A00.svg
+++ client/views/theme/tema_v1/img/A00.svg
No changes
client/views/theme/tema_v1/img/next.svg (Renamed from client/theme/tema_v1/img/next.svg)
--- client/theme/tema_v1/img/next.svg
+++ client/views/theme/tema_v1/img/next.svg
No changes
client/views/theme/tema_v1/img/play.svg (Renamed from client/theme/tema_v1/img/play.svg)
--- client/theme/tema_v1/img/play.svg
+++ client/views/theme/tema_v1/img/play.svg
No changes
client/views/theme/tema_v1/img/prev.svg (Renamed from client/theme/tema_v1/img/prev.svg)
--- client/theme/tema_v1/img/prev.svg
+++ client/views/theme/tema_v1/img/prev.svg
No changes
client/views/theme/tema_v1/img/stop.svg (Renamed from client/theme/tema_v1/img/stop.svg)
--- client/theme/tema_v1/img/stop.svg
+++ client/views/theme/tema_v1/img/stop.svg
No changes
client/views/theme/tema_v2/css/component.css (Renamed from client/theme/tema_v2/css/component.css)
--- client/theme/tema_v2/css/component.css
+++ client/views/theme/tema_v2/css/component.css
No changes
client/views/theme/tema_v2/css/main.css (Renamed from client/theme/tema_v2/css/main.css)
--- client/theme/tema_v2/css/main.css
+++ client/views/theme/tema_v2/css/main.css
No changes
client/views/theme/tema_v2/css/style.css (Renamed from client/theme/tema_v2/css/style.css)
--- client/theme/tema_v2/css/style.css
+++ client/views/theme/tema_v2/css/style.css
No changes
client/views/theme/tema_v2/img/A00.svg (Renamed from client/theme/tema_v2/img/A00.svg)
--- client/theme/tema_v2/img/A00.svg
+++ client/views/theme/tema_v2/img/A00.svg
No changes
client/views/theme/tema_v2/img/btn_bullet_white.png (Binary) (Renamed from client/theme/tema_v2/img/btn_bullet_white.png (Binary))
--- client/theme/tema_v2/img/btn_bullet_white.png
+++ client/views/theme/tema_v2/img/btn_bullet_white.png
Binary file is not shown
client/views/theme/tema_v2/img/btn_list_bullet.png (Binary) (Renamed from client/theme/tema_v2/img/btn_list_bullet.png (Binary))
--- client/theme/tema_v2/img/btn_list_bullet.png
+++ client/views/theme/tema_v2/img/btn_list_bullet.png
Binary file is not shown
client/views/theme/tema_v2/img/circle_arrow.png (Binary) (Renamed from client/theme/tema_v2/img/circle_arrow.png (Binary))
--- client/theme/tema_v2/img/circle_arrow.png
+++ client/views/theme/tema_v2/img/circle_arrow.png
Binary file is not shown
client/views/theme/tema_v2/img/img1.png (Binary) (Renamed from client/theme/tema_v2/img/img1.png (Binary))
--- client/theme/tema_v2/img/img1.png
+++ client/views/theme/tema_v2/img/img1.png
Binary file is not shown
client/views/theme/tema_v2/img/img_service_05.png (Binary) (Renamed from client/theme/tema_v2/img/img_service_05.png (Binary))
--- client/theme/tema_v2/img/img_service_05.png
+++ client/views/theme/tema_v2/img/img_service_05.png
Binary file is not shown
client/views/theme/tema_v2/img/next.svg (Renamed from client/theme/tema_v2/img/next.svg)
--- client/theme/tema_v2/img/next.svg
+++ client/views/theme/tema_v2/img/next.svg
No changes
client/views/theme/tema_v2/img/play.svg (Renamed from client/theme/tema_v2/img/play.svg)
--- client/theme/tema_v2/img/play.svg
+++ client/views/theme/tema_v2/img/play.svg
No changes
client/views/theme/tema_v2/img/prev.svg (Renamed from client/theme/tema_v2/img/prev.svg)
--- client/theme/tema_v2/img/prev.svg
+++ client/views/theme/tema_v2/img/prev.svg
No changes
client/views/theme/tema_v2/img/stop.svg (Renamed from client/theme/tema_v2/img/stop.svg)
--- client/theme/tema_v2/img/stop.svg
+++ client/views/theme/tema_v2/img/stop.svg
No changes
Add a comment
List