
--- client/resources/css/common.css
+++ client/resources/css/common.css
... | ... | @@ -146,10 +146,60 @@ |
146 | 146 |
margin-left: 32rem !important; |
147 | 147 |
} |
148 | 148 |
|
149 |
-.m-b{margin-bottom: 0.5rem;} |
|
149 |
+.m-b{margin-bottom: 1rem;} |
|
150 | 150 |
.m-r{margin-right: 1rem;} |
151 |
- |
|
151 |
+.gap{gap: 1rem;} |
|
152 | 152 |
button{padding: 0.3rem 2rem;} |
153 | 153 |
.btn-l{width: -webkit-fill-available;} |
154 | 154 |
.green-btn{background: #13833b; border: 0; border-radius: 5px; color: #fff;} |
155 |
-.gray-btn{background: #f9f9f9; border: 1px solid #c8c5c5; border-radius: 5px;}(No newline at end of file) |
|
155 |
+.gray-btn{background: #f9f9f9; border: 1px solid #c8c5c5; border-radius: 5px;} |
|
156 |
+ |
|
157 |
+ |
|
158 |
+/*스크롤바디자인*/ |
|
159 |
+::-webkit-scrollbar { |
|
160 |
+ width: 8px; |
|
161 |
+} |
|
162 |
+::-webkit-scrollbar-thumb { |
|
163 |
+ background-color: #c4c7cc; |
|
164 |
+ border-radius: 10px; |
|
165 |
+} |
|
166 |
+::-webkit-scrollbar-track { |
|
167 |
+ background-color: #eef3fa; |
|
168 |
+ border-radius: 10px; |
|
169 |
+} |
|
170 |
+ |
|
171 |
+/* 모달 */ |
|
172 |
+.modal-wrap { |
|
173 |
+ position: fixed; |
|
174 |
+ top: 0; |
|
175 |
+ left: 0; |
|
176 |
+ right: 0; |
|
177 |
+ bottom: 0; |
|
178 |
+ z-index: 50; |
|
179 |
+} |
|
180 |
+ |
|
181 |
+.modal-bg { |
|
182 |
+ position: absolute; |
|
183 |
+ width: 100%; |
|
184 |
+ height: 100%; |
|
185 |
+ background-color: rgba(0, 0, 0, .6); |
|
186 |
+} |
|
187 |
+ |
|
188 |
+.modal { |
|
189 |
+ position: absolute; |
|
190 |
+ top: 50%; |
|
191 |
+ left: 50%; |
|
192 |
+ transform: translate(-50%, -50%); |
|
193 |
+ z-index: 2; |
|
194 |
+ background-color: #fff; |
|
195 |
+ |
|
196 |
+ text-align: center; |
|
197 |
+} |
|
198 |
+ |
|
199 |
+.modal .btn-wrap { |
|
200 |
+ margin-top: 15px; |
|
201 |
+ text-align: center; |
|
202 |
+} |
|
203 |
+.txt-point { |
|
204 |
+ color: #13833b; |
|
205 |
+}(No newline at end of file) |
--- client/resources/css/layout.css
+++ client/resources/css/layout.css
... | ... | @@ -55,19 +55,17 @@ |
55 | 55 |
|
56 | 56 |
.verticalbar { |
57 | 57 |
width: 155rem; |
58 |
- height: 15rem; |
|
59 | 58 |
border-radius: 15px; |
60 | 59 |
background-color: #dddddd; |
61 | 60 |
margin-bottom: 3rem; |
62 |
- display: block; |
|
63 |
- padding: 2rem; |
|
61 |
+ padding: 1rem; |
|
64 | 62 |
} |
65 | 63 |
.bar_title { |
66 | 64 |
color: #3b3d3d; |
67 | 65 |
font-size: 28px; |
68 | 66 |
font-weight: bolder; |
69 |
- margin-left: 6rem; |
|
70 |
- margin-right: 12rem; |
|
67 |
+ width: 41rem; |
|
68 |
+ padding-left: 9rem; |
|
71 | 69 |
} |
72 | 70 |
|
73 | 71 |
.barinfo { |
... | ... | @@ -78,11 +76,9 @@ |
78 | 76 |
justify-content: center; |
79 | 77 |
font-size: 16px; |
80 | 78 |
color: #949292; |
81 |
- margin-left: 10rem; |
|
82 | 79 |
} |
83 | 80 |
|
84 | 81 |
.bar_element { |
85 |
- height: 15rem; |
|
86 | 82 |
width: 15rem; |
87 | 83 |
text-align: center; |
88 | 84 |
} |
... | ... | @@ -91,24 +87,18 @@ |
91 | 87 |
background: #ffffff; |
92 | 88 |
border-radius: 15px; |
93 | 89 |
width: 76rem; |
94 |
- height: 35rem; |
|
95 | 90 |
box-shadow: 0px 5px 20px #00000038; |
96 | 91 |
padding: 2rem; |
97 | 92 |
} |
98 | 93 |
|
99 | 94 |
.board_title { |
100 | 95 |
color: #13833b; |
101 |
- width: 70rem; |
|
102 | 96 |
font-size: 26px; |
103 |
- margin-bottom: 2.5rem; |
|
104 |
- margin-left: 8rem; |
|
105 | 97 |
} |
106 | 98 |
.board_add { |
107 | 99 |
color: #565757; |
108 | 100 |
transition: 0.3s; |
109 | 101 |
font-size: 26px; |
110 |
- margin-left: 43.6rem; |
|
111 |
- margin-right: 2rem; |
|
112 | 102 |
} |
113 | 103 |
.board_add:hover { |
114 | 104 |
color: #13833b; |
... | ... | @@ -118,9 +108,9 @@ |
118 | 108 |
.boardinfo { |
119 | 109 |
color: #3e4141; |
120 | 110 |
font-size: 20px; |
121 |
- padding: 2rem; |
|
111 |
+ padding: 2rem 2rem 0 2rem; |
|
122 | 112 |
} |
123 |
- |
|
113 |
+.boardinfo .board_element:last-child{margin: 0;} |
|
124 | 114 |
.beforetxt { |
125 | 115 |
font-size: 10px; |
126 | 116 |
color: #13833b; |
... | ... | @@ -131,7 +121,7 @@ |
131 | 121 |
display: flex; |
132 | 122 |
flex-wrap: wrap; |
133 | 123 |
align-items: center; |
134 |
- margin-bottom: 25px; |
|
124 |
+ margin-bottom: 15px; |
|
135 | 125 |
justify-content: space-between; |
136 | 126 |
align-items: center; |
137 | 127 |
} |
... | ... | @@ -143,9 +133,9 @@ |
143 | 133 |
|
144 | 134 |
.boxmenu { |
145 | 135 |
display: flex; |
146 |
- height: 13.5rem; |
|
147 | 136 |
background-color: #fdfdf2; |
148 | 137 |
box-shadow: 0px 5px 20px #00000038; |
138 |
+ padding: 1rem; |
|
149 | 139 |
} |
150 | 140 |
/* .box { |
151 | 141 |
width: 29%; |
... | ... | @@ -177,7 +167,7 @@ |
177 | 167 |
|
178 | 168 |
.boxborder { |
179 | 169 |
content: ""; |
180 |
- height: 10.5rem; |
|
170 |
+ height: 6rem; |
|
181 | 171 |
border-right: 2px solid #9c9b9a; |
182 | 172 |
float: right; |
183 | 173 |
position: relative; |
+++ client/resources/images/close.png
Binary file is not shown |
--- client/resources/images/icon/today'scumulativenumberofpedestrians.png
+++ client/resources/images/icon/scumulativenumberofpedestrians.png
Binary file is not shown |
+++ client/resources/js/commonUtil.js
... | ... | @@ -0,0 +1,507 @@ |
1 | +/** | |
2 | + * @author 최정우 | |
3 | + | |
4 | + * @since 2019.12.06 | |
5 | + * | |
6 | + * 공통 자바스크립트 Util입니다. | |
7 | + */ | |
8 | + | |
9 | +const COMMON_UTIL = (function () { | |
10 | + | |
11 | + var _utils = { | |
12 | + /** | |
13 | + * 빈 객체 여부 | |
14 | + */ | |
15 | + isEmpty: function (data) { | |
16 | + if (data === undefined || data === null || data === "" || data.length === 0 || (data.constructor == Object && Object.keys(data).length === 0)) { | |
17 | + if ((typeof data) === "number") { | |
18 | + return false | |
19 | + } else { | |
20 | + return true; | |
21 | + } | |
22 | + } else { | |
23 | + return false; | |
24 | + } | |
25 | + }, | |
26 | + | |
27 | + /** | |
28 | + * empty to null | |
29 | + */ | |
30 | + toNull: function (data) { | |
31 | + if(data === undefined || data === "") { | |
32 | + try { | |
33 | + data = null; | |
34 | + return data; | |
35 | + } catch (e) { | |
36 | + console.log("commonUtil.js - empty to null convert error : ", e); | |
37 | + return data; | |
38 | + } | |
39 | + } else { | |
40 | + return data; | |
41 | + } | |
42 | + }, | |
43 | + | |
44 | + /** | |
45 | + * string to JSON | |
46 | + */ | |
47 | + toJson: function (data) { | |
48 | + if ("string" === (typeof data)) { | |
49 | + try { | |
50 | + return JSON.parse(data); | |
51 | + } catch (e) { | |
52 | + console.log("commonUtil.js - string to json convert error : ", e); | |
53 | + return data; | |
54 | + } | |
55 | + } else { | |
56 | + return data; | |
57 | + } | |
58 | + }, | |
59 | + | |
60 | + /** | |
61 | + * string to JSON | |
62 | + */ | |
63 | + toJson: function (data) { | |
64 | + if ("string" === (typeof data)) { | |
65 | + try { | |
66 | + return JSON.parse(data); | |
67 | + } catch (e) { | |
68 | + console.log("commonUtil.js - string to json convert error : ", e); | |
69 | + return data; | |
70 | + } | |
71 | + } else { | |
72 | + return data; | |
73 | + } | |
74 | + }, | |
75 | + | |
76 | + /** | |
77 | + * JSON to string | |
78 | + */ | |
79 | + toString: function (data) { | |
80 | + try { | |
81 | + return JSON.parse(data); | |
82 | + } catch (e) { | |
83 | + console.log("commonUtil.js - json to string convert error : ", e); | |
84 | + return data; | |
85 | + } | |
86 | + }, | |
87 | + | |
88 | + /** | |
89 | + * 다중 separator split | |
90 | + */ | |
91 | + split: function (text, separator) { | |
92 | + var words = []; | |
93 | + if (this.isEmpty(text) == false && this.isEmpty(separator) == false && separator.length > 0) { | |
94 | + words.push(text); | |
95 | + for (var i = 0; i < separator.length; i++) { | |
96 | + var subWords = []; | |
97 | + for (var j = 0; j < words.length; j++) { | |
98 | + if (this.isEmpty(words[j]) == false && this.isEmpty(separator[i]) == false) { | |
99 | + subWords = subWords.concat(words[j].split(separator[i])); | |
100 | + } else { | |
101 | + if (words[j] == false) { | |
102 | + subWords.push(words[j]); | |
103 | + } else { | |
104 | + continue; | |
105 | + } | |
106 | + } | |
107 | + } | |
108 | + words = subWords; | |
109 | + } | |
110 | + return words; | |
111 | + } else { | |
112 | + if (this.isEmpty(text) == false) { | |
113 | + words.push(text); | |
114 | + } | |
115 | + return words; | |
116 | + } | |
117 | + }, | |
118 | + | |
119 | + /** | |
120 | + * 객체 깊은 복사 | |
121 | + */ | |
122 | + copyObject: function (obj) { | |
123 | + if (obj === null || typeof(obj) !== 'object') return obj; | |
124 | + | |
125 | + try { | |
126 | + return JSON.parse(JSON.stringify(obj)); | |
127 | + } catch (e) { | |
128 | + console.log("commonUtil.js - copyObject error : ", e); | |
129 | + return null; | |
130 | + } | |
131 | + }, | |
132 | + /** | |
133 | + * 날짜 + 시간 구하기 | |
134 | + * | |
135 | + * | |
136 | + | |
137 | + */ | |
138 | + getDateTime : function () { | |
139 | + return this.getDate()+ " " + this.getFullTime(); | |
140 | + }, | |
141 | + | |
142 | + /** | |
143 | + * 날짜 구하기 | |
144 | + * | |
145 | + * param 설명 | |
146 | + * | |
147 | + * options = { | |
148 | + * addYear(Integer), | |
149 | + * addMonth(Integer), | |
150 | + * addDay(Integer), | |
151 | + * separator(String) | |
152 | + * } | |
153 | + */ | |
154 | + getDate: function (options) { | |
155 | + | |
156 | + if (this.isEmpty(options) == true) { | |
157 | + options = { | |
158 | + addYear: 0, | |
159 | + addMonth: 0, | |
160 | + addDay: 0, | |
161 | + separator: '-' | |
162 | + } | |
163 | + } else { | |
164 | + options.addYear = options.addYear || 0; | |
165 | + options.addMonth = options.addMonth || 0; | |
166 | + options.addDay = options.addDay || 0; | |
167 | + options.separator = options.separator || '-'; | |
168 | + } | |
169 | + | |
170 | + var date = new Date(); | |
171 | + date.setFullYear(date.getFullYear() + options.addYear); | |
172 | + date.setMonth(date.getMonth() + options.addMonth); | |
173 | + date.setDate(date.getDate() + options.addDay); | |
174 | + | |
175 | + var yyyy = date.getFullYear(); | |
176 | + var mm = date.getMonth() + 1; | |
177 | + var dd = date.getDate(); | |
178 | + | |
179 | + return yyyy + options.separator + this.prefixZero(mm, 2) + options.separator + this.prefixZero(dd, 2); | |
180 | + }, | |
181 | + | |
182 | + /** | |
183 | + * 현재 년도 조회 | |
184 | + */ | |
185 | + getYear: function () { | |
186 | + var date = new Date(); | |
187 | + return date.getFullYear(); | |
188 | + }, | |
189 | + | |
190 | + /** | |
191 | + * 현재 월 조회 | |
192 | + */ | |
193 | + getMonth: function () { | |
194 | + var date = new Date(); | |
195 | + return date.getMonth() + 1; | |
196 | + }, | |
197 | + | |
198 | + /** | |
199 | + * 현재 월 조회 | |
200 | + */ | |
201 | + getFullMonth: function () { | |
202 | + var date = new Date(); | |
203 | + return this.prefixZero((date.getMonth() + 1), 2); | |
204 | + }, | |
205 | + | |
206 | + /** | |
207 | + * 현재 일 조회 | |
208 | + */ | |
209 | + getDay: function () { | |
210 | + var date = new Date(); | |
211 | + return date.getDate(); | |
212 | + }, | |
213 | + | |
214 | + /** | |
215 | + * 현재 일 조회 | |
216 | + */ | |
217 | + getFullDay: function () { | |
218 | + var date = new Date(); | |
219 | + return this.prefixZero(date.getDate(), 2); | |
220 | + }, | |
221 | + | |
222 | + /** | |
223 | + * 현재 시간 조회 | |
224 | + */ | |
225 | + getHour: function () { | |
226 | + var date = new Date(); | |
227 | + return date.getFullYear(); | |
228 | + }, | |
229 | + | |
230 | + /** | |
231 | + * 현재 분 조회 | |
232 | + */ | |
233 | + getMinute: function () { | |
234 | + var date = new Date(); | |
235 | + return date.getMinutes() + 1; | |
236 | + }, | |
237 | + | |
238 | + /** | |
239 | + * 현재 초 조회 | |
240 | + */ | |
241 | + getSeconds: function () { | |
242 | + var date = new Date(); | |
243 | + return date.getSeconds(); | |
244 | + }, | |
245 | + | |
246 | + /** | |
247 | + * 시간 구하기 | |
248 | + * | |
249 | + * param 설명 | |
250 | + * | |
251 | + * options = { | |
252 | + * addHour(Integer), | |
253 | + * addMinute(Integer), | |
254 | + * addSeconds(Integer), | |
255 | + * separator(String) | |
256 | + * } | |
257 | + */ | |
258 | + getFullTime: function (options) { | |
259 | + if (this.isEmpty(options) == true) { | |
260 | + options = { | |
261 | + addHour: 0, | |
262 | + addMinute: 0, | |
263 | + addSeconds: 0, | |
264 | + separator: '-' | |
265 | + } | |
266 | + } else { | |
267 | + options.addHour = options.addHour || 0; | |
268 | + options.addMinute = options.addMinute || 0; | |
269 | + options.addSeconds = options.addSeconds || 0; | |
270 | + options.separator = options.separator || ':'; | |
271 | + } | |
272 | + | |
273 | + var date = new Date(); | |
274 | + date.setHours(date.getHours() + options.addHour); | |
275 | + date.setMinutes(date.getMinutes() + options.addMinute); | |
276 | + date.setSeconds(date.getSeconds() + options.addSeconds); | |
277 | + | |
278 | + var h = date.getHours(); | |
279 | + var m = date.getMinutes(); | |
280 | + var s = date.getSeconds(); | |
281 | + | |
282 | + return this.prefixZero(h, 2) + ":" + this.prefixZero(m, 2) + ":" + this.prefixZero(s, 2); | |
283 | + }, | |
284 | + | |
285 | + /** | |
286 | + * 시간 구하기 | |
287 | + * | |
288 | + * param 설명 | |
289 | + * | |
290 | + * options = { | |
291 | + * addHour(Integer), | |
292 | + * addMinute(Integer), | |
293 | + * separator(String) | |
294 | + * } | |
295 | + */ | |
296 | + getTime: function (options) { | |
297 | + if (this.isEmpty(options) == true) { | |
298 | + options = { | |
299 | + addHour: 0, | |
300 | + addMinute: 0, | |
301 | + separator: '-' | |
302 | + } | |
303 | + } else { | |
304 | + options.addHour = options.addHour || 0; | |
305 | + options.addMinute = options.addMinute || 0; | |
306 | + options.separator = options.separator || ':'; | |
307 | + } | |
308 | + | |
309 | + var date = new Date(); | |
310 | + date.setHours(date.getHours() + options.addHour); | |
311 | + date.setMinutes(date.getMinutes() + options.addMinute); | |
312 | + | |
313 | + var h = date.getHours(); | |
314 | + var m = date.getMinutes(); | |
315 | + | |
316 | + return this.prefixZero(h, 2) + ":" + this.prefixZero(m, 2); | |
317 | + }, | |
318 | + | |
319 | + /** | |
320 | + * 특정 길이만큼 앞에'0' 붙이기 | |
321 | + * | |
322 | + * param 설명 | |
323 | + * | |
324 | + * text(String or Integer): 맨 뒤에 붙일 문자열(숫자든 문자든 상관웞음) | |
325 | + * length(Integer): 해당 값 만큼 '0'을 붙임 (단, text의 문자열 길이를 뺌) | |
326 | + * ex) this.prefixZero(2, 5) => 00002, this.prefixZero(20, 5) => 00020 | |
327 | + * | |
328 | + */ | |
329 | + prefixZero: function (text, length) { | |
330 | + var zero = ''; | |
331 | + var suffix = text; | |
332 | + | |
333 | + if ((typeof text) === "number") { | |
334 | + suffix = text.toString(); | |
335 | + } | |
336 | + | |
337 | + | |
338 | + if (suffix.length < length) { | |
339 | + for (let i = 0; i < length - suffix.length; i++) { | |
340 | + zero += '0'; | |
341 | + } | |
342 | + } | |
343 | + return zero + suffix; | |
344 | + }, | |
345 | + | |
346 | + /** | |
347 | + * Date => text | |
348 | + */ | |
349 | + dateToText: function (date) { | |
350 | + var d = new Date(date); | |
351 | + var yyyy = d.getFullYear(); | |
352 | + var mm = d.getMonth() + 1; | |
353 | + var dd = d.getDate(); | |
354 | + return yyyy + "-" + this.prefixZero(mm, 2) + "-" + this.prefixZero(dd, 2); | |
355 | + }, | |
356 | + | |
357 | + /** | |
358 | + * 최솟값은 포함, 최댓값은 제외한 정수 난수 생성(최솟값 ~ 최댓값 - 1) | |
359 | + * | |
360 | + * param 설명 | |
361 | + * | |
362 | + * min(Integer): 난수 생성시, 최소값 | |
363 | + * max(Integer): 난수 생성시, 최대값 | |
364 | + * | |
365 | + * ex) getRandomInt(2, 5) => 2~5사이의 정수 난수 값 리턴 | |
366 | + */ | |
367 | + getRandomInt: function (min, max) { | |
368 | + min = Math.ceil(min); | |
369 | + max = Math.floor(max); | |
370 | + return Math.floor(Math.random() * (max - min)) + min; | |
371 | + }, | |
372 | + | |
373 | + /** | |
374 | + * 현재 시스템의 URL 조회 | |
375 | + * | |
376 | + * ex) http://localohst:8080, https://www.naver.com | |
377 | + */ | |
378 | + getSystemURL: function () { | |
379 | + var url = window.location.protocol | |
380 | + + "//" + window.location.host; | |
381 | + return url; | |
382 | + }, | |
383 | + | |
384 | + /** | |
385 | + * 현재 시스템의 URL 경로 조회 | |
386 | + * | |
387 | + * ex) http://localohst:8080/dataset/datasetPostList => /dataset/datasetPostList | |
388 | + */ | |
389 | + getSystemPath: function () { | |
390 | + var path = window.location.pathname; | |
391 | + return path; | |
392 | + }, | |
393 | + | |
394 | + /** | |
395 | + * 3글자 마다 콤마 찍기 (돈) | |
396 | + * | |
397 | + * ex) 10000 => 10,000 | |
398 | + */ | |
399 | + comma: function (text) { | |
400 | + try { | |
401 | + return text.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); | |
402 | + } catch (e) { | |
403 | + if (this.isEmpty(text) == true) { | |
404 | + return "-"; | |
405 | + } else { | |
406 | + return text; | |
407 | + } | |
408 | + } | |
409 | + }, | |
410 | + | |
411 | + /** | |
412 | + * 3글자 마다 콤마 찍기 (돈) | |
413 | + * | |
414 | + * ex) 10,000 => 10000 | |
415 | + */ | |
416 | + removeComma: function (text) { | |
417 | + try { | |
418 | + return text.toString().replace(/,/g, "");; | |
419 | + } catch (e) { | |
420 | + if (this.isEmpty(text) == true) { | |
421 | + return "-"; | |
422 | + } else { | |
423 | + return text; | |
424 | + } | |
425 | + } | |
426 | + }, | |
427 | + | |
428 | + /** | |
429 | + * json 데이터 가지고 오기 (외부 JSON 파일 PATH or URL) (동기 요청) | |
430 | + */ | |
431 | + getJsonByPromise: function (url, isAsync) { | |
432 | + if (this.isEmpty(url) == true) { | |
433 | + new Error('COMMON_UTIL - getJson(url, isAsync) Error : url(parameter) is empty') | |
434 | + } | |
435 | + if (this.isEmpty(isAsync) == true) { | |
436 | + isAsync = true; | |
437 | + } | |
438 | + | |
439 | + return new Promise(function (resolve, reject) { | |
440 | + var xhr = new XMLHttpRequest(); | |
441 | + xhr.onload = function (e) { | |
442 | + if (xhr.readyState === 4) { | |
443 | + if (xhr.status === 200) { | |
444 | + resolve(JSON.parse(this.responseText)); | |
445 | + } else { | |
446 | + reject(this); | |
447 | + } | |
448 | + } | |
449 | + }; | |
450 | + xhr.onerror = function (e) { | |
451 | + reject(this); | |
452 | + }; | |
453 | + xhr.open("GET", url, isAsync); | |
454 | + //xhr.responseType='json'; | |
455 | + xhr.send(null); | |
456 | + }); | |
457 | + }, | |
458 | + | |
459 | + /** | |
460 | + * json 데이터 가지고 오기 (동기 요청) (외부 JSON 파일 PATH or URL) | |
461 | + */ | |
462 | + getJsonBySync: function (url) { | |
463 | + var result = {}; | |
464 | + if (this.isEmpty(url) == true) { | |
465 | + new Error('COMMON_UTIL - getJson(url, isAsync) Error : url(parameter) is empty') | |
466 | + return result; | |
467 | + } | |
468 | + | |
469 | + var xhr = new XMLHttpRequest(); | |
470 | + xhr.onload = function (e) { | |
471 | + if (xhr.readyState === 4) { | |
472 | + if (xhr.status === 200) { | |
473 | + result = JSON.parse(this.responseText); | |
474 | + } else { | |
475 | + console.error(this); | |
476 | + } | |
477 | + } | |
478 | + }; | |
479 | + xhr.onerror = function (e) { | |
480 | + console.error(this); | |
481 | + }; | |
482 | + xhr.open("GET", url, false); | |
483 | + xhr.send(null); | |
484 | + | |
485 | + return result; | |
486 | + }, | |
487 | + | |
488 | + } | |
489 | + | |
490 | + | |
491 | + //초기화 | |
492 | + function init() { | |
493 | + //console.info('commonUtil.js initialized.'); | |
494 | + return _utils; | |
495 | + } | |
496 | + | |
497 | + | |
498 | + return init(); | |
499 | + | |
500 | +})(); | |
501 | + | |
502 | + | |
503 | +export default COMMON_UTIL; | |
504 | + | |
505 | + | |
506 | + | |
507 | + |
--- client/views/component/MapPage.vue
+++ client/views/component/MapPage.vue
... | ... | @@ -23,7 +23,7 @@ |
23 | 23 |
/* global kakao */ |
24 | 24 |
script.onload = () => kakao.maps.load(this.loadMap); |
25 | 25 |
script.src = |
26 |
- "http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=d0f88d63bd41b545d08ea9984995f082&libraries=clusterer"; |
|
26 |
+ "http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=d0f88d63bd41b545d08ea9984995f082"; |
|
27 | 27 |
document.head.appendChild(script); |
28 | 28 |
}, |
29 | 29 |
loadMap() { |
+++ client/views/component/Modal.vue
... | ... | @@ -0,0 +1,55 @@ |
1 | +<template> | |
2 | + <div class="modal" v-if="visible"> | |
3 | + | |
4 | + <div class="modal-content"> | |
5 | + <slot></slot> | |
6 | + </div> | |
7 | + <!-- <div class="modal-overlay" @click="close"></div> --> | |
8 | + </div> | |
9 | + </template> | |
10 | + | |
11 | + <script> | |
12 | + export default { | |
13 | + props: { | |
14 | + visible: { | |
15 | + type: Boolean, | |
16 | + required: true, | |
17 | + }, | |
18 | + }, | |
19 | + methods: { | |
20 | + close() { | |
21 | + this.$emit("close"); | |
22 | + }, | |
23 | + }, | |
24 | + }; | |
25 | + </script> | |
26 | + | |
27 | + <style scoped> | |
28 | + .modal { | |
29 | + position: fixed; | |
30 | + top: 0; | |
31 | + left: 0; | |
32 | + right: 0; | |
33 | + bottom: 0; | |
34 | + display: flex; | |
35 | + align-items: center; | |
36 | + justify-content: center; | |
37 | + z-index: 9999; | |
38 | + } | |
39 | + | |
40 | + .modal-overlay { | |
41 | + position: absolute; | |
42 | + top: 0; | |
43 | + left: 0; | |
44 | + right: 0; | |
45 | + bottom: 0; | |
46 | + /* background-color: rgba(0, 0, 0, 0.5); */ | |
47 | + } | |
48 | + | |
49 | + .modal-content { | |
50 | + background-color: white; | |
51 | + /* padding: 20px; */ | |
52 | + border-radius: 5px; | |
53 | + border: 1px solid black; | |
54 | + } | |
55 | + </style>(No newline at end of file) |
+++ client/views/index.js
... | ... | @@ -0,0 +1,18 @@ |
1 | +/** | |
2 | + * @author : 최정우 | |
3 | + * @since : 2022.10.19 | |
4 | + * @dscription : Vue를 활용한 Client단 구현의 시작점(Index) Component 입니다. | |
5 | + */ | |
6 | +import { createApp } from 'vue'; | |
7 | + | |
8 | +import AppRouter from './pages/AppRouter.js'; | |
9 | +import App from './pages/App.vue'; | |
10 | + | |
11 | +const vue = createApp(App).use(AppRouter).mount('#root'); | |
12 | + | |
13 | +if (!APP_USER_HTTP_REQUEST_URL && APP_USER_HTTP_REQUEST_URL != '/') { | |
14 | + console.log('index.js APP_USER_HTTP_REQUEST_URL : ', APP_USER_HTTP_REQUEST_URL); | |
15 | + AppRouter.push({ path: APP_USER_HTTP_REQUEST_URL, query: {}}) | |
16 | +} | |
17 | + | |
18 | + |
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
... | ... | @@ -96,10 +96,10 @@ |
96 | 96 |
selectedOption: null, |
97 | 97 |
showDropdown2: false, |
98 | 98 |
dropdownOptions2: [ |
99 |
- { label: '실시간 현황 관제', value: 'Introduction', route: '/Introduction.page' }, |
|
99 |
+ { label: '실시간 현황 관제', value: 'RealtimeStatus', route: '/RealtimeStatus.page' }, |
|
100 | 100 |
{ label: '상황발생 정보 조회', value: 'SituationSearch', route: '/SituationSearch.page' }, |
101 | 101 |
{ label: '장애발생 정보 조회', value: 'ErrorSearch', route: '/ErrorSearch.page' }, |
102 |
- { label: '횡단보도 조회', value: 'CrosswalkListSearch', route: '/CrosswalkListSearch.page' }, |
|
102 |
+ { label: '횡단보도 목록 조회', value: 'CrosswalkListSearch', route: '/CrosswalkListSearch.page' }, |
|
103 | 103 |
], |
104 | 104 |
selectedOption2: null, |
105 | 105 |
showDropdown3: false, |
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
... | ... | @@ -35,7 +35,7 @@ |
35 | 35 |
</script> |
36 | 36 |
|
37 | 37 |
<style scoped> |
38 |
-.main-warp{position: relative;} |
|
38 |
+.main-warp{position: relative; height: 865px;} |
|
39 | 39 |
[v-cloak] { |
40 | 40 |
display: none; |
41 | 41 |
} |
+++ client/views/pages/AppRouter.js
... | ... | @@ -0,0 +1,53 @@ |
1 | +import { createWebHistory, createRouter } from "vue-router"; | |
2 | + | |
3 | +import Main from '../pages/main/Main.vue'; | |
4 | +import RealtimeStatus from '../pages/RealtimeStatus/RealtimeStatus.vue'; | |
5 | +import CrosswalkListSearch from '../pages/RealtimeStatus/CrosswalkListSearch.vue'; | |
6 | +import SituationSearch from '../pages/RealtimeStatus/SituationSearch.vue'; | |
7 | +import ErrorSearch from '../pages/RealtimeStatus/ErrorSearch.vue'; | |
8 | +import Analysis from '../pages/Analysis/Analysis.vue'; | |
9 | +import CrosswalkInsert from '../pages/CrosswalkManagement/CrosswalkInsert.vue'; | |
10 | +import CrosswalkSearch from '../pages/CrosswalkManagement/CrosswalkSearch.vue'; | |
11 | +import UserManagement from '../pages/SystemManagement/UserManagement.vue'; | |
12 | +import DongManagement from '../pages/SystemManagement/DongManagement.vue'; | |
13 | +import NodeManagement from '../pages/SystemManagement/NodeManagement.vue'; | |
14 | +import ChargeManagement from '../pages/SystemManagement/ChargeManagement.vue'; | |
15 | +import DataRecord from '../pages/SystemManagement/DataRecord.vue'; | |
16 | +import UserAddForm from '../pages/SystemManagement/UserAddForm.vue'; | |
17 | +import ManagerAddForm from '../pages/SystemManagement/ManagerAddForm.vue'; | |
18 | +import Mypage from '../pages/User/Mypage.vue'; | |
19 | +import Login from '../pages/main/Login.vue'; | |
20 | +import IdFind from '../pages/main/IdFind.vue'; | |
21 | +import Introduction from '../pages/Introduction/Introduction.vue'; | |
22 | +import ManualDown from '../pages/Introduction/ManualDown.vue'; | |
23 | + | |
24 | +const routes = [ | |
25 | + /* 메인화면 */ | |
26 | + { path: '/', name: 'Main', component: Main}, | |
27 | + { path: '/RealtimeStatus.page', name: 'RealtimeStatus', component: RealtimeStatus}, | |
28 | + { path: '/Analysis.page', name: 'Analysis', component: Analysis}, | |
29 | + { path: '/CrosswalkInsert.page', name: 'CrosswalkInsert', component: CrosswalkInsert}, | |
30 | + { path: '/CrosswalkSearch.page', name: 'CrosswalkSearch', component: CrosswalkSearch}, | |
31 | + { path: '/UserManagement.page', name: 'UserManagement', component: UserManagement}, | |
32 | + { path: '/Mypage.page', name: 'Mypage', component: Mypage}, | |
33 | + { path: '/Login.page', name: 'Login', component: Login}, | |
34 | + { path: '/Introduction.page', name: 'Introduction', component: Introduction}, | |
35 | + { path: '/ManualDown.page', name: 'ManualDown', component: ManualDown}, | |
36 | + { path: '/CrosswalkListSearch.page', name: 'CrosswalkListSearch', component: CrosswalkListSearch}, | |
37 | + { path: '/SituationSearch.page', name: 'SituationSearch', component: SituationSearch}, | |
38 | + { path: '/ErrorSearch.page', name: 'ErrorSearch', component: ErrorSearch}, | |
39 | + { path: '/DongManagement.page', name: 'DongManagement', component: DongManagement}, | |
40 | + { path: '/NodeManagement.page', name: 'NodeManagement', component: NodeManagement}, | |
41 | + { path: '/ChargeManagement.page', name: 'ChargeManagement', component: ChargeManagement}, | |
42 | + { path: '/DataRecord.page', name: 'DataRecord', component: DataRecord}, | |
43 | + { path: '/UserAddForm.page', name: 'UserAddForm', component: UserAddForm}, | |
44 | + { path: '/ManagerAddForm.page', name: 'ManagerAddForm', component: ManagerAddForm}, | |
45 | + { path: '/IdFind.page', name: 'IdFind', component: IdFind}, | |
46 | +]; | |
47 | + | |
48 | +const AppRouter = createRouter({ | |
49 | + history: createWebHistory(), | |
50 | + routes, | |
51 | +}); | |
52 | + | |
53 | +export default AppRouter;(No newline at end of file) |
--- client/views/pages/RealtimeStatus/CrosswalkListSearch.vue
+++ client/views/pages/RealtimeStatus/CrosswalkListSearch.vue
... | ... | @@ -1,131 +1,361 @@ |
1 | 1 |
<template> |
2 |
- <div class="flex"> |
|
3 |
- <div class="left"> |
|
4 |
- <div class="wrap flex-between"> |
|
5 |
- <div class="iconlist"><ul> |
|
6 |
- <li></li> |
|
7 |
- <li></li> |
|
8 |
- <li></li> |
|
9 |
- <li></li> |
|
10 |
- </ul></div> |
|
11 |
- <div> |
|
12 |
- <div class=""> |
|
13 |
- <h2>지역설정</h2> |
|
14 |
- <div> |
|
15 |
- <label for="">시/도</label> |
|
16 |
- <select name="" id=""></select> |
|
17 |
- </div> |
|
18 |
- <div> |
|
19 |
- <label for="">시/군/구</label> |
|
20 |
- <select name="" id=""></select> |
|
21 |
- </div> |
|
22 |
- <div> |
|
23 |
- <label for="">행정동</label> |
|
24 |
- <select name="" id=""></select> |
|
25 |
- </div> |
|
26 |
- <div> |
|
27 |
- <label for="">교차로</label> |
|
28 |
- <select name="" id=""></select> |
|
29 |
- </div> |
|
30 |
- <h2>조건설정</h2> |
|
31 |
- <div class="flex"> |
|
32 |
- <input type="checkbox" /><label for="">무단횡단</label> |
|
33 |
- <input type="checkbox" /><label for="">신호연장</label> |
|
34 |
- <input type="checkbox" /><label for="">신호위반</label> |
|
35 |
- <input type="checkbox" /><label for="">장애발생</label> |
|
36 |
- </div> |
|
37 |
- <div> |
|
38 |
- <label for="date-input">일자</label> |
|
39 |
- <input id="date-input" type="date" v-model="selectedDate" /> |
|
40 |
- </div> |
|
41 |
- <div> |
|
42 |
- <label for="time-input">시간대</label> |
|
43 |
- <input id="time-input" type="time" v-model="selectedTime" />~<input |
|
44 |
- id="time-input" |
|
45 |
- type="time" |
|
46 |
- v-model="selectedTime" |
|
47 |
- /> |
|
48 |
- </div> |
|
49 |
- <button>검색</button> |
|
2 |
+ <div class="wrap"> |
|
3 |
+ <div class="board-wrap"> |
|
4 |
+ <div class="search-wrap"> |
|
5 |
+ <div class="flex m-b gap" style="margin-bottom: 2rem;"> |
|
6 |
+ <div class="flex gap m-r" style="margin-right: 5rem;"> |
|
7 |
+ <label>조회기간: </label> |
|
8 |
+ <input type="date" name="" id="" /> |
|
9 |
+ <span>~</span> |
|
10 |
+ <input type="date" name="" id="" /> |
|
50 | 11 |
</div> |
51 |
- <div class=""> |
|
52 |
- <h2>지역설정</h2> |
|
53 |
- <button>상황발생현황</button> |
|
54 |
- <button>장애발생현황</button> |
|
55 |
- <ul> |
|
56 |
- <li> |
|
57 |
- <p>발생일시: 2023-05-04 14:27</p> |
|
58 |
- <p>상황명: 무단횡단</p> |
|
59 |
- <p>발생장소: 영재어린이집(서측)</p> |
|
60 |
- </li> |
|
61 |
- </ul> |
|
12 |
+ <div class="flex gap"> |
|
13 |
+ <label>지역: </label> |
|
14 |
+ <select name="" id=""> |
|
15 |
+ <option value="">대구광역시</option> |
|
16 |
+ </select> |
|
17 |
+ <select name="" id=""> |
|
18 |
+ <option value="">서구</option> |
|
19 |
+ </select> |
|
20 |
+ <select name="" id=""> |
|
21 |
+ <option value="">전체</option> |
|
22 |
+ </select> |
|
23 |
+ </div> |
|
24 |
+ </div> |
|
25 |
+ <div class="flex-between gap"> |
|
26 |
+ <div class="gap flex"> |
|
27 |
+ <label>우회차선: </label> |
|
28 |
+ <select name="" id=""> |
|
29 |
+ <option value="">전체</option> |
|
30 |
+ </select> |
|
31 |
+ <label>왕복차선: </label> |
|
32 |
+ <select name="" id=""> |
|
33 |
+ <option value="">전체</option> |
|
34 |
+ </select> |
|
35 |
+ <div class="m-r flex"> |
|
36 |
+ <label class="m-r">장비: </label> |
|
37 |
+ <label>무단횡단</label> |
|
38 |
+ <input class="m-r" type="checkbox" name="" id="" /> |
|
39 |
+ <label>신호연장</label> |
|
40 |
+ <input class="m-r" type="checkbox" name="" id="" /> |
|
41 |
+ <label>우회차량</label> |
|
42 |
+ <input class="m-r" type="checkbox" name="" id="" /> |
|
43 |
+ </div> |
|
44 |
+ <label>상태: </label> |
|
45 |
+ <select name="" id=""> |
|
46 |
+ <option value="">정상</option> |
|
47 |
+ </select> |
|
48 |
+ </div> |
|
49 |
+ |
|
50 |
+ <button type="button" class="btn-2 green-btn">조회</button> |
|
51 |
+ </div> |
|
52 |
+ |
|
53 |
+ </div> |
|
54 |
+ <div> |
|
55 |
+ <table> |
|
56 |
+ <!-- <colgroup> |
|
57 |
+ <col style="width: 10%;"> |
|
58 |
+ <col style="width: 20%;"> |
|
59 |
+ <col style="width: 20%;"> |
|
60 |
+ <col style="width: 30%;"> |
|
61 |
+ <col style="width: 20%;"> |
|
62 |
+ </colgroup> --> |
|
63 |
+ <thead> |
|
64 |
+ <tr> |
|
65 |
+ <th>No</th> |
|
66 |
+ <th>설치일자</th> |
|
67 |
+ <th>시/도</th> |
|
68 |
+ <th>시/군/구</th> |
|
69 |
+ <th>행정동</th> |
|
70 |
+ <th>교차로</th> |
|
71 |
+ <th>횡단보도명</th> |
|
72 |
+ </tr> |
|
73 |
+ </thead> |
|
74 |
+ <tbody> |
|
75 |
+ <tr @click="modal_1 = true"> |
|
76 |
+ <td></td> |
|
77 |
+ <td></td> |
|
78 |
+ <td></td> |
|
79 |
+ <td></td> |
|
80 |
+ <td></td> |
|
81 |
+ <td></td> |
|
82 |
+ <td></td> |
|
83 |
+ </tr> |
|
84 |
+ </tbody> |
|
85 |
+ </table> |
|
86 |
+ <div class="modal-wrap" v-if="modal_1 == true"> |
|
87 |
+ <div class="modal-bg"></div> |
|
88 |
+ <div class="modal"> |
|
89 |
+ <h2 class="flex-between">횡단보도 상세정보 <button type="button" class="gray-btn" @click="modal_1 = false"> |
|
90 |
+ <img src="../../../resources/images/close.png" alt=""> |
|
91 |
+ </button></h2> |
|
92 |
+ <div class="flex-between"> |
|
93 |
+ <div class="img">무단횡단검지카메라 이미지</div> |
|
94 |
+ <div class="img">무단횡단검지카메라 이미지</div> |
|
95 |
+ <div class="img">신호연장검지카메라 이미지</div> |
|
96 |
+ <div class="img">신호연장검지카메라 이미지</div> |
|
97 |
+ <div class="img">우회차량검지카메라 이미지</div> |
|
98 |
+ </div> |
|
99 |
+ <div class="modalmain"> |
|
100 |
+ <table> |
|
101 |
+ <colgroup> |
|
102 |
+ <col style="width: 20%;"> |
|
103 |
+ <col style="width: 20%;"> |
|
104 |
+ <col style="width: 60%;"> |
|
105 |
+ </colgroup> |
|
106 |
+ <tbody> |
|
107 |
+ <tr > |
|
108 |
+ <td colspan="2">시/도</td> |
|
109 |
+ <td></td> |
|
110 |
+ </tr> |
|
111 |
+ <tr > |
|
112 |
+ <td colspan="2">시/군/구</td> |
|
113 |
+ <td></td> |
|
114 |
+ </tr> |
|
115 |
+ <tr > |
|
116 |
+ <td colspan="2">행정동</td> |
|
117 |
+ <td></td> |
|
118 |
+ </tr> |
|
119 |
+ <tr > |
|
120 |
+ <td colspan="2">노드명</td> |
|
121 |
+ <td></td> |
|
122 |
+ </tr> |
|
123 |
+ <tr > |
|
124 |
+ <td colspan="2">방위각</td> |
|
125 |
+ <td></td> |
|
126 |
+ </tr> |
|
127 |
+ <tr > |
|
128 |
+ <td rowspan="2">좌표</td> |
|
129 |
+ <td>경도</td> |
|
130 |
+ </tr> |
|
131 |
+ <tr > |
|
132 |
+ <td>위도</td> |
|
133 |
+ <td></td> |
|
134 |
+ </tr> |
|
135 |
+ <tr > |
|
136 |
+ <td rowspan="3">설치된 검시장비</td> |
|
137 |
+ <td>무단횡단</td> |
|
138 |
+ </tr> |
|
139 |
+ <tr > |
|
140 |
+ <td>신호연장</td> |
|
141 |
+ <td></td> |
|
142 |
+ </tr> |
|
143 |
+ <tr > |
|
144 |
+ <td>우회전차량</td> |
|
145 |
+ <td></td> |
|
146 |
+ </tr> |
|
147 |
+ <tr > |
|
148 |
+ <td colspan="2">무단횡단 검지범위</td> |
|
149 |
+ <td></td> |
|
150 |
+ </tr> |
|
151 |
+ <tr > |
|
152 |
+ <td colspan="2">왕복차선</td> |
|
153 |
+ <td></td> |
|
154 |
+ </tr> |
|
155 |
+ <tr > |
|
156 |
+ <td colspan="2">우회전차선유무</td> |
|
157 |
+ <td></td> |
|
158 |
+ </tr> |
|
159 |
+ <tr > |
|
160 |
+ <td colspan="2">우회전차선유형</td> |
|
161 |
+ <td></td> |
|
162 |
+ </tr> |
|
163 |
+ <tr > |
|
164 |
+ <td colspan="2">등록일자</td> |
|
165 |
+ <td></td> |
|
166 |
+ </tr> |
|
167 |
+ <tr > |
|
168 |
+ <td colspan="2">횡단보도 유지보수 담당자</td> |
|
169 |
+ <td></td> |
|
170 |
+ </tr> |
|
171 |
+ |
|
172 |
+ </tbody> |
|
173 |
+ </table> |
|
174 |
+ <h4 style="margin-top: 2rem;">횡단보도 유지보수 담당자 정보</h4> |
|
175 |
+ <table> |
|
176 |
+ <colgroup> |
|
177 |
+ <col style="width: 50%;"> |
|
178 |
+ <col style="width: 50%;"> |
|
179 |
+ </colgroup> |
|
180 |
+ <tbody> |
|
181 |
+ <tr > |
|
182 |
+ <td>이름</td> |
|
183 |
+ <td></td> |
|
184 |
+ </tr> |
|
185 |
+ <tr > |
|
186 |
+ <td>이메일</td> |
|
187 |
+ <td></td> |
|
188 |
+ </tr> |
|
189 |
+ <tr > |
|
190 |
+ <td>소속정보</td> |
|
191 |
+ <td></td> |
|
192 |
+ </tr> |
|
193 |
+ </tbody> |
|
194 |
+ </table> |
|
195 |
+ </div> |
|
62 | 196 |
</div> |
63 | 197 |
</div> |
64 | 198 |
</div> |
65 |
- </div> |
|
66 |
- <div class="right"> |
|
67 |
- <div class="top"> |
|
68 |
- <ul class="flex-end"> |
|
69 |
- <li> |
|
70 |
- <p>금일 보행자</p> |
|
71 |
- <h3>명</h3> |
|
72 |
- </li> |
|
73 |
- <li> |
|
74 |
- <p>금일 무단횡단 발생</p> |
|
75 |
- <h3>회</h3> |
|
76 |
- </li> |
|
77 |
- <li> |
|
78 |
- <p>금일 신호연장 발생</p> |
|
79 |
- <h3>회</h3> |
|
80 |
- </li> |
|
81 |
- <li> |
|
82 |
- <p>금일 신호연장 시간</p> |
|
83 |
- <h3>초</h3> |
|
84 |
- </li> |
|
85 |
- <li> |
|
86 |
- <p>금일 차량 신호위반 발생</p> |
|
87 |
- <h3>회</h3> |
|
88 |
- </li> |
|
89 |
- <li> |
|
90 |
- <p>금일 장애 발생</p> |
|
91 |
- <h3>회</h3> |
|
92 |
- </li> |
|
93 |
- </ul> |
|
199 |
+ <div class="bottom-wrap"> |
|
200 |
+ <div class="pg-wrap"> |
|
201 |
+ <a href="#" class="pg-item prev">◀</a> |
|
202 |
+ <a href="#" class="pg-item active">1</a> |
|
203 |
+ <a href="#" class="pg-item">2</a> |
|
204 |
+ <a href="#" class="pg-item">3</a> |
|
205 |
+ <a href="#" class="pg-item">4</a> |
|
206 |
+ <a href="#" class="pg-item">5</a> |
|
207 |
+ <a href="#" class="pg-item next">▶</a> |
|
94 | 208 |
</div> |
95 |
- <div><MapPage /></div> |
|
96 |
- </div> |
|
97 |
- </div> |
|
98 |
- |
|
209 |
+ <div class="btn-wrap"> |
|
210 |
+ <router-link to="/UserManagement.page"> |
|
211 |
+ <span class="btn-2 green-btn">Excel로 저장</span> |
|
212 |
+ </router-link> |
|
213 |
+ </div> |
|
214 |
+ </div> |
|
215 |
+ </div> |
|
216 |
+ </div> |
|
99 | 217 |
</template> |
100 |
-<style scoped> |
|
101 |
-.top p{font-size: 15px;} |
|
102 |
-.top ul{padding: 1rem 0;} |
|
103 |
-.top li{width: 267px; text-align: center;} |
|
104 |
-.top h3{font-size: 20px;} |
|
105 |
-.wrap { |
|
106 |
- z-index: 100; |
|
107 |
- top: 0; |
|
108 |
-} |
|
109 |
-.left { |
|
110 |
- background: #fff; |
|
111 |
- width: 300px; |
|
112 |
-} |
|
113 |
-</style> |
|
218 |
+ |
|
114 | 219 |
<script> |
115 |
-import MapPage from "../../component/MapPage.vue"; |
|
220 |
+import Modal from "../../component/Modal.vue"; |
|
116 | 221 |
|
117 | 222 |
export default { |
118 | 223 |
data() { |
119 |
- return {}; |
|
224 |
+ return { |
|
225 |
+ modal_1: false, |
|
226 |
+ }; |
|
120 | 227 |
}, |
121 |
- components: { |
|
122 |
- MapPage: MapPage, |
|
228 |
+ methods: { |
|
229 |
+ |
|
123 | 230 |
}, |
124 |
- methods: {}, |
|
125 | 231 |
watch: {}, |
126 |
- computed: {}, |
|
232 |
+ computed: { |
|
233 |
+ Modal: Modal, |
|
234 |
+ }, |
|
127 | 235 |
mounted() { |
128 |
- console.log("Main2 mounted"); |
|
236 |
+ console.log("Main4 mounted"); |
|
129 | 237 |
}, |
130 | 238 |
}; |
131 | 239 |
</script> |
240 |
+ |
|
241 |
+<style scoped> |
|
242 |
+.img{width: 20rem; height: 20rem; border: 1px solid #e5e5dd;} |
|
243 |
+label{width: max-content;} |
|
244 |
+select{width: 15rem;} |
|
245 |
+.modal{width: 100rem; max-height: 70rem; |
|
246 |
+ overflow: scroll; |
|
247 |
+ overflow-x: hidden;} |
|
248 |
+.modalmain{ padding: 1rem;} |
|
249 |
+.modalmain table tbody tr:nth-child(odd){background: #f7f6f6;} |
|
250 |
+.modalmain table tbody tr:nth-child(even){background: #ffffff;} |
|
251 |
+.modalmain table td{border: 1px solid #eee;} |
|
252 |
+.modal h2{background: #e5e5dd; font-size: 2rem; padding: 1rem ;} |
|
253 |
+.modal h3{font-size: 1.8rem; border-bottom: 1px solid #eee; padding: 1rem 0 0.2rem 0;} |
|
254 |
+.modal h4{font-size: 1.6rem; font-weight: 100; padding: 0.2rem 0 1rem 0 ;} |
|
255 |
+.modal button{border: 0; background: none; height: 30px; |
|
256 |
+ cursor: pointer;} |
|
257 |
+.modal button img{width: 25px;} |
|
258 |
+.txt-point { |
|
259 |
+ color: #333; |
|
260 |
+} |
|
261 |
+.wrap { |
|
262 |
+ width: 155rem; |
|
263 |
+ margin: 100px auto; |
|
264 |
+} |
|
265 |
+ |
|
266 |
+.search-wrap { |
|
267 |
+ margin-bottom: 30px; |
|
268 |
+ background: #f7f6f6; |
|
269 |
+ padding: 1rem; |
|
270 |
+} |
|
271 |
+ |
|
272 |
+.search-wrap input, |
|
273 |
+.search-wrap select { |
|
274 |
+ height: 22.5px; |
|
275 |
+ border-radius: 3px; |
|
276 |
+ border: 1px solid #949292; |
|
277 |
+} |
|
278 |
+ |
|
279 |
+.float-right { |
|
280 |
+ float: right; |
|
281 |
+} |
|
282 |
+ |
|
283 |
+.clear-fix::after { |
|
284 |
+ content: ""; |
|
285 |
+ display: block; |
|
286 |
+ clear: both; |
|
287 |
+} |
|
288 |
+ |
|
289 |
+.search-wrap .float-right form > *:not(:last-child) { |
|
290 |
+ margin-right: 1rem; |
|
291 |
+} |
|
292 |
+ |
|
293 |
+table { |
|
294 |
+ width: 100%; |
|
295 |
+ text-align: center; |
|
296 |
+ border-collapse: collapse; |
|
297 |
+} |
|
298 |
+ |
|
299 |
+th, |
|
300 |
+td { |
|
301 |
+ border-left: none; |
|
302 |
+ border-right: none; |
|
303 |
+} |
|
304 |
+ |
|
305 |
+table th { |
|
306 |
+ padding: 15px 0; |
|
307 |
+ color: #fff; |
|
308 |
+ background-color: #13833b; |
|
309 |
+} |
|
310 |
+ |
|
311 |
+table td { |
|
312 |
+ padding: 10px 0; |
|
313 |
+ border-bottom: 1px solid #e5e5dd; |
|
314 |
+} |
|
315 |
+ |
|
316 |
+table tr:nth-child(odd) { |
|
317 |
+ background-color: #f7f6f6; |
|
318 |
+} |
|
319 |
+ |
|
320 |
+table tr:nth-child(even) { |
|
321 |
+ background-color: #fdfdf2; |
|
322 |
+} |
|
323 |
+ |
|
324 |
+.bottom-wrap { |
|
325 |
+ position: relative; |
|
326 |
+ padding: 1rem 0; |
|
327 |
+} |
|
328 |
+ |
|
329 |
+.btn-2 { |
|
330 |
+ display: inline-block; |
|
331 |
+ padding: 0.3rem 2rem; |
|
332 |
+ font-size: 13.333px; |
|
333 |
+} |
|
334 |
+ |
|
335 |
+.pg-wrap { |
|
336 |
+ text-align: center; |
|
337 |
+} |
|
338 |
+ |
|
339 |
+.pg-item { |
|
340 |
+ display: inline-block; |
|
341 |
+ padding: 10px; |
|
342 |
+ color: #949292; |
|
343 |
+} |
|
344 |
+ |
|
345 |
+.pg-item.prev, |
|
346 |
+.pg-item.next, |
|
347 |
+.pg-item.active { |
|
348 |
+ color: #13833b; |
|
349 |
+} |
|
350 |
+ |
|
351 |
+.btn-wrap { |
|
352 |
+ position: absolute; |
|
353 |
+ right: 0; |
|
354 |
+ top: 1.5em; |
|
355 |
+ z-index: 10; |
|
356 |
+} |
|
357 |
+ |
|
358 |
+.btn-wrap button { |
|
359 |
+ cursor: pointer; |
|
360 |
+} |
|
361 |
+</style> |
--- client/views/pages/RealtimeStatus/ErrorSearch.vue
+++ client/views/pages/RealtimeStatus/ErrorSearch.vue
... | ... | @@ -1,171 +1,305 @@ |
1 | 1 |
<template> |
2 |
- <div class="flex"> |
|
3 |
- <div class="left"> |
|
4 |
- <div class="wrap flex-between"> |
|
5 |
- <div class="iconlist"> |
|
6 |
- <ul> |
|
7 |
- <li |
|
8 |
- v-for="item in items" |
|
9 |
- :key="item.id" |
|
10 |
- :class="{ active: item.isActive }" |
|
11 |
- @click="toggleActive(item)" |
|
12 |
- > |
|
13 |
- <div></div> |
|
14 |
- <p>{{ item.name }}</p> |
|
15 |
- </li> |
|
16 |
- </ul> |
|
2 |
+ <div class="wrap"> |
|
3 |
+ <div class="board-wrap"> |
|
4 |
+ <div class="search-wrap"> |
|
5 |
+ <div class="flex m-b gap" style="margin-bottom: 2rem;"> |
|
6 |
+ <div class="flex gap m-r" style="margin-right: 5rem;"> |
|
7 |
+ <label>조회기간: </label> |
|
8 |
+ <input type="date" name="" id="" /> |
|
9 |
+ <span>~</span> |
|
10 |
+ <input type="date" name="" id="" /> |
|
11 |
+ </div> |
|
12 |
+ <div class="flex gap"> |
|
13 |
+ <label>지역: </label> |
|
14 |
+ <select name="" id=""> |
|
15 |
+ <option value="">대구광역시</option> |
|
16 |
+ </select> |
|
17 |
+ <select name="" id=""> |
|
18 |
+ <option value="">서구</option> |
|
19 |
+ </select> |
|
20 |
+ <select name="" id=""> |
|
21 |
+ <option value="">전체</option> |
|
22 |
+ </select> |
|
23 |
+ </div> |
|
17 | 24 |
</div> |
18 |
- <div class="search"> |
|
19 |
- <h2>지역설정</h2> |
|
20 |
- <div class="box"> |
|
21 |
- <div class="flex-between m-b"> |
|
22 |
- <label for="">시/도</label> |
|
23 |
- <select name="" id=""></select> |
|
25 |
+ <div class="flex-between gap"> |
|
26 |
+ <div class="gap flex"> |
|
27 |
+ <label>장애타입: </label> |
|
28 |
+ <select name="" id=""> |
|
29 |
+ <option value="">전체</option> |
|
30 |
+ </select> |
|
31 |
+ <label>장비타입: </label> |
|
32 |
+ <select name="" id=""> |
|
33 |
+ <option value="">전체</option> |
|
34 |
+ </select> |
|
35 |
+ <label>복구여부: </label> |
|
36 |
+ <select name="" id=""> |
|
37 |
+ <option value="">정상</option> |
|
38 |
+ </select> |
|
39 |
+ </div> |
|
40 |
+ <button type="button" class="btn-2 green-btn">조회</button> |
|
41 |
+ </div> |
|
42 |
+ |
|
43 |
+ </div> |
|
44 |
+ <div> |
|
45 |
+ <table> |
|
46 |
+ <!-- <colgroup> |
|
47 |
+ <col style="width: 10%;"> |
|
48 |
+ <col style="width: 20%;"> |
|
49 |
+ <col style="width: 20%;"> |
|
50 |
+ <col style="width: 30%;"> |
|
51 |
+ <col style="width: 20%;"> |
|
52 |
+ </colgroup> --> |
|
53 |
+ <thead> |
|
54 |
+ <tr> |
|
55 |
+ <th>No</th> |
|
56 |
+ <th>장애 발생일시</th> |
|
57 |
+ <th>시/도</th> |
|
58 |
+ <th>시/군/구</th> |
|
59 |
+ <th>행정동</th> |
|
60 |
+ <th>교차로</th> |
|
61 |
+ <th>횡단보도명</th> |
|
62 |
+ <th>장비명</th> |
|
63 |
+ <th>장애명</th> |
|
64 |
+ <th>복구여부</th> |
|
65 |
+ <th>복구시간</th> |
|
66 |
+ </tr> |
|
67 |
+ </thead> |
|
68 |
+ <tbody> |
|
69 |
+ <tr @click="modal_1 = true"> |
|
70 |
+ <td></td> |
|
71 |
+ <td></td> |
|
72 |
+ <td></td> |
|
73 |
+ <td></td> |
|
74 |
+ <td></td> |
|
75 |
+ <td></td> |
|
76 |
+ <td></td> |
|
77 |
+ <td></td> |
|
78 |
+ <td></td> |
|
79 |
+ <td></td> |
|
80 |
+ <td></td> |
|
81 |
+ </tr> |
|
82 |
+ </tbody> |
|
83 |
+ </table> |
|
84 |
+ <div class="modal-wrap" v-if="modal_1 == true"> |
|
85 |
+ <div class="modal-bg"></div> |
|
86 |
+ <div class="modal"> |
|
87 |
+ <h2 class="flex">장애발생 상세정보 <button type="button" class="gray-btn" @click="modal_1 = false"> |
|
88 |
+ <img src="../../../resources/images/close.png" alt=""> |
|
89 |
+ </button></h2> |
|
90 |
+ <div class="modalmain"> |
|
91 |
+ <h3>영재어린이집(서측)</h3> |
|
92 |
+ <h4>동쪽횡단보도</h4> |
|
93 |
+ <table> |
|
94 |
+ <colgroup> |
|
95 |
+ <col style="width: 50%;"> |
|
96 |
+ <col style="width: 50%;"> |
|
97 |
+ </colgroup> |
|
98 |
+ <tbody> |
|
99 |
+ <tr > |
|
100 |
+ <td>발생일시</td> |
|
101 |
+ <td></td> |
|
102 |
+ </tr> |
|
103 |
+ <tr > |
|
104 |
+ <td>장비명</td> |
|
105 |
+ <td></td> |
|
106 |
+ </tr> |
|
107 |
+ <tr > |
|
108 |
+ <td>장애명</td> |
|
109 |
+ <td></td> |
|
110 |
+ </tr> |
|
111 |
+ <tr > |
|
112 |
+ <td>복구여부</td> |
|
113 |
+ <td></td> |
|
114 |
+ </tr> |
|
115 |
+ <tr > |
|
116 |
+ <td>복구상태</td> |
|
117 |
+ <td></td> |
|
118 |
+ </tr> |
|
119 |
+ </tbody> |
|
120 |
+ </table> |
|
121 |
+ <h4 style="margin-top: 2rem;">횡단보도 유지보수 담당자 정보</h4> |
|
122 |
+ <table> |
|
123 |
+ <colgroup> |
|
124 |
+ <col style="width: 50%;"> |
|
125 |
+ <col style="width: 50%;"> |
|
126 |
+ </colgroup> |
|
127 |
+ <tbody> |
|
128 |
+ <tr > |
|
129 |
+ <td>이름</td> |
|
130 |
+ <td></td> |
|
131 |
+ </tr> |
|
132 |
+ <tr > |
|
133 |
+ <td>이메일</td> |
|
134 |
+ <td></td> |
|
135 |
+ </tr> |
|
136 |
+ <tr > |
|
137 |
+ <td>소속정보</td> |
|
138 |
+ <td></td> |
|
139 |
+ </tr> |
|
140 |
+ </tbody> |
|
141 |
+ </table> |
|
24 | 142 |
</div> |
25 |
- <div class="flex-between m-b"> |
|
26 |
- <label for="">시/군/구</label> |
|
27 |
- <select name="" id=""></select> |
|
28 |
- </div> |
|
29 |
- <div class="flex-between m-b"> |
|
30 |
- <label for="">행정동</label> |
|
31 |
- <select name="" id=""></select> |
|
32 |
- </div> |
|
33 |
- <div class="flex-between m-b"> |
|
34 |
- <label for="">교차로</label> |
|
35 |
- <select name="" id=""></select> |
|
36 |
- </div> |
|
37 |
- </div> |
|
38 |
- <h2>조건설정</h2> |
|
39 |
- <div class="box"> |
|
40 |
- <div class="flex-between m-b"> |
|
41 |
- <input type="checkbox" /><label for="">무단횡단</label> |
|
42 |
- <input type="checkbox" /><label for="">신호연장</label> |
|
43 |
- <input type="checkbox" /><label for="">신호위반</label> |
|
44 |
- <input type="checkbox" /><label for="">장애발생</label> |
|
45 |
- </div> |
|
46 |
- <div class="flex-between m-b" > |
|
47 |
- <label for="date-input">일자</label> |
|
48 |
- <input id="date-input" type="date" v-model="selectedDate" /> ~ <input id="date-input" type="date" v-model="selectedDate" /> |
|
49 |
- </div> |
|
50 |
- <div class="flex-between m-b" > |
|
51 |
- <label for="time-input">시간대</label> |
|
52 |
- <input |
|
53 |
- id="time-input" |
|
54 |
- type="time" |
|
55 |
- v-model="selectedTime" |
|
56 |
- />~<input id="time-input" type="time" v-model="selectedTime" /> |
|
57 |
- </div> |
|
58 |
- <button class="btn-l green-btn">검색</button> |
|
59 |
- </div> |
|
60 |
- <h2>지역설정</h2> |
|
61 |
- <div class="box bg-white"> |
|
62 |
- <button c>상황발생현황</button> |
|
63 |
- <button>장애발생현황</button> |
|
64 |
- <ul> |
|
65 |
- <li> |
|
66 |
- <p class="m-b">발생일시: 2023-05-04 14:27</p> |
|
67 |
- <p class="m-b">상황명: 무단횡단</p> |
|
68 |
- <p class="m-b">발생장소: 영재어린이집(서측) 동쪽횡단보도</p> |
|
69 |
- </li> |
|
70 |
- </ul> |
|
71 | 143 |
</div> |
72 | 144 |
</div> |
73 | 145 |
</div> |
74 |
- </div> |
|
75 |
- <div class="right"> |
|
76 |
- <div class="top"> |
|
77 |
- <ul class="flex-end"> |
|
78 |
- <li> |
|
79 |
- <p>금일 보행자</p> |
|
80 |
- <h3>명</h3> |
|
81 |
- </li> |
|
82 |
- <li> |
|
83 |
- <p>금일 무단횡단 발생</p> |
|
84 |
- <h3>회</h3> |
|
85 |
- </li> |
|
86 |
- <li> |
|
87 |
- <p>금일 신호연장 발생</p> |
|
88 |
- <h3>회</h3> |
|
89 |
- </li> |
|
90 |
- <li> |
|
91 |
- <p>금일 신호연장 시간</p> |
|
92 |
- <h3>초</h3> |
|
93 |
- </li> |
|
94 |
- <li> |
|
95 |
- <p>금일 차량 신호위반 발생</p> |
|
96 |
- <h3>회</h3> |
|
97 |
- </li> |
|
98 |
- <li> |
|
99 |
- <p>금일 장애 발생</p> |
|
100 |
- <h3>회</h3> |
|
101 |
- </li> |
|
102 |
- </ul> |
|
146 |
+ <div class="bottom-wrap"> |
|
147 |
+ <div class="pg-wrap"> |
|
148 |
+ <a href="#" class="pg-item prev">◀</a> |
|
149 |
+ <a href="#" class="pg-item active">1</a> |
|
150 |
+ <a href="#" class="pg-item">2</a> |
|
151 |
+ <a href="#" class="pg-item">3</a> |
|
152 |
+ <a href="#" class="pg-item">4</a> |
|
153 |
+ <a href="#" class="pg-item">5</a> |
|
154 |
+ <a href="#" class="pg-item next">▶</a> |
|
155 |
+ </div> |
|
156 |
+ <div class="btn-wrap"> |
|
157 |
+ <router-link to="/UserManagement.page"> |
|
158 |
+ <span class="btn-2 green-btn">Excel로 저장</span> |
|
159 |
+ </router-link> |
|
160 |
+ </div> |
|
103 | 161 |
</div> |
104 |
- <div><MapPage /></div> |
|
105 | 162 |
</div> |
106 | 163 |
</div> |
107 | 164 |
</template> |
108 |
-<style scoped> |
|
109 |
-.bg-white{min-height: 46.6rem; max-height: 46.6rem; overflow: scroll; overflow-x: hidden;} |
|
110 |
-.bg-white::-webkit-scrollbar-thumb {background-color: #fff;} |
|
111 |
-h2 { |
|
112 |
- background: #50ba8a; |
|
113 |
- text-align: center; |
|
114 |
- color: #fff; |
|
115 |
- padding: 1.6rem 0; |
|
116 |
-} |
|
117 |
-.top p { |
|
118 |
- font-size: 15px; |
|
119 |
-} |
|
120 |
-.top ul { |
|
121 |
- padding: 1rem 0; |
|
122 |
-} |
|
123 |
-.top li { |
|
124 |
- width: calc(100% / 6); |
|
125 |
- text-align: center; |
|
126 |
-} |
|
127 |
-.top h3 { |
|
128 |
- font-size: 20px; |
|
129 |
-} |
|
130 |
-.wrap { |
|
131 |
- z-index: 100; |
|
132 |
- top: 0; |
|
133 |
- height: 865px; |
|
134 |
-} |
|
135 |
-.left { |
|
136 |
- background: #fff; |
|
137 |
-} |
|
138 |
-.right { |
|
139 |
- width: -webkit-fill-available; |
|
140 |
- |
|
141 |
-} |
|
142 |
-</style> |
|
165 |
+ |
|
143 | 166 |
<script> |
144 |
-import MapPage from "../../component/MapPage.vue"; |
|
167 |
+import Modal from "../../component/Modal.vue"; |
|
145 | 168 |
|
146 | 169 |
export default { |
147 | 170 |
data() { |
148 | 171 |
return { |
149 |
- items: [ |
|
150 |
- { id: 1, name: "무단횡단", isActive: false }, |
|
151 |
- { id: 2, name: "신호연장", isActive: false }, |
|
152 |
- { id: 3, name: "우회전 차량", isActive: false }, |
|
153 |
- { id: 4, name: "장애발생", isActive: false }, |
|
154 |
- ], |
|
172 |
+ modal_1: false, |
|
155 | 173 |
}; |
156 | 174 |
}, |
157 |
- components: { |
|
158 |
- MapPage: MapPage, |
|
159 |
- }, |
|
160 | 175 |
methods: { |
161 |
- toggleActive(item) { |
|
162 |
- item.isActive = !item.isActive; |
|
163 |
- }, |
|
176 |
+ |
|
164 | 177 |
}, |
165 | 178 |
watch: {}, |
166 |
- computed: {}, |
|
179 |
+ computed: { |
|
180 |
+ Modal: Modal, |
|
181 |
+ }, |
|
167 | 182 |
mounted() { |
168 |
- console.log("Main2 mounted"); |
|
183 |
+ console.log("Main4 mounted"); |
|
169 | 184 |
}, |
170 | 185 |
}; |
171 | 186 |
</script> |
187 |
+ |
|
188 |
+<style scoped> |
|
189 |
+label{width: max-content;} |
|
190 |
+select{width: 15rem;} |
|
191 |
+.modal{width: max-content;} |
|
192 |
+.modalmain{ padding: 1rem;} |
|
193 |
+.modalmain table tbody tr:nth-child(odd){background: #f7f6f6;} |
|
194 |
+.modalmain table tbody tr:nth-child(even){background: #ffffff;} |
|
195 |
+.modalmain table td{border: 1px solid #eee;} |
|
196 |
+.modal h2{background: #e5e5dd; font-size: 2rem; padding: 1rem ;} |
|
197 |
+.modal h3{font-size: 1.8rem; border-bottom: 1px solid #eee; padding: 1rem 0 0.2rem 0;} |
|
198 |
+.modal h4{font-size: 1.6rem; font-weight: 100; padding: 0.2rem 0 1rem 0 ;} |
|
199 |
+.modal button{border: 0; background: none; height: 30px; |
|
200 |
+ padding: 0 0 0 50rem; cursor: pointer;} |
|
201 |
+.modal button img{width: 25px;} |
|
202 |
+.txt-point { |
|
203 |
+ color: #333; |
|
204 |
+} |
|
205 |
+.wrap { |
|
206 |
+ width: 155rem; |
|
207 |
+ margin: 100px auto; |
|
208 |
+} |
|
209 |
+ |
|
210 |
+.search-wrap { |
|
211 |
+ margin-bottom: 30px; |
|
212 |
+ background: #f7f6f6; |
|
213 |
+ padding: 1rem; |
|
214 |
+} |
|
215 |
+ |
|
216 |
+.search-wrap input, |
|
217 |
+.search-wrap select { |
|
218 |
+ height: 22.5px; |
|
219 |
+ border-radius: 3px; |
|
220 |
+ border: 1px solid #949292; |
|
221 |
+} |
|
222 |
+ |
|
223 |
+.float-right { |
|
224 |
+ float: right; |
|
225 |
+} |
|
226 |
+ |
|
227 |
+.clear-fix::after { |
|
228 |
+ content: ""; |
|
229 |
+ display: block; |
|
230 |
+ clear: both; |
|
231 |
+} |
|
232 |
+ |
|
233 |
+.search-wrap .float-right form > *:not(:last-child) { |
|
234 |
+ margin-right: 1rem; |
|
235 |
+} |
|
236 |
+ |
|
237 |
+table { |
|
238 |
+ width: 100%; |
|
239 |
+ text-align: center; |
|
240 |
+ border-collapse: collapse; |
|
241 |
+} |
|
242 |
+ |
|
243 |
+th, |
|
244 |
+td { |
|
245 |
+ border-left: none; |
|
246 |
+ border-right: none; |
|
247 |
+} |
|
248 |
+ |
|
249 |
+table th { |
|
250 |
+ padding: 15px 0; |
|
251 |
+ color: #fff; |
|
252 |
+ background-color: #13833b; |
|
253 |
+} |
|
254 |
+ |
|
255 |
+table td { |
|
256 |
+ padding: 10px 0; |
|
257 |
+ border-bottom: 1px solid #e5e5dd; |
|
258 |
+} |
|
259 |
+ |
|
260 |
+table tr:nth-child(odd) { |
|
261 |
+ background-color: #f7f6f6; |
|
262 |
+} |
|
263 |
+ |
|
264 |
+table tr:nth-child(even) { |
|
265 |
+ background-color: #fdfdf2; |
|
266 |
+} |
|
267 |
+ |
|
268 |
+.bottom-wrap { |
|
269 |
+ position: relative; |
|
270 |
+ padding: 1rem 0; |
|
271 |
+} |
|
272 |
+ |
|
273 |
+.btn-2 { |
|
274 |
+ display: inline-block; |
|
275 |
+ padding: 0.3rem 2rem; |
|
276 |
+ font-size: 13.333px; |
|
277 |
+} |
|
278 |
+ |
|
279 |
+.pg-wrap { |
|
280 |
+ text-align: center; |
|
281 |
+} |
|
282 |
+ |
|
283 |
+.pg-item { |
|
284 |
+ display: inline-block; |
|
285 |
+ padding: 10px; |
|
286 |
+ color: #949292; |
|
287 |
+} |
|
288 |
+ |
|
289 |
+.pg-item.prev, |
|
290 |
+.pg-item.next, |
|
291 |
+.pg-item.active { |
|
292 |
+ color: #13833b; |
|
293 |
+} |
|
294 |
+ |
|
295 |
+.btn-wrap { |
|
296 |
+ position: absolute; |
|
297 |
+ right: 0; |
|
298 |
+ top: 1.5em; |
|
299 |
+ z-index: 10; |
|
300 |
+} |
|
301 |
+ |
|
302 |
+.btn-wrap button { |
|
303 |
+ cursor: pointer; |
|
304 |
+} |
|
305 |
+</style> |
--- client/views/pages/RealtimeStatus/RealtimeStatus.vue
+++ client/views/pages/RealtimeStatus/RealtimeStatus.vue
... | ... | @@ -55,19 +55,35 @@ |
55 | 55 |
v-model="selectedTime" |
56 | 56 |
/>~<input id="time-input" type="time" v-model="selectedTime" /> |
57 | 57 |
</div> |
58 |
- <button class="btn-l green-btn">검색</button> |
|
58 |
+ <button class="btn-l green-btn" style="padding: 0.5rem 0;">검색</button> |
|
59 | 59 |
</div> |
60 | 60 |
<h2>지역설정</h2> |
61 |
- <div class="box bg-white"> |
|
62 |
- <button c>상황발생현황</button> |
|
63 |
- <button>장애발생현황</button> |
|
64 |
- <ul> |
|
65 |
- <li> |
|
66 |
- <p class="m-b">발생일시: 2023-05-04 14:27</p> |
|
67 |
- <p class="m-b">상황명: 무단횡단</p> |
|
68 |
- <p class="m-b">발생장소: 영재어린이집(서측) 동쪽횡단보도</p> |
|
69 |
- </li> |
|
70 |
- </ul> |
|
61 |
+ <div class="box bg-white tab-buttons"> |
|
62 |
+ <div class="btn_set flex-center"> |
|
63 |
+ <button class="m-r" v-for="tab in tabs" |
|
64 |
+ :key="tab.id" |
|
65 |
+ :class="{ 'active': activeTab === tab.id }" |
|
66 |
+ @click="changeTab(tab.id)">{{ tab.title }}</button> |
|
67 |
+ </div> |
|
68 |
+ <div class="tab-content" v-for="tab in tabs" :key="tab.id" v-show="activeTab === tab.id"> |
|
69 |
+ <ul v-show="tab.content1"> |
|
70 |
+ <li > |
|
71 |
+ <p class="m-b">발생일시: 2023-05-04 14:27</p> |
|
72 |
+ <p class="m-b">상황명: 무단횡단</p> |
|
73 |
+ <p class="">발생장소: 영재어린이집(서측) 동쪽횡단보도</p> |
|
74 |
+ </li> |
|
75 |
+ </ul> |
|
76 |
+ <ul v-show="tab.content2"> |
|
77 |
+ <li > |
|
78 |
+ <p class="m-b">발생일시: 2023-05-04 14:27</p> |
|
79 |
+ <p class="m-b">장애명: CPU 사용 90% 이상</p> |
|
80 |
+ <p class="m-b">발생장소: 영재어린이집(서측) 동쪽횡단보도</p> |
|
81 |
+ <p class="m-b">담당자: 김담당</p> |
|
82 |
+ <p class="">연락처: 010-1234-5678</p> |
|
83 |
+ <div class="flex-end"><button >확인</button></div> |
|
84 |
+ </li> |
|
85 |
+ </ul> |
|
86 |
+ </div> |
|
71 | 87 |
</div> |
72 | 88 |
</div> |
73 | 89 |
</div> |
... | ... | @@ -106,6 +122,11 @@ |
106 | 122 |
</div> |
107 | 123 |
</template> |
108 | 124 |
<style scoped> |
125 |
+.btn_set{position: relative; border-bottom: 1px solid #e5e3e3; padding: 0 0 1rem 0;} |
|
126 |
+.btn_set div{position: absolute; top: 40px; |
|
127 |
+ width: 313px; |
|
128 |
+ height: 380px; |
|
129 |
+ background: #fff; padding: 1rem;} |
|
109 | 130 |
.bg-white{min-height: 46.6rem; max-height: 46.6rem; overflow: scroll; overflow-x: hidden;} |
110 | 131 |
.bg-white::-webkit-scrollbar-thumb {background-color: #fff;} |
111 | 132 |
h2 { |
... | ... | @@ -146,6 +167,11 @@ |
146 | 167 |
export default { |
147 | 168 |
data() { |
148 | 169 |
return { |
170 |
+ tabs: [ |
|
171 |
+ { id: 1, title: '상황발생현황', content1: 'This is the content for Tab 1' }, |
|
172 |
+ { id: 2, title: '장애발생현황', content2: 'This is the content for Tab 2' }, |
|
173 |
+ ], |
|
174 |
+ activeTab: 1, |
|
149 | 175 |
items: [ |
150 | 176 |
{ id: 1, name: "무단횡단", isActive: false }, |
151 | 177 |
{ id: 2, name: "신호연장", isActive: false }, |
... | ... | @@ -158,6 +184,9 @@ |
158 | 184 |
MapPage: MapPage, |
159 | 185 |
}, |
160 | 186 |
methods: { |
187 |
+ changeTab(tabId) { |
|
188 |
+ this.activeTab = tabId; |
|
189 |
+ }, |
|
161 | 190 |
toggleActive(item) { |
162 | 191 |
item.isActive = !item.isActive; |
163 | 192 |
}, |
--- client/views/pages/RealtimeStatus/SituationSearch.vue
+++ client/views/pages/RealtimeStatus/SituationSearch.vue
... | ... | @@ -1,171 +1,255 @@ |
1 | 1 |
<template> |
2 |
- <div class="flex"> |
|
3 |
- <div class="left"> |
|
4 |
- <div class="wrap flex-between"> |
|
5 |
- <div class="iconlist"> |
|
6 |
- <ul> |
|
7 |
- <li |
|
8 |
- v-for="item in items" |
|
9 |
- :key="item.id" |
|
10 |
- :class="{ active: item.isActive }" |
|
11 |
- @click="toggleActive(item)" |
|
12 |
- > |
|
13 |
- <div></div> |
|
14 |
- <p>{{ item.name }}</p> |
|
15 |
- </li> |
|
16 |
- </ul> |
|
17 |
- </div> |
|
18 |
- <div class="search"> |
|
19 |
- <h2>지역설정</h2> |
|
20 |
- <div class="box"> |
|
21 |
- <div class="flex-between m-b"> |
|
22 |
- <label for="">시/도</label> |
|
23 |
- <select name="" id=""></select> |
|
24 |
- </div> |
|
25 |
- <div class="flex-between m-b"> |
|
26 |
- <label for="">시/군/구</label> |
|
27 |
- <select name="" id=""></select> |
|
28 |
- </div> |
|
29 |
- <div class="flex-between m-b"> |
|
30 |
- <label for="">행정동</label> |
|
31 |
- <select name="" id=""></select> |
|
32 |
- </div> |
|
33 |
- <div class="flex-between m-b"> |
|
34 |
- <label for="">교차로</label> |
|
35 |
- <select name="" id=""></select> |
|
36 |
- </div> |
|
2 |
+ <div class="wrap"> |
|
3 |
+ <div class="board-wrap"> |
|
4 |
+ <div class="search-wrap"> |
|
5 |
+ <div class="flex-between"> |
|
6 |
+ <div class="flex gap"> |
|
7 |
+ <label>날짜를 선택해주세요.</label> |
|
8 |
+ <input type="date" name="" id="" /> |
|
9 |
+ <span>~</span> |
|
10 |
+ <input type="date" name="" id="" /> |
|
37 | 11 |
</div> |
38 |
- <h2>조건설정</h2> |
|
39 |
- <div class="box"> |
|
40 |
- <div class="flex-between m-b"> |
|
41 |
- <input type="checkbox" /><label for="">무단횡단</label> |
|
42 |
- <input type="checkbox" /><label for="">신호연장</label> |
|
43 |
- <input type="checkbox" /><label for="">신호위반</label> |
|
44 |
- <input type="checkbox" /><label for="">장애발생</label> |
|
45 |
- </div> |
|
46 |
- <div class="flex-between m-b" > |
|
47 |
- <label for="date-input">일자</label> |
|
48 |
- <input id="date-input" type="date" v-model="selectedDate" /> ~ <input id="date-input" type="date" v-model="selectedDate" /> |
|
49 |
- </div> |
|
50 |
- <div class="flex-between m-b" > |
|
51 |
- <label for="time-input">시간대</label> |
|
52 |
- <input |
|
53 |
- id="time-input" |
|
54 |
- type="time" |
|
55 |
- v-model="selectedTime" |
|
56 |
- />~<input id="time-input" type="time" v-model="selectedTime" /> |
|
57 |
- </div> |
|
58 |
- <button class="btn-l green-btn">검색</button> |
|
59 |
- </div> |
|
60 |
- <h2>지역설정</h2> |
|
61 |
- <div class="box bg-white"> |
|
62 |
- <button c>상황발생현황</button> |
|
63 |
- <button>장애발생현황</button> |
|
64 |
- <ul> |
|
65 |
- <li> |
|
66 |
- <p class="m-b">발생일시: 2023-05-04 14:27</p> |
|
67 |
- <p class="m-b">상황명: 무단횡단</p> |
|
68 |
- <p class="m-b">발생장소: 영재어린이집(서측) 동쪽횡단보도</p> |
|
69 |
- </li> |
|
70 |
- </ul> |
|
12 |
+ <div class="flex gap"> |
|
13 |
+ <label>시/도</label> |
|
14 |
+ <select name="" id=""> |
|
15 |
+ <option value="">대구광역시</option> |
|
16 |
+ </select> |
|
17 |
+ <label>시/군/구</label> |
|
18 |
+ <select name="" id=""> |
|
19 |
+ <option value="">서구</option> |
|
20 |
+ </select> |
|
21 |
+ <label>행정동</label> |
|
22 |
+ <select name="" id=""> |
|
23 |
+ <option value="">전체</option> |
|
24 |
+ </select> |
|
25 |
+ <label>상황명</label> |
|
26 |
+ <select name="" id=""> |
|
27 |
+ <option value="">전체</option> |
|
28 |
+ <option value="">무단횡단</option> |
|
29 |
+ <option value="">신호연장</option> |
|
30 |
+ <option value="">신호위반</option> |
|
31 |
+ </select> |
|
32 |
+ <input type="text" /> |
|
33 |
+ <button type="button" class="btn-2 green-btn">조회</button> |
|
71 | 34 |
</div> |
72 | 35 |
</div> |
73 | 36 |
</div> |
74 |
- </div> |
|
75 |
- <div class="right"> |
|
76 |
- <div class="top"> |
|
77 |
- <ul class="flex-end"> |
|
78 |
- <li> |
|
79 |
- <p>금일 보행자</p> |
|
80 |
- <h3>명</h3> |
|
81 |
- </li> |
|
82 |
- <li> |
|
83 |
- <p>금일 무단횡단 발생</p> |
|
84 |
- <h3>회</h3> |
|
85 |
- </li> |
|
86 |
- <li> |
|
87 |
- <p>금일 신호연장 발생</p> |
|
88 |
- <h3>회</h3> |
|
89 |
- </li> |
|
90 |
- <li> |
|
91 |
- <p>금일 신호연장 시간</p> |
|
92 |
- <h3>초</h3> |
|
93 |
- </li> |
|
94 |
- <li> |
|
95 |
- <p>금일 차량 신호위반 발생</p> |
|
96 |
- <h3>회</h3> |
|
97 |
- </li> |
|
98 |
- <li> |
|
99 |
- <p>금일 장애 발생</p> |
|
100 |
- <h3>회</h3> |
|
101 |
- </li> |
|
102 |
- </ul> |
|
37 |
+ <div> |
|
38 |
+ <table> |
|
39 |
+ <!-- <colgroup> |
|
40 |
+ <col style="width: 10%;"> |
|
41 |
+ <col style="width: 20%;"> |
|
42 |
+ <col style="width: 20%;"> |
|
43 |
+ <col style="width: 30%;"> |
|
44 |
+ <col style="width: 20%;"> |
|
45 |
+ </colgroup> --> |
|
46 |
+ <thead> |
|
47 |
+ <tr> |
|
48 |
+ <th>No</th> |
|
49 |
+ <th>발생일시</th> |
|
50 |
+ <th>시/도</th> |
|
51 |
+ <th>시/군/구</th> |
|
52 |
+ <th>행정동</th> |
|
53 |
+ <th>상황명</th> |
|
54 |
+ </tr> |
|
55 |
+ </thead> |
|
56 |
+ <tbody> |
|
57 |
+ <tr @click="modal_1 = true"> |
|
58 |
+ <td></td> |
|
59 |
+ <td></td> |
|
60 |
+ <td></td> |
|
61 |
+ <td></td> |
|
62 |
+ <td></td> |
|
63 |
+ <td></td> |
|
64 |
+ </tr> |
|
65 |
+ </tbody> |
|
66 |
+ </table> |
|
67 |
+ <div class="modal-wrap" v-if="modal_1 == true"> |
|
68 |
+ <div class="modal-bg"></div> |
|
69 |
+ <div class="modal"> |
|
70 |
+ <h2 class="flex">상황발생 상세정보 <button type="button" class="gray-btn" @click="modal_1 = false"> |
|
71 |
+ <img src="../../../resources/images/close.png" alt=""> |
|
72 |
+ </button></h2> |
|
73 |
+ <div class="modalmain"> |
|
74 |
+ <h3>영재어린이집(서측)</h3> |
|
75 |
+ <h4>동쪽횡단보도</h4> |
|
76 |
+ <table> |
|
77 |
+ <colgroup> |
|
78 |
+ <col style="width: 50%;"> |
|
79 |
+ <col style="width: 50%;"> |
|
80 |
+ </colgroup> |
|
81 |
+ <tbody> |
|
82 |
+ <tr @click="modal_1 = true"> |
|
83 |
+ <td>발생일시</td> |
|
84 |
+ <td>2023-05-03 14:48</td> |
|
85 |
+ </tr> |
|
86 |
+ <tr @click="modal_1 = true"> |
|
87 |
+ <td>상황명</td> |
|
88 |
+ <td>무단횡단</td> |
|
89 |
+ </tr> |
|
90 |
+ <tr @click="modal_1 = true"> |
|
91 |
+ <td>신호상태</td> |
|
92 |
+ <td>적색불</td> |
|
93 |
+ </tr> |
|
94 |
+ </tbody> |
|
95 |
+ </table> |
|
96 |
+ </div> |
|
97 |
+ </div> |
|
98 |
+ </div> |
|
103 | 99 |
</div> |
104 |
- <div><MapPage /></div> |
|
100 |
+ <div class="bottom-wrap"> |
|
101 |
+ <div class="pg-wrap"> |
|
102 |
+ <a href="#" class="pg-item prev">◀</a> |
|
103 |
+ <a href="#" class="pg-item active">1</a> |
|
104 |
+ <a href="#" class="pg-item">2</a> |
|
105 |
+ <a href="#" class="pg-item">3</a> |
|
106 |
+ <a href="#" class="pg-item">4</a> |
|
107 |
+ <a href="#" class="pg-item">5</a> |
|
108 |
+ <a href="#" class="pg-item next">▶</a> |
|
109 |
+ </div> |
|
110 |
+ <div class="btn-wrap"> |
|
111 |
+ <router-link to="/UserManagement.page"> |
|
112 |
+ <span class="btn-2 green-btn">Excel로 저장</span> |
|
113 |
+ </router-link> |
|
114 |
+ </div> |
|
115 |
+ </div> |
|
105 | 116 |
</div> |
106 | 117 |
</div> |
107 | 118 |
</template> |
108 |
-<style scoped> |
|
109 |
-.bg-white{min-height: 46.6rem; max-height: 46.6rem; overflow: scroll; overflow-x: hidden;} |
|
110 |
-.bg-white::-webkit-scrollbar-thumb {background-color: #fff;} |
|
111 |
-h2 { |
|
112 |
- background: #50ba8a; |
|
113 |
- text-align: center; |
|
114 |
- color: #fff; |
|
115 |
- padding: 1.6rem 0; |
|
116 |
-} |
|
117 |
-.top p { |
|
118 |
- font-size: 15px; |
|
119 |
-} |
|
120 |
-.top ul { |
|
121 |
- padding: 1rem 0; |
|
122 |
-} |
|
123 |
-.top li { |
|
124 |
- width: calc(100% / 6); |
|
125 |
- text-align: center; |
|
126 |
-} |
|
127 |
-.top h3 { |
|
128 |
- font-size: 20px; |
|
129 |
-} |
|
130 |
-.wrap { |
|
131 |
- z-index: 100; |
|
132 |
- top: 0; |
|
133 |
- height: 865px; |
|
134 |
-} |
|
135 |
-.left { |
|
136 |
- background: #fff; |
|
137 |
-} |
|
138 |
-.right { |
|
139 |
- width: -webkit-fill-available; |
|
140 |
- |
|
141 |
-} |
|
142 |
-</style> |
|
119 |
+ |
|
143 | 120 |
<script> |
144 |
-import MapPage from "../../component/MapPage.vue"; |
|
121 |
+import Modal from "../../component/Modal.vue"; |
|
145 | 122 |
|
146 | 123 |
export default { |
147 | 124 |
data() { |
148 | 125 |
return { |
149 |
- items: [ |
|
150 |
- { id: 1, name: "무단횡단", isActive: false }, |
|
151 |
- { id: 2, name: "신호연장", isActive: false }, |
|
152 |
- { id: 3, name: "우회전 차량", isActive: false }, |
|
153 |
- { id: 4, name: "장애발생", isActive: false }, |
|
154 |
- ], |
|
126 |
+ modal_1: false, |
|
155 | 127 |
}; |
156 | 128 |
}, |
157 |
- components: { |
|
158 |
- MapPage: MapPage, |
|
159 |
- }, |
|
160 | 129 |
methods: { |
161 |
- toggleActive(item) { |
|
162 |
- item.isActive = !item.isActive; |
|
163 |
- }, |
|
130 |
+ |
|
164 | 131 |
}, |
165 | 132 |
watch: {}, |
166 |
- computed: {}, |
|
133 |
+ computed: { |
|
134 |
+ Modal: Modal, |
|
135 |
+ }, |
|
167 | 136 |
mounted() { |
168 |
- console.log("Main2 mounted"); |
|
137 |
+ console.log("Main4 mounted"); |
|
169 | 138 |
}, |
170 | 139 |
}; |
171 | 140 |
</script> |
141 |
+ |
|
142 |
+<style scoped> |
|
143 |
+.modal{width: max-content;} |
|
144 |
+.modalmain{ padding: 1rem;} |
|
145 |
+.modalmain table tbody tr:nth-child(odd){background: #f7f6f6;} |
|
146 |
+.modalmain table tbody tr:nth-child(even){background: #ffffff;} |
|
147 |
+.modalmain table td{border: 1px solid #eee;} |
|
148 |
+.modal h2{background: #e5e5dd; font-size: 2rem; padding: 1rem ;} |
|
149 |
+.modal h3{font-size: 1.8rem; border-bottom: 1px solid #eee; padding: 1rem 0 0.2rem 0;} |
|
150 |
+.modal h4{font-size: 1.6rem; font-weight: 100; padding: 0.2rem 0 1rem 0 ;} |
|
151 |
+.modal button{border: 0; background: none; height: 30px; |
|
152 |
+ padding: 0 0 0 50rem; cursor: pointer;} |
|
153 |
+.modal button img{width: 25px;} |
|
154 |
+.txt-point { |
|
155 |
+ color: #333; |
|
156 |
+} |
|
157 |
+.wrap { |
|
158 |
+ width: 155rem; |
|
159 |
+ margin: 100px auto; |
|
160 |
+} |
|
161 |
+ |
|
162 |
+.search-wrap { |
|
163 |
+ margin-bottom: 30px; |
|
164 |
+} |
|
165 |
+ |
|
166 |
+.search-wrap input, |
|
167 |
+.search-wrap select { |
|
168 |
+ height: 22.5px; |
|
169 |
+ border-radius: 3px; |
|
170 |
+ border: 1px solid #949292; |
|
171 |
+} |
|
172 |
+ |
|
173 |
+.float-right { |
|
174 |
+ float: right; |
|
175 |
+} |
|
176 |
+ |
|
177 |
+.clear-fix::after { |
|
178 |
+ content: ""; |
|
179 |
+ display: block; |
|
180 |
+ clear: both; |
|
181 |
+} |
|
182 |
+ |
|
183 |
+.search-wrap .float-right form > *:not(:last-child) { |
|
184 |
+ margin-right: 1rem; |
|
185 |
+} |
|
186 |
+ |
|
187 |
+table { |
|
188 |
+ width: 100%; |
|
189 |
+ text-align: center; |
|
190 |
+ border-collapse: collapse; |
|
191 |
+} |
|
192 |
+ |
|
193 |
+th, |
|
194 |
+td { |
|
195 |
+ border-left: none; |
|
196 |
+ border-right: none; |
|
197 |
+} |
|
198 |
+ |
|
199 |
+table th { |
|
200 |
+ padding: 15px 0; |
|
201 |
+ color: #fff; |
|
202 |
+ background-color: #13833b; |
|
203 |
+} |
|
204 |
+ |
|
205 |
+table td { |
|
206 |
+ padding: 10px 0; |
|
207 |
+ border-bottom: 1px solid #e5e5dd; |
|
208 |
+} |
|
209 |
+ |
|
210 |
+table tr:nth-child(odd) { |
|
211 |
+ background-color: #f7f6f6; |
|
212 |
+} |
|
213 |
+ |
|
214 |
+table tr:nth-child(even) { |
|
215 |
+ background-color: #fdfdf2; |
|
216 |
+} |
|
217 |
+ |
|
218 |
+.bottom-wrap { |
|
219 |
+ position: relative; |
|
220 |
+ padding: 1rem 0; |
|
221 |
+} |
|
222 |
+ |
|
223 |
+.btn-2 { |
|
224 |
+ display: inline-block; |
|
225 |
+ padding: 0.3rem 2rem; |
|
226 |
+ font-size: 13.333px; |
|
227 |
+} |
|
228 |
+ |
|
229 |
+.pg-wrap { |
|
230 |
+ text-align: center; |
|
231 |
+} |
|
232 |
+ |
|
233 |
+.pg-item { |
|
234 |
+ display: inline-block; |
|
235 |
+ padding: 10px; |
|
236 |
+ color: #949292; |
|
237 |
+} |
|
238 |
+ |
|
239 |
+.pg-item.prev, |
|
240 |
+.pg-item.next, |
|
241 |
+.pg-item.active { |
|
242 |
+ color: #13833b; |
|
243 |
+} |
|
244 |
+ |
|
245 |
+.btn-wrap { |
|
246 |
+ position: absolute; |
|
247 |
+ right: 0; |
|
248 |
+ top: 1.5em; |
|
249 |
+ z-index: 10; |
|
250 |
+} |
|
251 |
+ |
|
252 |
+.btn-wrap button { |
|
253 |
+ cursor: pointer; |
|
254 |
+} |
|
255 |
+</style> |
--- client/views/pages/SystemManagement/ChargeManagement.vue
+++ client/views/pages/SystemManagement/ChargeManagement.vue
... | ... | @@ -1,9 +1,5 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="wrap"> |
3 |
- <div> |
|
4 |
- <h2 class="page-title">횡단보도 유지보수 담당자</h2> |
|
5 |
- </div> |
|
6 |
- <hr class="margin"> |
|
7 | 3 |
<div class="board-wrap"> |
8 | 4 |
<div class="search-wrap clear-fix"> |
9 | 5 |
<div class="float-right"> |
... | ... | @@ -60,7 +56,7 @@ |
60 | 56 |
<a href="#" class="pg-item next">▶</a> |
61 | 57 |
</div> |
62 | 58 |
<div class="btn-wrap"> |
63 |
- <router-link to="/ManagerAddForm.page"> |
|
59 |
+ <router-link to="/UserManagement.page"> |
|
64 | 60 |
<span class="btn-2 green-btn">등록</span> |
65 | 61 |
</router-link> |
66 | 62 |
</div> |
... | ... | @@ -112,14 +108,6 @@ |
112 | 108 |
|
113 | 109 |
.search-wrap .float-right form>*:not(:last-child) { |
114 | 110 |
margin-right: 1rem; |
115 |
-} |
|
116 |
- |
|
117 |
-h2.page-title { |
|
118 |
- font-size: 24px; |
|
119 |
-} |
|
120 |
- |
|
121 |
-hr.margin { |
|
122 |
- margin: 30px 0; |
|
123 | 111 |
} |
124 | 112 |
|
125 | 113 |
table { |
--- client/views/pages/SystemManagement/DongManagement.vue
+++ client/views/pages/SystemManagement/DongManagement.vue
... | ... | @@ -1,10 +1,6 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="wrap"> |
3 | 3 |
<div> |
4 |
- <h2 class="page-title">행정동 관리</h2> |
|
5 |
- </div> |
|
6 |
- <hr class="margin"> |
|
7 |
- <div> |
|
8 | 4 |
<div class="search-wrap clear-fix"> |
9 | 5 |
<div class="float-left"> |
10 | 6 |
<h3 class="sub-title">행정동 목록</h3> |
... | ... | @@ -57,16 +53,6 @@ |
57 | 53 |
<td></td> |
58 | 54 |
<td>2023-03-03 12:50</td> |
59 | 55 |
</tr> |
60 |
- <tr> |
|
61 |
- <td>1</td> |
|
62 |
- <td>2203060</td> |
|
63 |
- <td>평리1동</td> |
|
64 |
- <td>Pyeongni 1–dong</td> |
|
65 |
- <td>00.000000</td> |
|
66 |
- <td>00.000000</td> |
|
67 |
- <td></td> |
|
68 |
- <td>2023-03-03 12:50</td> |
|
69 |
- </tr> |
|
70 | 56 |
</tbody> |
71 | 57 |
</table> |
72 | 58 |
</div> |
... | ... | @@ -84,7 +70,7 @@ |
84 | 70 |
</div> |
85 | 71 |
<div> |
86 | 72 |
<div class="sub-title-wrap"> |
87 |
- <h3 class="sub-title">행정동 정보관리</h3> |
|
73 |
+ <h3 class="sub-title">행정동 정보관</h3> |
|
88 | 74 |
<span class="btn-2 green-btn">신규등록</span> |
89 | 75 |
</div> |
90 | 76 |
<div> |
... | ... | @@ -249,18 +235,6 @@ |
249 | 235 |
float: right; |
250 | 236 |
} |
251 | 237 |
|
252 |
-h2.page-title { |
|
253 |
- font-size: 24px; |
|
254 |
-} |
|
255 |
- |
|
256 |
-hr.margin { |
|
257 |
- margin: 30px 0; |
|
258 |
-} |
|
259 |
- |
|
260 |
-.sub-title-wrap { |
|
261 |
- margin: 30px 0; |
|
262 |
-} |
|
263 |
- |
|
264 | 238 |
.sub-title-wrap>* { |
265 | 239 |
display: inline-block; |
266 | 240 |
vertical-align: middle; |
... | ... | @@ -407,4 +381,5 @@ |
407 | 381 |
|
408 | 382 |
.txt-point { |
409 | 383 |
color: #13833b; |
410 |
-}</style>(No newline at end of file) |
|
384 |
+} |
|
385 |
+</style>(No newline at end of file) |
--- client/views/pages/SystemManagement/ManagerAddForm.vue
+++ client/views/pages/SystemManagement/ManagerAddForm.vue
... | ... | @@ -1,8 +1,18 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="wrap"> |
3 |
+ <div class="tab-wrap"> |
|
4 |
+ <ul> |
|
5 |
+ <li> |
|
6 |
+ <a href="" class="tab active">사용자 관리</a> |
|
7 |
+ </li> |
|
8 |
+ <li> |
|
9 |
+ <a href="" class="tab">접속기록 조회</a> |
|
10 |
+ </li> |
|
11 |
+ </ul> |
|
12 |
+ </div> |
|
3 | 13 |
<div> |
4 | 14 |
<div> |
5 |
- <h2 class="page-title">횡단보도 유지보수 담당자 등록</h2> |
|
15 |
+ <h2 class="page-title">횡단보도 유지보수 담당자</h2> |
|
6 | 16 |
</div> |
7 | 17 |
<hr class="margin"> |
8 | 18 |
<div class="form-wrap"> |
... | ... | @@ -19,25 +29,11 @@ |
19 | 29 |
<span>이메일 : </span> |
20 | 30 |
<input type="text" name="" id="" placeholder="E-Mail"> |
21 | 31 |
</div> |
22 |
- <div class="flex m-b"> |
|
23 |
- <span>소속명 : </span> |
|
24 |
- <input type="text" name="" id="" placeholder="Affiliation Name"> |
|
25 |
- </div> |
|
26 | 32 |
|
27 | 33 |
<div class="btn-wrap"> |
28 |
- <button type="button" class="green-btn m-r" @click="modal_1 = true">등록</button> |
|
34 |
+ <button type="button" class="green-btn" @click="modal_1 = true">등록</button> |
|
29 | 35 |
<router-link to="/UserManagement.page"> |
30 | 36 |
<span class="btn-2 gray-btn">취소</span> |
31 |
- </router-link> |
|
32 |
- </div> |
|
33 |
- |
|
34 |
- <div class="btn-wrap"> |
|
35 |
- <div class="m-b"> |
|
36 |
- <button type="button" class="green-btn m-r" @click="modal_1 = true">등록</button> |
|
37 |
- <button type="button" class="gray-btn" @click="modal_2 = true">삭제</button> |
|
38 |
- </div> |
|
39 |
- <router-link to="/UserManagement.page"> |
|
40 |
- <span class="btn-3 gray-btn">취소</span> |
|
41 | 37 |
</router-link> |
42 | 38 |
</div> |
43 | 39 |
</form> |
... | ... | @@ -51,23 +47,8 @@ |
51 | 47 |
<div class="modal"> |
52 | 48 |
<p>사용자를 <span class="txt-point">등록</span>하시겠습니까?</p> |
53 | 49 |
<div class="btn-wrap"> |
54 |
- <button type="button" class="green-btn m-r">확인</button> |
|
50 |
+ <button type="button" class="green-btn">확인</button> |
|
55 | 51 |
<button type="button" class="gray-btn" @click="modal_1 = false">취소</button> |
56 |
- </div> |
|
57 |
- </div> |
|
58 |
- </div> |
|
59 |
- <div class="modal-wrap" v-if="modal_2 == true"> |
|
60 |
- <div class="modal-bg"> |
|
61 |
- </div> |
|
62 |
- <div class="modal"> |
|
63 |
- <p> |
|
64 |
- 해당 기능은 데이터 삭제 기능입니다.<br> |
|
65 |
- 데이터 삭제 후, 조회에서 해당 데이터를 확인할 수 없습니다.<br> |
|
66 |
- 삭제를 원하시면 아래 삭제 버튼을 눌러주세요. |
|
67 |
- </p> |
|
68 |
- <div class="btn-wrap"> |
|
69 |
- <button type="button" class="green-btn m-r">삭제</button> |
|
70 |
- <button type="button" class="gray-btn" @click="modal_2 = false">취소</button> |
|
71 | 52 |
</div> |
72 | 53 |
</div> |
73 | 54 |
</div> |
... | ... | @@ -78,7 +59,6 @@ |
78 | 59 |
data() { |
79 | 60 |
return { |
80 | 61 |
modal_1: false, |
81 |
- modal_2: false, |
|
82 | 62 |
}; |
83 | 63 |
}, |
84 | 64 |
methods: {}, |
... | ... | @@ -96,6 +76,33 @@ |
96 | 76 |
margin: 100px auto; |
97 | 77 |
} |
98 | 78 |
|
79 |
+.tab-wrap { |
|
80 |
+ margin-bottom: 30px; |
|
81 |
+} |
|
82 |
+ |
|
83 |
+.tab-wrap ul { |
|
84 |
+ display: flex; |
|
85 |
+ gap: 2rem; |
|
86 |
+} |
|
87 |
+ |
|
88 |
+.tab { |
|
89 |
+ display: inline-block; |
|
90 |
+ width: 20rem; |
|
91 |
+ height: 3rem; |
|
92 |
+ line-height: 3rem; |
|
93 |
+ text-align: center; |
|
94 |
+ border-radius: 5px; |
|
95 |
+ background: #fff; |
|
96 |
+ color: #949292; |
|
97 |
+ border: 1px solid #949292; |
|
98 |
+} |
|
99 |
+ |
|
100 |
+.tab.active { |
|
101 |
+ background: #13833b; |
|
102 |
+ color: #fff; |
|
103 |
+ border-color: #13833b; |
|
104 |
+} |
|
105 |
+ |
|
99 | 106 |
h2.page-title { |
100 | 107 |
font-size: 24px; |
101 | 108 |
} |
... | ... | @@ -104,26 +111,29 @@ |
104 | 111 |
margin: 30px 0; |
105 | 112 |
} |
106 | 113 |
|
114 |
+.form-wrap { |
|
115 |
+ width: 52rem; |
|
116 |
+ margin: 0 auto; |
|
117 |
+} |
|
118 |
+ |
|
119 |
+.idchk { |
|
120 |
+ margin-left: 1rem; |
|
121 |
+} |
|
122 |
+ |
|
107 | 123 |
.btn-wrap { |
108 | 124 |
margin-top: 30px; |
109 | 125 |
text-align: center; |
110 | 126 |
} |
111 | 127 |
|
112 |
-.btn-2, |
|
113 |
-.btn-3 { |
|
128 |
+.btn-2 { |
|
114 | 129 |
display: inline-block; |
115 | 130 |
padding: 0.3rem 2rem; |
116 | 131 |
font-size: 13.333px; |
117 | 132 |
color: #000; |
118 | 133 |
} |
119 | 134 |
|
120 |
-.btn-3 { |
|
121 |
- width: 145px; |
|
122 |
-} |
|
123 |
- |
|
124 |
-.form-wrap { |
|
125 |
- width: 40rem; |
|
126 |
- margin: 0 auto; |
|
135 |
+.btn-wrap>*:not(:last-child) { |
|
136 |
+ margin-right: 2rem; |
|
127 | 137 |
} |
128 | 138 |
|
129 | 139 |
.form-wrap .flex span { |
... | ... | @@ -184,7 +194,6 @@ |
184 | 194 |
margin-top: 15px; |
185 | 195 |
text-align: center; |
186 | 196 |
} |
187 |
- |
|
188 | 197 |
.txt-point { |
189 | 198 |
color: #13833b; |
190 | 199 |
} |
--- client/views/pages/SystemManagement/NodeManagement.vue
+++ client/views/pages/SystemManagement/NodeManagement.vue
... | ... | @@ -1,10 +1,6 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="wrap"> |
3 | 3 |
<div> |
4 |
- <h2 class="page-title">표준노드 관리</h2> |
|
5 |
- </div> |
|
6 |
- <hr class="margin"> |
|
7 |
- <div> |
|
8 | 4 |
<div class="search-wrap clear-fix"> |
9 | 5 |
<div class="float-left"> |
10 | 6 |
<h3 class="sub-title">표준노드 목록</h3> |
... | ... | @@ -54,15 +50,6 @@ |
54 | 50 |
<td>128.666666</td> |
55 | 51 |
<td>2023-03-03 12:50</td> |
56 | 52 |
</tr> |
57 |
- <tr> |
|
58 |
- <td>1</td> |
|
59 |
- <td>1550006621</td> |
|
60 |
- <td>테이큰 네거리</td> |
|
61 |
- <td>105</td> |
|
62 |
- <td>33.888888</td> |
|
63 |
- <td>128.666666</td> |
|
64 |
- <td>2023-03-03 12:50</td> |
|
65 |
- </tr> |
|
66 | 53 |
</tbody> |
67 | 54 |
</table> |
68 | 55 |
</div> |
... | ... | @@ -80,7 +67,7 @@ |
80 | 67 |
</div> |
81 | 68 |
<div> |
82 | 69 |
<div class="sub-title-wrap"> |
83 |
- <h3 class="sub-title">표준노드 정보관리</h3> |
|
70 |
+ <h3 class="sub-title">표준노드 목록</h3> |
|
84 | 71 |
<span class="btn-2 green-btn">신규등록</span> |
85 | 72 |
</div> |
86 | 73 |
<div> |
... | ... | @@ -236,17 +223,6 @@ |
236 | 223 |
|
237 | 224 |
.float-right { |
238 | 225 |
float: right; |
239 |
-} |
|
240 |
- |
|
241 |
-h2.page-title { |
|
242 |
- font-size: 24px; |
|
243 |
-} |
|
244 |
- |
|
245 |
-hr.margin { |
|
246 |
- margin: 30px 0; |
|
247 |
-} |
|
248 |
-.sub-title-wrap { |
|
249 |
- margin: 30px 0; |
|
250 | 226 |
} |
251 | 227 |
|
252 | 228 |
.sub-title-wrap>* { |
--- client/views/pages/SystemManagement/UserAddForm.vue
+++ client/views/pages/SystemManagement/UserAddForm.vue
... | ... | @@ -3,14 +3,10 @@ |
3 | 3 |
<div class="tab-wrap"> |
4 | 4 |
<ul> |
5 | 5 |
<li> |
6 |
- <router-link to="/UserManagement.page"> |
|
7 |
- <span class="tab active">사용자 관리</span> |
|
8 |
- </router-link> |
|
6 |
+ <a href="" class="tab active">사용자 관리</a> |
|
9 | 7 |
</li> |
10 | 8 |
<li> |
11 |
- <router-link to="/AccessRecord.page"> |
|
12 |
- <span class="tab">접속기록 조회</span> |
|
13 |
- </router-link> |
|
9 |
+ <a href="" class="tab">접속기록 조회</a> |
|
14 | 10 |
</li> |
15 | 11 |
</ul> |
16 | 12 |
</div> |
... | ... | @@ -75,19 +71,9 @@ |
75 | 71 |
</div> |
76 | 72 |
|
77 | 73 |
<div class="btn-wrap"> |
78 |
- <button type="button" class="green-btn m-r" @click="modal_1 = true">등록</button> |
|
74 |
+ <button type="button" class="green-btn" @click="modal_1 = true">등록</button> |
|
79 | 75 |
<router-link to="/UserManagement.page"> |
80 | 76 |
<span class="btn-2 gray-btn">취소</span> |
81 |
- </router-link> |
|
82 |
- </div> |
|
83 |
- |
|
84 |
- <div class="btn-wrap"> |
|
85 |
- <div class="m-b"> |
|
86 |
- <button type="button" class="green-btn m-r" @click="modal_1 = true">등록</button> |
|
87 |
- <button type="button" class="gray-btn" @click="modal_2 = true">삭제</button> |
|
88 |
- </div> |
|
89 |
- <router-link to="/UserManagement.page"> |
|
90 |
- <span class="btn-3 gray-btn">취소</span> |
|
91 | 77 |
</router-link> |
92 | 78 |
</div> |
93 | 79 |
</form> |
... | ... | @@ -101,24 +87,8 @@ |
101 | 87 |
<div class="modal"> |
102 | 88 |
<p>사용자를 <span class="txt-point">등록</span>하시겠습니까?</p> |
103 | 89 |
<div class="btn-wrap"> |
104 |
- <button type="button" class="green-btn m-r">확인</button> |
|
90 |
+ <button type="button" class="green-btn">확인</button> |
|
105 | 91 |
<button type="button" class="gray-btn" @click="modal_1 = false">취소</button> |
106 |
- </div> |
|
107 |
- </div> |
|
108 |
- </div> |
|
109 |
- |
|
110 |
- <div class="modal-wrap" v-if="modal_2 == true"> |
|
111 |
- <div class="modal-bg"> |
|
112 |
- </div> |
|
113 |
- <div class="modal"> |
|
114 |
- <p> |
|
115 |
- 해당 기능은 데이터 삭제 기능입니다.<br> |
|
116 |
- 데이터 삭제 후, 조회에서 해당 데이터를 확인할 수 없습니다.<br> |
|
117 |
- 삭제를 원하시면 아래 삭제 버튼을 눌러주세요. |
|
118 |
- </p> |
|
119 |
- <div class="btn-wrap"> |
|
120 |
- <button type="button" class="green-btn m-r">삭제</button> |
|
121 |
- <button type="button" class="gray-btn" @click="modal_2 = false">취소</button> |
|
122 | 92 |
</div> |
123 | 93 |
</div> |
124 | 94 |
</div> |
... | ... | @@ -129,7 +99,6 @@ |
129 | 99 |
data() { |
130 | 100 |
return { |
131 | 101 |
modal_1: false, |
132 |
- modal_2: false, |
|
133 | 102 |
}; |
134 | 103 |
}, |
135 | 104 |
methods: {}, |
... | ... | @@ -196,16 +165,15 @@ |
196 | 165 |
text-align: center; |
197 | 166 |
} |
198 | 167 |
|
199 |
-.btn-2, |
|
200 |
-.btn-3 { |
|
168 |
+.btn-2 { |
|
201 | 169 |
display: inline-block; |
202 | 170 |
padding: 0.3rem 2rem; |
203 | 171 |
font-size: 13.333px; |
204 | 172 |
color: #000; |
205 | 173 |
} |
206 | 174 |
|
207 |
-.btn-3 { |
|
208 |
- width: 145px; |
|
175 |
+.btn-wrap>*:not(:last-child) { |
|
176 |
+ margin-right: 2rem; |
|
209 | 177 |
} |
210 | 178 |
|
211 | 179 |
.form-wrap .flex span { |
... | ... | @@ -266,7 +234,6 @@ |
266 | 234 |
margin-top: 15px; |
267 | 235 |
text-align: center; |
268 | 236 |
} |
269 |
- |
|
270 | 237 |
.txt-point { |
271 | 238 |
color: #13833b; |
272 | 239 |
} |
--- client/views/pages/SystemManagement/UserManagement.vue
+++ client/views/pages/SystemManagement/UserManagement.vue
... | ... | @@ -3,14 +3,10 @@ |
3 | 3 |
<div class="tab-wrap"> |
4 | 4 |
<ul> |
5 | 5 |
<li> |
6 |
- <router-link to="/UserManagement.page"> |
|
7 |
- <span class="tab active">사용자 관리</span> |
|
8 |
- </router-link> |
|
6 |
+ <a href="" class="tab active">사용자 관리</a> |
|
9 | 7 |
</li> |
10 | 8 |
<li> |
11 |
- <router-link to="/AccessRecord.page"> |
|
12 |
- <span class="tab">접속기록 조회</span> |
|
13 |
- </router-link> |
|
9 |
+ <a href="" class="tab">접속기록 조회</a> |
|
14 | 10 |
</li> |
15 | 11 |
</ul> |
16 | 12 |
</div> |
+++ client/views/pages/main/IdFind.vue
... | ... | @@ -0,0 +1,177 @@ |
1 | +<template> | |
2 | + <div class="wrap"> | |
3 | + <div> | |
4 | + <div> | |
5 | + <h2 class="page-title">Login</h2> | |
6 | + </div> | |
7 | + <hr class="margin"> | |
8 | + <div class="form-wrap"> | |
9 | + <form action=""> | |
10 | + <div class="flex m-b"> | |
11 | + <span>이름 : </span> | |
12 | + <input type="text" name="" id="" placeholder="이름"> | |
13 | + </div> | |
14 | + <div class="flex m-b"> | |
15 | + <span>이메일 : </span> | |
16 | + <input type="password" name="" id="" placeholder="e-mail"> | |
17 | + </div> | |
18 | + | |
19 | + | |
20 | + <div class="btn-wrap"> | |
21 | + <button type="button" class="green-btn m-r" @click="modal_1 = true">찾기</button> | |
22 | + <router-link to=""> | |
23 | + <span class="btn-2 gray-btn">취소</span> | |
24 | + </router-link> | |
25 | + </div> | |
26 | + </form> | |
27 | + </div> | |
28 | + </div> | |
29 | + </div> | |
30 | + | |
31 | + | |
32 | +</template> | |
33 | + | |
34 | +<script> | |
35 | +export default { | |
36 | + data() { | |
37 | + return { | |
38 | + modal_1: false, | |
39 | + }; | |
40 | + }, | |
41 | + methods: {}, | |
42 | + watch: {}, | |
43 | + computed: {}, | |
44 | + mounted() { | |
45 | + console.log("Main4 mounted"); | |
46 | + }, | |
47 | +}; | |
48 | +</script> | |
49 | + | |
50 | +<style scoped> | |
51 | +.btn-wrap span{font-size: 13px; margin-top: 2rem;} | |
52 | +.loginbtn{padding: 1rem 0; margin-bottom: 1rem;} | |
53 | +.wrap { | |
54 | + width: 155rem; | |
55 | + margin: 100px auto; | |
56 | +} | |
57 | + | |
58 | +.tab-wrap { | |
59 | + margin-bottom: 30px; | |
60 | +} | |
61 | + | |
62 | +.tab-wrap ul { | |
63 | + display: flex; | |
64 | + gap: 2rem; | |
65 | +} | |
66 | + | |
67 | +.tab { | |
68 | + display: inline-block; | |
69 | + width: 20rem; | |
70 | + height: 3rem; | |
71 | + line-height: 3rem; | |
72 | + text-align: center; | |
73 | + border-radius: 5px; | |
74 | + background: #fff; | |
75 | + color: #949292; | |
76 | + border: 1px solid #949292; | |
77 | +} | |
78 | + | |
79 | +.tab.active { | |
80 | + background: #13833b; | |
81 | + color: #fff; | |
82 | + border-color: #13833b; | |
83 | +} | |
84 | + | |
85 | +h2.page-title { | |
86 | + font-size: 24px; | |
87 | +} | |
88 | + | |
89 | +hr.margin { | |
90 | + margin: 30px 0; | |
91 | +} | |
92 | + | |
93 | +.form-wrap { | |
94 | + width: 52rem; | |
95 | + margin: 0 auto; | |
96 | +} | |
97 | + | |
98 | +.idchk { | |
99 | + margin-left: 1rem; | |
100 | +} | |
101 | + | |
102 | +.btn-wrap { | |
103 | + margin-top: 30px; | |
104 | + text-align: center; | |
105 | +} | |
106 | + | |
107 | +.btn-2 { | |
108 | + display: inline-block; | |
109 | + padding: 0.3rem 2rem; | |
110 | + font-size: 13.333px; | |
111 | + color: #000; | |
112 | +} | |
113 | + | |
114 | + | |
115 | +.form-wrap .flex span { | |
116 | + display: inline-block; | |
117 | + width: 10rem; | |
118 | + padding: 0 5px; | |
119 | +} | |
120 | + | |
121 | +.form-wrap input:not([type="radio"]) { | |
122 | + min-width: 30rem; | |
123 | + min-height: 4rem; | |
124 | +} | |
125 | + | |
126 | +.form-wrap select { | |
127 | + min-width: 9rem; | |
128 | +} | |
129 | + | |
130 | +.form-wrap select:not(:last-child) { | |
131 | + margin-right: 1.5rem; | |
132 | +} | |
133 | + | |
134 | +.form-wrap input[type="radio"] { | |
135 | + vertical-align: middle; | |
136 | +} | |
137 | + | |
138 | +.form-wrap label:not(:last-child) { | |
139 | + margin-right: 2rem; | |
140 | +} | |
141 | + | |
142 | +.modal-wrap { | |
143 | + position: fixed; | |
144 | + top: 0; | |
145 | + left: 0; | |
146 | + right: 0; | |
147 | + bottom: 0; | |
148 | +} | |
149 | + | |
150 | +.modal-bg { | |
151 | + position: absolute; | |
152 | + width: 100%; | |
153 | + height: 100%; | |
154 | + background-color: rgba(0, 0, 0, .6); | |
155 | +} | |
156 | + | |
157 | +.modal { | |
158 | + position: absolute; | |
159 | + top: 50%; | |
160 | + left: 50%; | |
161 | + transform: translate(-50%, -50%); | |
162 | + max-width: 350px; | |
163 | + padding: 5rem; | |
164 | + z-index: 2; | |
165 | + background-color: #fff; | |
166 | + border-radius: 1rem; | |
167 | + text-align: center; | |
168 | +} | |
169 | + | |
170 | +.modal .btn-wrap { | |
171 | + margin-top: 15px; | |
172 | + text-align: center; | |
173 | +} | |
174 | +.txt-point { | |
175 | + color: #13833b; | |
176 | +} | |
177 | +</style>(No newline at end of file) |
--- client/views/pages/main/Login.vue
+++ client/views/pages/main/Login.vue
... | ... | @@ -1,11 +1,38 @@ |
1 | 1 |
<template> |
2 |
- <div>로그인/로그아웃</div> |
|
2 |
+ <div class="wrap"> |
|
3 |
+ <div> |
|
4 |
+ <div> |
|
5 |
+ <h2 class="page-title">Login</h2> |
|
6 |
+ </div> |
|
7 |
+ <hr class="margin"> |
|
8 |
+ <div class="form-wrap"> |
|
9 |
+ <form action=""> |
|
10 |
+ <div class="flex-center m-b"> |
|
11 |
+ <input type="text" name="" id="" placeholder="ID"> |
|
12 |
+ </div> |
|
13 |
+ <div class="flex-center m-b"> |
|
14 |
+ <input type="password" name="" id="" placeholder="Password"> |
|
15 |
+ </div> |
|
16 |
+ |
|
17 |
+ |
|
18 |
+ <div class="btn-wrap"> |
|
19 |
+ <button type="button" class="green-btn btn-l loginbtn" @click="modal_1 = true">로그인</button> |
|
20 |
+ <router-link to="/IdFind.page"> <span class="">아이디 찾기</span></router-link> |
|
21 |
+ </div> |
|
22 |
+ </form> |
|
23 |
+ </div> |
|
24 |
+ </div> |
|
25 |
+ </div> |
|
26 |
+ |
|
27 |
+ |
|
3 | 28 |
</template> |
4 | 29 |
|
5 | 30 |
<script> |
6 | 31 |
export default { |
7 | 32 |
data() { |
8 |
- return {}; |
|
33 |
+ return { |
|
34 |
+ modal_1: false, |
|
35 |
+ }; |
|
9 | 36 |
}, |
10 | 37 |
methods: {}, |
11 | 38 |
watch: {}, |
... | ... | @@ -15,3 +42,132 @@ |
15 | 42 |
}, |
16 | 43 |
}; |
17 | 44 |
</script> |
45 |
+ |
|
46 |
+<style scoped> |
|
47 |
+.btn-wrap span{font-size: 13px; margin-top: 2rem; color: #333;} |
|
48 |
+.loginbtn{padding: 1rem 0; margin-bottom: 1rem;} |
|
49 |
+.wrap { |
|
50 |
+ width: 155rem; |
|
51 |
+ margin: 100px auto; |
|
52 |
+} |
|
53 |
+ |
|
54 |
+.tab-wrap { |
|
55 |
+ margin-bottom: 30px; |
|
56 |
+} |
|
57 |
+ |
|
58 |
+.tab-wrap ul { |
|
59 |
+ display: flex; |
|
60 |
+ gap: 2rem; |
|
61 |
+} |
|
62 |
+ |
|
63 |
+.tab { |
|
64 |
+ display: inline-block; |
|
65 |
+ width: 20rem; |
|
66 |
+ height: 3rem; |
|
67 |
+ line-height: 3rem; |
|
68 |
+ text-align: center; |
|
69 |
+ border-radius: 5px; |
|
70 |
+ background: #fff; |
|
71 |
+ color: #949292; |
|
72 |
+ border: 1px solid #949292; |
|
73 |
+} |
|
74 |
+ |
|
75 |
+.tab.active { |
|
76 |
+ background: #13833b; |
|
77 |
+ color: #fff; |
|
78 |
+ border-color: #13833b; |
|
79 |
+} |
|
80 |
+ |
|
81 |
+h2.page-title { |
|
82 |
+ font-size: 24px; |
|
83 |
+} |
|
84 |
+ |
|
85 |
+hr.margin { |
|
86 |
+ margin: 30px 0; |
|
87 |
+} |
|
88 |
+ |
|
89 |
+.form-wrap { |
|
90 |
+ width: 30rem; |
|
91 |
+ margin: 0 auto; |
|
92 |
+} |
|
93 |
+ |
|
94 |
+.idchk { |
|
95 |
+ margin-left: 1rem; |
|
96 |
+} |
|
97 |
+ |
|
98 |
+.btn-wrap { |
|
99 |
+ margin-top: 30px; |
|
100 |
+ text-align: center; |
|
101 |
+} |
|
102 |
+ |
|
103 |
+.btn-2 { |
|
104 |
+ display: inline-block; |
|
105 |
+ padding: 0.3rem 2rem; |
|
106 |
+ font-size: 13.333px; |
|
107 |
+ color: #000; |
|
108 |
+} |
|
109 |
+ |
|
110 |
+ |
|
111 |
+.form-wrap .flex span { |
|
112 |
+ display: inline-block; |
|
113 |
+ width: 10rem; |
|
114 |
+ padding: 0 5px; |
|
115 |
+} |
|
116 |
+ |
|
117 |
+.form-wrap input:not([type="radio"]) { |
|
118 |
+ min-width: 30rem; |
|
119 |
+ min-height: 4rem; |
|
120 |
+} |
|
121 |
+ |
|
122 |
+.form-wrap select { |
|
123 |
+ min-width: 9rem; |
|
124 |
+} |
|
125 |
+ |
|
126 |
+.form-wrap select:not(:last-child) { |
|
127 |
+ margin-right: 1.5rem; |
|
128 |
+} |
|
129 |
+ |
|
130 |
+.form-wrap input[type="radio"] { |
|
131 |
+ vertical-align: middle; |
|
132 |
+} |
|
133 |
+ |
|
134 |
+.form-wrap label:not(:last-child) { |
|
135 |
+ margin-right: 2rem; |
|
136 |
+} |
|
137 |
+ |
|
138 |
+.modal-wrap { |
|
139 |
+ position: fixed; |
|
140 |
+ top: 0; |
|
141 |
+ left: 0; |
|
142 |
+ right: 0; |
|
143 |
+ bottom: 0; |
|
144 |
+} |
|
145 |
+ |
|
146 |
+.modal-bg { |
|
147 |
+ position: absolute; |
|
148 |
+ width: 100%; |
|
149 |
+ height: 100%; |
|
150 |
+ background-color: rgba(0, 0, 0, .6); |
|
151 |
+} |
|
152 |
+ |
|
153 |
+.modal { |
|
154 |
+ position: absolute; |
|
155 |
+ top: 50%; |
|
156 |
+ left: 50%; |
|
157 |
+ transform: translate(-50%, -50%); |
|
158 |
+ max-width: 350px; |
|
159 |
+ padding: 5rem; |
|
160 |
+ z-index: 2; |
|
161 |
+ background-color: #fff; |
|
162 |
+ border-radius: 1rem; |
|
163 |
+ text-align: center; |
|
164 |
+} |
|
165 |
+ |
|
166 |
+.modal .btn-wrap { |
|
167 |
+ margin-top: 15px; |
|
168 |
+ text-align: center; |
|
169 |
+} |
|
170 |
+.txt-point { |
|
171 |
+ color: #13833b; |
|
172 |
+} |
|
173 |
+</style>(No newline at end of file) |
--- client/views/pages/main/Main.vue
+++ client/views/pages/main/Main.vue
... | ... | @@ -1,97 +1,103 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="boxmenu"> |
3 |
- <div class="box"> |
|
4 |
- <img src="" alt /> |
|
5 |
- <span class="box_title">금일 누적보행자 수</span> |
|
6 |
- <br /> |
|
3 |
+ <div class="box "> |
|
4 |
+ <div class="flex"> |
|
5 |
+ <img src="../../../resources/images/icon/scumulativenumberofpedestrians.png" alt /> |
|
6 |
+ <span class="box_title">금일 누적보행자 수</span> |
|
7 |
+ </div> |
|
7 | 8 |
<span class="box_num">00</span> |
8 | 9 |
<span class="box_subtxt">명</span> |
9 | 10 |
</div> |
10 | 11 |
<div class="boxborder"></div> |
11 | 12 |
<div class="box"> |
12 |
- <img src="" alt /> |
|
13 |
- <span class="box_title">금일 무단횡단 발생</span> |
|
14 |
- <br /> |
|
13 |
+ <div class="flex"> |
|
14 |
+ <img src="../../../resources/images/icon/scumulativenumberofpedestrians.png" alt /> |
|
15 |
+ <span class="box_title">금일 무단횡단 발생</span> |
|
16 |
+ </div> |
|
15 | 17 |
<span class="box_num">00</span> |
16 | 18 |
<span class="box_subtxt">회</span> |
17 | 19 |
</div> |
18 | 20 |
|
19 | 21 |
<div class="boxborder"></div> |
20 | 22 |
<div class="box"> |
21 |
- <img src="" alt /> |
|
22 |
- <span class="box_title">금일 신호연장 발생 수</span> |
|
23 |
- <br /> |
|
23 |
+ <div class="flex"> |
|
24 |
+ <img src="../../../resources/images/icon/Numberofsignalextensionstoday.png" alt /> |
|
25 |
+ <span class="box_title">금일 신호연장 발생 수</span> |
|
26 |
+ </div> |
|
24 | 27 |
<span class="box_num">00</span> |
25 | 28 |
<span class="box_subtxt">회</span> |
26 | 29 |
</div> |
27 | 30 |
|
28 | 31 |
<div class="boxborder"></div> |
29 | 32 |
<div class="box"> |
30 |
- <img src="" alt /> |
|
31 |
- <span class="box_title">금일 신호연장</span> |
|
32 |
- <br /> |
|
33 |
+ <div class="flex"> |
|
34 |
+ <img src="../../../resources/images/icon/Numberofsignalextensionstoday.png" alt /> |
|
35 |
+ <span class="box_title">금일 신호연장</span> |
|
36 |
+ </div> |
|
33 | 37 |
<span class="box_num">00</span> |
34 | 38 |
<span class="box_subtxt">초</span> |
35 | 39 |
</div> |
36 | 40 |
|
37 | 41 |
<div class="boxborder"></div> |
38 | 42 |
<div class="box"> |
39 |
- <img src="" alt /> |
|
40 |
- <span class="box_title">금일 신호 위반 발생</span> |
|
41 |
- <br /> |
|
43 |
+ <div class="flex"> |
|
44 |
+ <img src="../../../resources/images/icon/Numberofsignalviolationstoday.png" alt /> |
|
45 |
+ <span class="box_title">금일 신호 위반 발생</span> |
|
46 |
+ </div> |
|
42 | 47 |
<span class="box_num">00</span> |
43 | 48 |
<span class="box_subtxt">회</span> |
44 | 49 |
</div> |
45 | 50 |
|
46 | 51 |
<div class="boxborder"></div> |
47 | 52 |
<div class="box"> |
48 |
- <img src="" alt /> |
|
49 |
- <span class="box_title">금일 장애 발생 수</span> |
|
50 |
- <br /> |
|
53 |
+ <div class="flex"> |
|
54 |
+ <img src="../../../resources/images/icon/Numberofsignalviolationstoday.png" alt /> |
|
55 |
+ <span class="box_title">금일 장애 발생 수</span> |
|
56 |
+ </div> |
|
51 | 57 |
<span class="box_num">00</span> |
52 | 58 |
<span class="box_subtxt">회</span> |
53 | 59 |
</div> |
54 | 60 |
</div> |
55 | 61 |
<div class="main_section"> |
56 | 62 |
<h1>AI 안전통합 횡단보도 플랫폼</h1> |
57 |
- <div class="verticalbar"> |
|
63 |
+ <div class="verticalbar flex"> |
|
58 | 64 |
<span class="bar_title">실시간 관제</span> |
59 | 65 |
<div class="barinfo"> |
60 | 66 |
<div class="bar_element"> |
61 |
- <img src="" alt="" /> |
|
67 |
+ <img src="../../../resources/images/icon/Real-timestatuscontrol.png" alt="" /> |
|
62 | 68 |
<span class="elementtxt">실시간 현황 관제</span> |
63 | 69 |
</div> |
64 | 70 |
<div class="bar_element"> |
65 |
- <img src="" alt="" /> |
|
71 |
+ <img src="../../../resources/images/icon/Lifeoccurrenceinformationinquiry.png" alt="" /> |
|
66 | 72 |
<span class="elementtxt">생활발생 정보 조회</span> |
67 | 73 |
</div> |
68 | 74 |
<div class="bar_element"> |
69 |
- <img src="" alt="" /> |
|
75 |
+ <img src="../../../resources/images/icon/Failureoccurrenceinformationinquiry.png" alt="" /> |
|
70 | 76 |
<span class="elementtxt">장애발생 정보 조회</span> |
71 | 77 |
</div> |
72 | 78 |
<div class="bar_element"> |
73 |
- <img src="" alt="" /> |
|
79 |
+ <img src="../../../resources/images/icon/Crosswalkinquiry.png" alt="" /> |
|
74 | 80 |
<span class="elementtxt">횡단보도 조회</span> |
75 | 81 |
</div> |
76 | 82 |
</div> |
77 | 83 |
</div> |
78 |
- <div class="verticalbar"> |
|
84 |
+ <div class="verticalbar flex"> |
|
79 | 85 |
<span class="bar_title">통계 분석</span> |
80 | 86 |
<div class="barinfo"> |
81 | 87 |
<div class="bar_element"> |
82 |
- <img src="" alt="" /> |
|
88 |
+ <img src="../../../resources/images/icon/Jaywalking.png" alt="" /> |
|
83 | 89 |
<span class="elementtxt">무단횡단</span> |
84 | 90 |
</div> |
85 | 91 |
<div class="bar_element"> |
86 |
- <img src="" alt="" /> |
|
92 |
+ <img src="../../../resources/images/icon/anextensionoftime.png" alt="" /> |
|
87 | 93 |
<span class="elementtxt">시간 연장</span> |
88 | 94 |
</div> |
89 | 95 |
<div class="bar_element"> |
90 |
- <img src="" alt="" /> |
|
96 |
+ <img src="../../../resources/images/icon/rightturn.png" alt="" /> |
|
91 | 97 |
<span class="elementtxt">우회전 위반 차</span> |
92 | 98 |
</div> |
93 | 99 |
<div class="bar_element"> |
94 |
- <img src="" alt="" /> |
|
100 |
+ <img src="../../../resources/images/icon/dang.png" alt="" /> |
|
95 | 101 |
<span class="elementtxt">장애 발생</span> |
96 | 102 |
</div> |
97 | 103 |
</div> |
... | ... | @@ -99,11 +105,17 @@ |
99 | 105 |
</div> |
100 | 106 |
<div class="main_bottom"> |
101 | 107 |
<div class="board"> |
102 |
- <img class="board_logo" src="" alt="" /> |
|
103 |
- <span class="board_title">장애 발생 내역</span> |
|
104 |
- <router-link to="/Main3"> |
|
105 |
- <span class="board_add">+</span> |
|
106 |
- </router-link> |
|
108 |
+ <div class="flex-between"> |
|
109 |
+ <div class="flex gap"> |
|
110 |
+ <img class="board_logo" src="../../../resources/images/icon/nemo.png" alt="" /> |
|
111 |
+ <span class="board_title">장애 발생 내역</span> |
|
112 |
+ </div> |
|
113 |
+ <div> |
|
114 |
+ <router-link to="/Main3"> |
|
115 |
+ <span class="board_add">+</span> |
|
116 |
+ </router-link> |
|
117 |
+ </div> |
|
118 |
+ </div> |
|
107 | 119 |
<div class="boardinfo"> |
108 | 120 |
<div class="board_element"> |
109 | 121 |
<span class="elementtxt"> |
... | ... | @@ -138,11 +150,17 @@ |
138 | 150 |
</div> |
139 | 151 |
</div> |
140 | 152 |
<div class="board"> |
141 |
- <img class="board_logo" src="" alt="" /> |
|
142 |
- <span class="board_title">상황 발생 내역</span> |
|
143 |
- <router-link to="/Main3"> |
|
144 |
- <span class="board_add">+</span> |
|
145 |
- </router-link> |
|
153 |
+ <div class="flex-between"> |
|
154 |
+ <div class="flex gap"> |
|
155 |
+ <img class="board_logo" src="../../../resources/images/icon/nemo.png" alt="" /> |
|
156 |
+ <span class="board_title">상황 발생 내역</span> |
|
157 |
+ </div> |
|
158 |
+ <div> |
|
159 |
+ <router-link to="/Main3"> |
|
160 |
+ <span class="board_add">+</span> |
|
161 |
+ </router-link> |
|
162 |
+ </div> |
|
163 |
+ </div> |
|
146 | 164 |
<div class="boardinfo"> |
147 | 165 |
<div class="board_element"> |
148 | 166 |
<span class="elementtxt"> |
... | ... | @@ -194,6 +212,9 @@ |
194 | 212 |
}; |
195 | 213 |
</script> |
196 | 214 |
<style> |
215 |
+.box{text-align: end;} |
|
216 |
+.boxmenu{justify-content: space-around;} |
|
217 |
+.boxmenu img{width: 35px;} |
|
197 | 218 |
template { |
198 | 219 |
background-color: #f7f7f6; |
199 | 220 |
} |
... | ... | @@ -207,8 +228,7 @@ |
207 | 228 |
.main_section h1 { |
208 | 229 |
font-size: 48px; |
209 | 230 |
color: #13833b; |
210 |
- margin-top: 5rem; |
|
211 |
- margin-bottom: 5rem; |
|
231 |
+ margin: 3rem 0; |
|
212 | 232 |
} |
213 | 233 |
.main_bottom { |
214 | 234 |
display: flex; |
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?