하석형 하석형 04-03
250403 하석형 페이지 이동 시 Context Path 경로 추가
@15cb101764f6f6af2fce9972f21b59dd28c3ebe8
client/resources/api/cntxtPth.js
--- client/resources/api/cntxtPth.js
+++ client/resources/api/cntxtPth.js
@@ -1,7 +1,7 @@
 import apiClient from "./index";
 
 export const getCntxtPth = () => {
-    return apiClient.get(`/admin/cntxtPth/findLatestCntxtPth.json`);
+    return apiClient.get(`/sys/cntxtPth/findLatestCntxtPth.json`);
 }
 
 export const saveCntxtPth = cntxtPth => {
client/resources/api/index.js
--- client/resources/api/index.js
+++ client/resources/api/index.js
@@ -9,14 +9,14 @@
 });
 
 const excludeCtxUrls = [
-  '/admin/cntxtPth/findLatestCntxtPth.json' // Context Path 정보 호출
+  '/sys/cntxtPth/findLatestCntxtPth.json' // Context Path 정보 호출
 ]
 
 apiClient.interceptors.request.use(
   config => {
     const excludeCtxUrl = excludeCtxUrls.some(url => config.url.includes(url));
     const contextPath = store.state.contextPath || '';
-    if(contextPath != '/' && !excludeCtxUrl) {
+    if(!excludeCtxUrl) {
       config.url = contextPath + config.url; // 요청 시 Context Path 추가
     }
 
client/views/common/filters.js
--- client/views/common/filters.js
+++ client/views/common/filters.js
@@ -1,7 +1,14 @@
 import moment from 'moment';
+import store from '../pages/AppStore';
 
 const filters = {
 
+    // Context Path를 포함한 URL 생성
+    ctxPath(value) {
+        const contextPath = store.state.contextPath || '';
+        return contextPath + value;
+    },
+
     // 아이디 정규식(5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용)
     date(value) {
         return moment(value).format('YYYY-MM-DD');
client/views/component/Breadcrumb/Breadcrumb.vue
--- client/views/component/Breadcrumb/Breadcrumb.vue
+++ client/views/component/Breadcrumb/Breadcrumb.vue
@@ -1,6 +1,6 @@
 <template>
   <div v-if="breadcrumbList.length > 0">
-    <span><router-link :to="{path : '/adm/main.page'}">홈</router-link> &gt; </span>
+    <span><router-link :to="{path : this.$filters.ctxPath('/adm/main.page')}">홈</router-link> &gt; </span>
     <span v-for="(crumb, index) in breadcrumbList" :key="index">
       {{ crumb.menuNm }}
       <span v-if="index < breadcrumbList.length - 1"> &gt; </span>
client/views/layout/AdminHeader.vue
--- client/views/layout/AdminHeader.vue
+++ client/views/layout/AdminHeader.vue
@@ -4,7 +4,7 @@
             <div class="page-title">
                 <p>{{ pgNm }} </p>
             </div>
-            <Breadcrumb v-if="$route.path !== '/adm/main.page' && $route.path !== '/main.page'" />
+            <Breadcrumb v-if="$route.path !== this.$filters.ctxPath('/adm/main.page') && $route.path !== this.$filters.ctxPath('/main.page')" />
         </div>
         <div class="info-wrap">
             <div class="info">
@@ -43,7 +43,7 @@
         // 사이트 이동
         fnSiteMove() {
             this.$router.push({
-                path: "/",
+                path: this.$filters.ctxPath("/"),
             });
         },
         ...mapActions(["logout"]),
@@ -51,7 +51,7 @@
         async fnlogOut() {
             await this.logout();
             this.$router.push({
-                path: "/login.page",
+                path: this.$filters.ctxPath("/login.page"),
             });
         },
         // 캐시 초기화
client/views/layout/AdminMenu.vue
--- client/views/layout/AdminMenu.vue
+++ client/views/layout/AdminMenu.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="side-bar">
         <div class="logo">
-            <router-link :to="{path : '/adm/main.page'}">ADMINISTRATOR</router-link>
+            <router-link :to="{path : this.$filters.ctxPath('/adm/main.page')}">ADMINISTRATOR</router-link>
         </div>
         <nav>
             <ul class="main-menu">
@@ -77,7 +77,8 @@
                         isOpen: false, // 1뎁스 닫힘
                         childList: menu.childList.map(sub => ({
                             ...sub,
-                            isOpen: false // 2뎁스도 닫힘
+                            isOpen: false, // 2뎁스도 닫힘
+                            routerUrl: this.$filters.ctxPath(sub.routerUrl)
                         }))
                     }));
                     // 전체 메뉴 트리 store에 저장
client/views/layout/UserHeader.vue
--- client/views/layout/UserHeader.vue
+++ client/views/layout/UserHeader.vue
@@ -4,7 +4,7 @@
       <div class="flex justify-between align-center header">
         <div class="logo">
           <router-link
-            :to="{ path: '/' }"
+            :to="{ path: this.$filters.ctxPath('/') }"
           >
             <img
               src="../../resources/img/logo-color.png"
@@ -74,14 +74,14 @@
     async fnlogOut() {
       await this.logout();
       this.$router.push({
-        path: "/",
+        path: this.$filters.ctxPath("/"),
       });
     },
 
     // 사용자 정보 보기로 이동
     fnLink() {
       this.$router.push({
-        path: "/portal/myInfo/view.page",
+        path: this.$filters.ctxPath("/portal/myInfo/view.page"),
       });
     },
   },
client/views/layout/UserMenu.vue
--- client/views/layout/UserMenu.vue
+++ client/views/layout/UserMenu.vue
@@ -150,7 +150,13 @@
         };
         const res = await findBySysMenu(params);
         if (res.status == 200) {
-          this.menuList = res.data.data.menuList;
+          this.menuList = res.data.data.menuList.map(menu => ({
+              ...menu,
+              childList: menu.childList.map(sub => ({
+                  ...sub,
+                  routerUrl: this.$filters.ctxPath(sub.routerUrl)
+              }))
+          }));
           // 전체 메뉴 트리 store에 저장
           this.$store.commit('setMenuList', this.menuList);
           this.fnMenuActive(this.$route.path);
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -3,15 +3,15 @@
     <AdminHeader />
     <AdminMenu />
     <main class="main-wrap">
-        <div :class="{'content-wrap': true, 'main': this.$route.path === '/adm/main.page'}">
+        <div :class="{'content-wrap': true, 'main': this.$route.path === this.$filters.ctxPath('/adm/main.page')}">
           <router-view />
         </div>
     </main>
-  </div>
+  </div> 
   <div v-else v-cloak class="user-wrap relative">
-    <UserHeader v-if="path != '/login.page'"/>
+    <UserHeader v-if="path != this.$filters.ctxPath('/login.page')"/>
     <main class="main-wrap">
-      <Breadcrumb v-if="$route.path !== '/adm/main.page' && $route.path !== '/main.page'" />
+      <Breadcrumb v-if="$route.path !== this.$filters.ctxPath('/adm/main.page') && $route.path !== this.$filters.ctxPath('/main.page')" />
       <router-view />
     </main>
   </div>
@@ -43,7 +43,7 @@
   computed: {
     isAdminPage() {
       // 현재 URL을 기반으로 사용자와 관리자 페이지 여부를 판단
-      return this.$route && this.$route.path.startsWith("/adm");
+      return this.$route && this.$route.path.startsWith(this.$filters.ctxPath("/adm"));
     },
   },
   components: {
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -1,5 +1,6 @@
 import { createWebHistory, createRouter } from "vue-router";
 import store from "./AppStore";
+import filters from '../common/filters';
 
 // 메인화면
 import Main from "./user/portal/main/Main.vue";
@@ -31,12 +32,15 @@
   try {
     const res = await getCntxtPth();
     if (res.status == 200) {
-      const ctx = res.data.data || ""; // Context Path 정보
+      let ctx = res.data.data || ''; // Context Path 정보
+      if(ctx == '/') {
+        ctx = ''; // Context Path가 '/'인 경우 빈 문자열로 설정
+      }
       store.commit("setContextPath", ctx); // Context Path 정보 저장
       return ctx;
     }else {
       store.commit("setStoreReset");
-      window.location = '/'
+      window.location = filters.ctxPath('/')
     }
   } catch (error) {
     return [];
@@ -57,7 +61,7 @@
       return newRoutes;
     }else {
       store.commit("setStoreReset");
-      window.location = '/'
+      window.location = filters.ctxPath('/')
     }    
   } catch (error) {
     return [];
@@ -149,7 +153,9 @@
   const dynamicRoutes = await fetchRoutes(); // DB에 적재된 라우터 정보 호출
   const prefixedBeforeRoutes = addContextPathToRoutes(beforeRoutes, ctx); // 기존 라우터 정보에 Context Path 추가
   const prefixedDynamicRoutes = addContextPathToRoutes(dynamicRoutes, ctx); // DB에 적재된 라우터 정보에 Context Path 추가
+  console.log('prefixedDynamicRoutes: ', prefixedDynamicRoutes);
   const newRoutes = prefixedBeforeRoutes.concat(prefixedDynamicRoutes); // 기존 라우터 정보와 합치기
+  console.log('newRoutes: ', newRoutes);
   const AppRouter = createRouter({
     history: createWebHistory(),
     routes: newRoutes,
@@ -167,8 +173,8 @@
     console.log('loginMode', loginMode)
     // 로그인 상태 확인 (JWT 또는 SESSION)
     const isLogin = loginMode === 'J' ? store.state.authorization : store.state.mbrId;
-    if (!isLogin && to.path !== '/login.page') {
-      next({ path: "/login.page" });
+    if (!isLogin && to.path !== filters.ctxPath('/login.page')) {
+      next({ path: filters.ctxPath("/login.page") });
       return;
     }
 
@@ -185,16 +191,16 @@
     const roleCheck = isValidRole();
     if (!accesCheck || !roleCheck) {
       alert('접근이 불가합니다.\n관리자에게 문의하세요.');
-      next('/');
+      next(filters.ctxPath('/'));
     }
     // 경로에 따른 사용자 타입 설정
-    if (to.path === '/') {
+    if (to.path === filters.ctxPath('/')) {
       store.commit('setUserType', 'portal')
-    } else if (to.path.startsWith('/adm')) {
+    } else if (to.path.startsWith(filters.ctxPath('/adm'))) {
       store.commit('setUserType', 'adm');
     } 
 
-    if (to.path === '/login.page') {
+    if (to.path === filters.ctxPath('/login.page')) {
       store.commit('setPath', to.path);
       next();
       return;
@@ -204,11 +210,11 @@
     sessionStorage.setItem("redirect", to.fullPath);
     
     // 메인 페이지 or 로그인 페이지
-    if (to.path === '/' || to.path.includes('/login.page') || to.path.startsWith('/cmmn/') || to.path.includes('/searchId.page') || to.path.includes('/resetPswd.page')) {
+    if (to.path === filters.ctxPath('/') || to.path.includes('/login.page') || to.path.startsWith(filters.ctxPath('/cmmn/')) || to.path.includes('/searchId.page') || to.path.includes('/resetPswd.page')) {
       let path = to.path;
       // 게시판일 경우 .page로 끝나는 경로가 있으므로 마지막 '/' 이전 경로로 설정
       if (to.path.includes('BBS_MNG')) {
-        const lastSlashIndex = to.path.lastIndexOf('/'); // 마지막 '/' 인덱스
+        const lastSlashIndex = to.path.lastIndexOf(filters.ctxPath('/')); // 마지막 '/' 인덱스
         path = to.path.substring(0, lastSlashIndex); // 마지막 '/' 이전 경로
       }
       store.commit('setPath', path);
@@ -242,7 +248,7 @@
       // 권한이 있고 접근 가능한 경우
       if (hasAcc) {
         if (to.path.includes('.page')) {
-          const lastSlashIndex = to.path.lastIndexOf('/'); // 마지막 '/' 인덱스
+          const lastSlashIndex = to.path.lastIndexOf(filters.ctxPath('/')); // 마지막 '/' 인덱스
           const path = to.path.substring(0, lastSlashIndex); // 마지막 '/' 이전 경로
           store.commit('setPath', path);
         }
@@ -262,7 +268,7 @@
       }
     } else {
       // sessionStorage.setItem("redirect", to.fullPath);
-      next({ path: "/login.page" });
+      next({ path: filters.ctxPath("/login.page") });
     }
   });
   return AppRouter;
client/views/pages/AppStore.js
--- client/views/pages/AppStore.js
+++ client/views/pages/AppStore.js
@@ -81,7 +81,7 @@
           document.cookie = "refresh=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
           document.cookie = "Authorization=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
           // 4. 로그인 페이지로 이동
-          window.location = "/login.page";
+          window.location = state.contextPath + "/login.page";
         }
       } catch(error) {
         const errorData = error.response.data;
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
@@ -352,7 +352,7 @@
       }
       // axios 호출
       await defaultAxios({
-        url: "/sys/bbsCn/saveBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/saveBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
@@ -414,7 +414,7 @@
       }
       // axios 호출
       defaultAxios({
-        url: "/sys/bbsCn/updateBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/updateBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
--- client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
+++ client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
@@ -395,7 +395,7 @@
       }
       // axios 호출
       await defaultAxios({
-        url: "/sys/bbsCn/saveBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/saveBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
@@ -455,7 +455,7 @@
       }
       // axios 호출
       defaultAxios({
-        url: "/sys/bbsCn/updateBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/updateBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/boardManagement/template/galleryTemplate/GalleryInsert.vue
--- client/views/pages/adm/boardManagement/template/galleryTemplate/GalleryInsert.vue
+++ client/views/pages/adm/boardManagement/template/galleryTemplate/GalleryInsert.vue
@@ -482,7 +482,7 @@
       }
       // axios 호출
       await defaultAxios({
-        url: "/sys/bbsCn/saveBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/saveBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
@@ -544,7 +544,7 @@
       }
       // axios 호출
       defaultAxios({
-        url: "/sys/bbsCn/updateBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/updateBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectListOne.vue
--- client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectListOne.vue
@@ -344,7 +344,7 @@
       }
       try {
         const response = await defaultAxios({
-          url: "/sys/file/fileDownload.json", // URL 경로 확인
+          url: this.$filters.ctxPath("/sys/file/fileDownload.json"), // URL 경로 확인
           method: "post",
           headers: {
             "Content-Type": "application/json; charset=UTF-8",
client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
--- client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
+++ client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
@@ -514,7 +514,7 @@
       }
       // axios 호출
       await defaultAxios({
-        url: "/sys/bbsCn/saveBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/saveBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
@@ -576,7 +576,7 @@
       }
       // axios 호출
       defaultAxios({
-        url: "/sys/bbsCn/updateBbsCn.file",
+        url: this.$filters.ctxPath("/sys/bbsCn/updateBbsCn.file"),
         method: "post",
         headers: {
           "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectListOne.vue
--- client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectListOne.vue
@@ -317,7 +317,7 @@
       }
       try {
         const response = await defaultAxios({
-          url: "/sys/file/fileDownload.json", // URL 경로 확인
+          url: this.$filters.ctxPath("/sys/file/fileDownload.json"), // URL 경로 확인
           method: "post",
           headers: {
             "Content-Type": "application/json; charset=UTF-8",
client/views/pages/adm/main/Main.vue
--- client/views/pages/adm/main/Main.vue
+++ client/views/pages/adm/main/Main.vue
@@ -234,11 +234,11 @@
       }
       if (this.bbsCnList[idx].type == "faq") {
         this.$router.push({
-          path: "/adm/" + this.bbsCnList[idx]["mng_id"] + "/list.page",
+          path: this.$filters.ctxPath("/adm/") + this.bbsCnList[idx]["mng_id"] + "/list.page",
         });
       } else {
         this.$router.push({
-          path: "/adm/" + this.bbsCnList[idx]["mng_id"] + "/view.page",
+          path: this.$filters.ctxPath("/adm/") + this.bbsCnList[idx]["mng_id"] + "/view.page",
           query: {
             pageId: this.bbsCnList[idx]["id"],
           },
client/views/pages/adm/member/termsManagement/TermsManagementSelectList.vue
--- client/views/pages/adm/member/termsManagement/TermsManagementSelectList.vue
+++ client/views/pages/adm/member/termsManagement/TermsManagementSelectList.vue
@@ -85,7 +85,7 @@
   methods: {
     passwordReset: function () {},
     insertPage: function () {
-      this.$router.push({ path: "/adm/termsManagementInsert.page", query: {} });
+      this.$router.push({ path: this.$filters.ctxPath("/adm/termsManagementInsert.page"), query: {} });
     },
   },
   watch: {},
client/views/pages/adm/popup/PopupManagementInsert.vue
--- client/views/pages/adm/popup/PopupManagementInsert.vue
+++ client/views/pages/adm/popup/PopupManagementInsert.vue
@@ -300,9 +300,9 @@
       // URL 삽입
       let url = null;
       if (this.popup["popupId"] != null) {
-        url = "/admin/popup/updateProc.file";
+        url = this.$filters.ctxPath("/admin/popup/updateProc.file");
       } else {
-        url = "/admin/popup/insertProc.file";
+        url = this.$filters.ctxPath("/admin/popup/insertProc.file");
       }
 
       this.axiosUpsert(url, formData);
client/views/pages/adm/statistics/BbsStatistics.vue
--- client/views/pages/adm/statistics/BbsStatistics.vue
+++ client/views/pages/adm/statistics/BbsStatistics.vue
@@ -206,7 +206,7 @@
         formData.append("chart", chartToBlob);
         // 실행
         defaultAxios({
-          url: "/sys/cntnStats/excelDownload.file",
+          url: this.$filters.ctxPath("/sys/cntnStats/excelDownload.file"),
           method: "post",
           headers: {
             "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/statistics/MenuStatistics.vue
--- client/views/pages/adm/statistics/MenuStatistics.vue
+++ client/views/pages/adm/statistics/MenuStatistics.vue
@@ -205,7 +205,7 @@
         formData.append("chart", chartToBlob);
         // 실행
         defaultAxios({
-          url: "/sys/cntnStats/excelDownload.file",
+          url: this.$filters.ctxPath("/sys/cntnStats/excelDownload.file"),
           method: "post",
           headers: {
             "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/statistics/UserStatistics.vue
--- client/views/pages/adm/statistics/UserStatistics.vue
+++ client/views/pages/adm/statistics/UserStatistics.vue
@@ -194,7 +194,7 @@
         formData.append("chart", chartToBlob);
         // 실행
         defaultAxios({
-          url: "/sys/cntnStats/excelDownload.file",
+          url: this.$filters.ctxPath("/sys/cntnStats/excelDownload.file"),
           method: "post",
           headers: {
             "Content-Type": "multipart/form-data; charset=UTF-8",
client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
--- client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
+++ client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
@@ -142,7 +142,7 @@
         //         await saveByLoginMode(loginMode);
         alert('로그인 방식이 변경되었습니다.\n다시 로그인해주세요.');
         store.commit("setStoreReset");
-        window.location = '/login.page';
+        window.location = this.$filters.ctxPath('/login.page');
       } catch (err) {
         alert('로그인 방식 저장 실패: ' + (err.response?.data?.message || err.message));
         this.lgnMode = this.previousLgnMode;
@@ -174,19 +174,16 @@
           const res = await saveCntxtPth(ctx);
           alert(res.data.message);
           if (res.status == 200) {
-            console.log("origin store contextPath : ", store.state.contextPath);
             let storeCtx = this.cntxtPth;
             if(storeCtx == '/') {
               storeCtx = '';
             }
             store.commit("setContextPath", storeCtx); // 캐시 초기화 요청을 보내기 위한 Context Path 정보 저장
-            const cacheRes = await cacheReSet(); // 캐시 초기화
-            alert(cacheRes.data.message);
-            store.commit("setStoreReset"); // 캐시 초기화 후 Store 초기화
-            // console.log("before reload store contextPath : ", store.state.contextPath);
+            // const cacheRes = await cacheReSet(); // 캐시 초기화
+            // alert(cacheRes.data.message);
+            // store.commit("setStoreReset"); // 캐시 초기화 후 Store 초기화
             // window.location.reload(); // AppRouter 재실행을 위한 페이지 새로고침
-            // console.log("after reload store contextPath : ", store.state.contextPath);
-            window.location.href = `${storeCtx}/login.page`;
+            window.location.href = `${storeCtx}/adm/main.page`;
           } else {
             alert(res.data.message);
           }
client/views/pages/login/Login.vue
--- client/views/pages/login/Login.vue
+++ client/views/pages/login/Login.vue
@@ -133,13 +133,13 @@
           }
           const url = this.restoreRedirect("redirect");
           if (url != null && url != "") {
-            if (url == "/searchId.page" || url == "/resetPswd.page") {
-              this.$router.push({ path: "/main.page" });
+            if (url == this.$filters.ctxPath("/searchId.page") || url == this.$filters.ctxPath("/resetPswd.page")) {
+              this.$router.push({ path: this.$filters.ctxPath("/main.page") });
             } else {
               this.$router.push({ path: url });
             }
           } else {
-            this.$router.push({ path: "/" });
+            this.$router.push({ path: this.$filters.ctxPath("/") });
           }
 
           
@@ -150,7 +150,7 @@
     },
     moveSearchId() {
       this.$router.push({
-        path: "/resetPswd.page",
+        path: this.$filters.ctxPath("/resetPswd.page"),
         query: {
           tab: "id",
         },
@@ -158,7 +158,7 @@
     },
     moveResetPswd() { 
       this.$router.push({
-        path: "/resetPswd.page",
+        path: this.$filters.ctxPath("/resetPswd.page"),
         query: {
           tab: "pw",
         },
client/views/pages/login/ResetPswd.vue
--- client/views/pages/login/ResetPswd.vue
+++ client/views/pages/login/ResetPswd.vue
@@ -169,7 +169,7 @@
         );
         if (isCheck) {
           this.$router.push({
-            path: "/login.page",
+            path: this.$filters.ctxPath("/login.page"),
           });
         }
       } catch (error) {
@@ -200,7 +200,7 @@
           );
           if (isCheck) {
             this.$router.push({
-              path: "/login.page",
+              path: this.$filters.ctxPath("/login.page"),
             });
           }
         }
client/views/pages/login/SearchId.vue
--- client/views/pages/login/SearchId.vue
+++ client/views/pages/login/SearchId.vue
@@ -71,7 +71,7 @@
         );
         if (isCheck) {
           this.$router.push({
-            path: "/login.page",
+            path: this.$filters.ctxPath("/login.page"),
           });
         }
       } catch (error) {
client/views/pages/user/etc/NotFound.vue
--- client/views/pages/user/etc/NotFound.vue
+++ client/views/pages/user/etc/NotFound.vue
@@ -38,7 +38,7 @@
   methods: {
     fnMainMove() {
       this.$router.push({
-        path: "/",
+        path: this.$filters.ctxPath("/"),
       });
     },
     fnGoBack() {
client/views/pages/user/portal/search/Search.vue
--- client/views/pages/user/portal/search/Search.vue
+++ client/views/pages/user/portal/search/Search.vue
@@ -328,7 +328,7 @@
         fnView(item, subItem) {
             let menuPath = null;
             if(item.routerUrl.includes('.page')) {
-                const lastSlashIndex = item.routerUrl.lastIndexOf('/'); // 마지막 '/' 인덱스
+                const lastSlashIndex = item.routerUrl.lastIndexOf(this.$filters.ctxPath('/')); // 마지막 '/' 인덱스
                 menuPath = item.routerUrl.substring(0, lastSlashIndex) ; // 마지막 '/' 이전 경로
             }
 
Add a comment
List