
--- client/resources/api/entDscsnAply.js
... | ... | @@ -1,21 +0,0 @@ |
1 | -import apiClient from "./index"; | |
2 | - | |
3 | -// 조회(목록) | |
4 | -export const entDscsnAplylistProc = (data) => { | |
5 | - return apiClient.post(`/government/entDscsnAply/listProc.json`, data); | |
6 | -}; | |
7 | - | |
8 | -// 조회(상세) | |
9 | -export const entDscsnAplyDetailProc = (data) => { | |
10 | - return apiClient.post(`/sys/entDscsnAply/detailProc.json`, data); | |
11 | -}; | |
12 | - | |
13 | -// 수정 | |
14 | -export const entDscsnAplyUpdate = (data) => { | |
15 | - return apiClient.post(`/sys/entDscsnAply/update.json`, data); | |
16 | -}; | |
17 | - | |
18 | -// 삭제 | |
19 | -export const entDscsnAplyDelete = (data) => { | |
20 | - return apiClient.post(`/government/entDscsnAply/delete.json`, data); | |
21 | -}; |
--- client/resources/api/entInfo.js
... | ... | @@ -1,26 +0,0 @@ |
1 | -import apiClient from "./index"; | |
2 | - | |
3 | -// 등록 | |
4 | -export const entInfoInsertProc = (data) => { | |
5 | - return apiClient.post(`/government/entInfo/insertProc.file`, data); | |
6 | -}; | |
7 | - | |
8 | -// 조회(목록) | |
9 | -export const entInfoListProc = (data) => { | |
10 | - return apiClient.post(`/government/entInfo/listProc.json`, data); | |
11 | -}; | |
12 | - | |
13 | -// 조회(상세) | |
14 | -export const entInfoDetailProc = (data) => { | |
15 | - return apiClient.post(`/government/entInfo/detailProc.json`, data); | |
16 | -}; | |
17 | - | |
18 | -// 수정 | |
19 | -export const entInfoUpdateProc = (data) => { | |
20 | - return apiClient.post(`/government/entInfo/updateProc.file`, data); | |
21 | -}; | |
22 | - | |
23 | -// 삭제 | |
24 | -export const entInfoDeleteProc = (data) => { | |
25 | - return apiClient.post(`/government/entInfo/deleteProc.json`, data); | |
26 | -};(파일 끝에 줄바꿈 문자 없음) |
--- client/resources/api/ivstDscsn.js
... | ... | @@ -1,16 +0,0 @@ |
1 | -import apiClient from "./index"; | |
2 | - | |
3 | -// 조회(목록) | |
4 | -export const ivstDscsnListProc = (data) => { | |
5 | - return apiClient.post(`/government/ivstDscsn/listProc.json`, data); | |
6 | -}; | |
7 | - | |
8 | -// 조회(상세) | |
9 | -export const ivstDscsnDetailProc = (data) => { | |
10 | - return apiClient.post(`/government/ivstDscsn/detailProc.json`, data); | |
11 | -}; | |
12 | - | |
13 | -// 삭제 | |
14 | -export const ivstDscsnDeleteProc = (data) => { | |
15 | - return apiClient.post(`/government/ivstDscsn/deleteProc.json`, data); | |
16 | -}; |
--- client/resources/api/main.js
+++ client/resources/api/main.js
... | ... | @@ -4,8 +4,3 @@ |
4 | 4 |
export const adminMainProc = () => { |
5 | 5 |
return apiClient.post(`/admin/main/adminMainProc.json`); |
6 | 6 |
} |
7 |
- |
|
8 |
-// 공무원용 메인 페이지 |
|
9 |
-export const governmentMainProc = data => { |
|
10 |
- return apiClient.post(`/government/main/governmentMainProc.json`, data); |
|
11 |
-}(파일 끝에 줄바꿈 문자 없음) |
--- client/resources/api/rvwMttr.js
... | ... | @@ -1,26 +0,0 @@ |
1 | -import apiClient from "./index"; | |
2 | - | |
3 | -// 등록 | |
4 | -export const rvwMttrInsertProc = (data) => { | |
5 | - return apiClient.post(`/government/rvwMttr/insertProc.json`, data); | |
6 | -}; | |
7 | - | |
8 | -// 조회(목록) | |
9 | -export const rvwMttrListProc = (data) => { | |
10 | - return apiClient.post(`/government/rvwMttr/listProc.json`, data); | |
11 | -}; | |
12 | - | |
13 | -// 조회(상세) | |
14 | -export const rvwMttrDetailProc = (data) => { | |
15 | - return apiClient.post(`/government/rvwMttr/detailProc.json`, data); | |
16 | -}; | |
17 | - | |
18 | -// 수정 | |
19 | -export const rvwMttrUpdateProc = (data) => { | |
20 | - return apiClient.post(`/government/rvwMttr/updateProc.json`, data); | |
21 | -}; | |
22 | - | |
23 | -// 삭제 | |
24 | -export const rvwMttrDeleteProc = (data) => { | |
25 | - return apiClient.post(`/government/rvwMttr/deleteProc.json`, data); | |
26 | -};(파일 끝에 줄바꿈 문자 없음) |
--- client/resources/api/statistics.js
... | ... | @@ -1,16 +0,0 @@ |
1 | -import apiClient from "./index"; | |
2 | - | |
3 | -// 분류별 통계 | |
4 | -export const categoryStatistics = data => { | |
5 | - return apiClient.post(`/government/statistics/categoryStatistics.json`, data); | |
6 | -}; | |
7 | - | |
8 | -// 검토사항 통계 | |
9 | -export const rvwMttrStatistics = data => { | |
10 | - return apiClient.post(`/government/statistics/rvwMttrStatistics.json`, data); | |
11 | -}; | |
12 | - | |
13 | -// 상담신청 통계 | |
14 | -export const consultationStatistics = data => { | |
15 | - return apiClient.post(`/government/statistics/consultationStatistics.json`, data); | |
16 | -};(파일 끝에 줄바꿈 문자 없음) |
--- client/resources/img/background.png
Binary file is not shown |
--- client/resources/img/background2.png
Binary file is not shown |
--- client/resources/img/co_main_img.png
Binary file is not shown |
--- client/resources/img/hong.png
Binary file is not shown |
--- client/resources/img/img1.png
Binary file is not shown |
--- client/resources/img/intro_background.png
Binary file is not shown |
--- client/resources/img/logo.png
Binary file is not shown |
--- client/resources/img/logo_w.png
Binary file is not shown |
--- client/resources/img/mascot_left.png
Binary file is not shown |
--- client/resources/img/mascot_right.png
Binary file is not shown |
--- client/resources/img/quick.png
Binary file is not shown |
--- client/resources/img/sam.png
Binary file is not shown |
--- client/views/index.html
+++ client/views/index.html
... | ... | @@ -5,7 +5,8 @@ |
5 | 5 |
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
6 | 6 |
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
7 | 7 |
<meta name="description" content="Node Vue Web"> |
8 |
- <!-- <link rel="icon" href="../client/favicon.ico" /> --> |
|
8 |
+ <link rel="icon" href="" /> |
|
9 |
+ <base href="/" /> |
|
9 | 10 |
|
10 | 11 |
<!-- 공통css --> |
11 | 12 |
<link rel="stylesheet" href="../client/resources/lib/swiper/swiper-bundle.min.css"> |
--- client/views/layout/UserHeader.vue
+++ client/views/layout/UserHeader.vue
... | ... | @@ -10,36 +10,22 @@ |
10 | 10 |
<div class="flex justify-between align-center header"> |
11 | 11 |
<div class="logo"> |
12 | 12 |
<router-link |
13 |
- :to="{ path: '/company/main.page' }" |
|
13 |
+ :to="{ path: '/' }" |
|
14 | 14 |
v-if="pageRole === 'company'" |
15 | 15 |
> |
16 | 16 |
<img |
17 |
- src="/client/resources/img/logo_w.png" |
|
18 |
- alt="" |
|
19 |
- v-if="$route.path === '/company/main.page'" |
|
17 |
+ src="" |
|
18 |
+ alt="홈" |
|
20 | 19 |
/> |
21 |
- <img src="/client/resources/img/logo.png" alt="" v-else /> |
|
22 | 20 |
</router-link> |
23 |
- <router-link :to="{ path: '/government/main.page' }" v-else> |
|
24 |
- <img src="/client/resources/img/logo.png" alt="" /> |
|
25 |
- </router-link> |
|
21 |
+ |
|
26 | 22 |
</div> |
27 | 23 |
<div v-show="pageRole === 'company'" class="mobile-menu mr10"> |
28 | 24 |
<!-- <p class="white detail-text">문의전화</p> --> |
29 |
- <p |
|
30 |
- :class=" |
|
31 |
- pageRole === 'company' && |
|
32 |
- $route.path === '/company/main.page' |
|
33 |
- ? 'call white' |
|
34 |
- : 'call green' |
|
35 |
- " |
|
36 |
- > |
|
37 |
- ☎ 054)639-6161~3 |
|
38 |
- </p> |
|
25 |
+ <p>☎ 054)639-6161~3</p> |
|
39 | 26 |
</div> |
40 | 27 |
<div |
41 | 28 |
class="user-info mobile-menu" |
42 |
- v-if="this.$store.state.userType === 'government'" |
|
43 | 29 |
> |
44 | 30 |
<div class="flex align-center"> |
45 | 31 |
<button class="user-name cursor" @click="fnLink"> |
... | ... | @@ -54,7 +40,6 @@ |
54 | 40 |
|
55 | 41 |
<div |
56 | 42 |
class="user-info pc-menu" |
57 |
- v-if="this.$store.state.userType === 'government'" |
|
58 | 43 |
> |
59 | 44 |
<div class="flex align-center"> |
60 | 45 |
<button class="user-name cursor" @click="fnLink"> |
... | ... | @@ -67,12 +52,6 @@ |
67 | 52 |
<div v-show="pageRole === 'company'" class="pc-menu"> |
68 | 53 |
<!-- <p class="white detail-text">문의전화</p> --> |
69 | 54 |
<p |
70 |
- :class=" |
|
71 |
- pageRole === 'company' && |
|
72 |
- $route.path === '/company/main.page' |
|
73 |
- ? 'call white' |
|
74 |
- : 'call green' |
|
75 |
- " |
|
76 | 55 |
> |
77 | 56 |
☎ 054)639-6161~3 |
78 | 57 |
</p> |
--- client/views/layout/UserMenu.vue
+++ client/views/layout/UserMenu.vue
... | ... | @@ -148,8 +148,10 @@ |
148 | 148 |
try { |
149 | 149 |
const params = { |
150 | 150 |
roles: this.roles, |
151 |
- menuType: store.state.userType, |
|
151 |
+ menuType: 'government', |
|
152 |
+ // menuType: store.state.userType, |
|
152 | 153 |
}; |
154 |
+ console.log('params', params); |
|
153 | 155 |
const res = await findBySysMenu(params); |
154 | 156 |
if (res.status == 200) { |
155 | 157 |
this.menuList = res.data.data.menuList; |
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
... | ... | @@ -9,6 +9,7 @@ |
9 | 9 |
</div> |
10 | 10 |
</div> |
11 | 11 |
<div v-else v-cloak class="user-wrap relative"> |
12 |
+ <UserHeader /> |
|
12 | 13 |
<div class="main-warp"> |
13 | 14 |
<router-view /> |
14 | 15 |
</div> |
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
... | ... | @@ -1,13 +1,15 @@ |
1 | 1 |
import { createWebHistory, createRouter } from "vue-router"; |
2 | 2 |
import store from "./AppStore"; |
3 | 3 |
|
4 |
+// 메인화면 |
|
5 |
+import Main from "./user/portal/main/Main.vue"; |
|
4 | 6 |
// 관리자 |
5 | 7 |
import CommonSelectList from "./adm/boardManagement/template/commonTemplate/CommonSelectList.vue"; |
6 | 8 |
import CommonSelectListOne from "./adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue"; |
7 | 9 |
|
8 | 10 |
const beforeRoutes = [ |
9 | 11 |
/* 메인화면 */ |
10 |
- // { path: "/", name: "", component: }, |
|
12 |
+ { path: "/", name: "main", component: Main }, |
|
11 | 13 |
|
12 | 14 |
// 관리자 |
13 | 15 |
{ |
... | ... | @@ -21,6 +23,7 @@ |
21 | 23 |
|
22 | 24 |
import { findAll, accessCheck } from "../../resources/api/router"; |
23 | 25 |
import { save } from "../../resources/api/cntnStats"; |
26 |
+import { mdiConsoleLine } from "@mdi/js"; |
|
24 | 27 |
|
25 | 28 |
// 라우터 정보 호출 |
26 | 29 |
async function fetchRoutes() { |
... | ... | @@ -125,6 +128,7 @@ |
125 | 128 |
} |
126 | 129 |
// 접근 제어 확인(미확인 시 이전 페이지로 이동) |
127 | 130 |
const accesCheck = await accessUrl(to.path); |
131 |
+ console.log('accesCheck', accesCheck); |
|
128 | 132 |
const roleCheck = isValidRole(); |
129 | 133 |
if (!accesCheck || !roleCheck) { |
130 | 134 |
alert('접근이 불가합니다.\n관리자에게 문의하세요.'); |
... | ... | @@ -132,7 +136,7 @@ |
132 | 136 |
} |
133 | 137 |
// 경로에 따른 사용자 타입 설정 |
134 | 138 |
if (to.path === '/') { |
135 |
- store.commit('setUserType', null) |
|
139 |
+ store.commit('setUserType', 'portal') |
|
136 | 140 |
} else if (to.path.startsWith('/adm')) { |
137 | 141 |
store.commit('setUserType', 'adm'); |
138 | 142 |
} |
--- client/views/pages/AppStore.js
+++ client/views/pages/AppStore.js
... | ... | @@ -7,7 +7,7 @@ |
7 | 7 |
state: { |
8 | 8 |
authorization: null, |
9 | 9 |
// refresh: null, |
10 |
- userType: "company", |
|
10 |
+ userType: "portal", |
|
11 | 11 |
menu: null, |
12 | 12 |
path: null, |
13 | 13 |
roles: [{authority: "ROLE_NONE"}], |
--- client/views/pages/adm/preferences/contentManagement/CompanyConsultSelectListOne.vue
... | ... | @@ -1,326 +0,0 @@ |
1 | -<template> | |
2 | - <div class="content"> | |
3 | - <div class="admin-page-title point-font2 mb30"> | |
4 | - <p>콘텐츠 관리</p> | |
5 | - </div> | |
6 | - <div class="admin-style"> | |
7 | - <details open class="form-table-style mb30"> | |
8 | - <summary class="point-font"> | |
9 | - <p class="summary-style pl10">신청내용</p> | |
10 | - </summary> | |
11 | - <div class="pt10 pb10"> | |
12 | - <table class="form-table2 mb30"> | |
13 | - <colgroup> | |
14 | - <col width="15%" /> | |
15 | - <col width="35%" /> | |
16 | - <col width="15%" /> | |
17 | - <col width="35%" /> | |
18 | - </colgroup> | |
19 | - <tr> | |
20 | - <th class="point-font">기업명</th> | |
21 | - <td>{{ entDscsnAply["entNm"] }}</td> | |
22 | - <th class="point-font">성명</th> | |
23 | - <td>{{ entDscsnAply["aplcntNm"] }}</td> | |
24 | - </tr> | |
25 | - <tr> | |
26 | - <th class="point-font">연락처</th> | |
27 | - <td>{{ entDscsnAply["telno"] }}</td> | |
28 | - <th class="point-font">이메일</th> | |
29 | - <td>{{ entDscsnAply["eml"] }}</td> | |
30 | - </tr> | |
31 | - <tr> | |
32 | - <th class="point-font">첨부파일</th> | |
33 | - <td colspan="3"> | |
34 | - <div v-if="entDscsnAply['fileMngId'] != null"> | |
35 | - <p v-for="(file, index) of fileList" :key="index"> | |
36 | - <a :href="file['absltPath']"> | |
37 | - {{ file["fileNm"] }}.{{ file["extnNm"] }} | |
38 | - </a> | |
39 | - </p> | |
40 | - </div> | |
41 | - <p v-else class="data-none">등록된 첨부파일이 없습니다.</p> | |
42 | - </td> | |
43 | - </tr> | |
44 | - </table> | |
45 | - <div class="gd-12 pd0"> | |
46 | - <label for="" class="point-font mb10" style="font-size: 1.6rem"> | |
47 | - 내용 | |
48 | - </label> | |
49 | - <textarea | |
50 | - class="content" | |
51 | - :value="entDscsnAply['aplyCn']" | |
52 | - disabled | |
53 | - ></textarea> | |
54 | - </div> | |
55 | - </div> | |
56 | - </details> | |
57 | - <details open class="form-table-style mb30"> | |
58 | - <summary class="point-font"> | |
59 | - <p class="summary-style pl10">상담조치내역</p> | |
60 | - </summary> | |
61 | - <div class="pt10 pb10"> | |
62 | - <table class="form-table2 mb10"> | |
63 | - <colgroup> | |
64 | - <col width="15%" /> | |
65 | - <col width="35%" /> | |
66 | - <col width="15%" /> | |
67 | - <col width="35%" /> | |
68 | - </colgroup> | |
69 | - <tr> | |
70 | - <th class="point-font">담당자</th> | |
71 | - <td> | |
72 | - <div class="flex align-center no-gutters"> | |
73 | - <div class="gd-9 mr10"> | |
74 | - <input | |
75 | - type="text" | |
76 | - class="full-input" | |
77 | - ref="clr" | |
78 | - v-model="entDscsnAply['mbrNm']" | |
79 | - placeholder="담당자를 선택하세요." | |
80 | - readonly | |
81 | - /> | |
82 | - </div> | |
83 | - <div class="gd-2"> | |
84 | - <button | |
85 | - class="large-btn blue-border-btn" | |
86 | - @click="fnModalOpen('접수자')" | |
87 | - > | |
88 | - 찾기 | |
89 | - </button> | |
90 | - </div> | |
91 | - </div> | |
92 | - </td> | |
93 | - <th class="point-font">조치일자</th> | |
94 | - <td> | |
95 | - <div class="gd-12"> | |
96 | - <div>{{ entDscsnAply["actnDt"] }}</div> | |
97 | - </div> | |
98 | - </td> | |
99 | - </tr> | |
100 | - </table> | |
101 | - <div class="gd-12 pd0"> | |
102 | - <label for="" class="point-font mb10" style="font-size: 1.6rem"> | |
103 | - 비고 | |
104 | - </label> | |
105 | - <textarea | |
106 | - class="content" | |
107 | - v-model="entDscsnAply['rmrk']" | |
108 | - disabled | |
109 | - ></textarea> | |
110 | - </div> | |
111 | - </div> | |
112 | - </details> | |
113 | - <div class="flex justify-end align-center"> | |
114 | - <div class="gd-1 pr0"> | |
115 | - <button class="large-btn gray-border-btn" @click="fnPrev"> | |
116 | - 목록 | |
117 | - </button> | |
118 | - </div> | |
119 | - <div class="gd-1 pr0"> | |
120 | - <button | |
121 | - class="large-btn blue-btn" | |
122 | - :disabled="isMbrId" | |
123 | - @click="fnUpdate" | |
124 | - > | |
125 | - <span v-if="entDscsnAply['prcsStts'] == 'C'">재배정</span> | |
126 | - <span v-else>배정</span> | |
127 | - </button> | |
128 | - </div> | |
129 | - </div> | |
130 | - </div> | |
131 | - <!-- 모달: 찾기 --> | |
132 | - <Modal :showModal="isOpen"> | |
133 | - <template v-slot:header> | |
134 | - <div class="box-title point-font"> | |
135 | - <p>담당자 선택</p> | |
136 | - </div> | |
137 | - <button class="close-btn" @click="fnModalClose">X</button> | |
138 | - </template> | |
139 | - <table class="form-table2 mb10"> | |
140 | - <colgroup> | |
141 | - <col width="60%" /> | |
142 | - <col width="35%" /> | |
143 | - </colgroup> | |
144 | - <thead> | |
145 | - <tr> | |
146 | - <th class="text-ct">이름</th> | |
147 | - <th class="text-ct">비고</th> | |
148 | - </tr> | |
149 | - </thead> | |
150 | - <tr v-for="(item, index) of modal['list']" :key="index"> | |
151 | - <td>{{ item["name"] }}</td> | |
152 | - <td> | |
153 | - <button | |
154 | - type="button" | |
155 | - class="large-btn blue-btn" | |
156 | - @click="fnModalInsert(item)" | |
157 | - > | |
158 | - 선택 | |
159 | - </button> | |
160 | - </td> | |
161 | - </tr> | |
162 | - </table> | |
163 | - <template v-slot:footer> | |
164 | - <div class="gd-2"></div> | |
165 | - <div class="gd-8"> | |
166 | - <PaginationButton | |
167 | - :className="'admin-pagination'" | |
168 | - v-model:currentPage="modal.pagination.currentPage" | |
169 | - :pagination="modal.pagination" | |
170 | - :click="axiosModalViewList" | |
171 | - /> | |
172 | - </div> | |
173 | - <div class="gd-2"></div> | |
174 | - </template> | |
175 | - </Modal> | |
176 | - </div> | |
177 | -</template> | |
178 | - | |
179 | -<script> | |
180 | -import Modal from "../../../../component/modal/Modal.vue"; | |
181 | -import PaginationButton from "../../../../component/pagination/PaginationButton.vue"; | |
182 | -import { defaultSearchParams } from "../../../../../resources/js/defaultSearchParams"; | |
183 | - | |
184 | -// api | |
185 | -import { | |
186 | - entDscsnAplyDetailProc, | |
187 | - entDscsnAplyUpdate, | |
188 | -} from "../../../../../resources/api/entDscsnAply"; | |
189 | -import { mbrListProc } from "../../../../../resources/api/mbrInfo"; | |
190 | - | |
191 | -export default { | |
192 | - data() { | |
193 | - return { | |
194 | - // id | |
195 | - pageId: this.$route.query.pageId, | |
196 | - | |
197 | - // 상세 조회 정보 담는 객체 | |
198 | - entDscsnAply: {}, | |
199 | - fileList: [], | |
200 | - | |
201 | - isOpen: false, | |
202 | - isMbrId: false, | |
203 | - | |
204 | - // 모달 객체 | |
205 | - modal: { | |
206 | - list: [], | |
207 | - listCount: 0, | |
208 | - pagination: { ...defaultSearchParams }, | |
209 | - }, | |
210 | - }; | |
211 | - }, | |
212 | - created() { | |
213 | - this.fnViewDetail(); | |
214 | - }, | |
215 | - methods: { | |
216 | - // 배정 | |
217 | - fnUpdate() { | |
218 | - this.axiosUpdate(); | |
219 | - }, | |
220 | - // 모달 열기 | |
221 | - fnModalOpen() { | |
222 | - this.isOpen = true; | |
223 | - this.axiosModalViewList(); | |
224 | - }, | |
225 | - // 모달 닫기 | |
226 | - fnModalClose() { | |
227 | - this.isOpen = false; | |
228 | - this.modal = { | |
229 | - title: null, | |
230 | - list: [], | |
231 | - listCount: 0, | |
232 | - pagination: {}, | |
233 | - }; | |
234 | - }, | |
235 | - // 모달 등록 | |
236 | - fnModalInsert(data) { | |
237 | - this.entDscsnAply["mbrNm"] = data["name"]; | |
238 | - this.entDscsnAply["actnPic"] = data["id"]; | |
239 | - this.fnModalClose(); | |
240 | - }, | |
241 | - // 목록 | |
242 | - fnPrev() { | |
243 | - this.$router.push({ | |
244 | - name: "admAdminCompanyConsultSelectList" | |
245 | - }); | |
246 | - }, | |
247 | - | |
248 | - // 조회(상세) | |
249 | - async fnViewDetail() { | |
250 | - // 데이터 세팅 | |
251 | - const data = { entDscsnAplyId: this.pageId }; | |
252 | - // 실행 | |
253 | - try { | |
254 | - const response = await entDscsnAplyDetailProc(data); | |
255 | - this.entDscsnAply = response.data["data"]["entDscsnAply"]; | |
256 | - if ( | |
257 | - response.data["data"]["entDscsnAply"]["mbrNm"] != null && | |
258 | - response.data["data"]["entDscsnAply"]["mbrNm"] != "" | |
259 | - ) { | |
260 | - if (response.data["data"]["entDscsnAply"]["prcsStts"] != "C") { | |
261 | - this.isMbrId = true; | |
262 | - } | |
263 | - } | |
264 | - } catch (error) { | |
265 | - const errorData = error.response.data; | |
266 | - if (errorData.message != null && errorData.message != "") { | |
267 | - alert(error.response.data.message); | |
268 | - } else { | |
269 | - alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); | |
270 | - } | |
271 | - } | |
272 | - }, | |
273 | - // axios: 수정 | |
274 | - async axiosUpdate() { | |
275 | - // 데이터 세팅 | |
276 | - let data = this.entDscsnAply; | |
277 | - if (this.entDscsnAply["prcsStts"] == "C") { | |
278 | - data["prcsStts"] = "N"; | |
279 | - } | |
280 | - // 실행 | |
281 | - try { | |
282 | - const response = await entDscsnAplyUpdate(data); | |
283 | - alert(response.data["message"]); | |
284 | - location.reload(); | |
285 | - } catch (error) { | |
286 | - const errorData = error.response.data; | |
287 | - if (errorData.message != null && errorData.message != "") { | |
288 | - alert(error.response.data.message); | |
289 | - } else { | |
290 | - alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); | |
291 | - } | |
292 | - } | |
293 | - }, | |
294 | - // axios: 조회(목록) | |
295 | - async axiosModalViewList() { | |
296 | - // 데이터 삽입 | |
297 | - const data = { ...this.modal["pagination"], authrtCd: "" }; | |
298 | - // 실행 | |
299 | - try { | |
300 | - const response = await mbrListProc(data); | |
301 | - | |
302 | - let dataList = []; | |
303 | - for (let mbr of response.data["data"]["list"]) { | |
304 | - dataList.push({ | |
305 | - name: mbr["mbrNm"], | |
306 | - id: mbr["mbrId"], | |
307 | - }); | |
308 | - } | |
309 | - this.modal["list"] = dataList; | |
310 | - this.modal["pagination"] = response.data["data"]["pagination"]; | |
311 | - } catch (error) { | |
312 | - const errorData = error.response.data; | |
313 | - if (errorData.message != null && errorData.message != "") { | |
314 | - alert(error.response.data.message); | |
315 | - } else { | |
316 | - alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); | |
317 | - } | |
318 | - } | |
319 | - }, | |
320 | - }, | |
321 | - watch: {}, | |
322 | - computed: {}, | |
323 | - components: { Modal, PaginationButton }, | |
324 | - mounted() {}, | |
325 | -}; | |
326 | -</script>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
... | ... | @@ -159,7 +159,8 @@ |
159 | 159 |
}, |
160 | 160 |
// 유효성 검사 |
161 | 161 |
Validation() { |
162 |
- const ipFilter = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;; |
|
162 |
+ // const ipFilter = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; |
|
163 |
+ const ipFilter = /^(\*|[1-9]?[0-9]|1\d\d|2[0-4]\d|25[0-5])(\.(\*|[1-9]?[0-9]|1\d\d|2[0-4]\d|25[0-5])){3}$/; |
|
163 | 164 |
if (this.accesCtrl.cntrlType == null || this.accesCtrl.cntrlType == '') { |
164 | 165 |
alert('제어 유형을 지정해주세요.'); |
165 | 166 |
return false; |
+++ client/views/pages/user/portal/main/Main.vue
... | ... | @@ -0,0 +1,410 @@ |
1 | +<template> | |
2 | + <div class="content main "> | |
3 | + <div class="w1400"> | |
4 | + <!-- 공지사항 및 배너 --> | |
5 | + <div class="community-zone flex mb30"> | |
6 | + <div class="visual-zone gd-8 pl0"> | |
7 | + <div class="swiper-container"> | |
8 | + <div class="swiper-wrapper"> | |
9 | + <div class="swiper-slide" v-for="(item, index) in visualSlides" :key="index"> | |
10 | + <img :src="item.img" :alt="item.alt" /> | |
11 | + </div> | |
12 | + </div> | |
13 | + </div> | |
14 | + <div class="swiper-pagination"></div> | |
15 | + <div class="swiper-button-prev button"></div> | |
16 | + <div class="swiper-button-next button"></div> | |
17 | + </div> | |
18 | + <div class="gd-4 pr0 "> | |
19 | + | |
20 | + <!-- 검색창 --> | |
21 | + <div class="community-zone mb20"> | |
22 | + <div class="box-out-title flex justify-between align-center"> | |
23 | + | |
24 | + </div> | |
25 | + <div class="search-bar text-ct" tabindex="0"> | |
26 | + <div class="box"> | |
27 | + <p>통합검색</p> | |
28 | + <div class="bar"></div> | |
29 | + <input type="text" class="search-input" placeholder="검색어를 입력하세요." v-model="search.searchText" | |
30 | + @keyup.enter="totalSearch" /> | |
31 | + <button class="icon-button search-button" @click="totalSearch"> | |
32 | + <svg-icon type="mdi" :path="this.$iconPath()" class="search-icon"></svg-icon> | |
33 | + </button> | |
34 | + </div> | |
35 | + </div> | |
36 | + </div> | |
37 | + <div class=""> | |
38 | + | |
39 | + <div class="box-out-title flex justify-between align-center"> | |
40 | + <p>공지사항(목록형)</p> | |
41 | + <router-link to="/government/BBS_MNG_000000000000027/list.page" class=" flex align-center"> | |
42 | + <p class="mr5">바로가기</p> | |
43 | + <svg-icon type="mdi" :width="15" :height="15" :path="this.$iconPath('mdiArrowRight')"></svg-icon> | |
44 | + </router-link> | |
45 | + </div> | |
46 | + <div class="box"> | |
47 | + <div class="tab-nav mb15"> | |
48 | + <ul class="flex align-center" style="gap: 30px;"> | |
49 | + <li v-for="(item, idx) in codeList" :key="idx" :value="item.cd" :class="{ | |
50 | + ' ': true, | |
51 | + activeTab: activeTab === item.cd, | |
52 | + }" @click="showTab(item.cd)"> | |
53 | + <p>{{ item.cdNm }}</p> | |
54 | + </li> | |
55 | + </ul> | |
56 | + </div> | |
57 | + <div class="tab-content"> | |
58 | + <div> | |
59 | + <div class="list_news flex justify-between" style="gap: 20px;"> | |
60 | + <ul> | |
61 | + <li class="leli"> | |
62 | + <a href="" title="천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)">천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)</a> | |
63 | + <span>2025.01.08</span> | |
64 | + </li> | |
65 | + <li class="leli"> | |
66 | + <a href="" title="천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)">천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)</a> | |
67 | + <span>2025.01.08</span> | |
68 | + </li> | |
69 | + <li class="leli"> | |
70 | + <a href="" title="천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)">천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)</a> | |
71 | + <span>2025.01.08</span> | |
72 | + </li> | |
73 | + </ul> | |
74 | + <ul> | |
75 | + <li class="leli"> | |
76 | + <a href="" title="천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)">천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)</a> | |
77 | + <span>2025.01.08</span> | |
78 | + </li> | |
79 | + <li class="leli"> | |
80 | + <a href="" title="천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)">천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)</a> | |
81 | + <span>2025.01.08</span> | |
82 | + </li> | |
83 | + <li class="leli"> | |
84 | + <a href="" title="천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)">천안청년센터 이음 매니저 채용 공고(청년인턴, 청년도전지원사업)</a> | |
85 | + <span>2025.01.08</span> | |
86 | + </li> | |
87 | + </ul> | |
88 | + </div> | |
89 | + </div> | |
90 | + </div> | |
91 | + | |
92 | + </div> | |
93 | + </div> | |
94 | + | |
95 | + </div> | |
96 | + | |
97 | + | |
98 | + </div> | |
99 | + <!-- 바로가기 --> | |
100 | + <div class="community-zone mb20"> | |
101 | + <div class="box-out-title flex justify-between align-center"> | |
102 | + <p>바로가기</p> | |
103 | + </div> | |
104 | + <ul class="quick-link"> | |
105 | + <li><a href="/yeyak.do" target="_blank" title="새창열림" class="link"><i class="icon n1"></i>통합예약</a></li> | |
106 | + <li><a href="/yeyak.do" target="_blank" title="새창열림" class="link"><i class="icon n1"></i>통합예약</a></li> | |
107 | + <li><a href="/yeyak.do" target="_blank" title="새창열림" class="link"><i class="icon n1"></i>통합예약</a></li> | |
108 | + <li><a href="/yeyak.do" target="_blank" title="새창열림" class="link"><i class="icon n1"></i>통합예약</a></li> | |
109 | + <li><a href="/yeyak.do" target="_blank" title="새창열림" class="link"><i class="icon n1"></i>통합예약</a></li> | |
110 | + </ul> | |
111 | + </div> | |
112 | + | |
113 | + | |
114 | + <!-- 배너 --> | |
115 | + <div class="community-zone mb30"> | |
116 | + <div class="best_service"> | |
117 | + <h4><span>BEST1</span><strong>대제목</strong> 1</h4> | |
118 | + <div class="service_wrap"> | |
119 | + <div class="left_cont best1"> | |
120 | + <a href="#"><img src="" alt=""></a> | |
121 | + <div class="txt"> | |
122 | + <span class="label_tag etc_tag">키워드</span> | |
123 | + <h5>부제목</h5> | |
124 | + <div class="sub_info">배너내용</div> | |
125 | + <div class="point_info"><strong>배너내용 강조</strong></div> | |
126 | + </div> | |
127 | + | |
128 | + <!-- <div class="btn_set"> | |
129 | + <a href="" class="btn_small btn_bg_blue">신청하기</a> | |
130 | + | |
131 | + </div> --> | |
132 | + </div> | |
133 | + <div class="right_cont"> | |
134 | + <ul class="product_list"> | |
135 | + <li> | |
136 | + <div class="pdt_info"> | |
137 | + <strong class="pdt_name">제목</strong> | |
138 | + <span class="label_tag blue_tag">키워드</span> | |
139 | + <div class="pdt_simple_info"> | |
140 | + 내용 | |
141 | + </div> | |
142 | + <a href="" class="btn_small btn_bg_green">바로가기</a> | |
143 | + </div> | |
144 | + </li> | |
145 | + <li> | |
146 | + <div class="pdt_info"> | |
147 | + <strong class="pdt_name">제목</strong> | |
148 | + <span class="label_tag blue_tag">키워드</span> | |
149 | + <div class="pdt_simple_info">내용 | |
150 | + </div> | |
151 | + <a href="" class="btn_small btn_bg_green">바로가기</a> | |
152 | + </div> | |
153 | + </li> | |
154 | + <li> | |
155 | + <div class="pdt_info"> | |
156 | + <strong class="pdt_name">제목</strong><span class="label_tag green_tag">키워드</span><span | |
157 | + class="label_tag blue_tag">키워드</span> | |
158 | + <div class="pdt_simple_info">내용</div> | |
159 | + <a href="" class="btn_small btn_bg_blue">신청하기</a> | |
160 | + </div> | |
161 | + </li> | |
162 | + </ul> | |
163 | + </div> | |
164 | + </div> | |
165 | + </div> | |
166 | + </div> | |
167 | + | |
168 | + <!-- 카드뉴스 --> | |
169 | + <div class="cardnews-zone mb30"> | |
170 | + <div class=" "> | |
171 | + <div class="box-out-title flex justify-between align-center"> | |
172 | + <p>카드뉴스</p> | |
173 | + | |
174 | + </div> | |
175 | + <div class="swiper-container"> | |
176 | + <ul class="swiper-wrapper search-list"> | |
177 | + <li class="li box swiper-slide" v-for="(item, index) in slides" :key="index" > | |
178 | + <a :href="item.link"> | |
179 | + <div class="img-wrap" :class="item.imgClass"> | |
180 | + <img :src="item.img" :alt="item.alt" /> | |
181 | + </div> | |
182 | + <div class="conts-wrap"> | |
183 | + <h4 class="tit">{{ item.title }}</h4> | |
184 | + <p class="desc">{{ item.description }}</p> | |
185 | + <div class="full-input flex justify-end"> | |
186 | + <div class="btn-wrap flex align-center"> | |
187 | + <p class="mr5">바로가기</p> | |
188 | + <svg-icon type="mdi" :width="15" :height="15" | |
189 | + :path="this.$iconPath('mdiArrowRight')"></svg-icon> | |
190 | + </div> | |
191 | + </div> | |
192 | + </div> | |
193 | + </a> | |
194 | + </li> | |
195 | + </ul> | |
196 | + </div> | |
197 | + <div class="swiper-button-prev button"></div> | |
198 | + <div class="swiper-button-next button"></div> | |
199 | + | |
200 | + </div> | |
201 | + </div> | |
202 | + | |
203 | + <!-- 배너존 --> | |
204 | + <div class="chart-zone mb30"> | |
205 | + <div class="box-out-title flex justify-between align-center"> | |
206 | + <p>배너</p> | |
207 | + </div> | |
208 | + <div class="banner-zone"> | |
209 | + <div class="banner_txt"> | |
210 | + <span>해당페이지</span> | |
211 | + <!-- 230808 문구 수정 --> | |
212 | + <span class="b_txt"><strong>해당페이지</strong>을 이용해 보세요.</span> | |
213 | + <!-- // 230808 문구 수정 --> | |
214 | + </div> | |
215 | + <a href="" class="btn_link" title="새창열림">바로 체험하기</a> | |
216 | + </div> | |
217 | + </div> | |
218 | + | |
219 | + </div> | |
220 | + </div> | |
221 | + </template> | |
222 | + | |
223 | + <script> | |
224 | + import ClusteredColumnChart from "../../../../component/chart/ClusteredColumnChart.vue"; | |
225 | + import store from "../../../AppStore.js"; | |
226 | + | |
227 | + // 통합검색 관련 | |
228 | + import queryParams from "../../../../../resources/js/queryParams.js"; | |
229 | + import { defaultTotalSearchParams } from "../../../../../resources/js/defaultTotalSearchParams.js"; | |
230 | + | |
231 | + // API | |
232 | + import { sysListByPageProc } from "../../../../../resources/api/popup.js"; | |
233 | + import Swiper from 'swiper'; | |
234 | + | |
235 | + export default { | |
236 | + name: 'SwiperComponent', | |
237 | + mixins: [queryParams], | |
238 | + components: { | |
239 | + ClusteredColumnChart: ClusteredColumnChart, | |
240 | + }, | |
241 | + data() { | |
242 | + return { | |
243 | + visualSlides: [ | |
244 | + { img: '', alt: 'Slide 1' }, | |
245 | + { img: '', alt: 'Slide 2' }, | |
246 | + { img: '', alt: 'Slide 3' }, | |
247 | + ], | |
248 | + slides: [ | |
249 | + { | |
250 | + img: '', | |
251 | + alt: 'Slide 1', | |
252 | + title: '컴포넌트 1', | |
253 | + description: '디지털 정부서비스 UI를 구성하는 공통 요소 기반으로 일관성 있는 구현이 용이한 컴포넌트 가이드디지털 정부서비스 UI를 구성하는 공통 요소 기반으로 일관성 있는 구현이 용이한 컴포넌트 가이드디지털 정부서비스 UI를 구성하는 공통 요소 기반으로 일관성 있는 구현이 용이한 컴포넌트 가이드디지털 정부서비스 UI를 구성하는 공통 요소 기반으로 일관성 있는 구현이 용이한 컴포넌트 가이드', | |
254 | + link: '', | |
255 | + imgClass: 'main_1' // 각 슬라이드에 고유한 클래스 적용 | |
256 | + }, | |
257 | + { | |
258 | + img: '', | |
259 | + alt: 'Slide 2', | |
260 | + title: '컴포넌트 2', | |
261 | + description: '두 번째 컴포넌트 설명', | |
262 | + link: '', | |
263 | + imgClass: 'main_2' | |
264 | + }, | |
265 | + { | |
266 | + img: '', | |
267 | + alt: 'Slide 3', | |
268 | + title: '컴포넌트 3', | |
269 | + description: '세 번째 컴포넌트 설명', | |
270 | + link: '', | |
271 | + imgClass: 'main_3' | |
272 | + } | |
273 | + ], | |
274 | + search: { ...defaultTotalSearchParams }, | |
275 | + mbrId: store.state.mbrId || null, // 사용자 아이디 | |
276 | + roles: store.state.roles.map((auth) => auth.authority) || [], // 사용자 권한 | |
277 | + menuType: store.state.userType || null, // 메뉴 타입 | |
278 | + | |
279 | + // 공지사항 top5 | |
280 | + noticeTop5: [], | |
281 | + | |
282 | + // 검색조건 | |
283 | + codeList: [], | |
284 | + activeTab: "categoryTab", | |
285 | + searchKeyword: "day", | |
286 | + | |
287 | + // 통계 | |
288 | + chartData: [], | |
289 | + | |
290 | + popupList: [], | |
291 | + | |
292 | + // 기업정보 | |
293 | + companyInfoList: [], | |
294 | + }; | |
295 | + }, | |
296 | + created() { | |
297 | + // 쿠키 초기화 | |
298 | + const today = new Date(); | |
299 | + let tomorrow = new Date(today.setDate(today.getDate() + 1)); | |
300 | + tomorrow.setHours(0, 0, 0, 0); | |
301 | + tomorrow = new Date(tomorrow); | |
302 | + if (this.$cookies.get("popup") == null) { | |
303 | + this.$cookies.set("popup", [], tomorrow); | |
304 | + } | |
305 | + | |
306 | + this.fnPopupList(); | |
307 | + }, | |
308 | + methods: { | |
309 | + | |
310 | + | |
311 | + showTab: function (tabName) { | |
312 | + this.activeTab = tabName; | |
313 | + this.searchKeyword = "day"; | |
314 | + }, | |
315 | + | |
316 | + // 통합검색 | |
317 | + totalSearch() { | |
318 | + if (this.search.searchText === "") { | |
319 | + alert("검색어를 입력해주세요."); | |
320 | + return; | |
321 | + } | |
322 | + this.search.mbrId = this.mbrId; | |
323 | + this.search.roles = this.roles; | |
324 | + this.search.menuType = this.menuType; | |
325 | + this.saveQueryParams("totalSearchQueryParams", this.search); // 검색조건 저장 | |
326 | + this.$router.push({ | |
327 | + path: "/government/search.page", | |
328 | + }); | |
329 | + }, | |
330 | + | |
331 | + // 팝업조회(상세) | |
332 | + async fnPopupList() { | |
333 | + let data = { | |
334 | + pageType: this.$store.state.userType, | |
335 | + }; | |
336 | + try { | |
337 | + const response = await sysListByPageProc(data); | |
338 | + let popupList = response.data.data; | |
339 | + if (popupList != null && popupList.length > 0) { | |
340 | + this.fnShowPopup(popupList); | |
341 | + } | |
342 | + } catch (error) { | |
343 | + alert("에러가 발생했습니다.\n시스템관리자에게 문의하세요."); | |
344 | + } | |
345 | + }, | |
346 | + // 팝업 표시 | |
347 | + fnShowPopup(popupList) { | |
348 | + for (let popup of popupList) { | |
349 | + let count = false; | |
350 | + const popupCookies = this.$cookies.get("popup"); | |
351 | + if (popupCookies.length > 0) { | |
352 | + for (let cookie of popupCookies) { | |
353 | + if (popup.popupId == cookie) { | |
354 | + count = true; | |
355 | + } | |
356 | + } | |
357 | + } | |
358 | + if (!count) { | |
359 | + let size = "width=" + popup.wdthLen + ", height=" + popup.vrtcLen; | |
360 | + window.open( | |
361 | + "/cmmn/popup.page?popupId=" + popup.popupId, | |
362 | + "_blank", | |
363 | + size + ", scrollbars=no, resizable=no, toolbars=no, menubar=no" | |
364 | + ); | |
365 | + } | |
366 | + } | |
367 | + }, | |
368 | + stopAutoplay() { | |
369 | + if (this.visualSlide) { | |
370 | + this.visualSlide.autoplay.stop(); | |
371 | + } | |
372 | + }, | |
373 | + // 자동 슬라이드 전환 시작하기 | |
374 | + startAutoplay() { | |
375 | + if (this.visualSlide) { | |
376 | + this.visualSlide.autoplay.start(); | |
377 | + this.visualSlide.update(); | |
378 | + } | |
379 | + }, | |
380 | + }, | |
381 | + mounted() { | |
382 | + // Swiper 인스턴스 초기화 | |
383 | + this.visualSlide = new Swiper('.visual-zone .swiper-container', { | |
384 | + loop: true, // 슬라이드 반복 여부 | |
385 | + autoplay: { | |
386 | + delay: 2500, // 2.5초마다 자동으로 슬라이드 전환 | |
387 | + disableOnInteraction: false, // 사용자가 슬라이드 조작 후에도 자동 전환 유지 | |
388 | + }, | |
389 | + pagination: { | |
390 | + el: '.swiper-pagination', // 페이지네이션 요소 | |
391 | + clickable: true, // 페이지네이션 클릭 가능 | |
392 | + }, | |
393 | + navigation: { | |
394 | + nextEl: '.swiper-button-next', // 다음 버튼 | |
395 | + prevEl: '.swiper-button-prev', // 이전 버튼 | |
396 | + }, | |
397 | + }); | |
398 | + this.cardnewsSlide = new Swiper('.cardnews-zone .swiper-container', { | |
399 | + loop: true, // 슬라이드 반복 여부 | |
400 | + slidesPerView: 3, // 한 번에 보여줄 슬라이드 개수 | |
401 | + spaceBetween: 25, | |
402 | + navigation: { | |
403 | + nextEl: '.swiper-button-next', // 다음 버튼 | |
404 | + prevEl: '.swiper-button-prev', // 이전 버튼 | |
405 | + }, | |
406 | + }); | |
407 | + } | |
408 | + }; | |
409 | + </script> | |
410 | + (파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/user/portal/search/Search.vue
... | ... | @@ -0,0 +1,367 @@ |
1 | +<template> | |
2 | + <div class="content pt50 pb50"> | |
3 | + <div class="w1400"> | |
4 | + <div class="search-bar mb30"> | |
5 | + <input type="text" class="full-input search-input" placeholder="검색어를 입력하세요." v-model="inputSearchText" @keyup.enter="totalSearch"/> | |
6 | + <button class="icon-button search-button" @click="totalSearch"> | |
7 | + <svg-icon type="mdi" :path="this.$iconPath()" class="search-icon"></svg-icon> | |
8 | + </button> | |
9 | + </div> | |
10 | + <div class="search-content"> | |
11 | + <p class="mb30 box-title"><strong>{{ search.searchText }}</strong>에 대한 <strong class="red-text">총 {{ totalCount }}</strong>건의 검색결과를 | |
12 | + 찾았습니다.</p> | |
13 | + <ul> | |
14 | + <li class="mb30" v-for="(item, idx) in pageList" :key="idx"> | |
15 | + <div class="border background radius pd10"> | |
16 | + <p class="chart-title">{{ item.fullMenuNm }} ({{ item.totalListCount }}건)</p> | |
17 | + </div> | |
18 | + <ul class="mb10"> | |
19 | + <li class="pd10 border-b" v-for="(subItem, subIdx) in item.previewList" @click="fnView(item, subItem)" style="cursor: pointer;" :key="subIdx"> | |
20 | + <div class="flex justify-start align-center mb10"> | |
21 | + <div v-if="subItem.title != null && subItem.title != ''" class="gd-10"> | |
22 | + <p class="detail-bold ">{{ subItem.title }}</p> | |
23 | + </div> | |
24 | + <div v-else class="gd-10"> | |
25 | + <p class="detail-bold ">Q.</p> | |
26 | + </div> | |
27 | + <div class="gd-2"> | |
28 | + <p class="date-text text-rg">{{ subItem.regDt }}</p> | |
29 | + </div> | |
30 | + </div> | |
31 | + <div class="content-warp gd-12"> | |
32 | + <p class="date-text">{{ subItem.content }}</p> | |
33 | + </div> | |
34 | + </li> | |
35 | + </ul> | |
36 | + <div v-show="item.totalListCount > 5" class="flex justify-end align-center no-gutters"> | |
37 | + <div class="gd-1"> | |
38 | + <button class="large-btn darkg-border-btn" @click="fnViewList(item)" style="cursor: pointer;">더보기 <svg-icon type="mdi" | |
39 | + :path="path"></svg-icon></button> | |
40 | + </div> | |
41 | + </div> | |
42 | + </li> | |
43 | + <!-- <li class="mb30"> | |
44 | + <div class="border background radius pd10"> | |
45 | + <p class="chart-title">기업정보(메뉴명)</p> | |
46 | + </div> | |
47 | + <ul class="mb10"> | |
48 | + <li class="pd10 border-b"> | |
49 | + <div class="flex justify-start align-center mb10"> | |
50 | + <div class="gd-10"> | |
51 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
52 | + </div> | |
53 | + <div class="gd-2"> | |
54 | + <p class="date-text text-rg">2024-05-02</p> | |
55 | + </div> | |
56 | + </div> | |
57 | + <div class="content-warp gd-12"> | |
58 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
59 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
60 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
61 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
62 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
63 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
64 | + </div> | |
65 | + </li> | |
66 | + <li class="pd10 border-b"> | |
67 | + <div class="flex justify-start align-center mb10"> | |
68 | + <div class="gd-10"> | |
69 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
70 | + </div> | |
71 | + <div class="gd-2"> | |
72 | + <p class="date-text text-rg">2024-05-02</p> | |
73 | + </div> | |
74 | + </div> | |
75 | + <div class="content-warp gd-12"> | |
76 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
77 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
78 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
79 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
80 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
81 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
82 | + </div> | |
83 | + </li> | |
84 | + <li class="pd10 border-b"> | |
85 | + <div class="flex justify-start align-center mb10"> | |
86 | + <div class="gd-10"> | |
87 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
88 | + </div> | |
89 | + <div class="gd-2"> | |
90 | + <p class="date-text text-rg">2024-05-02</p> | |
91 | + </div> | |
92 | + </div> | |
93 | + <div class="content-warp gd-12"> | |
94 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
95 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
96 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
97 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
98 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
99 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
100 | + </div> | |
101 | + </li> | |
102 | + <li class="pd10 border-b"> | |
103 | + <div class="flex justify-start align-center mb10"> | |
104 | + <div class="gd-10"> | |
105 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
106 | + </div> | |
107 | + <div class="gd-2"> | |
108 | + <p class="date-text text-rg">2024-05-02</p> | |
109 | + </div> | |
110 | + </div> | |
111 | + <div class="content-warp gd-12"> | |
112 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
113 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
114 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
115 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
116 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
117 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
118 | + </div> | |
119 | + </li> | |
120 | + <li class="pd10 border-b"> | |
121 | + <div class="flex justify-start align-center mb10"> | |
122 | + <div class="gd-10"> | |
123 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
124 | + </div> | |
125 | + <div class="gd-2"> | |
126 | + <p class="date-text text-rg">2024-05-02</p> | |
127 | + </div> | |
128 | + </div> | |
129 | + <div class="content-warp gd-12"> | |
130 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
131 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
132 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
133 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
134 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
135 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
136 | + </div> | |
137 | + </li> | |
138 | + </ul> | |
139 | + <div class="flex justify-end align-center no-gutters"> | |
140 | + <div class="gd-1"> | |
141 | + <button class="large-btn darkg-border-btn">더보기 <svg-icon type="mdi" | |
142 | + :path="path"></svg-icon></button> | |
143 | + </div> | |
144 | + </div> | |
145 | + </li> | |
146 | + <li class="mb30"> | |
147 | + <div class="border background radius pd10"> | |
148 | + <p class="chart-title">기업정보(메뉴명)</p> | |
149 | + </div> | |
150 | + <ul class="mb10"> | |
151 | + <li class="pd10 border-b"> | |
152 | + <div class="flex justify-start align-center mb10"> | |
153 | + <div class="gd-10"> | |
154 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
155 | + </div> | |
156 | + <div class="gd-2"> | |
157 | + <p class="date-text text-rg">2024-05-02</p> | |
158 | + </div> | |
159 | + </div> | |
160 | + <div class="content-warp gd-12"> | |
161 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
162 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
163 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
164 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
165 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
166 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
167 | + </div> | |
168 | + </li> | |
169 | + <li class="pd10 border-b"> | |
170 | + <div class="flex justify-start align-center mb10"> | |
171 | + <div class="gd-10"> | |
172 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
173 | + </div> | |
174 | + <div class="gd-2"> | |
175 | + <p class="date-text text-rg">2024-05-02</p> | |
176 | + </div> | |
177 | + </div> | |
178 | + <div class="content-warp gd-12"> | |
179 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
180 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
181 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
182 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
183 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
184 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
185 | + </div> | |
186 | + </li> | |
187 | + <li class="pd10 border-b"> | |
188 | + <div class="flex justify-start align-center mb10"> | |
189 | + <div class="gd-10"> | |
190 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
191 | + </div> | |
192 | + <div class="gd-2"> | |
193 | + <p class="date-text text-rg">2024-05-02</p> | |
194 | + </div> | |
195 | + </div> | |
196 | + <div class="content-warp gd-12"> | |
197 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
198 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
199 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
200 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
201 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
202 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
203 | + </div> | |
204 | + </li> | |
205 | + <li class="pd10 border-b"> | |
206 | + <div class="flex justify-start align-center mb10"> | |
207 | + <div class="gd-10"> | |
208 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
209 | + </div> | |
210 | + <div class="gd-2"> | |
211 | + <p class="date-text text-rg">2024-05-02</p> | |
212 | + </div> | |
213 | + </div> | |
214 | + <div class="content-warp gd-12"> | |
215 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
216 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
217 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
218 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
219 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
220 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
221 | + </div> | |
222 | + </li> | |
223 | + <li class="pd10 border-b"> | |
224 | + <div class="flex justify-start align-center mb10"> | |
225 | + <div class="gd-10"> | |
226 | + <p class="detail-bold ">검색내용에 대한 제목</p> | |
227 | + </div> | |
228 | + <div class="gd-2"> | |
229 | + <p class="date-text text-rg">2024-05-02</p> | |
230 | + </div> | |
231 | + </div> | |
232 | + <div class="content-warp gd-12"> | |
233 | + <p class="date-text">수행방법 8 2. 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) | |
234 | + 네이버 이슈 9 2) 네이버 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 | |
235 | + 분석 21 1) 네이버 21 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어수행방법 8 2. | |
236 | + 인터넷 검색어‘한옥기술’빅데이터 분석 9 1) 네이버 뉴스‘한옥기술’검색어의 주요 이슈 9 2) 네이버 이슈 9 2) 네이버 | |
237 | + 블로그‘한옥기술’검색어의 주요 이슈 16 3) 한옥기술의 인식 변화 20 3. 인터넷 검색어‘한옥 건축비’빅데이터 분석 21 1) 네이버21 | |
238 | + 1) 네이버 뉴스‘한옥 건축비’검색어의 주요 이슈 21 2) 네이버 블로그‘한옥 건축비’검색어</p> | |
239 | + </div> | |
240 | + </li> | |
241 | + </ul> | |
242 | + <div class="flex justify-end align-center no-gutters"> | |
243 | + <div class="gd-1"> | |
244 | + <button class="large-btn darkg-border-btn">더보기 <svg-icon type="mdi" | |
245 | + :path="path"></svg-icon></button> | |
246 | + </div> | |
247 | + </div> | |
248 | + </li> --> | |
249 | + </ul> | |
250 | + </div> | |
251 | + </div> | |
252 | + </div> | |
253 | +</template> | |
254 | + | |
255 | +<script> | |
256 | +import { toRaw } from 'vue' | |
257 | +import store from "../../../AppStore"; | |
258 | +import { mdiArrowRightDropCircleOutline } from '@mdi/js'; | |
259 | +import queryParams from '../../../../../resources/js/queryParams'; | |
260 | +import { defaultTotalSearchParams } from "../../../../../resources/js/defaultTotalSearchParams.js" | |
261 | +import { searchAll } from "../../../../../resources/api/search.js"; | |
262 | + | |
263 | +import { defaultSearchParams } from "../../../../../resources/js/defaultSearchParams.js" | |
264 | + | |
265 | +export default { | |
266 | + mixins: [queryParams], | |
267 | + data() { | |
268 | + return { | |
269 | + path: mdiArrowRightDropCircleOutline, | |
270 | + search: { ...defaultTotalSearchParams }, | |
271 | + pageSearch: { ...defaultSearchParams }, | |
272 | + mbrId: store.state.mbrId || null, // 사용자 아이디 | |
273 | + roles: store.state.roles.map(auth => auth.authority) || [], // 사용자 권한 | |
274 | + menuType: store.state.userType || null, // 메뉴 타입 | |
275 | + inputSearchText: '', | |
276 | + totalCount: 0, | |
277 | + menuCount: 0, | |
278 | + menuList: [], | |
279 | + pageCount: 0, | |
280 | + pageList: [], | |
281 | + | |
282 | + } | |
283 | + }, | |
284 | + created() { | |
285 | + this.resotreQueryParams('totalSearchQueryParams'); | |
286 | + this.checkSearchText(); | |
287 | + }, | |
288 | + methods: { | |
289 | + // 검색어 확인 | |
290 | + checkSearchText() { | |
291 | + if(this.search.searchText !== "") { | |
292 | + this.inputSearchText = this.search.searchText; | |
293 | + this.totalSearch(); | |
294 | + } | |
295 | + }, | |
296 | + | |
297 | + // 통합 검색 | |
298 | + async totalSearch() { | |
299 | + if(this.search.searchText === "") { | |
300 | + alert("검색어를 입력해주세요."); | |
301 | + return; | |
302 | + } | |
303 | + this.search.searchText = this.inputSearchText | |
304 | + this.search.mbrId = this.mbrId; | |
305 | + this.search.roles = this.roles; | |
306 | + this.search.menuType = this.menuType; | |
307 | + this.saveQueryParams('totalSearchQueryParams', this.search); // 검색조건 저장 | |
308 | + try { | |
309 | + const res = await searchAll(toRaw(this.search)); | |
310 | + this.menuCount = res.data.data.menuCount; | |
311 | + this.menuList = res.data.data.menuList; | |
312 | + this.pageCount = res.data.data.pageCount; | |
313 | + this.pageList = res.data.data.pageList; | |
314 | + this.totalCount = this.menuCount + this.pageCount; | |
315 | + } catch (error) { | |
316 | + alert('에러가 발생했습니다.\n시스템관리자에게 문의하세요.'); | |
317 | + } | |
318 | + }, | |
319 | + | |
320 | + // 메뉴 목록으로 이동 | |
321 | + fnViewList(item) { | |
322 | + this.$router.push({ | |
323 | + path: item.routerUrl | |
324 | + }); | |
325 | + }, | |
326 | + | |
327 | + // 메뉴 상세 조회로 이동 | |
328 | + fnView(item, subItem) { | |
329 | + let menuPath = null; | |
330 | + if(item.routerUrl.includes('.page')) { | |
331 | + const lastSlashIndex = item.routerUrl.lastIndexOf('/'); // 마지막 '/' 인덱스 | |
332 | + menuPath = item.routerUrl.substring(0, lastSlashIndex) ; // 마지막 '/' 이전 경로 | |
333 | + } | |
334 | + | |
335 | + // 페이지 검색 조건 저장 | |
336 | + this.pageSearch.searchText = this.search.searchText; | |
337 | + this.saveQueryParams('queryParams', this.pageSearch); // 검색조건 저장 | |
338 | + | |
339 | + // 일반 검색 결과 | |
340 | + if(subItem.title != null && subItem.title != '') { | |
341 | + this.$router.push({ | |
342 | + path: menuPath + '/view.page', | |
343 | + query: { | |
344 | + pageId: subItem.pageId | |
345 | + }, | |
346 | + }); | |
347 | + } | |
348 | + // 질의형 검색 결과 | |
349 | + else { | |
350 | + this.$router.push({ | |
351 | + path: item.routerUrl | |
352 | + }); | |
353 | + } | |
354 | + }, | |
355 | + }, | |
356 | + watch: { | |
357 | + | |
358 | + }, | |
359 | + computed: { | |
360 | + | |
361 | + }, | |
362 | + components: { | |
363 | + }, | |
364 | + mounted() { | |
365 | + } | |
366 | +} | |
367 | +</script> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?