
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
... | ... | @@ -32,7 +32,6 @@ |
32 | 32 |
methods: {}, |
33 | 33 |
watch: { |
34 | 34 |
$route(to, from) { |
35 |
- console.log("to", to); |
|
36 | 35 |
this.path = to.path; |
37 | 36 |
}, |
38 | 37 |
}, |
--- client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
+++ client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
... | ... | @@ -65,6 +65,7 @@ |
65 | 65 |
<ul style="height:calc(100% - 118px)" class="overflow-y"> |
66 | 66 |
<li v-for="(item, index) in wordsArr" class="word-item pd10 border radius mb5" :key="index"> |
67 | 67 |
{{ item }} |
68 |
+ <span class="close-btn ml10" @click="wordsArr.splice(index, 1)">x</span> |
|
68 | 69 |
</li> |
69 | 70 |
</ul> |
70 | 71 |
<template v-slot:footer> |
--- client/views/pages/adm/statistics/CompanyMenuStatistics.vue
... | ... | @@ -1,238 +0,0 @@ |
1 | -<template> | |
2 | - <div class="content admin-style overflow-y"> | |
3 | - <div class="admin-page-title point-font2 mb30"> | |
4 | - <p>메뉴별 접속 통계</p> | |
5 | - </div> | |
6 | - <div class="flex justify-between aling-center no-gutters mb30"> | |
7 | - <div class="gd-6 flex justify-start align-center"> | |
8 | - <div class="gd-4 pl0"> | |
9 | - <input | |
10 | - type="date" | |
11 | - class="full-input" | |
12 | - v-model="searchDate.startDt" | |
13 | - @change="validateDate($event, 'startDt')" | |
14 | - /> | |
15 | - </div> | |
16 | - <div>-</div> | |
17 | - <div class="gd-4"> | |
18 | - <input | |
19 | - type="date" | |
20 | - class="full-input" | |
21 | - v-model="searchDate.endDt" | |
22 | - @change="validateDate($event, 'endDt')" | |
23 | - /> | |
24 | - </div> | |
25 | - <div class="gd-2"> | |
26 | - <button class="large-btn blue-border-btn" @click="axiosSelectList"> | |
27 | - 조회 | |
28 | - </button> | |
29 | - </div> | |
30 | - </div> | |
31 | - <div class="gd-1"> | |
32 | - <button | |
33 | - class="large-btn green-border-btn" | |
34 | - v-if="pageAuth.fileDwnldAuthrt == 'Y'" | |
35 | - @click="fnDownload" | |
36 | - > | |
37 | - 다운로드 | |
38 | - </button> | |
39 | - </div> | |
40 | - </div> | |
41 | - <div class="chart-zone mb30" v-show="menuCnt > 0"> | |
42 | - <div class="chart-info"> | |
43 | - <p class="detail-text"> | |
44 | - 방문자 총 | |
45 | - <span class="detail-bold blue">{{ totalCnt }}</span> | |
46 | - 명 | |
47 | - </p> | |
48 | - </div> | |
49 | - <div class="chart-wrap" ref="chartdiv" :style="heightStyle"> | |
50 | - <ClusteredBarChart :chartData="chartData" columnX="menu" /> | |
51 | - </div> | |
52 | - </div> | |
53 | - <div class="table-zone"> | |
54 | - <table class="list-table admin-list complex-table"> | |
55 | - <colgroup> | |
56 | - <col width="25%" /> | |
57 | - <col width="25%" /> | |
58 | - <col width="25%" /> | |
59 | - <col width="25%" /> | |
60 | - </colgroup> | |
61 | - <thead> | |
62 | - <tr> | |
63 | - <th rowspan="2">구분</th> | |
64 | - <th colspan="3">사용자 구분</th> | |
65 | - </tr> | |
66 | - <tr> | |
67 | - <th class="text-ct">관리자</th> | |
68 | - <th class="text-ct">사용자</th> | |
69 | - <th class="text-ct">비로그인 사용자</th> | |
70 | - </tr> | |
71 | - </thead> | |
72 | - <tbody> | |
73 | - <template v-if="menuCnt > 0"> | |
74 | - <tr v-for="(tr, index) of chartData" :key="index"> | |
75 | - <td class="text-ct">{{ tr.menu }}</td> | |
76 | - <td class="text-rg">{{ tr["관리자"] }}</td> | |
77 | - <td class="text-rg">{{ tr["사용자"] }}</td> | |
78 | - <td class="text-rg">{{ tr["비로그인 사용자"] }}</td> | |
79 | - </tr> | |
80 | - </template> | |
81 | - <template v-else> | |
82 | - <tr> | |
83 | - <td colspan="4" class="text-ct"> | |
84 | - 등록된 정보가 존재하지 않습니다. | |
85 | - </td> | |
86 | - </tr> | |
87 | - </template> | |
88 | - </tbody> | |
89 | - </table> | |
90 | - </div> | |
91 | - </div> | |
92 | -</template> | |
93 | -<script> | |
94 | -import defaultAxios from "../../../../resources/js/defaultAxios"; | |
95 | -import html2canvas from "html2canvas"; | |
96 | -import ClusteredBarChart from "../../../component/chart/ClusteredBarChart.vue"; | |
97 | -import statisticsDate from "../../../../resources/js/defaultDateParams"; | |
98 | - | |
99 | -// API | |
100 | -import { selectMenuCntnStatsProc } from "../../../../resources/api/cntnStats"; | |
101 | - | |
102 | -export default { | |
103 | - mixins: [statisticsDate], | |
104 | - components: { | |
105 | - ClusteredBarChart: ClusteredBarChart, | |
106 | - }, | |
107 | - data() { | |
108 | - return { | |
109 | - // 페이지 권한 객체 | |
110 | - pageAuth: JSON.parse(localStorage.getItem("vuex")).pageAuth, | |
111 | - // 차트 데이터 | |
112 | - chartData: [], | |
113 | - // 전체 수 | |
114 | - totalCnt: 0, | |
115 | - // 메뉴 수 | |
116 | - menuCnt: 0, | |
117 | - // 차트 높이 스타일 | |
118 | - heightStyle: {}, | |
119 | - }; | |
120 | - }, | |
121 | - created() { | |
122 | - this.axiosSelectList(); | |
123 | - }, | |
124 | - methods: { | |
125 | - // 메뉴별 접속 통계 | |
126 | - async axiosSelectList() { | |
127 | - // 유효성 검사 | |
128 | - if (this.searchDate.startDt == null || this.searchDate.startDt == "") { | |
129 | - alert("시작일을 선택하세요."); | |
130 | - this.searchDate.startDt = null; | |
131 | - return; | |
132 | - } | |
133 | - if (this.searchDate.endDt == null || this.searchDate.endDt == "") { | |
134 | - alert("종료일을 선택하세요."); | |
135 | - this.searchDate.endDt = null; | |
136 | - return; | |
137 | - } | |
138 | - // 데이터 세팅 | |
139 | - let data = this.searchDate; | |
140 | - data["menuMainDepth"] = "MENU_000000000000002"; | |
141 | - data["startDt"] = this.dateFormat(new Date(data["startDt"])); | |
142 | - data["endDt"] = this.dateFormat(new Date(data["endDt"])); | |
143 | - // 실행 | |
144 | - try { | |
145 | - const response = await selectMenuCntnStatsProc(data); | |
146 | - let datas = []; | |
147 | - for (let data of response.data.data.list) { | |
148 | - let newData = {}; | |
149 | - newData["menu"] = data["menu_name"]; | |
150 | - for (let i = 0; i < data["authrt_nm"].length; i++) { | |
151 | - newData[data["authrt_nm"][i]] = data["cntn_nope"][i]; | |
152 | - } | |
153 | - datas.push(newData); | |
154 | - } | |
155 | - this.chartData = datas; | |
156 | - this.totalCnt = response.data.data.totalCnt; | |
157 | - this.heightStyle = { | |
158 | - height: 100 + 100 * datas.length + "px", | |
159 | - }; | |
160 | - this.menuCnt = response.data.data.menuCnt; | |
161 | - } catch (error) { | |
162 | - alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); | |
163 | - } | |
164 | - }, | |
165 | - | |
166 | - // 다운로드 | |
167 | - fnDownload() { | |
168 | - const vm = this; | |
169 | - const chartdiv = vm.$refs.chartdiv; | |
170 | - html2canvas(chartdiv).then(function (canvas) { | |
171 | - // 데이터 세팅 | |
172 | - let cntnStats = []; | |
173 | - for (let item of vm.chartData) { | |
174 | - cntnStats.push({ | |
175 | - date: item.menu, | |
176 | - admin: item["관리자"], | |
177 | - user: item["사용자"], | |
178 | - none: item["비로그인 사용자"], | |
179 | - }); | |
180 | - } | |
181 | - // 폼데이터 | |
182 | - var formData = new FormData(); | |
183 | - const cntnStatsToBlob = new Blob([JSON.stringify(cntnStats)], { | |
184 | - type: "application/json; charset=UTF-8", | |
185 | - }); | |
186 | - formData.append("cntnStats", cntnStatsToBlob); | |
187 | - let imageData = canvas.toDataURL("image/png"); | |
188 | - imageData.replace("data:image/png; base64, ", ""); | |
189 | - const chartToBlob = new Blob([imageData], { | |
190 | - type: "application/json; charset=UTF-8", | |
191 | - }); | |
192 | - formData.append("chart", chartToBlob); | |
193 | - // 실행 | |
194 | - defaultAxios({ | |
195 | - url: "/sys/cntnStats/excelDownload.file", | |
196 | - method: "post", | |
197 | - headers: { | |
198 | - "Content-Type": "multipart/form-data; charset=UTF-8", | |
199 | - Authorization: vm.$store.state.authorization, | |
200 | - }, | |
201 | - data: formData, | |
202 | - responseType: "blob", | |
203 | - }) | |
204 | - .then((response) => { | |
205 | - const url = window.URL.createObjectURL( | |
206 | - new Blob([response.data], { | |
207 | - type: response.headers["content-type"], | |
208 | - }) | |
209 | - ); | |
210 | - | |
211 | - let today = new Date().toISOString().substring(2, 10); | |
212 | - today = today.replace(/[^0-9]/g, ""); | |
213 | - | |
214 | - const link = document.createElement("a"); | |
215 | - link.href = url; | |
216 | - link.setAttribute( | |
217 | - "download", | |
218 | - `[${today}]메뉴별접속통계(기업용)_${vm.searchDate.startDt}_${vm.searchDate.endDt}.xlsx` | |
219 | - ); | |
220 | - document.body.appendChild(link); | |
221 | - link.click(); | |
222 | - document.body.removeChild(link); | |
223 | - window.URL.revokeObjectURL(url); | |
224 | - }) | |
225 | - .catch((error) => { | |
226 | - alert("에러가 발생했습니다.\n관리자에게 문의해주세요."); | |
227 | - }); | |
228 | - }); | |
229 | - }, | |
230 | - }, | |
231 | -}; | |
232 | -</script> | |
233 | - | |
234 | -<style scoped> | |
235 | -.chart-wrap { | |
236 | - height: 1000px; | |
237 | -} | |
238 | -</style>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/adm/statistics/GovernmentMenuStatistics.vue
+++ client/views/pages/adm/statistics/MenuStatistics.vue
... | ... | @@ -137,7 +137,7 @@ |
137 | 137 |
} |
138 | 138 |
// 데이터 세팅 |
139 | 139 |
let data = this.searchDate; |
140 |
- data["menuMainDepth"] = "MENU_000000000000003"; |
|
140 |
+ data["menuMainDepth"] = "MENU_000000000000002"; |
|
141 | 141 |
data["startDt"] = this.dateFormat(new Date(data["startDt"])); |
142 | 142 |
data["endDt"] = this.dateFormat(new Date(data["endDt"])); |
143 | 143 |
// 실행 |
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?