yjryu / KERIS star
류윤주 류윤주 2024-04-11
240411 류윤주 css 및 loading 추가
@f2bf2756c52846e4d9d1bc675586ecf726093d7a
client/resources/css/admin.css
--- client/resources/css/admin.css
+++ client/resources/css/admin.css
@@ -154,7 +154,7 @@
 .admin-wrap,
 .content-box {
   width: 100%;
-  height: 100%;
+  height: 100vh;
   font-size: 1.3rem;
 }
 
client/resources/css/common.css
--- client/resources/css/common.css
+++ client/resources/css/common.css
@@ -470,4 +470,8 @@
 .text-info{
   color: red;
   padding: 1rem 0;
+}
+
+.cursor{
+  cursor: pointer;
 }
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/reset.css
--- client/resources/css/reset.css
+++ client/resources/css/reset.css
@@ -2,16 +2,14 @@
 
 @font-face {
   font-family: "SBAggroB";
-  src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2108@1.1/SBAggroB.woff")
-    format("woff");
+  src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2108@1.1/SBAggroB.woff") format("woff");
   /* font-weight: normal; */
   font-style: normal;
 }
 
 @font-face {
   font-family: "Pretendard-Regular";
-  src: url("https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff")
-    format("woff");
+  src: url("https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff") format("woff");
   font-weight: 400;
   font-style: normal;
 }
@@ -35,14 +33,20 @@
 html {
   font-size: 10px;
   width: 100%;
-  height: 100%;
+  min-height: 100vh;
   font-family: "Pretendard-Regular";
+  -ms-user-select: none;
+  -moz-user-select: -moz-none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  user-select: none;
 }
 
 body,
 #root {
   width: 100%;
-  height: 100%;
+  min-height: 100vh;
+  position: relative;
 }
 
 ul,
@@ -76,7 +80,7 @@
 
 input[type="text"],
 input[type="password"],
-input[type="date"], 
+input[type="date"],
 input[type="month"] {
   width: 100%;
   padding: 10px;
@@ -96,9 +100,11 @@
   border-radius: 5px;
   margin-bottom: 10px;
 }
-details > div {
+
+details>div {
   padding: 10px;
 }
+
 summary {
   padding: 10px;
   font-size: 1.4rem;
@@ -112,5 +118,4 @@
 input[type='date']:focus::before,
 input[type='date']:valid::before {
   display: none;
-}
-
+}
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/responsive.css
--- client/resources/css/responsive.css
+++ client/resources/css/responsive.css
@@ -257,6 +257,10 @@
   .notice-search input:nth-child(2) {
     width: 100%;
   }
+
+  .main-history-box{
+    grid-template-columns: 1fr;
+  }
   /* 기술문서 */
   .tech-report {
     flex-direction: column;
 
client/views/component/loading/LoadingSpinner.vue (added)
+++ client/views/component/loading/LoadingSpinner.vue
@@ -0,0 +1,114 @@
+<template>
+    <div v-if="isLoading" class="loading-overlay">
+        <div class="loading-wrap">
+            <div class="loading">
+                <span></span>
+                <span></span>
+                <span></span>
+                <span></span>
+                <span></span>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+
+export default {
+    data() {
+        return {
+
+        };
+    },
+    methods: {},
+    watch: {},
+    computed: {
+        isLoading() {
+            return this.$store.state.isLoading;
+        }
+    },
+    mounted() {
+
+    },
+    beforeDestroy() {
+
+    },
+};
+
+</script>
+
+<style scoped>
+.loading-overlay {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.1);
+    z-index: 1;
+}
+
+.loading-wrap {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100vh;
+}
+
+.loading {
+    --speed-of-animation: 0.9s;
+    --gap: 6px;
+    --first-color: #4c86f9;
+    --second-color: #49a84c;
+    --third-color: #f6bb02;
+    --fourth-color: #f6bb02;
+    --fifth-color: #2196f3;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    width: 100px;
+    gap: 6px;
+    height: 100px;
+    position: fixed;
+}
+
+.loading span {
+    width: 4px;
+    height: 50px;
+    background: var(--first-color);
+    animation: scale var(--speed-of-animation) ease-in-out infinite;
+}
+
+.loading span:nth-child(2) {
+    background: var(--second-color);
+    animation-delay: -0.8s;
+}
+
+.loading span:nth-child(3) {
+    background: var(--third-color);
+    animation-delay: -0.7s;
+}
+
+.loading span:nth-child(4) {
+    background: var(--fourth-color);
+    animation-delay: -0.6s;
+}
+
+.loading span:nth-child(5) {
+    background: var(--fifth-color);
+    animation-delay: -0.5s;
+}
+
+@keyframes scale {
+
+    0%,
+    40%,
+    100% {
+        transform: scaleY(0.05);
+    }
+
+    20% {
+        transform: scaleY(1);
+    }
+}
+</style>
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -29,6 +29,7 @@
          </div>
       </div>
    </div>
+   <LoadingSpinner />
 </template>
 
 <script>
@@ -39,6 +40,7 @@
 import Footer from '../layout/Footer.vue';
 import AdminHeader from '../layout/AdminHeader.vue';
 import AdminMenu from '../layout/AdminMenu.vue';
+import LoadingSpinner from "../component/loading/LoadingSpinner.vue";
 import { debounce } from 'lodash'
 
 const App = {
@@ -171,6 +173,7 @@
       'Menu': Menu,
       'AdminMenu': AdminMenu,
       'Footer': Footer,
+      'LoadingSpinner': LoadingSpinner
    },
    mounted() {
       //vue router에게 페이지 변경 요청을 하여, router가 페이지 변경 전, 실행되는 훅(이벤트)
@@ -286,6 +289,4 @@
    justify-content: center;
    align-items: center;
 }
-
-
 </style>
client/views/pages/AppStore.js
--- client/views/pages/AppStore.js
+++ client/views/pages/AppStore.js
@@ -1,26 +1,24 @@
-import { createStore } from 'vuex';
+import { createStore } from "vuex";
 
-
-export default createStore ({
-    state: {
-        loginUser: null,
-        key:null,
-        // isLogin: false,
+export default createStore({
+  state: {
+    loginUser: null,
+    key: null,
+    isLoading: false,
+  },
+  getters: {
+    getLoginUser: function () {},
+    getKey: function () {},
+  },
+  mutations: {
+    setLoginUser: function (state, newValue) {
+      state.loginUser = newValue;
     },
-    getters: {
-        getLoginUser: function () {
-
-        },
-        getKey: function () {
-
-        }
+    setKey: function (state, newValue) {
+      state.key = newValue;
     },
-    mutations: {
-        setLoginUser: function (state, newValue) {
-            state.loginUser = newValue;
-        },
-        setKey: function (state, newValue) {
-            state.key = newValue;
-        }
-    }
-});
(파일 끝에 줄바꿈 문자 없음)
+    setLoading(state, newValue) {
+      state.isLoading = newValue;
+    },
+  },
+});
client/views/pages/admin/databook/DataSelectOne.vue
--- client/views/pages/admin/databook/DataSelectOne.vue
+++ client/views/pages/admin/databook/DataSelectOne.vue
@@ -11,7 +11,7 @@
                 <table class="selectone-table ">
                     <colgroup>
                         <col width="15%" />
-                         <col width="85%" />
+                        <col width="85%" />
                     </colgroup>
                     <tbody>
                         <tr>
@@ -23,7 +23,7 @@
                                     <span v-else class="category-zone">가이드라인</span>
                                 </p>
                                 <p class="flex-end write-info"><span class="writer">작성자</span>
-                                    <span>{{ post.rgtr_id}}</span>
+                                    <span>{{ post.rgtr_id }}</span>
                                     <span class="view">조회수</span>
                                     <span>{{ post.view_cnt }}</span>
                                 </p>
@@ -77,8 +77,8 @@
         <div v-show="isDeleteModalOpen" class="modal-wrapper">
             <div class="modal-container admin-alert">
                 <div class="modal-content-monthly alert-modal">
-                <p>해당 자료를 삭제하시겠습니까?</p>
-            </div>
+                    <p>해당 자료를 삭제하시겠습니까?</p>
+                </div>
                 <div class="modal-end">
                     <button class="dark-gray-btn  small-btn" @click="closeDeleteModal()">취소</button>
                     <button class="blue-btn small-btn" @click="postDelete">확인</button>
@@ -152,10 +152,10 @@
                     'Content-Type': "application/json; charset=UTF-8",
                 },
                 data: {
-                        'post_id': vm.route.query.post_id,
-                        'file_id': vm.route.query.file_id,
-                        'bbs_id': vm.route.query.bbs_id
-                      }
+                    'post_id': vm.route.query.post_id,
+                    'file_id': vm.route.query.file_id,
+                    'bbs_id': vm.route.query.bbs_id
+                }
             }).then(function (response) {
                 vm.prevPost = response.data.postSelectOne.prevPost;
                 vm.post = response.data.postSelectOne.post;
@@ -274,9 +274,9 @@
                 alert("게시글 상세보기 조회 오류, 관리자에게 문의하세요.");
             })
         },
-        
+
         postSelectListPage: function () {
-            this.$router.push({ path: '/adm/dataSelectList.page', query:{'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry, 'sort': this.$route.query.sort}});
+            this.$router.push({ path: '/adm/dataSelectList.page', query: { 'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry, 'sort': this.$route.query.sort } });
         },
 
         postUpdatePage: function () {
client/views/pages/user/Data/DataOne.vue
--- client/views/pages/user/Data/DataOne.vue
+++ client/views/pages/user/Data/DataOne.vue
@@ -11,13 +11,15 @@
                         <tr>
                             <td class="title-zone" colspan="2">
                                 <p class="flex"><span class="post-title">{{ post.post_title }}</span>
-                                    <span class="category-zone"  v-if="post.ctgry_nm === 'policy'">정책자료</span>
-                                    <span class="category-zone"  v-else-if="post.ctgry_nm === 'research'">연구자료</span>
-                                    <span class="category-zone"  v-else>가이드라인</span></p>
+                                    <span class="category-zone" v-if="post.ctgry_nm === 'policy'">정책자료</span>
+                                    <span class="category-zone" v-else-if="post.ctgry_nm === 'research'">연구자료</span>
+                                    <span class="category-zone" v-else>가이드라인</span>
+                                </p>
                                 <div class="flex-end write-info">
-                                   <p><span class="writer">작성자 </span><span>{{ post.rgtr_id }}</span>
-                                    <span class="view">조회수 </span><span>{{ post.view_cnt }}</span></p>
-                                    </div>
+                                    <p><span class="writer">작성자 </span><span>{{ post.rgtr_id }}</span>
+                                        <span class="view">조회수 </span><span>{{ post.view_cnt }}</span>
+                                    </p>
+                                </div>
                             </td>
                         </tr>
                         <tr>
@@ -32,7 +34,7 @@
                                     <label>첨부된 파일이 없습니다.</label>
                                 </div>
                                 <ul v-else v-for="(item, idx) in fileList" :key="idx">
-                                    <li @click="downloadFile(item)">{{ item.real_file_nm }}</li>
+                                    <li @click="downloadFile(item)" class="cursor">{{ item.real_file_nm }}</li>
                                 </ul>
                             </td>
                         </tr>
@@ -45,7 +47,7 @@
                                 <span>
                                     <span v-if="nextPost" @click="movePost(nextPost)" class="sub-content-title">
                                         {{ nextPost.post_title }}
-                                    </span> 
+                                    </span>
                                     <span v-else class="sub-content-title">다음글이 없습니다.</span>
                                 </span>
                             </li>
@@ -53,7 +55,7 @@
                                 <span>
                                     <span v-if="prevPost" @click="movePost(prevPost)" class="sub-content-title">
                                         {{ prevPost.post_title }}
-                                    </span> 
+                                    </span>
                                     <span v-else class="sub-content-title">이전글이 없습니다.</span>
                                 </span>
                             </li>
@@ -114,7 +116,7 @@
     },
     methods: {
         postSelectListPage: function () {
-            this.$router.push({ path: '/Data.page',query:{'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry, 'sort': this.$route.query.sort} });
+            this.$router.push({ path: '/Data.page', query: { 'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry, 'sort': this.$route.query.sort } });
             window.scrollTo({
                 top: 0,
                 behavior: 'smooth'
@@ -129,9 +131,11 @@
                 hearder: {
                     'Content-Type': "application/json; charset=UTF-8",
                 },
-                data: { 'post_id': vm.route.query.post_id, 
-                        'file_id': vm.route.query.file_id,
-                        'bbs_id': vm.route.query.bbs_id }
+                data: {
+                    'post_id': vm.route.query.post_id,
+                    'file_id': vm.route.query.file_id,
+                    'bbs_id': vm.route.query.bbs_id
+                }
             }).then(function (response) {
                 vm.prevPost = response.data.postSelectOne.prevPost;
                 vm.post = response.data.postSelectOne.post;
@@ -188,6 +192,7 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
 
@@ -207,7 +212,7 @@
                 item.post_id = vm.post.post_id;
                 item.bbs_id = vm.post.bbs_id;
                 item.ctgry_nm = vm.post.ctgry_nm;
-                
+                this.$store.commit('setLoading', false); // 로딩 종료
                 axios({
                     url: '/statistics/fileLogInsert.json',
                     method: 'post',
@@ -215,16 +220,16 @@
                         'Content-Type': "application/json; charset=UTF-8",
                     },
                     data: item
-                }).then(function(response){
+                }).then(function (response) {
                     vm.$router.go(0);
                 })
-                
+
             }).catch(function (error) {
                 alert('파일 다운로드 실패, 다시 시도해주세요.');
             });
         },
 
-        movePost : function (post1) {
+        movePost: function (post1) {
             const vm = this;
             axios({
                 url: '/post/postSelectOne.json',
@@ -232,15 +237,17 @@
                 hearder: {
                     'Content-Type': "application/json; charset=UTF-8",
                 },
-                data: { 'post_id': post1.post_id, 
-                        'file_id': post1.file_id,
-                        'bbs_id': post1.bbs_id }
+                data: {
+                    'post_id': post1.post_id,
+                    'file_id': post1.file_id,
+                    'bbs_id': post1.bbs_id
+                }
             }).then(function (response) {
                 vm.prevPost = response.data.postSelectOne.prevPost;
                 vm.post = response.data.postSelectOne.post;
                 vm.nextPost = response.data.postSelectOne.nextPost;
                 vm.fileList = response.data.selectFileList;
-                
+
 
                 vm.getViewer(vm.post.post_content)
             }).catch(function (error) {
client/views/pages/user/Data/TechnologyOne.vue
--- client/views/pages/user/Data/TechnologyOne.vue
+++ client/views/pages/user/Data/TechnologyOne.vue
@@ -136,16 +136,16 @@
             thumbnailFileList: [],
             attachFileList: [],
             src: null,
-            item:{}
+            item: {}
         }
     },
     methods: {
         postSelectListPage() {
-            this.$router.push({path:'/Technology.page', query: {'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry, 'sort': this.$route.query.sort}}),
-            window.scrollTo({
-                top: 0,
-                behavior: 'smooth'
-            })
+            this.$router.push({ path: '/Technology.page', query: { 'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry, 'sort': this.$route.query.sort } }),
+                window.scrollTo({
+                    top: 0,
+                    behavior: 'smooth'
+                })
         },
 
         postSelectOne: function () {
@@ -226,6 +226,8 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
 
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -246,7 +248,7 @@
                 vm.item = vm.post
                 vm.item.file_id = vm.attachFileList[0].file_id;
                 vm.item.file_sn = vm.attachFileList[0].file_sn;
-                
+                this.$store.commit('setLoading', false); // 로딩 종료
                 axios({
                     url: '/statistics/fileLogInsert.json',
                     method: 'post',
@@ -254,7 +256,7 @@
                         'Content-Type': "application/json; charset=UTF-8",
                     },
                     data: vm.item
-                }).then(function(response){
+                }).then(function (response) {
                     vm.$router.go(0);
                 })
 
client/views/pages/user/community/NoticeOne.vue
--- client/views/pages/user/community/NoticeOne.vue
+++ client/views/pages/user/community/NoticeOne.vue
@@ -12,9 +12,10 @@
                             <td class="title-zone" colspan="2">
                                 <p><span class="post-title">{{ post.post_title }}</span></p>
                                 <div class="flex-end write-info">
-                                   <p> <span class="writer">작성자 </span><span> {{ post.rgtr_id }}</span>
-                                    <span class="view">작성일자 </span><span> {{ yyyymmdd(post.reg_dt)}}</span>
-                                    <span class="view">조회수 </span><span> {{ post.view_cnt }}</span></p>
+                                    <p> <span class="writer">작성자 </span><span> {{ post.rgtr_id }}</span>
+                                        <span class="view">작성일자 </span><span> {{ yyyymmdd(post.reg_dt) }}</span>
+                                        <span class="view">조회수 </span><span> {{ post.view_cnt }}</span>
+                                    </p>
                                 </div>
                             </td>
                         </tr>
@@ -30,7 +31,7 @@
                                     <label>첨부된 파일이 없습니다.</label>
                                 </div>
                                 <ul v-else v-for="(item, idx) in fileList" :key="idx">
-                                    <li @click="downloadFile(item)">{{ item.real_file_nm }}</li>
+                                    <li @click="downloadFile(item)" class="cursor">{{ item.real_file_nm }}</li>
                                 </ul>
                             </td>
                         </tr>
@@ -39,21 +40,21 @@
                 <div class="article-list">
                     <ul>
                         <li><span class="next">다음글</span>
-                        <span>
-                            <span v-if="nextPost" @click="movePost(nextPost)" class="sub-content-title">
-                                {{ nextPost.post_title }}
-                            </span> 
-                        <span v-else class="sub-content-title">다음글이 없습니다.</span>
-                        </span>
-                    </li>
-                    <li><span class="prev">이전글</span>
-                        <span>
-                            <span v-if="prevPost" @click="movePost(prevPost)" class="sub-content-title">
-                                {{ prevPost.post_title }}
-                            </span> 
-                        <span v-else class="sub-content-title">이전글이 없습니다.</span>
-                        </span>
-                    </li>
+                            <span>
+                                <span v-if="nextPost" @click="movePost(nextPost)" class="sub-content-title">
+                                    {{ nextPost.post_title }}
+                                </span>
+                                <span v-else class="sub-content-title">다음글이 없습니다.</span>
+                            </span>
+                        </li>
+                        <li><span class="prev">이전글</span>
+                            <span>
+                                <span v-if="prevPost" @click="movePost(prevPost)" class="sub-content-title">
+                                    {{ prevPost.post_title }}
+                                </span>
+                                <span v-else class="sub-content-title">이전글이 없습니다.</span>
+                            </span>
+                        </li>
                     </ul>
                 </div>
                 <div class="btn-wrap">
@@ -63,7 +64,7 @@
         </div>
     </div>
 </template>
-  
+
 <script>
 import axios from 'axios';
 import COMMON_UTIL from '../../../../resources/js/commonUtil.js';
@@ -122,9 +123,11 @@
                 hearder: {
                     'Content-Type': "application/json; charset=UTF-8",
                 },
-                data: { 'post_id': vm.route.query.post_id, 
-                        'file_id': vm.route.query.file_id,
-                        'bbs_id': vm.route.query.bbs_id }
+                data: {
+                    'post_id': vm.route.query.post_id,
+                    'file_id': vm.route.query.file_id,
+                    'bbs_id': vm.route.query.bbs_id
+                }
             }).then(function (response) {
                 vm.prevPost = response.data.postSelectOne.prevPost;
                 vm.post = response.data.postSelectOne.post;
@@ -180,6 +183,7 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
 
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -199,7 +203,7 @@
 
                 item.post_id = vm.post.post_id;
                 item.bbs_id = vm.post.bbs_id;
-                
+                this.$store.commit('setLoading', false); // 로딩 종료
                 axios({
                     url: '/statistics/fileLogInsert.json',
                     method: 'post',
@@ -207,7 +211,7 @@
                         'Content-Type': "application/json; charset=UTF-8",
                     },
                     data: item
-                }).then(function(response){
+                }).then(function (response) {
                     vm.$router.go(0);
                 })
 
@@ -217,10 +221,10 @@
         },
 
         postSelectListPage: function () {
-            this.$router.push({ path: '/Notice.page', query: {'page': this.$route.query.page, 'sort': this.$route.query.sort} });
+            this.$router.push({ path: '/Notice.page', query: { 'page': this.$route.query.page, 'sort': this.$route.query.sort } });
         },
 
-        movePost : function (post1) {
+        movePost: function (post1) {
             const vm = this;
             axios({
                 url: '/post/postSelectOne.json',
@@ -228,15 +232,17 @@
                 hearder: {
                     'Content-Type': "application/json; charset=UTF-8",
                 },
-                data: { 'post_id': post1.post_id, 
-                        'file_id': post1.file_id,
-                        'bbs_id': post1.bbs_id }
+                data: {
+                    'post_id': post1.post_id,
+                    'file_id': post1.file_id,
+                    'bbs_id': post1.bbs_id
+                }
             }).then(function (response) {
                 vm.prevPost = response.data.postSelectOne.prevPost;
                 vm.post = response.data.postSelectOne.post;
                 vm.nextPost = response.data.postSelectOne.nextPost;
                 vm.fileList = response.data.selectFileList;
-                
+
 
                 vm.getViewer(vm.post.post_content)
             }).catch(function (error) {
@@ -256,4 +262,3 @@
     },
 }
 </script>
-
client/views/pages/user/community/WgcommunityOne.vue
--- client/views/pages/user/community/WgcommunityOne.vue
+++ client/views/pages/user/community/WgcommunityOne.vue
@@ -15,16 +15,21 @@
                                 <p class="flex detail-title">
                                     <span class="post-title">{{ post.post_title }}</span>
                                     <span v-if="post.ctgry_nm === 'WG1'" class="category-zone">(WG1)교육과정 표준체계</span>
-                                    <span v-else-if="post.ctgry_nm === 'WG2'" class="category-zone">(WG2)맞춤학습지원 기능</span>
+                                    <span v-else-if="post.ctgry_nm === 'WG2'" class="category-zone">(WG2)맞춤학습지원
+                                        기능</span>
                                     <span v-else-if="post.ctgry_nm === 'WG3'" class="category-zone">(WG3)접근성/UDL</span>
-                                    <span v-else-if="post.ctgry_nm === 'WG4'" class="category-zone">(WG4)클라우드 보안인증</span>
+                                    <span v-else-if="post.ctgry_nm === 'WG4'" class="category-zone">(WG4)클라우드
+                                        보안인증</span>
                                     <span v-else-if="post.ctgry_nm === 'WG5'" class="category-zone">(WG5)통합인증체계</span>
                                     <span v-else-if="post.ctgry_nm === 'WG6'"
                                         class="category-zone">(WG6)학습이력데이터/통합대시보드</span>
-                                    <span v-else-if="post.ctgry_nm === 'WG7'" class="category-zone">(WG7)AI 트레이닝 데이터</span>
-                                    <span v-else-if="post.ctgry_nm === 'WG8'" class="category-zone">(WG8)국가수준 학습분석</span>
+                                    <span v-else-if="post.ctgry_nm === 'WG7'" class="category-zone">(WG7)AI 트레이닝
+                                        데이터</span>
+                                    <span v-else-if="post.ctgry_nm === 'WG8'" class="category-zone">(WG8)국가수준
+                                        학습분석</span>
                                     <span v-else-if="post.ctgry_nm === 'WG9'" class="category-zone">(WG9)학교 인프라</span>
-                                    <span v-else-if="post.ctgry_nm === 'WG10'" class="category-zone">(WG10)서비스 품질관리</span>
+                                    <span v-else-if="post.ctgry_nm === 'WG10'" class="category-zone">(WG10)서비스
+                                        품질관리</span>
                                     <span v-else class="category-zone">(WG11)서비스 정책</span>
                                 </p>
                                 <p class="flex-end write-info">
@@ -47,7 +52,7 @@
                                     <label>첨부된 파일이 없습니다.</label>
                                 </div>
                                 <ul v-else v-for="(item, idx) in fileList" :key="idx">
-                                    <li @click="downloadFile(item)">{{ item.real_file_nm }}</li>
+                                    <li @click="downloadFile(item)" class="cursor">{{ item.real_file_nm }}</li>
                                 </ul>
                             </td>
                         </tr>
@@ -195,6 +200,7 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
 
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -215,7 +221,7 @@
                 item.post_id = vm.post.post_id;
                 item.bbs_id = vm.post.bbs_id;
                 item.ctgry_nm = vm.post.ctgry_nm;
-
+                this.$store.commit('setLoading', false); // 로딩 종료
                 axios({
                     url: '/statistics/fileLogInsert.json',
                     method: 'post',
@@ -264,7 +270,7 @@
         },
 
         postSelectListPage() {
-            this.$router.push({ path: 'Wgcommunity.page',query:{'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry} });
+            this.$router.push({ path: 'Wgcommunity.page', query: { 'page': this.$route.query.page, 'ctgry': this.$route.query.ctgry } });
         },
     },
     watch: {},
client/views/pages/user/mypage/Info.vue
--- client/views/pages/user/mypage/Info.vue
+++ client/views/pages/user/mypage/Info.vue
@@ -35,7 +35,7 @@
                         </div>
                         <div>
                             <p class="info-th">메일 구독서비스</p>
-                            <span>{{ user.subscribe == false ? '미구독' : '구독'}}</span>
+                            <span>{{ user.subscribe == false ? '미구독' : '구독' }}</span>
                         </div>
 
                     </section>
@@ -66,7 +66,8 @@
                         </div>
                         <div>
                             <p>주소</p>
-                            <span>[{{ company.company_zip }}] {{ company.company_addr }} {{ company.company_daddr }}</span>
+                            <span>[{{ company.company_zip }}] {{ company.company_addr }} {{ company.company_daddr
+                                }}</span>
                         </div>
                         <div>
                             <p>홈페이지</p>
@@ -133,7 +134,7 @@
                     </section>
                     <section class="info-sec-bt">
                         <!-- <router-link to="/infosub.page"> -->
-                            <button class="blue-btn"  @click="infoUpdate">수정하기</button>
+                        <button class="blue-btn" @click="infoUpdate">수정하기</button>
                         <!-- </router-link> -->
                     </section>
 
@@ -170,15 +171,15 @@
             </div>
         </div>
         <div v-if="isModalOpen" class="modal-wrapper">
-      <div class="modal-container admin-alert">
-         <p class="modal-text">
-            승인 대기 중입니다. 이후 내정보 수정이 가능합니다.
-         </p>
-         <div class="modal-end">
-            <button class="dark-gray-btn" @click="closeModal()" style="width:100%">닫기</button>
-         </div>
-      </div>
-   </div>
+            <div class="modal-container admin-alert">
+                <p class="modal-text">
+                    승인 대기 중입니다. 이후 내정보 수정이 가능합니다.
+                </p>
+                <div class="modal-end">
+                    <button class="dark-gray-btn" @click="closeModal()" style="width:100%">닫기</button>
+                </div>
+            </div>
+        </div>
     </div>
 </template>
 
@@ -228,20 +229,20 @@
                 subscribe: null,
             },
             presentPwd: null,
-            changePwd : null,
-            changePwdCheck : null,
-            isModalOpen:false
+            changePwd: null,
+            changePwdCheck: null,
+            isModalOpen: false
         }
     },
     methods: {
         openModal: function () {
-         this.isModalOpen = true;
-      },
+            this.isModalOpen = true;
+        },
 
-      closeModal: function () {
-         this.isModalOpen = false;
-         this.modalType = null;
-      },
+        closeModal: function () {
+            this.isModalOpen = false;
+            this.modalType = null;
+        },
 
         openModal1() {
             this.showpwchange2 = true;
@@ -280,7 +281,7 @@
             const isUserLogin = this.store.state.loginUser;
             if (isUserLogin.create_account_approval === 'N') {
                 this.isModalOpen = true;
-            } else{
+            } else {
                 this.$router.push('/Infosub.page');
             }
         },
@@ -348,6 +349,7 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
 
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -364,7 +366,7 @@
                     a.click();
                     window.URL.revokeObjectURL(url);
                 }
-
+                this.$store.commit('setLoading', false); // 로딩 종료
                 this.$router.go(0);
 
             }).catch(function (error) {
@@ -373,19 +375,19 @@
         },
 
 
-        checkPwd: function() {
+        checkPwd: function () {
             const vm = this;
             let passwordRegex = /^[A-Za-z0-9]{6,20}$/;
-            if (vm.changePwd == null){
+            if (vm.changePwd == null) {
                 alert("변경할 비밀번호를 입력해주세요.")
                 return;
-            } else if(vm.changePwdCheck == null) {
+            } else if (vm.changePwdCheck == null) {
                 alert("비밀번호 확인을 입력해주세요.")
                 return;
             } else if (vm.changePwd !== vm.changePwdCheck) {
                 alert("비밀번호가 불일치합니다.");
-                return;  
-            } else if(!passwordRegex.test(vm.changePwd)){
+                return;
+            } else if (!passwordRegex.test(vm.changePwd)) {
                 alert('비밀번호는 6~20자의 영문, 숫자만 사용 가능합니다.')
                 return;
             }
@@ -414,7 +416,7 @@
                 },
                 data: user
             }).then(function (response) {
-                if(response.data == 1){
+                if (response.data == 1) {
                     vm.changePassword()
                 } else {
                     alert("현재 비밀번호가 일치하지 않습니다.");
@@ -424,7 +426,7 @@
             });
         },
 
-        changePassword: function() {
+        changePassword: function () {
             const vm = this;
 
             var iv = vm.store.state.key.iv;
@@ -450,14 +452,14 @@
                 },
                 data: user
             }).then(function (response) {
-                if(response.data == 1){
+                if (response.data == 1) {
                     alert('비밀번호 변경에 성공하였습니다.')
                     vm.changePwd = null;
                     vm.presentPwd = null;
                     vm.changePwdCheck = null;
                     vm.closeModal2()
                 } else {
-                   alert('비밀번호 변경에 실패하였습니다.') 
+                    alert('비밀번호 변경에 실패하였습니다.')
                 }
             }).catch(function (error) {
                 alert("비밀번호 변경 오류, 관리자에게 문의해주세요.")
@@ -478,6 +480,3 @@
     }
 }
 </script>
-
-
-
client/views/pages/user/mypage/Infosub.vue
--- client/views/pages/user/mypage/Infosub.vue
+++ client/views/pages/user/mypage/Infosub.vue
@@ -69,7 +69,7 @@
                                 로고 수정하기
                             </div>
                             <input type="file" accept="image/*" name="logoImg" id="logoImg" ref="logoImg"
-                                        @change="logoUpload" style="display: none;" />
+                                @change="logoUpload" style="display: none;" />
                         </section>
                         <div>
                             <p>사업자등록번호</p>
@@ -84,23 +84,25 @@
                                 <p>우리회사 키워드</p>
                             </div>
                             <div>
-                                <p v-show="checkedKeywords.length < 3" class="item-style err-text" style="color: red;">최소
+                                <p v-show="checkedKeywords.length < 3" class="item-style err-text" style="color: red;">
+                                    최소
                                     3개 ~ 최대 6개를 선택해주세요.
                                 </p>
-                                <p v-show="checkedKeywords.length == 6" class="item-style err-text" style="color: red;">최대
+                                <p v-show="checkedKeywords.length == 6" class="item-style err-text" style="color: red;">
+                                    최대
                                     6개까지 입니다.</p>
                                 <div class=" keyword-wrap" style="padding: 1rem 0;">
                                     <ul>
-                               
+
                                         <li v-for="(keyword, index) in keywords" :key="index">
                                             <!-- <input type="checkbox" :id="keyword.name" v-model="keyword.checked"
                                              class="keyword-label" :disabled="isCheckboxDisabled(index)"
                                             style="display: none;" /> -->
                                             <input type="checkbox" :id="keyword.name" v-model="keyword.checked"
-                                             class="keyword-label" style="display: none;"/>
+                                                class="keyword-label" style="display: none;" />
                                             <label :for="keyword.name" class="keyword">{{ keyword.name }}</label>
                                         </li>
-                                        
+
                                     </ul>
                                 </div>
 
@@ -109,7 +111,8 @@
 
                         <div>
                             <p>한줄소개</p>
-                            <span><input type="text" name="" id="" v-model="company.company_simple_info" ref="company_simple_info"></span>
+                            <span><input type="text" name="" id="" v-model="company.company_simple_info"
+                                    ref="company_simple_info"></span>
 
                         </div>
                         <div class="join-sec1 joinsub0-1">
@@ -125,17 +128,20 @@
                                     <input type="text" v-model="company['company_addr']" placeholder="주소" readonly />
                                 </div>
                                 <div>
-                                    <input type="text" v-model="company['company_daddr']" placeholder="상세주소" ref="company_daddr" />
+                                    <input type="text" v-model="company['company_daddr']" placeholder="상세주소"
+                                        ref="company_daddr" />
                                 </div>
                             </div>
                         </div>
                         <div>
                             <p>홈페이지</p>
-                            <span><input type="text" name="" id="" v-model="company.company_hp_url" ref="company_hp_url"></span>
+                            <span><input type="text" name="" id="" v-model="company.company_hp_url"
+                                    ref="company_hp_url"></span>
                         </div>
                         <div>
                             <p>대표전화</p>
-                            <span><input type="text" name="" id="" v-model="company.company_telno" ref="company_telno"></span>
+                            <span><input type="text" name="" id="" v-model="company.company_telno"
+                                    ref="company_telno"></span>
 
                         </div>
                         <div class="info-sec-summary">
@@ -176,10 +182,10 @@
                             <span class="matchingbox-img">
                                 <label for="file-input" class="file-input" @click="openCardFileInput">
                                     <img :src="cardPreview || 'http://localhost:8080' + cardFile.file_path + '/' + cardFile.file_nm + '.' + cardFile.file_extn_nm"
-                                    width="100%" alt="">
+                                        width="100%" alt="">
                                 </label>
-                                <input type="file" accept="image/*" name="imgFile" id="businessCardImg" ref="businessCardImg"
-                                @change="businessCardUpload" style="display: none;" /></span>
+                                <input type="file" accept="image/*" name="imgFile" id="businessCardImg"
+                                    ref="businessCardImg" @change="businessCardUpload" style="display: none;" /></span>
                         </div>
                     </section>
 
@@ -187,10 +193,10 @@
 
                     <section class="info-sec-bt">
                         <!-- <router-link to="/info.page"> -->
-                            <button class="gray-btn" @click="goToInfoPage">이전</button>
-                            <!-- <button class="blue-btn" @click="updateUser">저장하기</button> -->
-                            <button class="blue-btn" v-if="user.user_auth == 'company'" @click="companyUpdate">저장하기</button>
-                            <button class="blue-btn" v-if="user.user_auth === 'common'" @click="updateUser">저장하기</button>
+                        <button class="gray-btn" @click="goToInfoPage">이전</button>
+                        <!-- <button class="blue-btn" @click="updateUser">저장하기</button> -->
+                        <button class="blue-btn" v-if="user.user_auth == 'company'" @click="companyUpdate">저장하기</button>
+                        <button class="blue-btn" v-if="user.user_auth === 'common'" @click="updateUser">저장하기</button>
                         <!-- </router-link> -->
                     </section>
                 </div>
@@ -246,7 +252,7 @@
             oEditors: [],
             // 키워드 배열
             // keywords: ['#수학', '#영어', '#정보', '#초등', '#중등', '#고등', '#AI튜터', '#블록코딩', '#패턴인식', '#대시보드', '#학습분석', '#보편적학습설계', '#클라우드', '#AI보조교사', '#음성인식', '#학습맵', '#맞춤형콘텐츠'],
-            keywords:[],
+            keywords: [],
             selectedKeywords: [],
             checkedKeywords: [],
             originalSubscribe: null,
@@ -319,7 +325,7 @@
                 data: { 'user_id': vm.user.user_id }
             }).then(function (response) {
                 vm.company = response.data.result
-                
+
                 const selectedKeywordList = response.data.result.keyword;
                 const selectedKeywords = selectedKeywordList.split('#').filter(keyword => keyword !== '').map(keyword => '#' + keyword);
                 vm.selectedKeywords = selectedKeywords;
@@ -357,6 +363,7 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
 
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -373,7 +380,7 @@
                     a.click();
                     window.URL.revokeObjectURL(url);
                 }
-
+                this.$store.commit('setLoading', false); // 로딩 종료
                 this.$router.go(0);
 
             }).catch(function (error) {
@@ -386,7 +393,7 @@
             if (this.initializedEditors[idx]) {
                 return;
             }
-            
+
             // 스마트 에디터 적용
             const oEditors = vm.oEditors;
             nhn.husky.EZCreator.createInIFrame({
@@ -417,14 +424,14 @@
             });
             vm.initializedEditors[idx] = true;
         },
-        
-        updateUser : function(){
-            if(!this.validationCheckForUser()){
-                return 
-            }        
-            
+
+        updateUser: function () {
+            if (!this.validationCheckForUser()) {
+                return
+            }
+
             const vm = this;
-            
+
             var iv = vm.store.state.key.iv;
             var salt = vm.store.state.key.salt;
             var passPhrase = vm.store.state.key.ENC_KEY;
@@ -448,11 +455,11 @@
                     'Content-Type': 'application/json; charset=UTF-8',
                 },
                 data: data
-            }).then(function(response) {
-                if(response.data == 1){
-                    if(vm.originalSubscribe != vm.user.subscribe && vm.originalSubscribe == true){
+            }).then(function (response) {
+                if (response.data == 1) {
+                    if (vm.originalSubscribe != vm.user.subscribe && vm.originalSubscribe == true) {
                         vm.subscDelete()
-                    } else if(vm.originalSubscribe != vm.user.subscribe && vm.originalSubscribe == false) {
+                    } else if (vm.originalSubscribe != vm.user.subscribe && vm.originalSubscribe == false) {
                         vm.subscInsert()
                     } else {
                         alert("회원정보 수정이 완료되었습니다.")
@@ -466,7 +473,7 @@
             });
         },
 
-        subscInsert : function() {
+        subscInsert: function () {
             const vm = this;
 
             var iv = vm.store.state.key.iv;
@@ -492,16 +499,16 @@
                 },
                 data: data
             }).then(function (response) {
-                if(response.data == 1){
+                if (response.data == 1) {
                     alert("회원정보 수정이 완료되었습니다.")
                     vm.$router.push('/info.page');
-                }             
+                }
             }).catch(function (error) {
                 alert('구독 신청 오류, 관리자에게 문의해주세요.');
             });
         },
 
-        subscDelete : function() {
+        subscDelete: function () {
             const vm = this;
 
             var iv = vm.store.state.key.iv;
@@ -525,23 +532,23 @@
                 },
                 data: data
             }).then(function (response) {
-                if(response.data == 1){
+                if (response.data == 1) {
                     alert("회원정보 수정이 완료되었습니다.")
                     vm.$router.push('/info.page');
-                }             
+                }
             }).catch(function (error) {
                 alert('구독 취소 오류, 관리자에게 문의해주세요.');
             });
         },
 
-        emailDuplicateCheck : function() {
+        emailDuplicateCheck: function () {
             let emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
-            if(!emailRegex.test(this.user.user_eml)){
+            if (!emailRegex.test(this.user.user_eml)) {
                 alert('이메일 형식이 올바르지 않습니다.')
                 this.$refs.user_eml.focus();
-                return ;
+                return;
             }
-            
+
             const vm = this;
 
             var iv = vm.store.state.key.iv;
@@ -561,23 +568,23 @@
                 url: '/user/userEmlCheck.json',
                 method: 'post',
                 headers: {
-                    'Content-Type' : 'application/json; charset=UTF-8',
+                    'Content-Type': 'application/json; charset=UTF-8',
                 },
                 data: data
-            }).then(function(response) {
-                if(response.data == false){
+            }).then(function (response) {
+                if (response.data == false) {
                     vm.emlDuplicateChecked = false;
                     alert("사용할 수 없는 이메일입니다.")
                 } else {
                     vm.emlDuplicateChecked = true;
                     alert("사용가능한 이메일입니다.")
                 }
-            }).catch(function(error){
+            }).catch(function (error) {
                 alert('이메일 중복확인 오류, 관리자에게 문의해주세요.');
             });
         },
 
-        showKeywordList : function(selectedKeywords) {
+        showKeywordList: function (selectedKeywords) {
             const vm = this;
             axios({
                 url: "/keyword/keywordList.json",
@@ -588,7 +595,7 @@
             }).then(function (response) {
                 vm.keywords = response.data.map(item => {
                     return {
-                        name: item.keyword_nm, 
+                        name: item.keyword_nm,
                         checked: (selectedKeywords && selectedKeywords.includes(item.keyword_nm)) ? true : false
                     };
                 });
@@ -597,15 +604,15 @@
             });
         },
 
-         //로고 이미지 등록
-         logoUpload: function (e) {
+        //로고 이미지 등록
+        logoUpload: function (e) {
             const vm = this;
 
             const MAX_WIDTH = 340;
             const MAX_HEIGHT = 120;
 
             for (const file of e.target.files) {
-                
+
                 var reader = new FileReader();
                 reader.onload = function (e) {
                     var img = new Image();
@@ -617,14 +624,14 @@
                         // 정해진 크기보다 큰 경우 경고창 표시
                         if (width > MAX_WIDTH || height > MAX_HEIGHT) {
                             alert("로고 이미지 크기는 최대 " + MAX_WIDTH + "x" + MAX_HEIGHT + "입니다.");
-                            vm.$refs.logoImg.value= '';
+                            vm.$refs.logoImg.value = '';
                         } else {
                             vm.logoPreview = reader.result;
                             vm.file.append('logo_img', file);
                             vm.deleteFileList.push(vm.logoFile);
-                            const fileItem = { file, file_ty: 'logo'};
+                            const fileItem = { file, file_ty: 'logo' };
                             vm.insertFileList.push(fileItem);
-                        }   
+                        }
                     };
                 };
                 reader.readAsDataURL(file);
@@ -640,7 +647,7 @@
             const MAX_HEIGHT = 614;
 
             for (const file of e.target.files) {
-                
+
                 var reader = new FileReader();
                 reader.onload = function () {
                     var img = new Image();
@@ -656,7 +663,7 @@
                         } else {
                             vm.cardPreview = reader.result;
                             vm.file.append('business_card_img', file);
-                            const fileItem = { file, file_ty: 'card'};
+                            const fileItem = { file, file_ty: 'card' };
                             vm.insertFileList.push(fileItem);
                             vm.deleteFileList.push(vm.cardFile);
                         }
@@ -674,29 +681,29 @@
             //     vm.file.append('company_profile', file);
             // }
             const file = e.target.files[0];
-            if(file){
+            if (file) {
                 vm.proFile.real_file_nm = file.name;
-                vm.file.append('company_profile',file)
+                vm.file.append('company_profile', file)
                 vm.isProFileChanged = true;
-                const fileItem = { file, file_ty: 'profile'};
+                const fileItem = { file, file_ty: 'profile' };
                 vm.insertFileList.push(fileItem);
                 vm.deleteFileList.push(vm.proFile);
             }
         },
-        
+
         openlogoFileInput() {
             this.$refs.logoImg.click();
         },
 
-        openProFileInput(){
+        openProFileInput() {
             this.$refs.companyProfile.click();
         },
-        
+
         openCardFileInput() {
             this.$refs.businessCardImg.click();
         },
 
-        companyUpdate: function() {
+        companyUpdate: function () {
             if (!this.validationCheckForUser() || !this.validationCheckForCompany()) {
                 return;
             }
@@ -708,23 +715,23 @@
             for (let i = 0; i < fields.length; i++) {
                 let idx = i + 1;
 
-                oEditors.getById["smart"+idx].exec("UPDATE_CONTENTS_FIELD", []);
-                vm.company[fields[i]] = document.getElementById("smart"+idx).value;
+                oEditors.getById["smart" + idx].exec("UPDATE_CONTENTS_FIELD", []);
+                vm.company[fields[i]] = document.getElementById("smart" + idx).value;
             }
 
             //키워드 바인딩
             vm.company['keyword'] = vm.checkedKeywords.join('');
-  
+
             axios({
                 url: '/company/companyUpdate.json',
                 method: 'post',
                 headers: {
-                    'Content-Type' : 'application/json; charset=UTF-8',
+                    'Content-Type': 'application/json; charset=UTF-8',
                 },
                 data: vm.company
-            }).then(function(response) {
-                if(response.data == 1){
-                    if(vm.insertFileList.length > 0){
+            }).then(function (response) {
+                if (response.data == 1) {
+                    if (vm.insertFileList.length > 0) {
                         vm.commonFileUpdate()
                     } else {
                         vm.updateUser()
@@ -732,12 +739,12 @@
                 } else {
                     alert('회원정보 수정에 실패하였습니다.')
                 }
-            }).catch(function(error){
+            }).catch(function (error) {
                 alert('회원정보 수정 오류, 관리자에게 문의해주세요.');
             });
         },
-        
-        commonFileUpdate : function() {
+
+        commonFileUpdate: function () {
             const vm = this;
             let formData = new FormData();
 
@@ -756,7 +763,7 @@
                 },
                 data: formData
             }).then(function (response) {
-                if(response.data > 0 ){
+                if (response.data > 0) {
                     vm.updateUser();
                 } else {
                     alert('회원정보 수정에 실패하였습니다.')
@@ -767,26 +774,26 @@
         },
 
         //일반회원 유효성 검사
-        validationCheckForUser : function(){
+        validationCheckForUser: function () {
             //이메일
-            if(this.user.user_eml === null || this.user.user_eml === ''){
+            if (this.user.user_eml === null || this.user.user_eml === '') {
                 alert('이메일은 필수값입니다.')
                 this.$refs.user_eml.focus();
                 return false;
             }
-            if(!this.emlDuplicateChecked){
+            if (!this.emlDuplicateChecked) {
                 alert('이메일 중복체크는 필수입니다.')
                 this.$refs.user_eml.focus();
                 return false;
-            } 
-            
+            }
+
             //담당자명
             let userNmRegex = /^[가-힣a-zA-Z\s]*$/;
-            if(this.user.user_nm === null || this.user.user_nm === ''){
+            if (this.user.user_nm === null || this.user.user_nm === '') {
                 alert('이름은 필수값입니다.')
                 this.$refs.user_nm.focus();
                 return false;
-            } else if(!userNmRegex.test(this.user.user_nm)){
+            } else if (!userNmRegex.test(this.user.user_nm)) {
                 alert('특수문자와 숫자는 입력하실 수 없습니다.')
                 this.$refs.user_nm.focus()
                 return false;
@@ -795,27 +802,27 @@
             return true;
         },
 
-        validationCheckForCompany : function(){
+        validationCheckForCompany: function () {
             //키워드
-            if(this.checkedKeywords.length < 3 || this.checkedKeywords.length > 6){
+            if (this.checkedKeywords.length < 3 || this.checkedKeywords.length > 6) {
                 alert('키워드는 최소 3개에서 최대 6개를 선택해주세요.')
                 return false;
             }
-            
+
             //한줄소개
-            if(this.company.company_simple_info === null || this.company.company_simple_info === ''){
+            if (this.company.company_simple_info === null || this.company.company_simple_info === '') {
                 alert('기업 한줄 소개는 필수값입니다.')
                 this.$refs.company_simple_info.focus();
                 return false;
             }
-            
+
             //기업주소
-            if(this.company.company_zip === null || this.company.company_zip === '' ||
+            if (this.company.company_zip === null || this.company.company_zip === '' ||
                 this.company.company_addr === null || this.company.company_addr === '' ||
-                this.company.company_daddr === null || this.company.company_daddr === ''){
-                    alert('기업 주소를 입력해주세요.')
-                    this.$refs.company_daddr.focus();
-                    return false;
+                this.company.company_daddr === null || this.company.company_daddr === '') {
+                alert('기업 주소를 입력해주세요.')
+                this.$refs.company_daddr.focus();
+                return false;
             }
 
             //기업홈페이지
@@ -829,16 +836,16 @@
                     alert("홈페이지 주소는 http:// 또는 https://로 시작해야합니다.");
                     this.$refs.company_hp_url.focus();
                     return false;
-               }
+                }
             }
 
             //대표전화
             let telRegex = /^[0-9]*$/;
-            if(this.company.company_telno === null || this.company.company_telno === ''){
+            if (this.company.company_telno === null || this.company.company_telno === '') {
                 alert('대표전화번호 입력은 필수입니다.')
                 this.$refs.company_telno.focus();
                 return false;
-            } else if(!telRegex.test(this.company.company_telno)){
+            } else if (!telRegex.test(this.company.company_telno)) {
                 alert('대표전화번호는 숫자만 입력할 수 있습니다.')
                 this.$refs.company_telno.focus();
                 return false;
@@ -847,14 +854,14 @@
             return true;
         },
 
-        goToInfoPage: function() {
+        goToInfoPage: function () {
             this.$router.push('/info.page');
         }
     },
     watch: {
         'user.user_eml': {
-            handler: function(newVal, oldVal) {
-                if(this.originalEmail !== newVal) {
+            handler: function (newVal, oldVal) {
+                if (this.originalEmail !== newVal) {
                     this.emlDuplicateChecked = false;
                 }
             },
@@ -863,8 +870,8 @@
 
         keywords: {
             handler() {
-                this.checkedKeywords = this.keywords.filter(keyword => keyword.checked).map(keyword => keyword.name); 
-                
+                this.checkedKeywords = this.keywords.filter(keyword => keyword.checked).map(keyword => keyword.name);
+
                 if (this.checkedKeywords.length > 6) {
                     alert('최대 6개까지만 선택 가능합니다.');
                     let removedKeywords = this.checkedKeywords.splice(6);
@@ -886,7 +893,3 @@
     }
 }
 </script>
-
-
-
-
client/views/pages/user/networking/MatchingOne.vue
--- client/views/pages/user/networking/MatchingOne.vue
+++ client/views/pages/user/networking/MatchingOne.vue
@@ -256,6 +256,7 @@
                 responseType: 'blob',
                 data: `file_path=${encodeURIComponent(path)}`
             }).then((response) => {
+                this.$store.commit('setLoading', true);
                 const blob = new Blob([response.data]);
 
                 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -274,7 +275,7 @@
                 }
 
                 let company_id = vm.company.company_id;
-
+                this.$store.commit('setLoading', false); // 로딩 종료
                 axios({
                     url: '/statistics/profileLogInsert.json',
                     method: 'post',
@@ -312,9 +313,9 @@
         //     });
         // },
 
-        downloadProurl(){
+        downloadProurl() {
             const url = this.company.company_hp_url;
-            window.open(url, '_blank'); 
+            window.open(url, '_blank');
         },
 
         openPickListMadal() {
@@ -428,7 +429,7 @@
         },
 
         companySelectListPage() {
-            this.$router.push({path: '/Matching.page', query: {'page': this.$route.query.page}});
+            this.$router.push({ path: '/Matching.page', query: { 'page': this.$route.query.page } });
         },
     },
     watch: {
@@ -451,4 +452,3 @@
     }
 }
 </script>
-
Add a comment
List