

240308 김하영 커밋
@8150e7044cfdfec44c65585fce240f0825f59872
+++ .gitignore
... | ... | @@ -0,0 +1,3 @@ |
1 | +client/build/ | |
2 | +server/logs/ | |
3 | +node_modules/(파일 끝에 줄바꿈 문자 없음) |
--- .idea/.gitignore
... | ... | @@ -1,8 +0,0 @@ |
1 | -# Default ignored files | |
2 | -/shelf/ | |
3 | -/workspace.xml | |
4 | -# Datasource local storage ignored files | |
5 | -/dataSources/ | |
6 | -/dataSources.local.xml | |
7 | -# Editor-based HTTP Client requests | |
8 | -/httpRequests/ |
--- .idea/AJIN-ERP.iml
... | ... | @@ -1,9 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<module type="JAVA_MODULE" version="4"> | |
3 | - <component name="NewModuleRootManager" inherit-compiler-output="true"> | |
4 | - <exclude-output /> | |
5 | - <content url="file://$MODULE_DIR$" /> | |
6 | - <orderEntry type="inheritedJdk" /> | |
7 | - <orderEntry type="sourceFolder" forTests="false" /> | |
8 | - </component> | |
9 | -</module>(파일 끝에 줄바꿈 문자 없음) |
--- .idea/misc.xml
... | ... | @@ -1,13 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<project version="4"> | |
3 | - <component name="ExternalStorageConfigurationManager" enabled="true" /> | |
4 | - <component name="FrameworkDetectionExcludesConfiguration"> | |
5 | - <file type="web" url="file://$PROJECT_DIR$" /> | |
6 | - </component> | |
7 | - <component name="JavaScriptSettings"> | |
8 | - <option name="languageLevel" value="ES6" /> | |
9 | - </component> | |
10 | - <component name="ProjectRootManager" version="2" languageLevel="JDK_14" default="false" project-jdk-name="17" project-jdk-type="JavaSDK"> | |
11 | - <output url="file://$PROJECT_DIR$/out" /> | |
12 | - </component> | |
13 | -</project>(파일 끝에 줄바꿈 문자 없음) |
--- .idea/vcs.xml
... | ... | @@ -1,6 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<project version="4"> | |
3 | - <component name="VcsDirectoryMappings"> | |
4 | - <mapping directory="" vcs="Git" /> | |
5 | - </component> | |
6 | -</project>(파일 끝에 줄바꿈 문자 없음) |
+++ Global.js
... | ... | @@ -0,0 +1,17 @@ |
1 | +const PROJECT_NAME = 'NodeJS Web Server Framework(Vue)'; | |
2 | +const PROJECT_VERSION = '1.0'; | |
3 | +const BASE_DIR = __dirname; | |
4 | +const LOG_BASE_DIR = `${__dirname}/server/logs`; | |
5 | +const SERVICE_STATUS = process.env.NODE_ENV;//development, production | |
6 | +const PORT = 80; | |
7 | +const API_SERVER_HOST = 'localhost:8080'; | |
8 | + | |
9 | +module.exports = { | |
10 | + PROJECT_NAME, | |
11 | + PROJECT_VERSION, | |
12 | + BASE_DIR, | |
13 | + LOG_BASE_DIR, | |
14 | + SERVICE_STATUS, | |
15 | + PORT, | |
16 | + API_SERVER_HOST | |
17 | +}(파일 끝에 줄바꿈 문자 없음) |
--- README.md
... | ... | @@ -1,1 +0,0 @@ |
1 | -Frist |
+++ SQL
... | ... | @@ -0,0 +1,33 @@ |
1 | +-- create test SCHEMA(mariaDB) | |
2 | +CREATE SCHEMA test DEFAULT CHARACTER SET utf8mb4; | |
3 | + | |
4 | +-- use test SCHEMA(mariaDB) | |
5 | +use test; | |
6 | + | |
7 | +-- create product table(mariaDB) | |
8 | +CREATE TABLE product | |
9 | +( | |
10 | + product_index INT PRIMARY KEY AUTO_INCREMENT, | |
11 | + product_name VARCHAR(50), | |
12 | + product_category VARCHAR(50), | |
13 | + product_price INT, | |
14 | + product_explan TEXT, | |
15 | + product_writer VARCHAR(50), | |
16 | + product_date DATE | |
17 | +) DEFAULT CHARACTER SET utf8mb4; | |
18 | + | |
19 | +-- create product_order table(mariaDB) | |
20 | +CREATE TABLE product_order | |
21 | +( | |
22 | + order_index INT, | |
23 | + order_product_number INT, | |
24 | + order_product_name VARCHAR(50), | |
25 | + order_product_category VARCHAR(50), | |
26 | + order_product_temperature VARCHAR(50), | |
27 | + order_amount INT, | |
28 | + order_price INT, | |
29 | + order_user VARCHAR(50), | |
30 | + order_date DATE, | |
31 | + order_state VARCHAR(50), | |
32 | + PRIMARY KEY(order_index, order_product_number) | |
33 | +) DEFAULT CHARACTER SET utf8mb4;(파일 끝에 줄바꿈 문자 없음) |
--- build.gradle
... | ... | @@ -1,55 +0,0 @@ |
1 | -plugins { | |
2 | - id 'java' | |
3 | - id 'org.springframework.boot' version '3.2.3' | |
4 | - id 'io.spring.dependency-management' version '1.1.4' | |
5 | -} | |
6 | - | |
7 | -group = 'com.ajin' | |
8 | -version = '0.0.1-SNAPSHOT' | |
9 | - | |
10 | -java { | |
11 | - sourceCompatibility = '17' | |
12 | -} | |
13 | - | |
14 | -repositories { | |
15 | - mavenCentral() | |
16 | -} | |
17 | - | |
18 | -dependencies { | |
19 | - // postgresql jdbc | |
20 | - implementation group: 'org.postgresql', name: 'postgresql', version: '42.6.0' | |
21 | - // 오라클 jdbc | |
22 | - implementation group: 'com.oracle.database.jdbc', name: 'ojdbc11', version: '21.8.0.0' | |
23 | - // 마리아 jdbc | |
24 | - implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.3.2' | |
25 | - // mysql jdbc | |
26 | - implementation group: 'com.mysql', name: 'mysql-connector-j', version: '8.0.33' | |
27 | - // mssql jdbc | |
28 | - implementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '12.4.2.jre11' | |
29 | - | |
30 | - // mybatis | |
31 | - implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' | |
32 | - | |
33 | - //lombok 라이브러리 | |
34 | - compileOnly 'org.projectlombok:lombok' | |
35 | - annotationProcessor 'org.projectlombok:lombok' | |
36 | - testCompileOnly 'org.projectlombok:lombok' | |
37 | - testAnnotationProcessor 'org.projectlombok:lombok' | |
38 | - | |
39 | - // https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple | |
40 | - implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' | |
41 | - // https://mvnrepository.com/artifact/org.json/json | |
42 | - implementation group: 'org.json', name: 'json', version: '20231013' | |
43 | - | |
44 | - //compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' | |
45 | - implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' | |
46 | - // https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 | |
47 | - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' | |
48 | - | |
49 | - implementation 'org.springframework.boot:spring-boot-starter-web' | |
50 | - testImplementation 'org.springframework.boot:spring-boot-starter-test' | |
51 | -} | |
52 | - | |
53 | -tasks.named('test') { | |
54 | - useJUnitPlatform() | |
55 | -} |
+++ client/resources/css/component.css
... | ... | @@ -0,0 +1,965 @@ |
1 | +@charset "utf-8"; | |
2 | + | |
3 | +/* box */ | |
4 | + | |
5 | +/* 메인 */ | |
6 | + | |
7 | +header { | |
8 | + background-color: #fff; | |
9 | + /* padding: 15px 30px; */ | |
10 | + grid-area: header; | |
11 | + position: absolute; | |
12 | + top: 0; | |
13 | + left: 0; | |
14 | + width: 100%; | |
15 | + z-index: 1; | |
16 | +} | |
17 | +/* .app-wrap{ | |
18 | + border: 1px solid red; | |
19 | + min-width: 1280px; | |
20 | +} */ | |
21 | +.wrapper { | |
22 | + width: 100%; | |
23 | + height: 100%; | |
24 | + position: absolute; | |
25 | + top: 0px; | |
26 | + left: 0px; | |
27 | + flex-wrap: nowrap; | |
28 | + padding-top: 64.5px; | |
29 | + font-family: 'Pretendard'; | |
30 | + background-color: var(--white); | |
31 | +} | |
32 | +/* | |
33 | +.main-nav { | |
34 | + position: absolute; | |
35 | + top: 70px; | |
36 | + left: 0; | |
37 | + width: 100%; | |
38 | + z-index: 2; | |
39 | +} */ | |
40 | + | |
41 | +.main-nav { | |
42 | + position: absolute; | |
43 | + /* top: 70px; */ | |
44 | + left: 0; | |
45 | + width: 100%; | |
46 | + z-index: 2; | |
47 | + flex-wrap: nowrap; | |
48 | + padding: 0 10px; | |
49 | + background-color: var(--navbarblue); | |
50 | +} | |
51 | + | |
52 | +.row { | |
53 | + padding-top: 5px; | |
54 | + padding-bottom: 5px; | |
55 | +} | |
56 | + | |
57 | +.box { | |
58 | + background-color: var(--white); | |
59 | + height: 100%; | |
60 | + padding: 15px; | |
61 | + border-radius: 10px; | |
62 | + box-shadow: 0 0 5px var(--light); | |
63 | +} | |
64 | + | |
65 | +.box-title { | |
66 | + font-size: 1.8rem; | |
67 | + font-weight: bold; | |
68 | + padding-bottom: 10px; | |
69 | + margin-bottom: 10px; | |
70 | + border-bottom: 1px solid var(--dark); | |
71 | +} | |
72 | + | |
73 | +.box-inner-title { | |
74 | + font-size: 1.6rem; | |
75 | + font-weight: bold; | |
76 | +} | |
77 | + | |
78 | +.chart-title { | |
79 | + font-size: 1.4rem; | |
80 | + font-weight: bold; | |
81 | +} | |
82 | + | |
83 | +.content-box { | |
84 | + height: calc(100% - 48px); | |
85 | + /* background-color: aliceblue; */ | |
86 | +} | |
87 | + | |
88 | + | |
89 | + | |
90 | + | |
91 | +/* btn */ | |
92 | +.small-btn { | |
93 | + width: 120px; | |
94 | + padding: 5px 10px; | |
95 | + border-radius: 5px; | |
96 | + font-size: 1.3rem; | |
97 | +} | |
98 | + | |
99 | +.large-btn { | |
100 | + width: 100%; | |
101 | + padding: 5px 15px; | |
102 | + border-radius: 5px; | |
103 | +} | |
104 | + | |
105 | +.icon-btn { | |
106 | + padding: 5px; | |
107 | + border-radius: 50%; | |
108 | +} | |
109 | + | |
110 | +.close-btn { | |
111 | + font-size: 1.6rem; | |
112 | + font-weight: 900; | |
113 | +} | |
114 | + | |
115 | + | |
116 | +.logout-btn::before { | |
117 | + content: ""; | |
118 | + width: 1px; | |
119 | + height: 10px; | |
120 | + position: absolute; | |
121 | + top: 50%; | |
122 | + left: 0; | |
123 | + transform: translateY(-50%); | |
124 | + background-color: #aaa; | |
125 | +} | |
126 | + | |
127 | +.close-btn { | |
128 | + color: #d6def6; | |
129 | +} | |
130 | + | |
131 | +.blue-btn, | |
132 | +.blue-border-btn:hover { | |
133 | + background-color: var(--blue); | |
134 | + color: var(--white); | |
135 | + transition: all 0.3s ease-in-out; | |
136 | +} | |
137 | + | |
138 | +.red-btn, | |
139 | +.red-border-btn:hover { | |
140 | + background-color: var(--red); | |
141 | + color: var(--white); | |
142 | + transition: all 0.3s ease-in-out; | |
143 | +} | |
144 | + | |
145 | +.green-btn, | |
146 | +.green-border-btn:hover { | |
147 | + background-color: var(--green); | |
148 | + color: var(--white); | |
149 | + transition: all 0.3s ease-in-out; | |
150 | +} | |
151 | + | |
152 | +.orange-btn, | |
153 | +.orange-border-btn:hover { | |
154 | + background-color: var(--orange); | |
155 | + color: var(--white); | |
156 | + transition: all 0.3s ease-in-out; | |
157 | +} | |
158 | + | |
159 | +.darkg-btn, | |
160 | +.darkg-border-btn:hover { | |
161 | + background-color: var(--darkG); | |
162 | + color: var(--white); | |
163 | + transition: all 0.3s ease-in-out; | |
164 | +} | |
165 | + | |
166 | +.gray-btn, | |
167 | +.gray-border-btn:hover { | |
168 | + background-color: #eee; | |
169 | + color: #333; | |
170 | + transition: all 0.3s ease-in-out; | |
171 | +} | |
172 | + | |
173 | + | |
174 | +.blue-border-btn { | |
175 | + border: 1px solid var(--blue); | |
176 | + color: var(--blue); | |
177 | + background-color: var(--white); | |
178 | +} | |
179 | + | |
180 | +.red-border-btn { | |
181 | + border: 1px solid var(--red); | |
182 | + color: var(--red); | |
183 | + background-color: var(--white); | |
184 | +} | |
185 | + | |
186 | +.green-border-btn { | |
187 | + border: 1px solid var(--green); | |
188 | + color: var(--green); | |
189 | + background-color: var(--white); | |
190 | +} | |
191 | + | |
192 | +.orange-border-btn { | |
193 | + border: 1px solid var(--orange); | |
194 | + ; | |
195 | + color: var(--orange); | |
196 | + background-color: var(--white); | |
197 | +} | |
198 | + | |
199 | +.darkg-border-btn { | |
200 | + border: 1px solid #434343; | |
201 | + color: #434343; | |
202 | + background-color: var(--white); | |
203 | +} | |
204 | + | |
205 | +.gray-border-btn { | |
206 | + border: 1px solid #aaa; | |
207 | + color: #aaa; | |
208 | + background-color: var(--white); | |
209 | +} | |
210 | + | |
211 | +.white-border-btn { | |
212 | + border: 1px solid var(--white); | |
213 | + color: var(--white); | |
214 | + background-color: transparent; | |
215 | +} | |
216 | + | |
217 | +.tp-btn { | |
218 | + background-color: transparent; | |
219 | + width: 15px; | |
220 | + height: 15px; | |
221 | + margin-left: 10px; | |
222 | +} | |
223 | + | |
224 | +button:disabled { | |
225 | + background-color: #eee; | |
226 | + color: #333; | |
227 | +} | |
228 | + | |
229 | +.del-icon-btn { | |
230 | + width: 25px; | |
231 | + height: 25px; | |
232 | + padding: 5px; | |
233 | + background-color: var(--red); | |
234 | + color: var(--white); | |
235 | + border-radius: 50%; | |
236 | +} | |
237 | + | |
238 | +.set-icon-btn { | |
239 | + width: 25px; | |
240 | + height: 25px; | |
241 | + padding: 5px; | |
242 | + background-color: var(--darkG); | |
243 | + color: var(--white); | |
244 | + border-radius: 50%; | |
245 | +} | |
246 | + | |
247 | + | |
248 | + | |
249 | + | |
250 | +/* 박스 컴포넌트 스타일 */ | |
251 | +.component-wrap { | |
252 | + width: 100%; | |
253 | + height: 100%; | |
254 | + padding: 8px; | |
255 | + border-radius: 5px; | |
256 | + background-color: #f8f8f8; | |
257 | +} | |
258 | + | |
259 | +.data-title { | |
260 | + font-size: 1.4rem; | |
261 | + font-weight: 500; | |
262 | +} | |
263 | + | |
264 | + | |
265 | +.data-number, | |
266 | +.data-caption { | |
267 | + font-size: 1.6rem; | |
268 | + font-weight: bold; | |
269 | +} | |
270 | + | |
271 | +.data-unit { | |
272 | + font-size: 1.4rem; | |
273 | + font-weight: 200; | |
274 | +} | |
275 | + | |
276 | +.data-icon { | |
277 | + min-width: 30px; | |
278 | + min-height: 30px; | |
279 | + width: 40px; | |
280 | + height: 40px; | |
281 | + max-width: 100%; | |
282 | + max-height: 100%; | |
283 | +} | |
284 | + | |
285 | + | |
286 | +.data-icon p { | |
287 | + font-size: 1.6rem; | |
288 | + font-weight: bold; | |
289 | + text-align: center; | |
290 | + line-height: 50px; | |
291 | + background-color: var(--orange); | |
292 | + border-radius: 5px; | |
293 | +} | |
294 | + | |
295 | + | |
296 | +/* 모달 */ | |
297 | +.modal-wrapper { | |
298 | + background-color: rgba(0, 0, 0, 0.5); | |
299 | + position: fixed; | |
300 | + width: 100%; | |
301 | + height: 100%; | |
302 | + top: 0; | |
303 | + left: 0; | |
304 | + display: flex; | |
305 | + justify-content: center; | |
306 | + align-items: center; | |
307 | + z-index: 11000; | |
308 | +} | |
309 | + | |
310 | +.modal-container { | |
311 | + background: #fff; | |
312 | + min-width: 500px; | |
313 | + width: 50%; | |
314 | + height: 80%; | |
315 | + border-radius: 5px; | |
316 | + display: grid; | |
317 | + grid-template-rows: auto 1fr auto; | |
318 | + padding: 20px; | |
319 | + box-sizing: border-box; | |
320 | + max-height: 95%; | |
321 | + min-height: 500px; | |
322 | +} | |
323 | + | |
324 | +.modal-title { | |
325 | + width: 100%; | |
326 | + border-bottom: 1px solid #d4cccc; | |
327 | + padding: 10px 0; | |
328 | +} | |
329 | + | |
330 | +.modal-subtitle { | |
331 | + font-size: 1.3rem; | |
332 | + font-weight: 600; | |
333 | +} | |
334 | + | |
335 | +.modal-content-monthly { | |
336 | + width: 100%; | |
337 | + padding: 20px 0; | |
338 | + overflow-y: auto; | |
339 | +} | |
340 | + | |
341 | +.large-modal { | |
342 | + width: 90%; | |
343 | +} | |
344 | + | |
345 | +.small-modal { | |
346 | + min-width: 200px; | |
347 | + min-height: 200px; | |
348 | + max-width: 450px; | |
349 | + height: auto; | |
350 | + max-height: 50%; | |
351 | +} | |
352 | + | |
353 | +.list-modal { | |
354 | + width: 80%; | |
355 | + height: 80%; | |
356 | +} | |
357 | + | |
358 | +.alert-write { | |
359 | + font-size: 1.6rem; | |
360 | + line-height: 180%; | |
361 | +} | |
362 | + | |
363 | + | |
364 | +.modal-content-monthly::-webkit-scrollbar { | |
365 | + width: 10px; | |
366 | +} | |
367 | + | |
368 | +.modal-content-monthly::-webkit-scrollbar-thumb { | |
369 | + background-color: #6b6b6b; | |
370 | + border-radius: 10px; | |
371 | + background-clip: padding-box; | |
372 | + border: 2px solid transparent; | |
373 | +} | |
374 | + | |
375 | +.modal-content-monthly::-webkit-scrollbar-track { | |
376 | + background-color: #eee; | |
377 | + border-radius: 10px; | |
378 | + box-shadow: inset 0px 0px 5px white; | |
379 | +} | |
380 | + | |
381 | +.modal-end { | |
382 | + width: 100%; | |
383 | + padding: 15px 0; | |
384 | + border-top: 1px solid #eee; | |
385 | +} | |
386 | + | |
387 | +.alert-modal .modal-end button, | |
388 | +.small-modal .modal-end button { | |
389 | + margin-left: 0; | |
390 | +} | |
391 | + | |
392 | +.full-input, | |
393 | +.full-select { | |
394 | + width: 100%; | |
395 | +} | |
396 | + | |
397 | + | |
398 | + | |
399 | +/* margin */ | |
400 | + | |
401 | +/* margin-left 왼쪽 */ | |
402 | +.ml0 { | |
403 | + margin-left: 0%; | |
404 | +} | |
405 | + | |
406 | +.ml1 { | |
407 | + margin-left: 1%; | |
408 | +} | |
409 | + | |
410 | +.ml2 { | |
411 | + margin-left: 2%; | |
412 | +} | |
413 | + | |
414 | +.ml3 { | |
415 | + margin-left: 3%; | |
416 | +} | |
417 | + | |
418 | +.ml4 { | |
419 | + margin-left: 4%; | |
420 | +} | |
421 | + | |
422 | +.ml5 { | |
423 | + margin-left: 5%; | |
424 | +} | |
425 | + | |
426 | +.ml6 { | |
427 | + margin-left: 6%; | |
428 | +} | |
429 | + | |
430 | +.ml7 { | |
431 | + margin-left: 7%; | |
432 | +} | |
433 | + | |
434 | +.ml8 { | |
435 | + margin-left: 8%; | |
436 | +} | |
437 | + | |
438 | +.ml9 { | |
439 | + margin-left: 9%; | |
440 | +} | |
441 | + | |
442 | +.ml10 { | |
443 | + margin-left: 10%; | |
444 | +} | |
445 | + | |
446 | +.ml15 { | |
447 | + margin-left: 15%; | |
448 | +} | |
449 | + | |
450 | +.ml20 { | |
451 | + margin-left: 20%; | |
452 | +} | |
453 | + | |
454 | +/* margin-right 오른쪽 */ | |
455 | +.mr0 { | |
456 | + margin-right: 0%; | |
457 | +} | |
458 | + | |
459 | +.mr1 { | |
460 | + margin-right: 1%; | |
461 | +} | |
462 | + | |
463 | +.mr2 { | |
464 | + margin-right: 2%; | |
465 | +} | |
466 | + | |
467 | +.mr3 { | |
468 | + margin-right: 3%; | |
469 | +} | |
470 | + | |
471 | +.mr4 { | |
472 | + margin-right: 4%; | |
473 | +} | |
474 | + | |
475 | +.mr5 { | |
476 | + margin-right: 5%; | |
477 | +} | |
478 | + | |
479 | +.mr6 { | |
480 | + margin-right: 6%; | |
481 | +} | |
482 | + | |
483 | +.mr7 { | |
484 | + margin-right: 7%; | |
485 | +} | |
486 | + | |
487 | +.mr8 { | |
488 | + margin-right: 8%; | |
489 | +} | |
490 | + | |
491 | +.mr9 { | |
492 | + margin-right: 9%; | |
493 | +} | |
494 | + | |
495 | +.mr10 { | |
496 | + margin-right: 10%; | |
497 | +} | |
498 | + | |
499 | +.mr15 { | |
500 | + margin-right: 15%; | |
501 | +} | |
502 | + | |
503 | +.mr20 { | |
504 | + margin-right: 20%; | |
505 | +} | |
506 | + | |
507 | +/* margin-top 윗쪽 */ | |
508 | +.mt0 { | |
509 | + margin-top: 0%; | |
510 | +} | |
511 | + | |
512 | +.mt1 { | |
513 | + margin-top: 1%; | |
514 | +} | |
515 | + | |
516 | +.mt2 { | |
517 | + margin-top: 2%; | |
518 | +} | |
519 | + | |
520 | +.mt3 { | |
521 | + margin-top: 3%; | |
522 | +} | |
523 | + | |
524 | +.mt4 { | |
525 | + margin-top: 4%; | |
526 | +} | |
527 | + | |
528 | +.mt5 { | |
529 | + margin-top: 5%; | |
530 | +} | |
531 | + | |
532 | +.mt6 { | |
533 | + margin-top: 6%; | |
534 | +} | |
535 | + | |
536 | +.mt7 { | |
537 | + margin-top: 7%; | |
538 | +} | |
539 | + | |
540 | +.mt8 { | |
541 | + margin-top: 8%; | |
542 | +} | |
543 | + | |
544 | +.mt9 { | |
545 | + margin-top: 9%; | |
546 | +} | |
547 | + | |
548 | +.mt10 { | |
549 | + margin-top: 10%; | |
550 | +} | |
551 | + | |
552 | +.mt15 { | |
553 | + margin-top: 15%; | |
554 | +} | |
555 | + | |
556 | +.mt20 { | |
557 | + margin-top: 20%; | |
558 | +} | |
559 | + | |
560 | +/* margin-bottom 아래쪽 */ | |
561 | + | |
562 | +.mb0 { | |
563 | + margin-bottom: 0%; | |
564 | +} | |
565 | + | |
566 | +.mb1 { | |
567 | + margin-bottom: 1%; | |
568 | +} | |
569 | + | |
570 | +.mb2 { | |
571 | + margin-bottom: 2%; | |
572 | +} | |
573 | + | |
574 | +.mb3 { | |
575 | + margin-bottom: 3%; | |
576 | +} | |
577 | + | |
578 | +.mb4 { | |
579 | + margin-bottom: 4%; | |
580 | +} | |
581 | + | |
582 | +.mb5 { | |
583 | + margin-bottom: 5%; | |
584 | +} | |
585 | + | |
586 | +.mb6 { | |
587 | + margin-bottom: 6%; | |
588 | +} | |
589 | + | |
590 | +.mb7 { | |
591 | + margin-bottom: 7%; | |
592 | +} | |
593 | + | |
594 | +.mb8 { | |
595 | + margin-bottom: 8%; | |
596 | +} | |
597 | + | |
598 | +.mb9 { | |
599 | + margin-bottom: 9%; | |
600 | +} | |
601 | + | |
602 | +.mb10 { | |
603 | + margin-bottom: 10%; | |
604 | +} | |
605 | + | |
606 | +.mb15 { | |
607 | + margin-bottom: 15%; | |
608 | +} | |
609 | + | |
610 | +.mb20 { | |
611 | + margin-bottom: 20%; | |
612 | +} | |
613 | + | |
614 | + | |
615 | +/* padding */ | |
616 | +.pd0 { | |
617 | + padding: 0%; | |
618 | +} | |
619 | + | |
620 | +.pd1 { | |
621 | + padding: 1%; | |
622 | +} | |
623 | + | |
624 | +.pd2 { | |
625 | + padding: 2%; | |
626 | +} | |
627 | + | |
628 | +.pd3 { | |
629 | + padding: 3%; | |
630 | +} | |
631 | + | |
632 | +.pd4 { | |
633 | + padding: 4%; | |
634 | +} | |
635 | + | |
636 | +.pd5 { | |
637 | + padding: 5%; | |
638 | +} | |
639 | + | |
640 | +.pd6 { | |
641 | + padding: 6%; | |
642 | +} | |
643 | + | |
644 | +.pd7 { | |
645 | + padding: 7%; | |
646 | +} | |
647 | + | |
648 | +.pd8 { | |
649 | + padding: 8%; | |
650 | +} | |
651 | + | |
652 | +.pd9 { | |
653 | + padding: 9%; | |
654 | +} | |
655 | + | |
656 | +.pd10 { | |
657 | + padding: 10%; | |
658 | +} | |
659 | + | |
660 | +.pd15 { | |
661 | + padding: 15%; | |
662 | +} | |
663 | + | |
664 | +.pd20 { | |
665 | + padding: 20%; | |
666 | +} | |
667 | + | |
668 | +/* padding-top */ | |
669 | +.pt0 { | |
670 | + padding-top: 0%; | |
671 | +} | |
672 | + | |
673 | +.pt1 { | |
674 | + padding-top: 1%; | |
675 | +} | |
676 | + | |
677 | +.pt2 { | |
678 | + padding-top: 2%; | |
679 | +} | |
680 | + | |
681 | +.pt3 { | |
682 | + padding-top: 3%; | |
683 | +} | |
684 | + | |
685 | +.pt4 { | |
686 | + padding-top: 4%; | |
687 | +} | |
688 | + | |
689 | +.pt5 { | |
690 | + padding-top: 5%; | |
691 | +} | |
692 | + | |
693 | +.pt6 { | |
694 | + padding-top: 6%; | |
695 | +} | |
696 | + | |
697 | +.pt7 { | |
698 | + padding-top: 7%; | |
699 | +} | |
700 | + | |
701 | +.pt8 { | |
702 | + padding-top: 8%; | |
703 | +} | |
704 | + | |
705 | +.pt9 { | |
706 | + padding-top: 9%; | |
707 | +} | |
708 | + | |
709 | +.pt10 { | |
710 | + padding-top: 10%; | |
711 | +} | |
712 | + | |
713 | +.pt15 { | |
714 | + padding-top: 15%; | |
715 | +} | |
716 | + | |
717 | +.pt20 { | |
718 | + padding-top: 20%; | |
719 | +} | |
720 | + | |
721 | +/* padding-bottom */ | |
722 | +.pb0 { | |
723 | + padding-bottom: 0%; | |
724 | +} | |
725 | + | |
726 | +.pb1 { | |
727 | + padding-bottom: 1%; | |
728 | +} | |
729 | + | |
730 | +.pb2 { | |
731 | + padding-bottom: 2%; | |
732 | +} | |
733 | + | |
734 | +.pb3 { | |
735 | + padding-bottom: 3%; | |
736 | +} | |
737 | + | |
738 | +.pb4 { | |
739 | + padding-bottom: 4%; | |
740 | +} | |
741 | + | |
742 | +.pb5 { | |
743 | + padding-bottom: 5%; | |
744 | +} | |
745 | + | |
746 | +.pb6 { | |
747 | + padding-bottom: 6%; | |
748 | +} | |
749 | + | |
750 | +.pb7 { | |
751 | + padding-bottom: 7%; | |
752 | +} | |
753 | + | |
754 | +.pb8 { | |
755 | + padding-bottom: 8%; | |
756 | +} | |
757 | + | |
758 | +.pb9 { | |
759 | + padding-bottom: 9%; | |
760 | +} | |
761 | + | |
762 | +.pb10 { | |
763 | + padding-bottom: 10%; | |
764 | +} | |
765 | + | |
766 | +.pb15 { | |
767 | + padding-bottom: 15%; | |
768 | +} | |
769 | + | |
770 | +.pb20 { | |
771 | + padding-bottom: 20%; | |
772 | +} | |
773 | + | |
774 | + | |
775 | +/* text 정렬 */ | |
776 | +.text-lf { | |
777 | + text-align: left; | |
778 | +} | |
779 | + | |
780 | +.text-ct { | |
781 | + text-align: center; | |
782 | +} | |
783 | + | |
784 | +.text-rg { | |
785 | + text-align: right; | |
786 | +} | |
787 | + | |
788 | + | |
789 | +/* 기타 공용 */ | |
790 | +.cursor { | |
791 | + cursor: pointer; | |
792 | +} | |
793 | + | |
794 | +.content-w20 { | |
795 | + width: 20%; | |
796 | +} | |
797 | + | |
798 | +.content-w30 { | |
799 | + width: 30%; | |
800 | +} | |
801 | + | |
802 | +.content-w60 { | |
803 | + width: 60%; | |
804 | +} | |
805 | + | |
806 | +.content-w70 { | |
807 | + width: 70%; | |
808 | +} | |
809 | + | |
810 | +.input-gray { | |
811 | + background-color: var(--inputgray); | |
812 | + text-align: left !important; | |
813 | +} | |
814 | + | |
815 | +.box-overflow { | |
816 | + height: 320px; | |
817 | + overflow-y: auto; | |
818 | +} | |
819 | + | |
820 | +.box-overflow::-webkit-scrollbar{ | |
821 | + width: 2px; | |
822 | +} | |
823 | +.box-overflow::-webkit-scrollbar-thumb{ | |
824 | + background-color: var(--navbarblue); | |
825 | +} | |
826 | +.rest-btn,.save-btn,.del-btn{ | |
827 | + position: relative; | |
828 | +} | |
829 | +.rest-btn::before{ | |
830 | + content: 'F11'; | |
831 | + position: absolute; | |
832 | + top: -30%; | |
833 | + right: 0; | |
834 | + background-color: var(--navbarblue); | |
835 | + color: white; | |
836 | + padding: 0 5px; | |
837 | + border-radius: 10px; | |
838 | + font-size: 1rem; | |
839 | +} | |
840 | +.save-btn::before{ | |
841 | + content: 'F9'; | |
842 | + position: absolute; | |
843 | + top: -30%; | |
844 | + right: 0; | |
845 | + background-color: var(--navbarblue); | |
846 | + color: white; | |
847 | + padding: 0 5px; | |
848 | + border-radius: 10px; | |
849 | + font-size: 1rem; | |
850 | +} | |
851 | +.del-btn::before{ | |
852 | + content: 'F8'; | |
853 | + position: absolute; | |
854 | + top: -30%; | |
855 | + right: 0; | |
856 | + background-color: var(--navbarblue); | |
857 | + color: white; | |
858 | + padding: 0 5px; | |
859 | + border-radius: 10px; | |
860 | + font-size: 1rem; | |
861 | +} | |
862 | +/* input checkbox */ | |
863 | +/* checkbox settings */ | |
864 | + | |
865 | +.ui-checkbox { | |
866 | + --primary-color: #005aab; | |
867 | + --secondary-color: #fff; | |
868 | + --primary-hover-color: #005aab; | |
869 | + /* checkbox */ | |
870 | + --checkbox-diameter: 20px; | |
871 | + --checkbox-border-radius: 5px; | |
872 | + --checkbox-border-color: #d9d9d9; | |
873 | + --checkbox-border-width: 1px; | |
874 | + --checkbox-border-style: solid; | |
875 | + /* checkmark */ | |
876 | + --checkmark-size: 1.2; | |
877 | +} | |
878 | + | |
879 | +.ui-checkbox, | |
880 | +.ui-checkbox *, | |
881 | +.ui-checkbox *::before, | |
882 | +.ui-checkbox *::after { | |
883 | + -webkit-box-sizing: border-box; | |
884 | + box-sizing: border-box; | |
885 | +} | |
886 | + | |
887 | +.ui-checkbox { | |
888 | + -webkit-appearance: none; | |
889 | + -moz-appearance: none; | |
890 | + appearance: none; | |
891 | + width: var(--checkbox-diameter); | |
892 | + height: var(--checkbox-diameter); | |
893 | + border-radius: var(--checkbox-border-radius); | |
894 | + background: var(--secondary-color); | |
895 | + border: var(--checkbox-border-width) var(--checkbox-border-style) var(--checkbox-border-color); | |
896 | + -webkit-transition: all 0.3s; | |
897 | + -o-transition: all 0.3s; | |
898 | + transition: all 0.3s; | |
899 | + cursor: pointer; | |
900 | + position: relative; | |
901 | +} | |
902 | + | |
903 | +.ui-checkbox::after { | |
904 | + content: ""; | |
905 | + position: absolute; | |
906 | + top: 0; | |
907 | + left: 0; | |
908 | + right: 0; | |
909 | + bottom: 0; | |
910 | + -webkit-box-shadow: 0 0 0 calc(var(--checkbox-diameter) / 2.5) var(--primary-color); | |
911 | + box-shadow: 0 0 0 calc(var(--checkbox-diameter) / 2.5) var(--primary-color); | |
912 | + border-radius: inherit; | |
913 | + opacity: 0; | |
914 | + -webkit-transition: all 0.5s cubic-bezier(0.12, 0.4, 0.29, 1.46); | |
915 | + -o-transition: all 0.5s cubic-bezier(0.12, 0.4, 0.29, 1.46); | |
916 | + transition: all 0.5s cubic-bezier(0.12, 0.4, 0.29, 1.46); | |
917 | +} | |
918 | + | |
919 | +.ui-checkbox::before { | |
920 | + top: 40%; | |
921 | + left: 50%; | |
922 | + content: ""; | |
923 | + position: absolute; | |
924 | + width: 4px; | |
925 | + height: 7px; | |
926 | + border-right: 2px solid var(--secondary-color); | |
927 | + border-bottom: 2px solid var(--secondary-color); | |
928 | + -webkit-transform: translate(-50%, -50%) rotate(45deg) scale(0); | |
929 | + -ms-transform: translate(-50%, -50%) rotate(45deg) scale(0); | |
930 | + transform: translate(-50%, -50%) rotate(45deg) scale(0); | |
931 | + opacity: 0; | |
932 | + -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; | |
933 | + -o-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; | |
934 | + transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; | |
935 | +} | |
936 | + | |
937 | +/* actions */ | |
938 | + | |
939 | +.ui-checkbox:hover { | |
940 | + border-color: var(--primary-color); | |
941 | +} | |
942 | + | |
943 | +.ui-checkbox:checked { | |
944 | + background: var(--primary-color); | |
945 | + border-color: transparent; | |
946 | +} | |
947 | + | |
948 | +.ui-checkbox:checked::before { | |
949 | + opacity: 1; | |
950 | + -webkit-transform: translate(-50%, -50%) rotate(45deg) scale(var(--checkmark-size)); | |
951 | + -ms-transform: translate(-50%, -50%) rotate(45deg) scale(var(--checkmark-size)); | |
952 | + transform: translate(-50%, -50%) rotate(45deg) scale(var(--checkmark-size)); | |
953 | + -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; | |
954 | + -o-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; | |
955 | + transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; | |
956 | +} | |
957 | + | |
958 | +.ui-checkbox:active:not(:checked)::after { | |
959 | + -webkit-transition: none; | |
960 | + -o-transition: none; | |
961 | + -webkit-box-shadow: none; | |
962 | + box-shadow: none; | |
963 | + transition: none; | |
964 | + opacity: 1; | |
965 | +}(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/css/font.css
... | ... | @@ -0,0 +1,27 @@ |
1 | +@font-face { | |
2 | + font-family: 'Pretendard'; | |
3 | + src: url('../font/PretendardVariable.woff2') format('woff'); | |
4 | + /* font-weight: 400; */ | |
5 | + font-style: normal; | |
6 | +} | |
7 | + | |
8 | +@font-face { | |
9 | + font-family: "GmarketSansM"; | |
10 | + src: url("/client/resources/font/GmarketSansMedium.woff") format("woff"); | |
11 | + font-weight: normal; | |
12 | + font-style: normal; | |
13 | +} | |
14 | + | |
15 | +@font-face { | |
16 | + font-family: "GmarketSansL"; | |
17 | + src: url("/client/resources/font/GmarketSansLight.woff") format("woff"); | |
18 | + font-weight: normal; | |
19 | + font-style: normal; | |
20 | +} | |
21 | + | |
22 | +@font-face { | |
23 | + font-family: "GmarketSansB"; | |
24 | + src: url("/client/resources/font/GmarketSansBold.woff") format("woff"); | |
25 | + font-weight: bold; | |
26 | + font-style: normal; | |
27 | +}(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/css/grid.css
... | ... | @@ -0,0 +1,256 @@ |
1 | +@charset "utf-8"; | |
2 | + | |
3 | +.container { | |
4 | + width: 100%; | |
5 | + /* padding-right: 15px; | |
6 | + padding-left: 15px; | |
7 | + margin-right: auto; | |
8 | + margin-left: auto; */ | |
9 | +} | |
10 | +/* 480 small */ | |
11 | +@media (min-width: 480px) { | |
12 | + .container { | |
13 | + max-width: 768px; | |
14 | + } | |
15 | +} | |
16 | + | |
17 | +/* 768 medium */ | |
18 | +@media (min-width: 768px) { | |
19 | + .container { | |
20 | + max-width: 1024px; | |
21 | + } | |
22 | +} | |
23 | +/* 1024 large */ | |
24 | +@media (min-width: 1024px) { | |
25 | + .container { | |
26 | + max-width: 1280px; | |
27 | + } | |
28 | +} | |
29 | +/* 1280 Xlarge */ | |
30 | +@media (min-width: 1280px) { | |
31 | + .container{ | |
32 | + max-width: 100%; | |
33 | + } | |
34 | +} | |
35 | + | |
36 | + | |
37 | +.flex { | |
38 | + display: flex; | |
39 | + flex-wrap: wrap; | |
40 | +} | |
41 | + | |
42 | +.flex-column { | |
43 | + display: flex; | |
44 | + flex-direction: column; | |
45 | +} | |
46 | + | |
47 | +.no-space { | |
48 | + margin-right: 0; | |
49 | + margin-left: 0; | |
50 | +} | |
51 | + | |
52 | + | |
53 | +.no-space >.gd, | |
54 | +.no-space >[class*="col-"] { | |
55 | + padding-right: 0; | |
56 | + padding-left: 0; | |
57 | +} | |
58 | + | |
59 | +.gd-1, | |
60 | +.gd-2, | |
61 | +.gd-3, | |
62 | +.gd-4, | |
63 | +.gd-5, | |
64 | +.gd-6, | |
65 | +.gd-7, | |
66 | +.gd-8, | |
67 | +.gd-9, | |
68 | +.gd-10, | |
69 | +.gd-11, | |
70 | +.gd-12, | |
71 | +.gd, | |
72 | +.gd-auto, | |
73 | +.gd-sm-1, | |
74 | +.gd-sm-2, | |
75 | +.gd-sm-3, | |
76 | +.gd-sm-4, | |
77 | +.gd-sm-5, | |
78 | +.gd-sm-6, | |
79 | +.gd-sm-7, | |
80 | +.gd-sm-8, | |
81 | +.gd-sm-9, | |
82 | +.gd-sm-10, | |
83 | +.gd-sm-11, | |
84 | +.gd-sm-12, | |
85 | +.gd-sm, | |
86 | +.gd-sm-auto, | |
87 | +.gd-md-1, | |
88 | +.gd-md-2, | |
89 | +.gd-md-3, | |
90 | +.gd-md-4, | |
91 | +.gd-md-5, | |
92 | +.gd-md-6, | |
93 | +.gd-md-7, | |
94 | +.gd-md-8, | |
95 | +.gd-md-9, | |
96 | +.gd-md-10, | |
97 | +.gd-md-11, | |
98 | +.gd-md-12, | |
99 | +.gd-md, | |
100 | +.gd-md-auto, | |
101 | +.gd-lg-1, | |
102 | +.gd-lg-2, | |
103 | +.gd-lg-3, | |
104 | +.gd-lg-4, | |
105 | +.gd-lg-5, | |
106 | +.gd-lg-6, | |
107 | +.gd-lg-7, | |
108 | +.gd-lg-8, | |
109 | +.gd-lg-9, | |
110 | +.gd-lg-10, | |
111 | +.gd-lg-11, | |
112 | +.gd-lg-12, | |
113 | +.gd-lg, | |
114 | +.gd-lg-auto, | |
115 | +.gd-xl-1, | |
116 | +.gd-xl-2, | |
117 | +.gd-xl-3, | |
118 | +.gd-xl-4, | |
119 | +.gd-xl-5, | |
120 | +.gd-xl-6, | |
121 | +.gd-xl-7, | |
122 | +.gd-xl-8, | |
123 | +.gd-xl-9, | |
124 | +.gd-xl-10, | |
125 | +.gd-xl-11, | |
126 | +.gd-xl-12, | |
127 | +.gd-xl, | |
128 | +.gd-xl-auto { | |
129 | + position: relative; | |
130 | + width: 100%; | |
131 | + min-height: 1px; | |
132 | + | |
133 | +} | |
134 | + | |
135 | + | |
136 | +.gd { | |
137 | + -ms-flex-preferred-size: 0; | |
138 | + flex-basis: 0; | |
139 | + -ms-flex-positive: 1; | |
140 | + flex-grow: 1; | |
141 | + max-width: 100%; | |
142 | +} | |
143 | + | |
144 | +.gd-auto { | |
145 | + -ms-flex: 0 0 auto; | |
146 | + flex: 0 0 auto; | |
147 | + width: auto; | |
148 | + max-width: none; | |
149 | +} | |
150 | + | |
151 | +.gd-1 { | |
152 | + -ms-flex: 0 0 8.333333%; | |
153 | + flex: 0 0 8.333333%; | |
154 | + max-width: 8.333333%; | |
155 | +} | |
156 | + | |
157 | +.gd-2 { | |
158 | + -ms-flex: 0 0 16.666667%; | |
159 | + flex: 0 0 16.666667%; | |
160 | + max-width: 16.666667%; | |
161 | +} | |
162 | + | |
163 | +.gd-3 { | |
164 | + -ms-flex: 0 0 25%; | |
165 | + flex: 0 0 25%; | |
166 | + max-width: 25%; | |
167 | +} | |
168 | + | |
169 | +.gd-4 { | |
170 | + -ms-flex: 0 0 33.333333%; | |
171 | + flex: 0 0 33.333333%; | |
172 | + max-width: 33.333333%; | |
173 | +} | |
174 | + | |
175 | +.gd-5 { | |
176 | + -ms-flex: 0 0 41.666667%; | |
177 | + flex: 0 0 41.666667%; | |
178 | + max-width: 41.666667%; | |
179 | +} | |
180 | + | |
181 | +.gd-6 { | |
182 | + -ms-flex: 0 0 50%; | |
183 | + flex: 0 0 50%; | |
184 | + max-width: 50%; | |
185 | +} | |
186 | + | |
187 | +.gd-7 { | |
188 | + -ms-flex: 0 0 58.333333%; | |
189 | + flex: 0 0 58.333333%; | |
190 | + max-width: 58.333333%; | |
191 | +} | |
192 | + | |
193 | +.gd-8 { | |
194 | + -ms-flex: 0 0 66.666667%; | |
195 | + flex: 0 0 66.666667%; | |
196 | + max-width: 66.666667%; | |
197 | +} | |
198 | + | |
199 | +.gd-9 { | |
200 | + -ms-flex: 0 0 75%; | |
201 | + flex: 0 0 75%; | |
202 | + max-width: 75%; | |
203 | +} | |
204 | + | |
205 | +.gd-10 { | |
206 | + -ms-flex: 0 0 83.333333%; | |
207 | + flex: 0 0 83.333333%; | |
208 | + max-width: 83.333333%; | |
209 | +} | |
210 | + | |
211 | +.gd-11 { | |
212 | + -ms-flex: 0 0 91.666667%; | |
213 | + flex: 0 0 91.666667%; | |
214 | + max-width: 91.666667%; | |
215 | +} | |
216 | + | |
217 | +.gd-12 { | |
218 | + -ms-flex: 0 0 100%; | |
219 | + flex: 0 0 100%; | |
220 | + max-width: 100%; | |
221 | +} | |
222 | + | |
223 | + | |
224 | + | |
225 | +.justify-start { | |
226 | + justify-content: flex-start; | |
227 | +} | |
228 | + | |
229 | +.justify-center { | |
230 | + justify-content: center; | |
231 | +} | |
232 | + | |
233 | +.justify-end { | |
234 | + justify-content: flex-end; | |
235 | +} | |
236 | + | |
237 | +.justify-between { | |
238 | + justify-content: space-between; | |
239 | +} | |
240 | + | |
241 | +.justify-around { | |
242 | + justify-content: space-around; | |
243 | +} | |
244 | + | |
245 | +.align-start { | |
246 | + align-items: flex-start; | |
247 | +} | |
248 | + | |
249 | + | |
250 | +.align-center { | |
251 | + align-items: center; | |
252 | +} | |
253 | + | |
254 | +.align-end { | |
255 | + align-items: flex-end; | |
256 | +} |
+++ client/resources/css/layout.css
... | ... | @@ -0,0 +1,0 @@ |
+++ client/resources/css/reset.css
... | ... | @@ -0,0 +1,207 @@ |
1 | +@charset "utf-8"; | |
2 | + | |
3 | +:root { | |
4 | + --blue: #007bff; | |
5 | + --skyblue: #c9e3ff; | |
6 | + --indigo: #6610f2; | |
7 | + --purple: #6f42c1; | |
8 | + --pink: #e83e8c; | |
9 | + --red: #dc3545; | |
10 | + --orange: #fd7e14; | |
11 | + --yellow: #ffc107; | |
12 | + --green: #28a745; | |
13 | + --teal: #20c997; | |
14 | + --cyan: #17a2b8; | |
15 | + --white: #fff; | |
16 | + --gray: #6c757d; | |
17 | + --gray-dark: #343a40; | |
18 | + --primary: #007bff; | |
19 | + --secondary: #6c757d; | |
20 | + --success: #28a745; | |
21 | + --info: #17a2b8; | |
22 | + --main:#388d6e; | |
23 | + --warning: #ffc107; | |
24 | + --danger: #dc3545; | |
25 | + --light: #f8f9fa; | |
26 | + --dark: #343a40; | |
27 | + --light:#eeeeee; | |
28 | + --headergray: #4f4f4f; | |
29 | + --navbarblue :#005aab; | |
30 | + --sidenavgray: #eceef2; | |
31 | + --lightbeige: #f8f8f8; | |
32 | + --bordergray: #c9c9c9; | |
33 | + --borderlightgray: #d1d2d2; | |
34 | + --tableblue :#f3faff; | |
35 | + --inputgray :#efefef; | |
36 | +} | |
37 | + | |
38 | +/* box-sizing 규칙을 명시합니다. */ | |
39 | +*, | |
40 | +*::before, | |
41 | +*::after { | |
42 | + box-sizing: border-box; | |
43 | + margin: 0; | |
44 | + padding: 0; | |
45 | +} | |
46 | +body { | |
47 | + min-width: 1300px; | |
48 | + overflow-x: auto; | |
49 | +} | |
50 | + | |
51 | +.layout-wrap { | |
52 | + width: 100%; | |
53 | + min-height: 100vh; | |
54 | + position: relative; | |
55 | + | |
56 | +} | |
57 | + | |
58 | + | |
59 | +a { | |
60 | + color: #333; | |
61 | + text-decoration: none; | |
62 | +} | |
63 | + | |
64 | +ol, | |
65 | +ul, | |
66 | +li { | |
67 | + list-style: none; | |
68 | +} | |
69 | + | |
70 | +img, | |
71 | +svg { | |
72 | + /* width: 100%; */ | |
73 | + vertical-align: middle; | |
74 | +} | |
75 | +/* 폰트 크기의 팽창을 방지합니다. */ | |
76 | +html { | |
77 | + -moz-text-size-adjust: none; | |
78 | + -webkit-text-size-adjust: none; | |
79 | + text-size-adjust: none; | |
80 | + font-size: 10px; | |
81 | +} | |
82 | +.layout-wrap{ | |
83 | + width: 100%; | |
84 | + min-height: 100%; | |
85 | + display: flex; | |
86 | + flex-direction: column; | |
87 | +} | |
88 | + | |
89 | +/* 기본 여백을 제거하여 작성된 CSS를 더 잘 제어할 수 있습니다. */ | |
90 | +body, | |
91 | +h1, | |
92 | +h2, | |
93 | +h3, | |
94 | +h4, | |
95 | +p, | |
96 | +figure, | |
97 | +blockquote, | |
98 | +dl, | |
99 | +dd { | |
100 | + margin-block-end: 0; | |
101 | +} | |
102 | + | |
103 | +/* list를 role값으로 갖는 ul, ol 요소의 기본 목록 스타일을 제거합니다. */ | |
104 | +ul[role='list'], | |
105 | +ol[role='list'] { | |
106 | + list-style: none; | |
107 | +} | |
108 | + | |
109 | +/* 핵심 body의 기본값을 설정합니다. */ | |
110 | +#root { | |
111 | + height: 100vh; | |
112 | + min-height: 100%; | |
113 | + line-height: 1.5; | |
114 | + display: flex; | |
115 | + flex-direction: column; | |
116 | + | |
117 | + } | |
118 | + | |
119 | +/* 제목 요소와 상호작용하는 요소에 대해 line-height를 더 짧게 설정합니다. */ | |
120 | +h1, | |
121 | +h2, | |
122 | +h3, | |
123 | +h4, | |
124 | +button, | |
125 | +input, | |
126 | +label { | |
127 | + line-height: 1.1; | |
128 | +} | |
129 | + | |
130 | +/* 제목에 대한 text-wrap을 balance로 설정합니다. */ | |
131 | +h1, | |
132 | +h2, | |
133 | +h3, | |
134 | +h4 { | |
135 | + text-wrap: balance; | |
136 | +} | |
137 | + | |
138 | +/* 클래스가 없는 기본 a 태그 요소는 기본 스타일을 가져옵니다. */ | |
139 | +a:not([class]) { | |
140 | + text-decoration-skip-ink: auto; | |
141 | + color: currentColor; | |
142 | +} | |
143 | + | |
144 | +/* 이미지 관련 작업을 더 쉽게 합니다. */ | |
145 | +img, | |
146 | +picture { | |
147 | + max-width: 100%; | |
148 | + display: block; | |
149 | +} | |
150 | + | |
151 | +/* input 및 button 항목들이 글꼴을 상속하도록 합니다. */ | |
152 | +input, | |
153 | +button, | |
154 | +textarea, | |
155 | +select { | |
156 | + font: inherit; | |
157 | +} | |
158 | + | |
159 | +button{ | |
160 | + background: inherit ; | |
161 | + border:none; | |
162 | + box-shadow:none; | |
163 | + border-radius:0; | |
164 | + padding:0; | |
165 | + overflow:visible; | |
166 | + cursor:pointer | |
167 | +} | |
168 | + | |
169 | +/* 행 속성이 없는 textarea가 너무 작지 않도록 합니다. */ | |
170 | +textarea:not([rows]) { | |
171 | + min-height: 10em; | |
172 | +} | |
173 | + | |
174 | + | |
175 | +table{ | |
176 | + min-width: 100%; | |
177 | + border-collapse: collapse; | |
178 | + table-layout: fixed; | |
179 | +} | |
180 | + | |
181 | +table th, | |
182 | +table td{ | |
183 | + font-size: 1.3rem; | |
184 | +} | |
185 | + | |
186 | +select,input{ | |
187 | + padding: 7px; | |
188 | + border: 1px solid #ddd; | |
189 | + border-radius: 5px; | |
190 | +} | |
191 | + | |
192 | + | |
193 | +/* 스크롤바 디자인 */ | |
194 | +::-webkit-scrollbar { | |
195 | + width: 8px; | |
196 | + height: 8px; | |
197 | +} | |
198 | + | |
199 | +::-webkit-scrollbar-thumb { | |
200 | + background-color: #ededed; | |
201 | + border-radius: 10px; | |
202 | +} | |
203 | + | |
204 | +::-webkit-scrollbar-track { | |
205 | + background-color: #fff; | |
206 | + border-radius: 10px; | |
207 | +}(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/css/responsive.css
... | ... | @@ -0,0 +1,0 @@ |
+++ client/resources/css/style.css
... | ... | @@ -0,0 +1,338 @@ |
1 | +.logo-wrap { | |
2 | + padding: 10px 30px; | |
3 | +} | |
4 | + | |
5 | +.logo { | |
6 | + width: 300px; | |
7 | + height: 50px; | |
8 | + background: url(../img/common/header-logo-w.png) no-repeat; | |
9 | + background-size: contain; | |
10 | + background-position: center; | |
11 | + | |
12 | +} | |
13 | + | |
14 | +.logo-btn { | |
15 | + padding-left: 0px; | |
16 | + padding-right: 0px; | |
17 | +} | |
18 | + | |
19 | + | |
20 | +.button-wrap button { | |
21 | + border: 1px solid var(--navbarblue); | |
22 | + color: var(--navbarblue); | |
23 | + padding: 7px 10px !important; | |
24 | + margin-left: 10px; | |
25 | + border-radius: 5px; | |
26 | + font-family: 'Pretendard'; | |
27 | + font-weight: 600; | |
28 | + font-size: 1.2rem; | |
29 | +} | |
30 | + | |
31 | + | |
32 | + | |
33 | +.header-btn a { | |
34 | + font-family: 'Pretendard'; | |
35 | + font-weight: bold; | |
36 | + font-size: 0.9rem; | |
37 | +} | |
38 | + | |
39 | +.btn-img1 { | |
40 | + background: url(../img/common/header01.png) no-repeat; | |
41 | +} | |
42 | + | |
43 | +.btn-img2 { | |
44 | + background: url(../img/component/arrow-right-from-bracket-solid.svg) no-repeat; | |
45 | +} | |
46 | + | |
47 | +.btn-img3 { | |
48 | + background: url(../img/component/user-solid.svg) no-repeat; | |
49 | +} | |
50 | + | |
51 | + | |
52 | +.topmenu-wrap p{ | |
53 | + position: relative; | |
54 | + padding: 1px 5px; | |
55 | + font-family: 'Pretendard'; | |
56 | + font-weight: 500; | |
57 | + /* height: px; */ | |
58 | + color: var(--white); | |
59 | + font-size: 1.5rem ; | |
60 | +} | |
61 | +.topmenu-wrap p.active { | |
62 | + width: 100px; | |
63 | + background-color: white; | |
64 | + color: var(--navbarblue); | |
65 | + padding: 1px 5px; | |
66 | + border-radius: 50px; | |
67 | + font-family: 'Pretendard'; | |
68 | + font-weight: 500; | |
69 | +} | |
70 | + | |
71 | +.side-wrap p { | |
72 | + font-size: 1.3rem; | |
73 | + padding: 8px 40px; | |
74 | + position: relative; | |
75 | + border-radius: 50px; | |
76 | + background-color: var(--white); | |
77 | + /* margin-bottom: 20px; */ | |
78 | + | |
79 | +} | |
80 | + | |
81 | +.side-wrap p.active { | |
82 | + margin-bottom: 5%; | |
83 | + background-color: var(--navbarblue); | |
84 | + color: var(--white) !important; | |
85 | +} | |
86 | + | |
87 | + | |
88 | +.side-wrap p::after { | |
89 | + content: ''; | |
90 | + position: absolute; | |
91 | + top: 50%; | |
92 | + left: 5%; | |
93 | + transform: translateY(-50%); | |
94 | + width: 20px; | |
95 | + height: 20px; | |
96 | + background: url(../img/component/file-solid-b.svg) no-repeat; | |
97 | +} | |
98 | + | |
99 | +.side-wrap p.active::after { | |
100 | + content: ''; | |
101 | + position: absolute; | |
102 | + top: 50%; | |
103 | + left: 5%; | |
104 | + transform: translateY(-50%); | |
105 | + width: 20px; | |
106 | + height: 20px; | |
107 | + background: url(../img/component/file-solid-w.svg) no-repeat; | |
108 | +} | |
109 | + | |
110 | +.side-wrap p::before { | |
111 | + content: ''; | |
112 | + position: absolute; | |
113 | + top: 50%; | |
114 | + right: 5%; | |
115 | + transform: translateY(-50%); | |
116 | + width: 15px; | |
117 | + height: 15px; | |
118 | + background: url(../img/component/chevron-down-solid-b.svg) no-repeat; | |
119 | +} | |
120 | + | |
121 | +.side-wrap p.active::before { | |
122 | + content: ''; | |
123 | + position: absolute; | |
124 | + top: 50%; | |
125 | + right: 5%; | |
126 | + transform: translateY(-50%); | |
127 | + width: 15px; | |
128 | + height: 15px; | |
129 | + background: url(../img/component/chevron-up-solid-w.svg) no-repeat; | |
130 | +} | |
131 | + | |
132 | +.sidemenu-wrap li { | |
133 | + margin-bottom: 10px; | |
134 | +} | |
135 | + | |
136 | +.sidemenu-wrap li a { | |
137 | + text-align: left; | |
138 | + font-size: 1.3rem; | |
139 | +} | |
140 | + | |
141 | +.sidemenu-wrap li a.active-text { | |
142 | + color: var(--navbarblue); | |
143 | +} | |
144 | + | |
145 | +.list-wrap { | |
146 | + width: 100%; | |
147 | + height: 100%; | |
148 | +} | |
149 | + | |
150 | +.content-table { | |
151 | + background-color: var(--lightbeige); | |
152 | + border-radius: 10px; | |
153 | +} | |
154 | + | |
155 | +.wrap-title { | |
156 | + font-size: 1.3rem; | |
157 | + color: var(--navbarblue); | |
158 | + border-bottom: 2px solid var(--bordergray); | |
159 | +} | |
160 | + | |
161 | +.content-title { | |
162 | + font-size: 1.7rem; | |
163 | + font-weight: bold; | |
164 | +} | |
165 | + | |
166 | +.content-title span { | |
167 | + font-size: 1rem; | |
168 | +} | |
169 | + | |
170 | +.list-table { | |
171 | + background-color: var(--white); | |
172 | + border-left: 1px solid var(--borderlightgray); | |
173 | +} | |
174 | + | |
175 | +.code-area { | |
176 | + padding: 10px 20px; | |
177 | + background-color: var(--tableblue); | |
178 | + border-radius: 10px; | |
179 | +} | |
180 | +.code-area th{ | |
181 | + white-space: nowrap; | |
182 | +padding: 7px 10px !important;} | |
183 | + | |
184 | +.code-area td { | |
185 | + | |
186 | + text-align: left !important; | |
187 | +} | |
188 | + | |
189 | + | |
190 | +.blue-text { | |
191 | + color: var(--navbarblue); | |
192 | + position: relative; | |
193 | + text-align: left !important; | |
194 | + /* left: 2%; */ | |
195 | + font-size: 1.3rem; | |
196 | + font-weight: 600; | |
197 | +} | |
198 | + | |
199 | + | |
200 | +.table-border td.selected { | |
201 | + background-color: var(--navbarblue); | |
202 | + color: var(--white); | |
203 | +} | |
204 | + | |
205 | +.table-scroll { | |
206 | + width: 100%; | |
207 | + overflow-y: auto; | |
208 | +} | |
209 | + | |
210 | +.table-scroll table { | |
211 | + white-space: nowrap; | |
212 | + border-collapse: collapse; | |
213 | +} | |
214 | + | |
215 | +.close-btn { | |
216 | + background: url(../img/component/xmark-solid.svg) no-repeat; | |
217 | + width: 20px; | |
218 | + height: 20px; | |
219 | +} | |
220 | + | |
221 | +.table-border th { | |
222 | + border: 1px solid var(--borderlightgray); | |
223 | +} | |
224 | +.box-overflow{ | |
225 | + border-top: 1px solid var(--borderlightgray); | |
226 | +} | |
227 | +.box-overflow thead { | |
228 | + position: sticky; | |
229 | + top: -1px; | |
230 | +} | |
231 | + | |
232 | +.wrap { | |
233 | + width: 100%; | |
234 | + height: 100%; | |
235 | +} | |
236 | + | |
237 | +.content { | |
238 | + height: 100%; | |
239 | +} | |
240 | + | |
241 | +.content-wrap { | |
242 | + padding-left: 20px; | |
243 | + gap: 30px; | |
244 | +} | |
245 | + | |
246 | +.container { | |
247 | + width: 100%; | |
248 | + height: 100%; | |
249 | + flex-wrap: nowrap; | |
250 | +} | |
251 | + | |
252 | +select, | |
253 | +input { | |
254 | + font-size: 1.2rem; | |
255 | + font-weight: 600; | |
256 | +} | |
257 | + | |
258 | +p, | |
259 | +td { | |
260 | + font-size: 1.3rem; | |
261 | + margin-right: 10px; | |
262 | +} | |
263 | + | |
264 | +td, | |
265 | +p, | |
266 | +th, | |
267 | +button { | |
268 | + padding: 7px 0; | |
269 | + /* text-align: center; */ | |
270 | + cursor: pointer; | |
271 | +} | |
272 | + | |
273 | +.table-border td, | |
274 | +.table-border th, | |
275 | +.table-header th { | |
276 | + border-bottom: 1px solid var(--borderlightgray); | |
277 | + border-right: 1px solid var(--borderlightgray); | |
278 | + | |
279 | +} | |
280 | +.table-header{ | |
281 | + background-color: var(--tableblue); | |
282 | + color: var(--navbarblue); | |
283 | +} | |
284 | + | |
285 | +.list-table th { | |
286 | + color: var(--navbarblue); | |
287 | +} | |
288 | + | |
289 | + | |
290 | + | |
291 | + | |
292 | +.table-area { | |
293 | + border: 1px solid var(--bordergray); | |
294 | + border-radius: 10px; | |
295 | +} | |
296 | + | |
297 | +.box-wrap { | |
298 | + font-size: 1.2rem; | |
299 | +} | |
300 | + | |
301 | +.blue-btn { | |
302 | + background-color: var(--navbarblue); | |
303 | + color: var(--white); | |
304 | + padding: 3px 20px; | |
305 | + font-size: 1.3rem; | |
306 | + border-radius: 5px; | |
307 | + | |
308 | +} | |
309 | + | |
310 | +.header-btn p { | |
311 | + margin: 0 auto; | |
312 | +} | |
313 | + | |
314 | +.section-wrap{ | |
315 | + background-color: var(--tableblue); | |
316 | + border: 1px solid red; | |
317 | +} | |
318 | +.section-wrap table{ | |
319 | + height: 300px; | |
320 | + overflow-y: auto; | |
321 | + | |
322 | +} | |
323 | + | |
324 | +.Bi002-table{ | |
325 | + text-align: left; | |
326 | +} | |
327 | +.Bi002-table tr{ | |
328 | + padding: 2rem; | |
329 | +} | |
330 | + | |
331 | + | |
332 | +.input-box{ | |
333 | + flex-wrap: nowrap; | |
334 | + gap: 1px; | |
335 | +} | |
336 | +.input-box input{ | |
337 | + width: 100%; | |
338 | +} |
+++ client/resources/font/GmarketSansBold.woff
Binary file is not shown |
+++ client/resources/font/GmarketSansLight.woff
Binary file is not shown |
+++ client/resources/font/GmarketSansMedium.woff
Binary file is not shown |
+++ client/resources/font/PretendardVariable.woff2
Binary file is not shown |
+++ client/resources/img/common/header-logo-w.png
Binary file is not shown |
+++ client/resources/img/common/header-logo.png
Binary file is not shown |
+++ client/resources/img/common/header01.png
Binary file is not shown |
+++ client/resources/img/common/header02.png
Binary file is not shown |
+++ client/resources/img/common/header03.png
Binary file is not shown |
+++ client/resources/img/common/header04.png
Binary file is not shown |
+++ client/resources/img/component/arrow-right-from-bracket-solid.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M502.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L402.7 224 192 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l210.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128zM160 96c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 32C43 32 0 75 0 128L0 384c0 53 43 96 96 96l64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l64 0z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/chevron-down-solid-b.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#333333" d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/chevron-down-solid-w.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/chevron-down.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/chevron-up-solid-w.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/chevron-up.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" /></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/file-solid-b.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#333333" d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/file-solid-w.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/file.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" /></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/star-solid.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/star.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z" /></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/user-solid.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/resources/img/component/xmark-solid.svg
... | ... | @@ -0,0 +1,1 @@ |
1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/index.html
... | ... | @@ -0,0 +1,22 @@ |
1 | +<!DOCTYPE html> | |
2 | +<html> | |
3 | + <head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
6 | + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | |
7 | + <meta name="description" content="Node Vue Web"> | |
8 | + <link rel="stylesheet" href="/client/resources/css/font.css"> | |
9 | + <link rel="stylesheet" href="/client/resources/css/reset.css"> | |
10 | + <link rel="stylesheet" href="/client/resources/css/layout.css"> | |
11 | + <link rel="stylesheet" href="/client/resources/css/grid.css"> | |
12 | + <link rel="stylesheet" href="/client/resources/css/component.css"> | |
13 | + <link rel="stylesheet" href="/client/resources/css/style.css"> | |
14 | + <link rel="stylesheet" href="/client/resources/css/responsive.css"> | |
15 | + <title>AJIN</title> | |
16 | + </head> | |
17 | + | |
18 | + <body> | |
19 | + <div id="root" ></div> | |
20 | + <script src="/client/build/bundle.js"></script> | |
21 | + </body> | |
22 | +</html>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/index.js
... | ... | @@ -0,0 +1,12 @@ |
1 | +/** | |
2 | + * @author : 하석형 | |
3 | + * @since : 2023.08.24 | |
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).mount('#root'); | |
12 | +const vue = createApp(App).use(AppRouter).mount('#root');(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi001.vue
... | ... | @@ -0,0 +1,340 @@ |
1 | +<template> | |
2 | + <div class="gd-10 Bi001-page container"> | |
3 | + <div class="wrap pd2 flex-column"> | |
4 | + <div class="wrap-title pb1 mb1 flex justify-between"> | |
5 | + <h1>(회계) 공동 코드 등록</h1> | |
6 | + <div class="flex justify-end gd-5"> | |
7 | + | |
8 | + <div class="flex justify-between button-wrap"> | |
9 | + <button class="rest-btn">초기화</button> | |
10 | + <button class="save-btn">저장</button> | |
11 | + </div> | |
12 | + | |
13 | + | |
14 | + </div> | |
15 | + </div> | |
16 | + <div class="container flex"> | |
17 | + <div class="content gd-2 list-wrap flex-column "> | |
18 | + <div class="content-title flex justify-between mb1"> | |
19 | + 분류목록 | |
20 | + </div> | |
21 | + <div class="content-table pd4 "> | |
22 | + <div class="box-overflow"> | |
23 | + | |
24 | + <table class="list-table"> | |
25 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
26 | + <colgroup> | |
27 | + <col style="width: 20%;"> | |
28 | + <col style="width: 80%;"> | |
29 | + | |
30 | + </colgroup> | |
31 | + <thead> | |
32 | + <tr class="table-header" | |
33 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
34 | + <th>코드분류</th> | |
35 | + <th>코드분류명</th> | |
36 | + | |
37 | + </tr> | |
38 | + </thead> | |
39 | + <tbody class="table-border"> | |
40 | + <tr v-for="(codeNum) in codeList" key="codeNum.id"> | |
41 | + <td :class="{ 'selected': selectedId === codeNum.id }">{{ codeNum.pathNum }}</td> | |
42 | + <td @click="clickCodeName(codeNum.id)" | |
43 | + :class="{ 'selected': selectedId === codeNum.id }" class="wrap-text">{{ | |
44 | + codeNum.pathName }}</td> | |
45 | + | |
46 | + </tr> | |
47 | + | |
48 | + | |
49 | + </tbody> | |
50 | + </table> | |
51 | + </div> | |
52 | + </div> | |
53 | + | |
54 | + </div> | |
55 | + <div class="content gd-10 flex-column content-wrap" style="width: 100%;"> | |
56 | + <div> | |
57 | + <div class="content-title mb1 list-box">코드등록</div> | |
58 | + <div class="code-area table-input"> | |
59 | + | |
60 | + <table> | |
61 | + | |
62 | + <tbody v-for="(codeInput, id) in filteredCodeBox" :key="id" class="filter-table"> | |
63 | + <tr> | |
64 | + <th class="blue-text text-befor">분류코드</th> | |
65 | + <td><input type="text" name="" id=""></td> | |
66 | + <th class="blue-text text-befor">분류명</th> | |
67 | + <td><input type="text" name="" id=""></td> | |
68 | + <th class="blue-text text-befor">코드</th> | |
69 | + <td><input style="width: 50px;" type="text" name="" id=""></td> | |
70 | + <th>정렬순서</th> | |
71 | + <td><input style="width: 50px;" type="text" name="" id=""></td> | |
72 | + <th class="blue-text text-befor">사용여부</th> | |
73 | + <td><input type="checkbox" name="" id="" class="ui-checkbox"></td> | |
74 | + </tr> | |
75 | + <tr v-show="activeItemId === codeInput.id"> | |
76 | + <th>코드명</th> | |
77 | + <td><input type="text" name="" id=""></td> | |
78 | + <th>코드약명</th> | |
79 | + <td><input type="text" name="" id=""></td> | |
80 | + | |
81 | + <th>{{ codeInput.pathName1 }}</th> | |
82 | + <td><input type="text" name="" id=""></td> | |
83 | + <th>{{ codeInput.pathName2 }}</th> | |
84 | + <td colspan="4"><input type="text" name="" id=""></td> | |
85 | + | |
86 | + </tr> | |
87 | + </tbody> | |
88 | + <tbody v-for="(codeInput, id) in filteredCodeBox" :key="id" class="filter-table"> | |
89 | + <tr> | |
90 | + <th>{{ codeInput.pathName3 }}</th> | |
91 | + <td><input type="text" name="" id=""></td> | |
92 | + <th>{{ codeInput.pathName4 }}</th> | |
93 | + <td><input type="text" name="" id=""></td> | |
94 | + <th>{{ codeInput.pathName5 }}</th> | |
95 | + <td><input type="text" name="" id=""></td> | |
96 | + <th>{{ codeInput.pathName6 }}</th> | |
97 | + <td colspan="3"><input type="text" name="" id=""></td> | |
98 | + | |
99 | + </tr> | |
100 | + </tbody> | |
101 | + <tbody v-for="(codeInput, id) in filteredCodeBox" :key="id" class="filter-table"> | |
102 | + <tr> | |
103 | + <th>{{ codeInput.pathName7 }}</th> | |
104 | + <td><input type="text" name="" id=""></td> | |
105 | + <th>{{ codeInput.pathName8 }}</th> | |
106 | + <td><input type="text" name="" id=""></td> | |
107 | + <th>{{ codeInput.pathName9 }}</th> | |
108 | + <td><input type="text" name="" id=""></td> | |
109 | + <th>{{ codeInput.pathName10 }}</th> | |
110 | + <td colspan="3"><input type="text" name="" id=""></td> | |
111 | + | |
112 | + </tr> | |
113 | + </tbody> | |
114 | + | |
115 | + </table> | |
116 | + | |
117 | + | |
118 | + | |
119 | + | |
120 | + </div> | |
121 | + </div> | |
122 | + <div class="table-border "> | |
123 | + <div class="content-title mb1">코드목록</div> | |
124 | + <div class="box-overflow"> | |
125 | + | |
126 | + | |
127 | + <table class="list-table"> | |
128 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
129 | + <colgroup> | |
130 | + <col style="width: 5%;"> | |
131 | + <col style="width: 10%;"> | |
132 | + <col style="width: 5%;"> | |
133 | + <col style="width: 5%;"> | |
134 | + <col style="width: 5%;"> | |
135 | + <col style="width: 5%;"> | |
136 | + <col style="width: 5%;"> | |
137 | + <col style="width: 5%;"> | |
138 | + <col style="width: 5%;"> | |
139 | + <col style="width: 5%;"> | |
140 | + <col style="width: 5%;"> | |
141 | + <col style="width: 5%;"> | |
142 | + <col style="width: 5%;"> | |
143 | + <col style="width: 5%;"> | |
144 | + <col style="width: 5%;"> | |
145 | + <col style="width: 5%;"> | |
146 | + <col style="width: 5%;"> | |
147 | + | |
148 | + | |
149 | + | |
150 | + </colgroup> | |
151 | + <thead class="list-table"> | |
152 | + <tr v-for="(codeInput, id) in filteredCodeBox" :key="id" | |
153 | + style="background-color: var(--tableblue);"> | |
154 | + <th>코드</th> | |
155 | + <th>코드명칭</th> | |
156 | + <th>코드약칭</th> | |
157 | + <th>정렬순서</th> | |
158 | + <th>사용</th> | |
159 | + <th class="wrap-text">{{ codeInput.pathName1 }}</th> | |
160 | + <th>{{ codeInput.pathName2 }}</th> | |
161 | + <th>{{ codeInput.pathName3 }}</th> | |
162 | + <th>{{ codeInput.pathName4 }}</th> | |
163 | + <th>{{ codeInput.pathName5 }}</th> | |
164 | + <th>{{ codeInput.pathName6 }}</th> | |
165 | + <th>{{ codeInput.pathName7 }}</th> | |
166 | + <th>{{ codeInput.pathName8 }}</th> | |
167 | + <th>{{ codeInput.pathName9 }}</th> | |
168 | + <th>{{ codeInput.pathName10 }}</th> | |
169 | + <th>{{ codeInput.pathName11 }}</th> | |
170 | + <th class="wrap-text">{{ codeInput.pathName12 }}</th> | |
171 | + | |
172 | + | |
173 | + | |
174 | + </tr> | |
175 | + </thead> | |
176 | + <tbody> | |
177 | + <tr> | |
178 | + <td>000101</td> | |
179 | + <td>합계잔액시산표</td> | |
180 | + <td></td> | |
181 | + <td>0</td> | |
182 | + <td><input type="checkbox" checked name="" id="" class="ui-checkbox"></td> | |
183 | + <td></td> | |
184 | + <td></td> | |
185 | + <td></td> | |
186 | + <td></td> | |
187 | + <td></td> | |
188 | + <td></td> | |
189 | + <td></td> | |
190 | + <td></td> | |
191 | + <td></td> | |
192 | + <td></td> | |
193 | + <td></td> | |
194 | + <td></td> | |
195 | + </tr> | |
196 | + | |
197 | + <tr v-if="postList === 0"> | |
198 | + <td colspan="5" class="no-list">검색조건에 해당하는 데이터가 없습니다.</td> | |
199 | + </tr> | |
200 | + </tbody> | |
201 | + </table> | |
202 | + </div> | |
203 | + </div> | |
204 | + </div> | |
205 | + </div> | |
206 | + </div> | |
207 | + | |
208 | + </div> | |
209 | +</template> | |
210 | + | |
211 | +<script> | |
212 | +export default { | |
213 | + data() { | |
214 | + return { | |
215 | + activeItemId: 0, | |
216 | + selectedId: null, | |
217 | + codeList: [ | |
218 | + { id: 0, pathNum: "001", pathName: "제무제표양식종류", selected: true }, | |
219 | + { id: 1, pathNum: "002", pathName: "증빙구분" }, | |
220 | + { id: 2, pathNum: "003", pathName: "카드번호" }, | |
221 | + { id: 3, pathNum: "004", pathName: "사업장(회계)" }, | |
222 | + { id: 4, pathNum: "005", pathName: "국세청전자(세금)계산서 수정사유코드" }, | |
223 | + { id: 5, pathNum: "006", pathName: "은행코드" }, | |
224 | + { id: 6, pathNum: "007", pathName: "지급조건" }, | |
225 | + { id: 7, pathNum: "008", pathName: "어음종류" }, | |
226 | + { id: 8, pathNum: "009", pathName: "어음구분" }, | |
227 | + { id: 9, pathNum: "010", pathName: "차입종류" }, | |
228 | + { id: 10, pathNum: "011", pathName: "원금상환방법" }, | |
229 | + { id: 11, pathNum: "012", pathName: "이자납입방법" }, | |
230 | + { id: 12, pathNum: "013", pathName: "전표결제진행상태" }, | |
231 | + { id: 13, pathNum: "014", pathName: "사원번호별 계정과목 조회(사번)" }, | |
232 | + { id: 14, pathNum: "015", pathName: "국책과제 카드" }, | |
233 | + ], | |
234 | + codeBox: [ | |
235 | + // 제무제표양식종류 | |
236 | + { id: 0, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
237 | + // 증빙구분 | |
238 | + { id: 1, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
239 | + // 카드번호 | |
240 | + { id: 2, pathName1: "카드번호", pathName2: "사업장구분", pathName3: "관리부서코드", pathName4: "NBS코드", pathName5: "카드수령일", pathName6: "유형", pathName7: "한도", pathName8: "유효기간(CVC)", pathName9: "사용부서명", pathName10: "담당자/부서장", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
241 | + // 사업장(회계) | |
242 | + { id: 3, pathName1: "법인번호", pathName2: "사업자번호", pathName3: "대표자명", pathName4: "업태", pathName5: "종목", pathName6: "대표전화", pathName7: "사업장주소", pathName8: "설립년도", pathName9: "사업장 정식명칭", pathName10: "유형", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
243 | + // 국세청전자(세금)계산서 수정사유코드 | |
244 | + { id: 4, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
245 | + // 은행코드 | |
246 | + { id: 5, pathName1: "NBS은행코드", pathName2: "어음할인율(%)", pathName3: "할인한도액", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
247 | + // 지급조건 | |
248 | + { id: 6, pathName1: "현금/어음/법인카드", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
249 | + // 어음종류 | |
250 | + { id: 7, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
251 | + // 어음구분 | |
252 | + { id: 8, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
253 | + // 차입종류 | |
254 | + { id: 9, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
255 | + // 원금상환방법 | |
256 | + { id: 10, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
257 | + // 이자납입방법 | |
258 | + { id: 11, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
259 | + // 전표결제진행상태 | |
260 | + { id: 12, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
261 | + // 전표결재진행상태 | |
262 | + { id: 13, pathName1: "계정과목 (,로구분)", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
263 | + // 국책과제 카드 | |
264 | + { id: 14, pathName1: "프로젝트 코드", pathName2: "사업장구분", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" }, | |
265 | + ] | |
266 | + } | |
267 | + }, | |
268 | + created() { | |
269 | + if (this.codeList.length > 0) { | |
270 | + this.selectedId = this.codeList[0].id; // 첫 번째 항목의 id를 선택합니다. | |
271 | + } | |
272 | + }, | |
273 | + methods: { | |
274 | + clickCodeName(id) { | |
275 | + console.log(id); | |
276 | + this.activeItemId = id; | |
277 | + this.selectedId = id; | |
278 | + console.log(`ID: ${this.activeItemId}`); | |
279 | + } | |
280 | + }, | |
281 | + watch: { | |
282 | + | |
283 | + }, | |
284 | + computed: { | |
285 | + filteredCodeBox() { | |
286 | + return this.codeBox.filter(codeInput => this.activeItemId === codeInput.id); | |
287 | + }, | |
288 | + | |
289 | + }, | |
290 | + mounted() { | |
291 | + console.log('Main mounted'); | |
292 | + } | |
293 | +} | |
294 | +</script> | |
295 | + | |
296 | +<style scoped> | |
297 | +.wrap { | |
298 | + width: 100%; | |
299 | + height: 100%; | |
300 | +} | |
301 | + | |
302 | +.content-wrap { | |
303 | + padding-left: 30px; | |
304 | + gap: 30px; | |
305 | +} | |
306 | + | |
307 | +.container { | |
308 | + width: 100%; | |
309 | + height: 100%; | |
310 | + flex-wrap: nowrap; | |
311 | +} | |
312 | + | |
313 | + | |
314 | +td, | |
315 | +th { | |
316 | + padding: 5px 0; | |
317 | + text-align: center; | |
318 | + cursor: pointer; | |
319 | +} | |
320 | + | |
321 | +.table-border td, | |
322 | +.table-border th, | |
323 | +.table-header th { | |
324 | + border-bottom: 1px solid var(--borderlightgray); | |
325 | + border-right: 1px solid var(--borderlightgray); | |
326 | + | |
327 | +} | |
328 | + | |
329 | +.list-table th { | |
330 | + color: var(--navbarblue); | |
331 | +} | |
332 | + | |
333 | +.filter-table th { | |
334 | + text-align: left; | |
335 | +} | |
336 | + | |
337 | +.wrap-text { | |
338 | + word-break: keep-all; | |
339 | +} | |
340 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi002.vue
... | ... | @@ -0,0 +1,426 @@ |
1 | +<template> | |
2 | + <div class="gd-10 Bi002-page container"> | |
3 | + <div class="wrap pd2 flex-column"> | |
4 | + <div class="wrap-title pb1 mb1 flex justify-between"> | |
5 | + <h1>거래처 정보 등록</h1> | |
6 | + <div class="flex justify-end gd-5"> | |
7 | + | |
8 | + <div class="flex justify-between button-wrap"> | |
9 | + <button class="rest-btn">초기화</button> | |
10 | + <button class="save-btn">저장</button> | |
11 | + <button class="del-btn">삭제</button> | |
12 | + </div> | |
13 | + | |
14 | + </div> | |
15 | + </div> | |
16 | + <div class="content flex-column"> | |
17 | + <div class="row"> | |
18 | + <div class="content-title flex justify-between mb1"> | |
19 | + 조회조건 | |
20 | + </div> | |
21 | + <div class="flex justify-between pb1" style="border-bottom: 2px solid var(--bordergray);"> | |
22 | + | |
23 | + <div class="flex justify-start box-wrap gd-10"> | |
24 | + | |
25 | + <div class="flex mr5"> | |
26 | + <div> | |
27 | + <p class="blue-text">사업장</p> | |
28 | + </div> | |
29 | + <select name="" id="" style="width: 150px;"> | |
30 | + <option value="본점">본점(제지)</option> | |
31 | + <option value="본점(포장)">본점(포장)</option> | |
32 | + <option value="에너지솔루션(주)">에너지솔루션(주)</option> | |
33 | + </select> | |
34 | + </div> | |
35 | + </div> | |
36 | + <div class="flex align-center"> | |
37 | + <button class="blue-btn">조회</button> | |
38 | + </div> | |
39 | + | |
40 | + | |
41 | + </div> | |
42 | + </div> | |
43 | + </div> | |
44 | + <div class="gd-12 flex"> | |
45 | + | |
46 | + <div class="gd-5" style="width: 100%; height: 100px;"> | |
47 | + <div class="content-title flex justify-between pt2 pb2"> | |
48 | + 거래처 정보 | |
49 | + </div> | |
50 | + <div style="border-bottom: 2px solid var(--borderlightgray);"> | |
51 | + <table class="list-table"> | |
52 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
53 | + <colgroup> | |
54 | + <col style="width: 10%;"> | |
55 | + <col style="width: 20%;"> | |
56 | + <col style="width: 20%;"> | |
57 | + <col style="width: 5%;"> | |
58 | + <col style="width: 5%;"> | |
59 | + <col style="width: 5%;"> | |
60 | + <col style="width: 5%;"> | |
61 | + <col style="width: 5%;"> | |
62 | + <col style="width: 5%;"> | |
63 | + <col style="width: 5%;"> | |
64 | + <col style="width: 5%;"> | |
65 | + | |
66 | + </colgroup> | |
67 | + <thead> | |
68 | + <tr class="table-header"> | |
69 | + <th>코드</th> | |
70 | + <th>거래처명</th> | |
71 | + <th>사업자번호</th> | |
72 | + <th>매입</th> | |
73 | + <th>매출</th> | |
74 | + <th>회계</th> | |
75 | + <th>영업</th> | |
76 | + <th>원자재</th> | |
77 | + <th>부자재</th> | |
78 | + <th>폐기물</th> | |
79 | + <th>약품</th> | |
80 | + | |
81 | + </tr> | |
82 | + </thead> | |
83 | + <tbody class="table-border"> | |
84 | + <tr v-for="(codeNum) in codeList" key="codeNum.id"> | |
85 | + <td>{{ codeNum.pathNum }}</td> | |
86 | + <td>{{ codeNum.pathName }}</td> | |
87 | + <td>{{ codeNum.businessNum }}</td> | |
88 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
89 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
90 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
91 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
92 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
93 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
94 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
95 | + <td><input type="checkbox" class="ui-checkbox"></td> | |
96 | + </tr> | |
97 | + </tbody> | |
98 | + </table> | |
99 | + </div> | |
100 | + <div class="flex justify-end"> | |
101 | + <button>거래처 찾기</button> | |
102 | + </div> | |
103 | + </div> | |
104 | + <div class="gd-7 flex-column" style="padding-left: 30px;"> | |
105 | + <div class="content-title flex justify-between "> | |
106 | + 거래처 등록 | |
107 | + </div> | |
108 | + <div class=" flex section-wrap pd3" style="gap: 30px;"> | |
109 | + <table class="Bi002-table flex"> | |
110 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
111 | + <colgroup> | |
112 | + <col style="width: 15%;"> | |
113 | + <col style="width: 15%;"> | |
114 | + <col style="width: 15%;"> | |
115 | + <col style="width: 15%;"> | |
116 | + <col style="width: 15%;"> | |
117 | + | |
118 | + | |
119 | + | |
120 | + </colgroup> | |
121 | + <tbody> | |
122 | + <tr> | |
123 | + <th>코드</th> | |
124 | + <td><input type="text" name="" id=""></td> | |
125 | + <td><button>거래처복사</button></td> | |
126 | + </tr> | |
127 | + <tr> | |
128 | + <th>거래처명</th> | |
129 | + <td><input type="text" name="" id=""></td> | |
130 | + <th>약칭명</th> | |
131 | + <td><input type="text" name="" id=""></td> | |
132 | + </tr> | |
133 | + <tr> | |
134 | + <th>사업자번호</th> | |
135 | + <td class="input-box flex"> | |
136 | + <input type="text" name="" id=""> | |
137 | + <input type="text" name="" id=""> | |
138 | + </td> | |
139 | + <th>종사업자번호</th> | |
140 | + <td class="input-box flex"> | |
141 | + <input type="text" name="" id=""> | |
142 | + <input type="text" name="" id=""> | |
143 | + </td> | |
144 | + </tr> | |
145 | + <tr> | |
146 | + <th>법인/주민번호</th> | |
147 | + <td class="flex input-box"> | |
148 | + <input type="text" name="" id=""> | |
149 | + <input type="text" name="" id=""> | |
150 | + </td> | |
151 | + <th>세금계산서종류</th> | |
152 | + <td class="flex input-box"> | |
153 | + <select name="" id=""> | |
154 | + <option value="">전자세금계산서</option> | |
155 | + <option value="">종이세금계산서</option> | |
156 | + <option value="">기타</option> | |
157 | + </select> | |
158 | + <input type="text" name="" id=""> | |
159 | + </td> | |
160 | + </tr> | |
161 | + <tr> | |
162 | + <th>대표자명</th> | |
163 | + <td class=" input-box flex"> | |
164 | + <input type="text" name="" id=""> | |
165 | + <!-- <input type="text" name="" id=""> --> | |
166 | + </td> | |
167 | + <th>홈페이지</th> | |
168 | + <td> | |
169 | + <input type="text" name="" id=""> | |
170 | + </td> | |
171 | + </tr> | |
172 | + <tr> | |
173 | + <th>업태</th> | |
174 | + <td class=" input-box flex"> | |
175 | + <input type="text" name="" id=""> | |
176 | + </td> | |
177 | + <th>종목</th> | |
178 | + <td> | |
179 | + <input type="text" name="" id=""> | |
180 | + </td> | |
181 | + </tr> | |
182 | + <tr class="address-row"> | |
183 | + <th>사업장주소</th> | |
184 | + <th> | |
185 | + <input type="text" name="" id=""> | |
186 | + <button>검색</button> | |
187 | + </th> | |
188 | + <td colspan="3"> | |
189 | + <input type="text" name="" id=""> | |
190 | + | |
191 | + </td> | |
192 | + | |
193 | + | |
194 | + </tr> | |
195 | + <tr> | |
196 | + | |
197 | + <th>전화번호</th> | |
198 | + <td class="input-box flex"> | |
199 | + <input type="text" name="" id=""> | |
200 | + <input type="text" name="" id=""> | |
201 | + </td> | |
202 | + | |
203 | + <th>팩스번호</th> | |
204 | + <td class="input-box flex"> | |
205 | + <input type="text" name="" id=""> | |
206 | + <input type="text" name="" id=""> | |
207 | + </td> | |
208 | + </tr> | |
209 | + <tr> | |
210 | + <th>사업자구분</th> | |
211 | + <td class="flex"> | |
212 | + <select name="" id=""> | |
213 | + <option value="">법인</option> | |
214 | + <option value="">개인</option> | |
215 | + </select> | |
216 | + </td> | |
217 | + <th>해외여부</th> | |
218 | + <td class="input-box flex"> | |
219 | + <select name="" id=""> | |
220 | + <option value="">국내</option> | |
221 | + <option value="">해외</option> | |
222 | + </select> | |
223 | + <input type="text" name="" id=""> | |
224 | + </td> | |
225 | + </tr> | |
226 | + <tr> | |
227 | + <th>과세구분</th> | |
228 | + <td class="flex"> | |
229 | + <select name="" id=""> | |
230 | + <option value="">과세</option> | |
231 | + <option value="">면세</option> | |
232 | + </select> | |
233 | + </td> | |
234 | + <th>거래코드</th> | |
235 | + <td class="input-box flex"> | |
236 | + <select name="" id=""> | |
237 | + <option value="">내수</option> | |
238 | + <option value="">Local</option> | |
239 | + <option value="">직수출</option> | |
240 | + </select> | |
241 | + <input type="text" name="" id=""> | |
242 | + </td> | |
243 | + </tr> | |
244 | + <tr> | |
245 | + <th>특수관계자</th> | |
246 | + <td> | |
247 | + <select name="" id=""> | |
248 | + <option value="">일반</option> | |
249 | + </select> | |
250 | + </td> | |
251 | + <th>계약기간</th> | |
252 | + <td class="input-box flex"> | |
253 | + <input class=" mr1" type="date" id="date" value="2024-03-04">~ | |
254 | + <input class=" mr1" type="date" id="date" value="2024-03-04"> | |
255 | + | |
256 | + </td> | |
257 | + </tr> | |
258 | + <tr> | |
259 | + <th>담당자1</th> | |
260 | + <td class="input-box flex"> | |
261 | + <input type="text" name="" id=""> | |
262 | + <input type="text" name="" id=""> | |
263 | + </td> | |
264 | + <th>담당자2</th> | |
265 | + <td class="input-box flex"> | |
266 | + <input type="text" name="" id=""> | |
267 | + <input type="text" name="" id=""> | |
268 | + </td> | |
269 | + </tr> | |
270 | + <tr> | |
271 | + <th>모바일번호1</th> | |
272 | + <td class="input-box flex"> | |
273 | + <input type="text" name="" id=""> | |
274 | + <input type="text" name="" id=""> | |
275 | + </td> | |
276 | + <th>모바일번호2</th> | |
277 | + <td class="input-box flex"> | |
278 | + <input type="text" name="" id=""> | |
279 | + <input type="text" name="" id=""> | |
280 | + </td> | |
281 | + </tr> | |
282 | + <tr> | |
283 | + <th>이메일1</th> | |
284 | + <td> | |
285 | + <input type="text" name="" id=""> | |
286 | + </td> | |
287 | + <th>이메일2</th> | |
288 | + <td> | |
289 | + <input type="text" name="" id=""> | |
290 | + </td> | |
291 | + </tr> | |
292 | + <tr> | |
293 | + <th>거래여부</th> | |
294 | + <td> | |
295 | + <input type="checkbox" name="" id="a"> | |
296 | + <label for="a">거래</label> | |
297 | + <input type="checkbox" name="" id="b"> | |
298 | + <label for="b">중지</label> | |
299 | + </td> | |
300 | + <th>지급조건</th> | |
301 | + <td> | |
302 | + <select name="" id=""> | |
303 | + <option value="">현금 1개월</option> | |
304 | + <option value="">현금 2개월</option> | |
305 | + <option value="">현금 3개월</option> | |
306 | + <option value="">현금 중간결제</option> | |
307 | + <option value="">현금 매월25일</option> | |
308 | + <option value="">현금 매월27일</option> | |
309 | + <option value="">현금 매월말일</option> | |
310 | + <option value="">어음 1개월 초</option> | |
311 | + <option value="">어음 1개월 중</option> | |
312 | + <option value="">어음 1개월 말</option> | |
313 | + <option value="">어음 2개월 초</option> | |
314 | + <option value="">어음 2개월 중</option> | |
315 | + <option value="">어음 2개월 말</option> | |
316 | + <option value="">어음 3개월 초</option> | |
317 | + <option value="">어음 3개월 중</option> | |
318 | + <option value="">어음 3개월 말</option> | |
319 | + <option value="">법인카드</option> | |
320 | + </select> | |
321 | + </td> | |
322 | + </tr> | |
323 | + <tr> | |
324 | + <th>거래구분</th> | |
325 | + <td> | |
326 | + <input type="checkbox" name="" id="a"> | |
327 | + <label for="a">매입</label> | |
328 | + <input type="checkbox" name="" id="b"> | |
329 | + <label for="b">매출</label> | |
330 | + </td> | |
331 | + <td colspan="6"> | |
332 | + <input type="text"> | |
333 | + </td> | |
334 | + </tr> | |
335 | + <tr> | |
336 | + <th>사용처</th> | |
337 | + <th colspan="6"> | |
338 | + <input type="checkbox" name="" id="c"> | |
339 | + <label for="c">회계</label> | |
340 | + <input type="checkbox" name="" id="c"> | |
341 | + <label for="c">영업</label> | |
342 | + <input type="checkbox" name="" id="c"> | |
343 | + <label for="c">원자재</label> | |
344 | + <input type="checkbox" name="" id="c"> | |
345 | + <label for="c">부자재</label> | |
346 | + <input type="checkbox" name="" id="c"> | |
347 | + <label for="c">폐기물</label> | |
348 | + <input type="checkbox" name="" id="c"> | |
349 | + <label for="c">약품</label> | |
350 | + </th> | |
351 | + </tr> | |
352 | + </tbody> | |
353 | + </table> | |
354 | + | |
355 | + </div> | |
356 | + <div class=" flex section-wrap pd3" style="gap: 30px; background-color: "> | |
357 | + <table class="list-table"> | |
358 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
359 | + <colgroup> | |
360 | + <col style="width: ;"> | |
361 | + <col style="width: ;"> | |
362 | + <col style="width: ;"> | |
363 | + <col style="width: ;"> | |
364 | + </colgroup> | |
365 | + <thead> | |
366 | + <tr class="table-header"> | |
367 | + <th>No</th> | |
368 | + <th>user ID</th> | |
369 | + <th>이름</th> | |
370 | + <th>생년월일</th> | |
371 | + <th>성별</th> | |
372 | + </tr> | |
373 | + </thead> | |
374 | + <tbody> | |
375 | + <tr> | |
376 | + <td>1</td> | |
377 | + <td>test123</td> | |
378 | + <td>홍길동</td> | |
379 | + <td>1999.01.01</td> | |
380 | + <td>여</td> | |
381 | + </tr> | |
382 | + <tr> | |
383 | + <td>1</td> | |
384 | + <td>test123</td> | |
385 | + <td>홍길동</td> | |
386 | + <td>1999.01.01</td> | |
387 | + <td>여</td> | |
388 | + </tr> | |
389 | + <tr v-if="postList === 0"> | |
390 | + <td colspan="5" class="no-list">검색조건에 해당하는 데이터가 없습니다.</td> | |
391 | + </tr> | |
392 | + </tbody> | |
393 | + </table> | |
394 | + </div> | |
395 | + </div> | |
396 | + </div> | |
397 | + </div> | |
398 | + </div> | |
399 | + | |
400 | +</template> | |
401 | + | |
402 | +<script> | |
403 | +export default { | |
404 | + data() { | |
405 | + return { | |
406 | + codeList: [ | |
407 | + { pathNum: "01001", pathName: "원자재거래처 테스트", businessNum: "123-45-67890", } | |
408 | + ] | |
409 | + } | |
410 | + }, | |
411 | + methods: { | |
412 | + | |
413 | + }, | |
414 | + watch: { | |
415 | + | |
416 | + }, | |
417 | + computed: { | |
418 | + | |
419 | + }, | |
420 | + mounted() { | |
421 | + console.log('Main mounted'); | |
422 | + } | |
423 | +} | |
424 | +</script> | |
425 | + | |
426 | +<style></style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi003.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi004.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi005.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi006.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi007.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/ChitManagement/Cm001.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AccountingManagement/ChitManagement/Cm002.vue
... | ... | @@ -0,0 +1,489 @@ |
1 | +<template> | |
2 | + <div class="gd-10 Bi001-page container"> | |
3 | + <div class="wrap pd2 flex-column"> | |
4 | + <div class="wrap-title pb1 mb1 flex justify-between"> | |
5 | + <h1>전표 작성(일반)</h1> | |
6 | + <div class="flex justify-end gd-5"> | |
7 | + | |
8 | + <div class="flex justify-between button-wrap"> | |
9 | + <button class="rest-btn">초기화</button> | |
10 | + <button class="save-btn">저장</button> | |
11 | + <button class="del-btn">삭제</button> | |
12 | + </div> | |
13 | + | |
14 | + </div> | |
15 | + </div> | |
16 | + <div class="content flex-column"> | |
17 | + <div class="row"> | |
18 | + <div class="content-title flex justify-between mb1"> | |
19 | + 조회조건 | |
20 | + </div> | |
21 | + <div class="flex justify-between pb1" style="border-bottom: 2px solid var(--bordergray);"> | |
22 | + | |
23 | + <div class="flex justify-start box-wrap gd-10"> | |
24 | + | |
25 | + <div class="flex mr5"> | |
26 | + <div> | |
27 | + <p class="blue-text">사업장</p> | |
28 | + </div> | |
29 | + <select name="" id="" style="width: 150px;"> | |
30 | + <option value="본점">본점(제지)</option> | |
31 | + <option value="본점(포장)">본점(포장)</option> | |
32 | + <option value="에너지솔루션(주)">에너지솔루션(주)</option> | |
33 | + </select> | |
34 | + </div> | |
35 | + | |
36 | + <div class="flex mr5"> | |
37 | + <div> | |
38 | + <p class="blue-text">발의 일자</p> | |
39 | + </div> | |
40 | + <input type="date" id="date" value="2024-03-04" style="width: 35%;"> | |
41 | + <p class="ml2">~</p> | |
42 | + <input type="date" id="date" value="2024-03-04" style="width: 35%;"> | |
43 | + | |
44 | + </div> | |
45 | + <div class="flex justify-between mr5"> | |
46 | + <div> | |
47 | + <p class="blue-text">발의자</p> | |
48 | + </div> | |
49 | + <div class="flex box-area"> | |
50 | + <select name="" id="" class="flex30" > | |
51 | + <option value="">박정현(180516)</option> | |
52 | + <option value="">권문기(210702)</option> | |
53 | + <option value="">김황석(200702)</option> | |
54 | + </select> | |
55 | + </div> | |
56 | + </div> | |
57 | + </div> | |
58 | + <div class="flex align-center"> | |
59 | + <button class="blue-btn">조회</button> | |
60 | + </div> | |
61 | + | |
62 | + | |
63 | + </div> | |
64 | + </div> | |
65 | + | |
66 | + <div style="background-color: var(--tableblue); border-radius: 10px;" | |
67 | + class="content-wrap pt1 pb1 mt1 mb1"> | |
68 | + | |
69 | + <table class="form-table2 code-area"> | |
70 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
71 | + <colgroup> | |
72 | + <col style="width: 4%;"> | |
73 | + <col style="width: 15%;"> | |
74 | + <col style="width: 5%;"> | |
75 | + <col style="width: 15%;"> | |
76 | + <col style="width: 5%;"> | |
77 | + </colgroup> | |
78 | + <tbody> | |
79 | + <tr class=""> | |
80 | + <th colspan="1" class="blue-text">발의 일자</th> | |
81 | + <td colspan="2"> | |
82 | + <input class=" mr1" type="date" id="date" value="2024-03-04">~ | |
83 | + <input class="content-w30 input-gray" type="text" id="date" placeholder="0012"> | |
84 | + </td> | |
85 | + | |
86 | + <td colspan="4" class="button-wrap"> | |
87 | + <button class="">신규발의번호부여</button> | |
88 | + <button class="">상세내역초기화</button> | |
89 | + <button class="" @click="openModal">수입결제전표만들기</button> | |
90 | + </td> | |
91 | + <td class="button-wrap"> | |
92 | + </td> | |
93 | + | |
94 | + | |
95 | + | |
96 | + | |
97 | + </tr> | |
98 | + | |
99 | + <tr class="content-area"> | |
100 | + <th class="blue-text">발의 부서</th> | |
101 | + <td> | |
102 | + <input class="content-w30 input-gray mr1" type="text" id="date" | |
103 | + placeholder="103000"> | |
104 | + <input class="content-w60 input-gray" type="text" id="date" placeholder="IT팀"> | |
105 | + </td> | |
106 | + <th class="blue-text">발의자</th> | |
107 | + <td> | |
108 | + <input class="content-w30 input-gray mr1" type="text" id="date" | |
109 | + placeholder="180516"> | |
110 | + <input class="content-w60 input-gray" type="text" id="date" placeholder="박정현"> | |
111 | + </td> | |
112 | + | |
113 | + <th class="blue-text">차변합계</th> | |
114 | + <td> | |
115 | + <input class="input-gray content-w40" type="text" id="date" placeholder=""> | |
116 | + </td> | |
117 | + | |
118 | + <th class="blue-text">대변합계</th> | |
119 | + <td> | |
120 | + <input class="input-gray" type="text" id="date" placeholder=""> | |
121 | + </td> | |
122 | + <th class="blue-text">차액</th> | |
123 | + <td> | |
124 | + <input class="input-gray" type="text" id="date" placeholder=""> | |
125 | + </td> | |
126 | + | |
127 | + | |
128 | + </tr> | |
129 | + | |
130 | + | |
131 | + </tbody> | |
132 | + </table> | |
133 | + </div> | |
134 | + <div class="flex" style="gap: 15px; height: 100% ; flex-wrap: nowrap;"> | |
135 | + <div class="gd-3 pd1 table-area"> | |
136 | + <div class="content-title flex justify-between mb1"> | |
137 | + 전표목록 | |
138 | + </div> | |
139 | + | |
140 | + <div class="box-overflow"> | |
141 | + | |
142 | + <table class="list-table"> | |
143 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
144 | + <colgroup> | |
145 | + <col style="width: 10%;"> | |
146 | + <col style="width: 15%;"> | |
147 | + <col style="width: 20%;"> | |
148 | + <col style="width: 10%;"> | |
149 | + <col style="width: 10%;"> | |
150 | + | |
151 | + </colgroup> | |
152 | + <thead> | |
153 | + <tr class="table-header" | |
154 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
155 | + <th>선택</th> | |
156 | + <th>발의번호</th> | |
157 | + <th>전송일시</th> | |
158 | + <th>상태</th> | |
159 | + <th>자동</th> | |
160 | + <th>G/W</th> | |
161 | + </tr> | |
162 | + </thead> | |
163 | + <tbody> | |
164 | + <tr class="table-border"> | |
165 | + <td><input type="checkbox"></td> | |
166 | + <td></td> | |
167 | + <td></td> | |
168 | + <td></td> | |
169 | + <td></td> | |
170 | + <td></td> | |
171 | + </tr> | |
172 | + | |
173 | + | |
174 | + </tbody> | |
175 | + </table> | |
176 | + </div> | |
177 | + <div class="button-wrap flex justify-end mb2"> | |
178 | + <button>전표 전송</button> | |
179 | + <button style="border: 1px solid var(--red); color: var(--red);">전표 취소</button> | |
180 | + <button>G/W 전송</button> | |
181 | + </div> | |
182 | + </div> | |
183 | + <div class=" pd1 table-area content-wrap" style="width: 80%;"> | |
184 | + <div class="content-title flex justify-between mb1"> | |
185 | + 전표등록 | |
186 | + </div> | |
187 | + <div class="box-overflow "> | |
188 | + | |
189 | + <table class="list-table" > | |
190 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
191 | + <colgroup> | |
192 | + <col style="width: 10%;"> | |
193 | + <col style="width: 10%;"> | |
194 | + <col style="width: 10%;"> | |
195 | + <col style="width: 10%;"> | |
196 | + <col style="width: 10%;"> | |
197 | + <col style="width: 10%;"> | |
198 | + <col style="width: 10%;"> | |
199 | + <col style="width: 10%;"> | |
200 | + <col style="width: 10%;"> | |
201 | + </colgroup> | |
202 | + | |
203 | + | |
204 | + <thead style="width: 100%;"> | |
205 | + <tr class="table-header table-border" | |
206 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
207 | + <th rowspan="2">순번</th> | |
208 | + <th rowspan="2">계정과목</th> | |
209 | + <th>관리항목1</th> | |
210 | + <th>관리일자1</th> | |
211 | + <th>증빙</th> | |
212 | + <th>참고항목</th> | |
213 | + <th>환율</th> | |
214 | + <th rowspan="2">차변금액</th> | |
215 | + <th rowspan="2">대변금액</th> | |
216 | + <th rowspan="2">적요</th> | |
217 | + </tr> | |
218 | + | |
219 | + <tr class="table-header table-border" | |
220 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
221 | + <th>관리항목2</th> | |
222 | + <th>관리일자2</th> | |
223 | + <th>비용부서</th> | |
224 | + <th>공급가액</th> | |
225 | + <th>외화금액($)</th> | |
226 | + </tr> | |
227 | + </thead> | |
228 | + <tbody class="box-overflow "> | |
229 | + | |
230 | + | |
231 | + <template v-for="(listNam, index) in listNam"> | |
232 | + <tr class="table-header table-border"> | |
233 | + <td rowspan="2">{{ listNam.no }}</td> | |
234 | + <td rowspan="2">{{ listNam.name }}</td> | |
235 | + <td>{{ listNam.list1 }}</td> | |
236 | + <td>{{ listNam.list2 }}</td> | |
237 | + <td>{{ listNam.list3 }}</td> | |
238 | + <td>{{ listNam.list4 }}</td> | |
239 | + <td>{{ listNam.list5 }}</td> | |
240 | + <td rowspan="2">{{ listNam.list6 }}</td> | |
241 | + <td rowspan="2">{{ listNam.list7 }}</td> | |
242 | + <td rowspan="2">{{ listNam.list8 }}</td> | |
243 | + </tr> | |
244 | + <tr class="table-header table-border"> | |
245 | + <td>{{ listNam.list9 }}</td> | |
246 | + <td>{{ listNam.list10 }}</td> | |
247 | + <td>{{ listNam.list11 }}</td> | |
248 | + <td>{{ listNam.list12 }}</td> | |
249 | + <td>{{ listNam.list13 }}</td> | |
250 | + </tr> | |
251 | + </template> | |
252 | + | |
253 | + | |
254 | + </tbody> | |
255 | + </table> | |
256 | + </div> | |
257 | + </div> | |
258 | + | |
259 | + </div> | |
260 | + </div> | |
261 | + | |
262 | + </div> | |
263 | + <!-- button 모달 --> | |
264 | + <div v-show="isModalOpen" class="modal-wrapper"> | |
265 | + <div class="modal-container flex flex-column"> | |
266 | + <div> | |
267 | + <div class="modal-title mb2"> | |
268 | + <div class="flex justify-between"> | |
269 | + <h2>수입결제전표만들기</h2> | |
270 | + <button class="close-btn " @click="closeModal"></button> | |
271 | + </div> | |
272 | + </div> | |
273 | + <div class="flex button-wrap "> | |
274 | + <p class="blue-text">조회조건</p> | |
275 | + <input type="date" id="date"> | |
276 | + <p class="ml2">~</p> | |
277 | + <input type="date" id="date"> | |
278 | + <button>조회</button> | |
279 | + </div> | |
280 | + <div class="modal-content-monthly "> | |
281 | + <div> | |
282 | + <p style="text-align: left; " class="blue-text"> 외화거래목록</p> | |
283 | + </div> | |
284 | + <div class="table-zone table-scroll"> | |
285 | + <table class="list-table"> | |
286 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
287 | + <colgroup> | |
288 | + <col style="width: 10%;"> | |
289 | + <col style="width: 10%;"> | |
290 | + <col style="width: 10%;"> | |
291 | + <col style="width: 10%;"> | |
292 | + <col style="width: 10%;"> | |
293 | + </colgroup> | |
294 | + <thead> | |
295 | + <tr class="table-header table-border " | |
296 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
297 | + <th>금융기관코드</th> | |
298 | + <th>금융기관코드</th> | |
299 | + <th>계좌번호</th> | |
300 | + <th>거래일자</th> | |
301 | + <th>일련번호</th> | |
302 | + <th>적요</th> | |
303 | + <th>통화구분</th> | |
304 | + <th>외화금액</th> | |
305 | + <th>원화금액</th> | |
306 | + </tr> | |
307 | + </thead> | |
308 | + <tbody> | |
309 | + <tr v-for="(modalWrap) in modalList" key="codeNum" style="overflow-y: scroll;"> | |
310 | + <td>{{ modalWrap.code }}</td> | |
311 | + <td>{{ modalWrap.accountNum }}</td> | |
312 | + <td>{{ modalWrap.data }}</td> | |
313 | + <td>{{ modalWrap.pathNum }}</td> | |
314 | + <td>{{ modalWrap.detailName }}</td> | |
315 | + <td>{{ modalWrap.division }}</td> | |
316 | + <td>{{ modalWrap.foreignCurrency }}</td> | |
317 | + <td>{{ modalWrap.KRW }}</td> | |
318 | + </tr> | |
319 | + | |
320 | + </tbody> | |
321 | + </table> | |
322 | + </div> | |
323 | + </div> | |
324 | + <div> | |
325 | + <div class="modal-content-monthly"> | |
326 | + <div class="flex justify-between mb1"> | |
327 | + <div class="flex button-wrap "> | |
328 | + <p style="text-align: left;" class="blue-text">선택내역</p> | |
329 | + <button>임시전표작성</button> | |
330 | + </div> | |
331 | + <div class="flex justify-end"> | |
332 | + <p>차변합계</p> | |
333 | + <input type="text" class="content-w20"> | |
334 | + | |
335 | + <p class="ml1">대변합계</p> | |
336 | + <input type="text" class="content-w20"> | |
337 | + | |
338 | + <p class="ml1">차액</p> | |
339 | + <input type="text" class="content-w20"> | |
340 | + </div> | |
341 | + </div> | |
342 | + <div class="table-zone"> | |
343 | + <table class="list-table"> | |
344 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
345 | + <colgroup> | |
346 | + <col style="width: 10%;"> | |
347 | + <col style="width: 10%;"> | |
348 | + <col style="width: 10%;"> | |
349 | + <col style="width: 10%;"> | |
350 | + <col style="width: 10%;"> | |
351 | + </colgroup> | |
352 | + <thead> | |
353 | + <tr class="table-header table-border" | |
354 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
355 | + <th>순번</th> | |
356 | + <th>계정과목</th> | |
357 | + <th>관리항목1</th> | |
358 | + <th>관리항목2</th> | |
359 | + <th>환율</th> | |
360 | + <th>외화금액($)</th> | |
361 | + <th>차변금액</th> | |
362 | + <th>대변금액</th> | |
363 | + <th>적요</th> | |
364 | + </tr> | |
365 | + </thead> | |
366 | + <tbody> | |
367 | + <tr> | |
368 | + <td></td> | |
369 | + </tr> | |
370 | + | |
371 | + </tbody> | |
372 | + </table> | |
373 | + </div> | |
374 | + </div> | |
375 | + <div> | |
376 | + <div class="flex button-wrap mb1"> | |
377 | + <p style="text-align: left;" class="blue-text">작성내역</p> | |
378 | + <button>자동전표작성</button> | |
379 | + </div> | |
380 | + <div class="table-zone"> | |
381 | + <table class="list-table"> | |
382 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
383 | + <colgroup> | |
384 | + <col style="width: 10%;"> | |
385 | + <col style="width: 10%;"> | |
386 | + <col style="width: 10%;"> | |
387 | + <col style="width: 10%;"> | |
388 | + <col style="width: 10%;"> | |
389 | + </colgroup> | |
390 | + <thead> | |
391 | + <tr class="table-header table-border" | |
392 | + style="background-color: var(--tableblue); color: var(--navbarblue); "> | |
393 | + <th>순번</th> | |
394 | + <th>계정과목</th> | |
395 | + <th>관리항목1</th> | |
396 | + <th>관리항목2</th> | |
397 | + <th>환율</th> | |
398 | + <th>외화금액($)</th> | |
399 | + <th>차변금액</th> | |
400 | + <th>대변금액</th> | |
401 | + <th>적요</th> | |
402 | + </tr> | |
403 | + </thead> | |
404 | + <tbody> | |
405 | + <tr> | |
406 | + <td></td> | |
407 | + </tr> | |
408 | + | |
409 | + </tbody> | |
410 | + </table> | |
411 | + </div> | |
412 | + </div> | |
413 | + </div> | |
414 | + </div> | |
415 | + | |
416 | + </div> | |
417 | + </div> | |
418 | + </div> | |
419 | +</template> | |
420 | + | |
421 | +<script> | |
422 | + | |
423 | +export default { | |
424 | + | |
425 | + data() { | |
426 | + return { | |
427 | + isModalOpen: false, | |
428 | + openModal: false, | |
429 | + modalList: [ | |
430 | + { | |
431 | + code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금", | |
432 | + division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000" | |
433 | + }, | |
434 | + { | |
435 | + code: "003", accountNum: "6380000795600017", data: "2023-02-27", pathNum: "401", detailName: "외화송금출금", | |
436 | + division: "USD", foreignCurrency: "10,995,00", KRW: "13,641,141" | |
437 | + }, | |
438 | + { | |
439 | + code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금", | |
440 | + division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000" | |
441 | + }, | |
442 | + { | |
443 | + code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금", | |
444 | + division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000" | |
445 | + }, | |
446 | + { | |
447 | + code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금", | |
448 | + division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000" | |
449 | + }, | |
450 | + ], | |
451 | + listNam: [ | |
452 | + { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" }, | |
453 | + { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" }, | |
454 | + { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" }, | |
455 | + { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" }, | |
456 | + { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" }, | |
457 | + { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" }, | |
458 | + | |
459 | + | |
460 | + ] | |
461 | + } | |
462 | + }, | |
463 | + methods: { | |
464 | + openModal() { | |
465 | + this.isModalOpen = true; | |
466 | + }, | |
467 | + closeModal() { | |
468 | + this.isModalOpen = false; | |
469 | + | |
470 | + } | |
471 | + }, | |
472 | + watch: { | |
473 | + | |
474 | + }, | |
475 | + computed: { | |
476 | + | |
477 | + }, | |
478 | + components: { | |
479 | + }, | |
480 | + mounted() { | |
481 | + } | |
482 | +} | |
483 | +</script> | |
484 | + | |
485 | +<style scoped> | |
486 | + | |
487 | + | |
488 | + | |
489 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/App.vue
... | ... | @@ -0,0 +1,61 @@ |
1 | +<template> | |
2 | + <div class="flex-column layout-wrap" > | |
3 | + <!-- <Header></Header> --> | |
4 | + <Menu @itemSelected="handleItemSelected"></Menu> | |
5 | + <div class="wrapper flex" :class="loginUser != null ? 'main' : 'login'"> | |
6 | + <SideMenu :selectedId="selectedId" class="gd-2"></SideMenu> | |
7 | + <router-view/> | |
8 | + </div> | |
9 | + </div> | |
10 | +</template> | |
11 | + | |
12 | +<script> | |
13 | +import Header from '../pages/layout/Header.vue'; | |
14 | +import Menu from '../pages/layout/Menu.vue'; | |
15 | +import SideMenu from '../pages/layout/sideMenu.vue'; | |
16 | +import axios from 'axios'; | |
17 | + | |
18 | +const App = { | |
19 | + data: () => { | |
20 | + return { | |
21 | + selectedId: true, | |
22 | + SideMenu: true, | |
23 | + // store: store, | |
24 | + loginUser: null | |
25 | + } | |
26 | + }, | |
27 | + methods: { | |
28 | + handleItemSelected(id) { | |
29 | + this.selectedId = id; | |
30 | + }, | |
31 | + async fetchUser() { | |
32 | + try { | |
33 | + const response = await axios.get('/api/user'); | |
34 | + this.loginUser = response.data; | |
35 | + } catch (error) { | |
36 | + console.error('Error fetching user:', error); | |
37 | + } | |
38 | + } | |
39 | + }, | |
40 | + watch: { | |
41 | + | |
42 | + }, | |
43 | + computed: { | |
44 | + | |
45 | + }, | |
46 | + components: { | |
47 | + 'Header': Header, | |
48 | + 'Menu': Menu, | |
49 | + 'SideMenu': SideMenu, | |
50 | + }, | |
51 | + mounted() { | |
52 | + console.log('Vue mounted'); | |
53 | + this.fetchUser(); // 로그인 상태 확인 | |
54 | + } | |
55 | +} | |
56 | + | |
57 | +export default App; | |
58 | +</script> | |
59 | +<style> | |
60 | + | |
61 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/AppRouter.js
... | ... | @@ -0,0 +1,43 @@ |
1 | +import { createWebHistory, createRouter } from "vue-router"; | |
2 | + | |
3 | +import Main from "../pages/main/Main.vue"; | |
4 | +import Login from "../pages/login/Login.vue"; | |
5 | + | |
6 | +// 기준정보 BaselinInformation | |
7 | +import Bi001 from "./AccountingManagement/BaselineInformation/Bi001.vue"; | |
8 | +import Bi002 from "./AccountingManagement/BaselineInformation/Bi002.vue"; | |
9 | +import Bi003 from "./AccountingManagement/BaselineInformation/Bi003.vue"; | |
10 | +import Bi004 from "./AccountingManagement/BaselineInformation/Bi004.vue"; | |
11 | +import Bi005 from "./AccountingManagement/BaselineInformation/Bi005.vue"; | |
12 | +import Bi006 from "./AccountingManagement/BaselineInformation/Bi006.vue"; | |
13 | +import Bi007 from "./AccountingManagement/BaselineInformation/Bi007.vue"; | |
14 | +import Cm001 from "./AccountingManagement/ChitManagement/Cm001.vue"; | |
15 | +import Cm002 from "./AccountingManagement/ChitManagement/Cm002.vue"; | |
16 | + | |
17 | + | |
18 | +const routes = [ | |
19 | + /* 메인화면 */ | |
20 | + { path: "/", name: "/", component: Main }, | |
21 | + { path: "/Login.page", name: "Login", component: Login },//로그인 | |
22 | + | |
23 | + // 기준정보 BaselinInformation | |
24 | + { path: "/Bi001.page", name: "Bi001", component: Bi001 }, //(회계)공동코드 등록 | |
25 | + { path: "/Bi002.page", name: "Bi002", component: Bi002 }, //거래처정보 등록 | |
26 | + { path: "/Bi003.page", name: "Bi003", component: Bi003 }, //계정과목 등록 | |
27 | + { path: "/Bi004.page", name: "Bi004", component: Bi004 }, //재무제표 양식 등록 | |
28 | + { path: "/Bi005.page", name: "Bi005", component: Bi005 }, //재무제표 계정설정등록 | |
29 | + { path: "/Bi006.page", name: "Bi006", component: Bi006 }, //은행계좌 등록 | |
30 | + { path: "/Bi007.page", name: "Bi007", component: Bi007 }, //거래처대장 | |
31 | + // 전표관리 | |
32 | + { path: "/Cm001.page", name: "Cm001", component: Cm001 }, //잔액 이월 전표등록 | |
33 | + { path: "/Cm002.page", name: "Cm002", component: Cm002 }, //전표작성(일반) | |
34 | + | |
35 | + | |
36 | +]; | |
37 | + | |
38 | +const AppRouter = createRouter({ | |
39 | + history: createWebHistory(), | |
40 | + routes, | |
41 | +}); | |
42 | + | |
43 | +export default AppRouter; |
+++ client/views/pages/component/Button.vue
... | ... | @@ -0,0 +1,0 @@ |
+++ client/views/pages/component/ModalComponent/AlertModal.vue
... | ... | @@ -0,0 +1,110 @@ |
1 | +<template> | |
2 | + <div v-show="isModalOpen" class="modal-wrapper"> | |
3 | + <div class="modal-container small-modal"> | |
4 | + <div class="modal-title text-ct"> | |
5 | + <h2>{{title}}</h2> | |
6 | + </div> | |
7 | + <div class="modal-content-monthly"> | |
8 | + <p class="alert-write text-ct" v-html="message"> | |
9 | + </p> | |
10 | + </div> | |
11 | + <div class="modal-end flex justify-center"> | |
12 | + <button class="gray-btn large-btn flex50" id="confirmCancle" @click="closeModal" v-show="confirmAt">취소</button> | |
13 | + <button class="blue-btn large-btn flex50" id="confirmOk" @click="closeModal">확인</button> | |
14 | + </div> | |
15 | + </div> | |
16 | + </div> | |
17 | +</template> | |
18 | + | |
19 | +<script> | |
20 | + | |
21 | +export default { | |
22 | + props: { | |
23 | + title : { | |
24 | + type : String, | |
25 | + default : '모달 제목' | |
26 | + }, | |
27 | + message : { | |
28 | + type : String, | |
29 | + default : '경고 메세지를 입력해주세요. <br /> 삭제,수정,추가 등등' | |
30 | + }, | |
31 | + }, | |
32 | + data() { | |
33 | + return { | |
34 | + isModalOpen: false, | |
35 | + activeTab: 'tab1', | |
36 | + modalType: 'tab-modal', | |
37 | + title : this.title, | |
38 | + message : this.message, | |
39 | + confirmAt : false | |
40 | + } | |
41 | + }, | |
42 | + methods: { | |
43 | + // 탭 변경 | |
44 | + showTab: function (tabName) { | |
45 | + this.activeTab = tabName; | |
46 | + }, | |
47 | + | |
48 | + // 닫기 | |
49 | + closeModal:function(){ | |
50 | + this.isModalOpen = false; | |
51 | + }, | |
52 | + | |
53 | + // 모달 호출 | |
54 | + showModal : function(){ | |
55 | + | |
56 | + this.confirmAt = false; | |
57 | + this.isModalOpen = true; | |
58 | + document.getElementById("confirmOk").focus() | |
59 | + }, | |
60 | + | |
61 | + // confirm 호출 | |
62 | + showConfirm : async function(){ | |
63 | + this.confirmAt = true; | |
64 | + this.isModalOpen = true; | |
65 | + document.getElementById("confirmOk").focus() | |
66 | + const promise = new Promise((resolve, reject) => { | |
67 | + document.getElementById("confirmCancle").addEventListener("click", async () => { | |
68 | + resolve('cancle') | |
69 | + }); | |
70 | + | |
71 | + document.getElementById("confirmOk").addEventListener("click", async () => { | |
72 | + resolve('ok') | |
73 | + }); | |
74 | + }); | |
75 | + | |
76 | + return promise.then( | |
77 | + (id) => { | |
78 | + if(id == 'cancle'){ | |
79 | + return false; | |
80 | + }else if(id =='ok'){ | |
81 | + return true; | |
82 | + } | |
83 | + | |
84 | + } | |
85 | + ); | |
86 | + }, | |
87 | + | |
88 | + setTitle : function(Title){ | |
89 | + this.title = Title; | |
90 | + }, | |
91 | + | |
92 | + setMessage : function(message){ | |
93 | + this.message = message; | |
94 | + }, | |
95 | + | |
96 | + }, | |
97 | + watch: { | |
98 | + | |
99 | + }, | |
100 | + computed: { | |
101 | + | |
102 | + }, | |
103 | + components: { | |
104 | + | |
105 | + }, | |
106 | + mounted() { | |
107 | + console.log('main mounted'); | |
108 | + } | |
109 | +} | |
110 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/component/ModalComponent/FormModal.vue
... | ... | @@ -0,0 +1,174 @@ |
1 | +<template> | |
2 | + <div v-show="isModalOpen" class="modal-wrapper"> | |
3 | + <div class="modal-container"> | |
4 | + <div class="modal-title"> | |
5 | + <div class="flex justify-between align-center"> | |
6 | + <h2>모달 제목</h2> | |
7 | + <button class="close-btn" @click="closeModal"><svg-icon type="mdi" :width="20" :height="20" :path="closePath"></svg-icon></button> | |
8 | + </div> | |
9 | + </div> | |
10 | + <div class="modal-content-monthly" v-show="modalType == 'tab-modal'"> | |
11 | + <ul class="tab-nav flex justify-between"> | |
12 | + <li @click="showTab('tab1')" class="flex50"><a href="#tab01" | |
13 | + :class="{ activeTab: activeTab === 'tab1' }">탭정보1</a></li> | |
14 | + <li @click="showTab('tab2')" class="flex50"><a href="#tab02" | |
15 | + :class="{ activeTab: activeTab === 'tab2' }">탭정보2</a></li> | |
16 | + </ul> | |
17 | + <ul class="tab-content"> | |
18 | + <li id="tab01" v-show="activeTab === 'tab1'"> | |
19 | + <table class="form-table"> | |
20 | + <colgroup> | |
21 | + <col style="width: 15%;" /> | |
22 | + <col style="width: 85%;" /> | |
23 | + </colgroup> | |
24 | + <tbody> | |
25 | + <tr> | |
26 | + <th>파일명</th> | |
27 | + <td></td> | |
28 | + </tr> | |
29 | + <tr> | |
30 | + <th>API URL</th> | |
31 | + <td></td> | |
32 | + </tr> | |
33 | + <tr> | |
34 | + <th>결과타입</th> | |
35 | + <td> | |
36 | + <input type="radio" name="result-type" id="json" class="chekck-type" checked> | |
37 | + <label for="json" class="chekcktype-label"> | |
38 | + json | |
39 | + </label> | |
40 | + <input type="radio" name="result-type" id="xml" class="chekck-type"> | |
41 | + <label for="xml" class="chekcktype-label"> | |
42 | + xml | |
43 | + </label> | |
44 | + </td> | |
45 | + </tr> | |
46 | + </tbody> | |
47 | + </table> | |
48 | + <table class="list-table"> | |
49 | + <thead> | |
50 | + <tr> | |
51 | + <th>No</th> | |
52 | + <th>key</th> | |
53 | + <th>value</th> | |
54 | + <th>예외</th> | |
55 | + <th>날짜</th> | |
56 | + <th>삭제</th> | |
57 | + </tr> | |
58 | + </thead> | |
59 | + <tbody> | |
60 | + <tr> | |
61 | + <td>1</td> | |
62 | + <td>04:00:00</td> | |
63 | + <td>접속성공</td> | |
64 | + <td>접속성공</td> | |
65 | + <td>접속성공</td> | |
66 | + <td>접속성공</td> | |
67 | + </tr> | |
68 | + </tbody> | |
69 | + </table> | |
70 | + </li> | |
71 | + <li id="tab01" v-show="activeTab === 'tab1'"></li> | |
72 | + </ul> | |
73 | + </div> | |
74 | + <div class="modal-content-monthly" v-show="modalType == 'form-modal'"> | |
75 | + <table class="form-table"> | |
76 | + <colgroup> | |
77 | + <col style="width: 15%;" /> | |
78 | + <col style="width: 85%;" /> | |
79 | + </colgroup> | |
80 | + <tbody> | |
81 | + <tr> | |
82 | + <th>제목</th> | |
83 | + <td></td> | |
84 | + </tr> | |
85 | + <tr> | |
86 | + <th>DBMS</th> | |
87 | + <td></td> | |
88 | + </tr> | |
89 | + <tr> | |
90 | + <th>호스트</th> | |
91 | + <td></td> | |
92 | + </tr> | |
93 | + <tr> | |
94 | + <th>PORT</th> | |
95 | + <td></td> | |
96 | + </tr> | |
97 | + <tr> | |
98 | + <th>DB명</th> | |
99 | + <td></td> | |
100 | + </tr> | |
101 | + <tr> | |
102 | + <th>접속ID</th> | |
103 | + <td></td> | |
104 | + </tr> | |
105 | + <tr> | |
106 | + <th>접속PW</th> | |
107 | + <td></td> | |
108 | + </tr> | |
109 | + </tbody> | |
110 | + </table> | |
111 | + <div class="flex justify-end"> | |
112 | + <button class="blue-btn small-btn">접속 테스트</button> | |
113 | + </div> | |
114 | + <table class="list-table orange"> | |
115 | + <thead> | |
116 | + <tr> | |
117 | + <th>No</th> | |
118 | + <th>접속시간</th> | |
119 | + <th>접속결과</th> | |
120 | + </tr> | |
121 | + </thead> | |
122 | + <tbody> | |
123 | + <tr> | |
124 | + <td>1</td> | |
125 | + <td>04:00:00</td> | |
126 | + <td>접속성공</td> | |
127 | + </tr> | |
128 | + </tbody> | |
129 | + </table> | |
130 | + </div> | |
131 | + <div class="modal-end flex justify-end"> | |
132 | + <button v-show="modalType === 'form-modal'" class="orange-btn small-btn">접속</button> | |
133 | + <button v-show="modalType === 'tab-modal'" class="blue-btn small-btn">확인</button> | |
134 | + </div> | |
135 | + </div> | |
136 | + </div> | |
137 | +</template> | |
138 | + | |
139 | +<script> | |
140 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
141 | +import { mdiClose } from '@mdi/js'; | |
142 | +export default { | |
143 | + data() { | |
144 | + return { | |
145 | + isModalOpen: true, | |
146 | + activeTab: 'tab1', | |
147 | + // modalType: 'form-modal', | |
148 | + modalType: 'tab-modal', | |
149 | + closePath:mdiClose | |
150 | + } | |
151 | + }, | |
152 | + methods: { | |
153 | + // 탭 변경 | |
154 | + showTab: function (tabName) { | |
155 | + this.activeTab = tabName; | |
156 | + }, | |
157 | + closeModal:function(){ | |
158 | + this.isModalOpen=false; | |
159 | + } | |
160 | + }, | |
161 | + watch: { | |
162 | + | |
163 | + }, | |
164 | + computed: { | |
165 | + | |
166 | + }, | |
167 | + components: { | |
168 | + 'SvgIcon':SvgIcon | |
169 | + }, | |
170 | + mounted() { | |
171 | + console.log('main mounted'); | |
172 | + } | |
173 | +} | |
174 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/component/ModalComponent/ListModal.vue
... | ... | @@ -0,0 +1,120 @@ |
1 | +<template> | |
2 | + <div v-show="isModalOpen" class="modal-wrapper"> | |
3 | + <div class="modal-container"> | |
4 | + <div class="modal-title"> | |
5 | + <div class="flex justify-between align-center"> | |
6 | + <h2>센서 알람 설정</h2> | |
7 | + <button class="close-btn" @click="closeModal"><svg-icon type="mdi" :width="20" :height="20" :path="closePath"></svg-icon></button> | |
8 | + </div> | |
9 | + </div> | |
10 | + <div class="modal-content-monthly"> | |
11 | + <div class="table-zone"> | |
12 | + <table class="list-table"> | |
13 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
14 | + <colgroup> | |
15 | + <col style="width: 22.5%;"> | |
16 | + <col style="width: 22.5%;"> | |
17 | + <col style="width: 22.5%;"> | |
18 | + <col style="width: 22.5%;"> | |
19 | + <col style="width: 10%;"> | |
20 | + </colgroup> | |
21 | + <thead> | |
22 | + <tr> | |
23 | + <th>컬럼명</th> | |
24 | + <th>한글명</th> | |
25 | + <th>MIN</th> | |
26 | + <th>MAX</th> | |
27 | + <th>사용여부</th> | |
28 | + </tr> | |
29 | + </thead> | |
30 | + <tbody> | |
31 | + <tr> | |
32 | + <td>SENS1</td> | |
33 | + <td><input type="text" name="" id="" class="full-input" value="벨브1"/></td> | |
34 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
35 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
36 | + <td><input type="checkbox" name="" id=""></td> | |
37 | + </tr> | |
38 | + <tr> | |
39 | + <td>SENS2</td> | |
40 | + <td><input type="text" name="" id="" class="full-input" value="벨브2"/></td> | |
41 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
42 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
43 | + <td><input type="checkbox" name="" id=""></td> | |
44 | + </tr> | |
45 | + <tr> | |
46 | + <td>SENS3</td> | |
47 | + <td><input type="text" name="" id="" class="full-input" value="벨브3"/></td> | |
48 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
49 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
50 | + <td><input type="checkbox" name="" id=""></td> | |
51 | + </tr> | |
52 | + <tr> | |
53 | + <td>SENS4</td> | |
54 | + <td><input type="text" name="" id="" class="full-input" value="벨브4"/></td> | |
55 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
56 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
57 | + <td><input type="checkbox" name="" id=""></td> | |
58 | + </tr> | |
59 | + <tr> | |
60 | + <td>SENS5</td> | |
61 | + <td><input type="text" name="" id="" class="full-input" value="벨브5"/></td> | |
62 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
63 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
64 | + <td><input type="checkbox" name="" id=""></td> | |
65 | + </tr> | |
66 | + <tr> | |
67 | + <td>SENS6</td> | |
68 | + <td><input type="text" name="" id="" class="full-input" value="벨브6"/></td> | |
69 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
70 | + <td><input type="text" name="" id="" class="full-input"/></td> | |
71 | + <td><input type="checkbox" name="" id=""></td> | |
72 | + </tr> | |
73 | + </tbody> | |
74 | + </table> | |
75 | + </div> | |
76 | + </div> | |
77 | + <div class="modal-end flex justify-end"> | |
78 | + <button v-show="modalType === 'form-modal'" class="orange-btn small-btn">접속</button> | |
79 | + <button v-show="modalType === 'tab-modal'" class="blue-btn small-btn">확인</button> | |
80 | + </div> | |
81 | + </div> | |
82 | + </div> | |
83 | +</template> | |
84 | + | |
85 | +<script> | |
86 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
87 | +import { mdiClose } from '@mdi/js'; | |
88 | + | |
89 | +export default { | |
90 | + data() { | |
91 | + return { | |
92 | + isModalOpen: true, | |
93 | + activeTab: 'tab1', | |
94 | + modalType: 'tab-modal', | |
95 | + closePath:mdiClose | |
96 | + } | |
97 | + }, | |
98 | + methods: { | |
99 | + // 탭 변경 | |
100 | + showTab: function (tabName) { | |
101 | + this.activeTab = tabName; | |
102 | + }, | |
103 | + closeModal: function () { | |
104 | + this.isModalOpen = false; | |
105 | + } | |
106 | + }, | |
107 | + watch: { | |
108 | + | |
109 | + }, | |
110 | + computed: { | |
111 | + | |
112 | + }, | |
113 | + components: { | |
114 | + 'SvgIcon':SvgIcon | |
115 | + }, | |
116 | + mounted() { | |
117 | + console.log('main mounted'); | |
118 | + } | |
119 | +} | |
120 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/component/Pagination.vue
... | ... | @@ -0,0 +1,0 @@ |
+++ client/views/pages/component/Searchbar.vue
... | ... | @@ -0,0 +1,0 @@ |
+++ client/views/pages/component/TableComponent/FormTable.vue
... | ... | @@ -0,0 +1,60 @@ |
1 | +<template> | |
2 | + <div class="table-zone"> | |
3 | + <table class="form-table"> | |
4 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
5 | + <colgroup> | |
6 | + <col style="width: ;"> | |
7 | + <col style="width: ;"> | |
8 | + <col style="width: ;"> | |
9 | + <col style="width: ;"> | |
10 | + </colgroup> | |
11 | + <tbody> | |
12 | + <tr> | |
13 | + <th>user ID</th> | |
14 | + <td><input type="text" name="" id=""></td> | |
15 | + <th>이름</th> | |
16 | + <td><input type="text" name="" id=""></td> | |
17 | + </tr> | |
18 | + <tr> | |
19 | + <th>생년월일</th> | |
20 | + <td> | |
21 | + <div class="flex justify-between"> | |
22 | + <select name="" id="" class="flex30"></select> | |
23 | + <select name="" id="" class="flex30"></select> | |
24 | + <select name="" id="" class="flex30"></select> | |
25 | + </div> | |
26 | + </td> | |
27 | + <th>성별</th> | |
28 | + <td> | |
29 | + <select name="" id=""></select> | |
30 | + </td> | |
31 | + </tr> | |
32 | + </tbody> | |
33 | + </table> | |
34 | + </div> | |
35 | +</template> | |
36 | + | |
37 | +<script> | |
38 | + | |
39 | +export default { | |
40 | + data() { | |
41 | + return { | |
42 | + } | |
43 | + }, | |
44 | + methods: { | |
45 | + | |
46 | + }, | |
47 | + watch: { | |
48 | + | |
49 | + }, | |
50 | + computed: { | |
51 | + | |
52 | + }, | |
53 | + components: { | |
54 | + }, | |
55 | + mounted() { | |
56 | + console.log('main mounted'); | |
57 | + } | |
58 | +} | |
59 | +</script> | |
60 | + |
+++ client/views/pages/component/TableComponent/FormTable2.vue
... | ... | @@ -0,0 +1,60 @@ |
1 | +<template> | |
2 | + <div class="table-zone"> | |
3 | + <table class="form-table2"> | |
4 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
5 | + <colgroup> | |
6 | + <col style="width: ;"> | |
7 | + <col style="width: ;"> | |
8 | + <col style="width: ;"> | |
9 | + <col style="width: ;"> | |
10 | + </colgroup> | |
11 | + <tbody> | |
12 | + <tr> | |
13 | + <th>user ID</th> | |
14 | + <td><input type="text" name="" id=""></td> | |
15 | + <th>이름</th> | |
16 | + <td><input type="text" name="" id=""></td> | |
17 | + </tr> | |
18 | + <tr> | |
19 | + <th>생년월일</th> | |
20 | + <td> | |
21 | + <div class="flex justify-between"> | |
22 | + <select name="" id="" class="flex30"></select> | |
23 | + <select name="" id="" class="flex30"></select> | |
24 | + <select name="" id="" class="flex30"></select> | |
25 | + </div> | |
26 | + </td> | |
27 | + <th>성별</th> | |
28 | + <td> | |
29 | + <select name="" id=""></select> | |
30 | + </td> | |
31 | + </tr> | |
32 | + </tbody> | |
33 | + </table> | |
34 | + </div> | |
35 | +</template> | |
36 | + | |
37 | +<script> | |
38 | + | |
39 | +export default { | |
40 | + data() { | |
41 | + return { | |
42 | + } | |
43 | + }, | |
44 | + methods: { | |
45 | + | |
46 | + }, | |
47 | + watch: { | |
48 | + | |
49 | + }, | |
50 | + computed: { | |
51 | + | |
52 | + }, | |
53 | + components: { | |
54 | + }, | |
55 | + mounted() { | |
56 | + console.log('main mounted'); | |
57 | + } | |
58 | +} | |
59 | +</script> | |
60 | + |
+++ client/views/pages/component/TableComponent/ListTable.vue
... | ... | @@ -0,0 +1,76 @@ |
1 | +<template> | |
2 | + <div class="table-zone"> | |
3 | + <div class="list-info flex justify-between align-center"> | |
4 | + <div class="count-zone"> | |
5 | + <p>총 <span>40</span>건 중 <span>01</span>건 선택</p> | |
6 | + </div> | |
7 | + <div class="cunt-selectZone"> | |
8 | + <select name="" id=""> | |
9 | + <option value="">10개 보기</option> | |
10 | + <option value="">20개 보기</option> | |
11 | + </select> | |
12 | + </div> | |
13 | + </div> | |
14 | + <table class="list-table"> | |
15 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
16 | + <colgroup> | |
17 | + <col style="width: ;"> | |
18 | + <col style="width: ;"> | |
19 | + <col style="width: ;"> | |
20 | + <col style="width: ;"> | |
21 | + </colgroup> | |
22 | + <thead> | |
23 | + <tr> | |
24 | + <th>No</th> | |
25 | + <th>user ID</th> | |
26 | + <th>이름</th> | |
27 | + <th>생년월일</th> | |
28 | + <th>성별</th> | |
29 | + </tr> | |
30 | + </thead> | |
31 | + <tbody> | |
32 | + <tr> | |
33 | + <td>1</td> | |
34 | + <td>test123</td> | |
35 | + <td>홍길동</td> | |
36 | + <td>1999.01.01</td> | |
37 | + <td>여</td> | |
38 | + </tr> | |
39 | + <tr> | |
40 | + <td>1</td> | |
41 | + <td>test123</td> | |
42 | + <td>홍길동</td> | |
43 | + <td>1999.01.01</td> | |
44 | + <td>여</td> | |
45 | + </tr> | |
46 | + <tr v-if="postList === 0"> | |
47 | + <td colspan="5" class="no-list">검색조건에 해당하는 데이터가 없습니다.</td> | |
48 | + </tr> | |
49 | + </tbody> | |
50 | + </table> | |
51 | + </div> | |
52 | +</template> | |
53 | + | |
54 | +<script> | |
55 | + | |
56 | +export default { | |
57 | + data() { | |
58 | + return { | |
59 | + } | |
60 | + }, | |
61 | + methods: { | |
62 | + | |
63 | + }, | |
64 | + watch: { | |
65 | + | |
66 | + }, | |
67 | + computed: { | |
68 | + | |
69 | + }, | |
70 | + components: { | |
71 | + }, | |
72 | + mounted() { | |
73 | + console.log('main mounted'); | |
74 | + } | |
75 | +} | |
76 | +</script> |
+++ client/views/pages/layout/Header.vue
... | ... | @@ -0,0 +1,78 @@ |
1 | +<template> | |
2 | + <header> | |
3 | + | |
4 | + <div class="logo-wrap gd flex justify-between align-center "> | |
5 | + <router-link to="/Bi002.page" class="logo gd-1"></router-link> | |
6 | + <div class="flex justify-end gd-2 logo-btn"> | |
7 | + <div class=" header-btn"> | |
8 | + <p class="btn-img1"></p> | |
9 | + <a href="/">사용설명서</a> | |
10 | + </div> | |
11 | + <div class=" header-btn"> | |
12 | + <p class="btn-img3"></p> | |
13 | + <a href="/">박정현님</a> | |
14 | + </div> | |
15 | + <div class=" header-btn"> | |
16 | + <p class="btn-img2"></p> | |
17 | + <a href="/">로그아웃</a> | |
18 | + </div> | |
19 | + | |
20 | + | |
21 | + </div> | |
22 | + </div> | |
23 | + </header> | |
24 | + | |
25 | +</template> | |
26 | + | |
27 | +<script> | |
28 | +export default { | |
29 | + data() { | |
30 | + return { | |
31 | + } | |
32 | + }, | |
33 | + methods: { | |
34 | + | |
35 | + }, | |
36 | + watch: { | |
37 | + | |
38 | + }, | |
39 | + computed: { | |
40 | + | |
41 | + }, | |
42 | + mounted() { | |
43 | + } | |
44 | +} | |
45 | +</script> | |
46 | + | |
47 | +<style scoped> | |
48 | +.topheader { | |
49 | + background-color: var(--headergray); | |
50 | + padding: 2px 30px; | |
51 | +} | |
52 | + | |
53 | +.topheader p, | |
54 | +.topheader button { | |
55 | + padding: 0.1% 0; | |
56 | + color: var(--white); | |
57 | + font-size: 1.4rem; | |
58 | +} | |
59 | + | |
60 | +.header-btn { | |
61 | + width: 50px; | |
62 | + height: 50px; | |
63 | + background-color: var(--white); | |
64 | + border-radius: 5px; | |
65 | + text-align: center; | |
66 | + margin-left: 2%; | |
67 | + padding: 3% 0; | |
68 | + box-shadow: 1px 1px 5px #00000031; | |
69 | + | |
70 | +} | |
71 | + | |
72 | +.header-btn p { | |
73 | + margin: 0 auto; | |
74 | + width: 20px; | |
75 | + height: 20px; | |
76 | + background-size: contain; | |
77 | +} | |
78 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/layout/Menu.vue
... | ... | @@ -0,0 +1,130 @@ |
1 | +<template> | |
2 | + <nav class="main-nav flex justify-between align-center"> | |
3 | + <router-link to="/Bi002.page" class="logo gd-1"></router-link> | |
4 | + | |
5 | + <ul class="flex justify-between topmenu-wrap align-center" > | |
6 | + | |
7 | + <li v-for="(topMenu, idx) in menuList" key="idx"> | |
8 | + <p @click="selectItem(topMenu.id)" :class="{ active: topMenu.isActive }">{{ topMenu.pathName }}</p> | |
9 | + </li> | |
10 | + | |
11 | + </ul> | |
12 | + <div class="logo-wrap flex justify-between align-center logo-btn " | |
13 | + style="flex-wrap: nowrap; width: 10%;"> | |
14 | + | |
15 | + <div class=" header-btn"> | |
16 | + <p class="btn-img1"></p> | |
17 | + <a href="/">사용설명서</a> | |
18 | + </div> | |
19 | + <div class=" header-btn"> | |
20 | + <p class="btn-img3"></p> | |
21 | + <a href="/">박정현님</a> | |
22 | + </div> | |
23 | + <div class=" header-btn"> | |
24 | + <p class="btn-img2"></p> | |
25 | + <a href="/">로그아웃</a> | |
26 | + </div> | |
27 | + </div> | |
28 | + | |
29 | + | |
30 | + | |
31 | + | |
32 | + </nav> | |
33 | +</template> | |
34 | +<script> | |
35 | +export default { | |
36 | + data() { | |
37 | + return { | |
38 | + menuList: [ | |
39 | + { id: 0, pathName: "인사/급여" }, | |
40 | + { id: 1, isActive: true, pathName: "회계" }, | |
41 | + { id: 2, pathName: "원가" }, | |
42 | + { id: 3, pathName: "영업" }, | |
43 | + { id: 4, pathName: "원자재" }, | |
44 | + { id: 5, pathName: "부자재" }, | |
45 | + { id: 6, pathName: "생산" }, | |
46 | + { id: 7, pathName: "계근" }, | |
47 | + { id: 8, pathName: "무역" }, | |
48 | + { id: 9, pathName: "안전" }, | |
49 | + { id: 10, pathName: "지시사항" }, | |
50 | + { id: 11, pathName: "업무계획" }, | |
51 | + { id: 12, pathName: "고객" }, | |
52 | + { id: 13, pathName: "프로젝트" }, | |
53 | + { id: 14, pathName: "시스템" }, | |
54 | + { id: 15, pathName: "WEB" }, | |
55 | + ] | |
56 | + } | |
57 | + }, | |
58 | + methods: { | |
59 | + selectItem(id) { | |
60 | + // 모든 메뉴 항목의 isActive 속성을 false로 설정 | |
61 | + this.menuList.forEach(item => { | |
62 | + item.isActive = false; | |
63 | + }); | |
64 | + | |
65 | + // 클릭한 메뉴 항목의 isActive 속성만 true로 설정 | |
66 | + const selectedItem = this.menuList.find(item => item.id === id); | |
67 | + if (selectedItem) { | |
68 | + selectedItem.isActive = true; | |
69 | + } | |
70 | + | |
71 | + console.log(id); | |
72 | + this.$emit('itemSelected', id); | |
73 | + | |
74 | + } | |
75 | + }, | |
76 | + watch: { | |
77 | + | |
78 | + }, | |
79 | + computed: { | |
80 | + | |
81 | + }, | |
82 | + mounted() { | |
83 | + } | |
84 | +} | |
85 | +</script> | |
86 | +<style scoped> | |
87 | +ul { | |
88 | + width: 100%; | |
89 | + list-style: none; | |
90 | + padding: 17px 30px; | |
91 | + background-color: var(--navbarblue); | |
92 | +} | |
93 | + | |
94 | +li { | |
95 | + /* border: 1px solid blue; */ | |
96 | + text-align: center; | |
97 | + | |
98 | +} | |
99 | + | |
100 | +.topheader { | |
101 | + background-color: var(--headergray); | |
102 | + padding: 2px 30px; | |
103 | +} | |
104 | + | |
105 | +.topheader p, | |
106 | +.topheader button { | |
107 | + padding: 0.1% 0; | |
108 | + color: var(--white); | |
109 | + font-size: 1.4rem; | |
110 | +} | |
111 | + | |
112 | +.header-btn { | |
113 | + width: 45px; | |
114 | + height: 45px; | |
115 | + background-color: var(--white); | |
116 | + border-radius: 5px; | |
117 | + text-align: center; | |
118 | + margin-left: 2%; | |
119 | + padding: 3% 0; | |
120 | + box-shadow: 1px 1px 5px #00000031; | |
121 | + | |
122 | +} | |
123 | + | |
124 | +.header-btn p { | |
125 | + margin: 0 auto; | |
126 | + width: 20px; | |
127 | + height: 20px; | |
128 | + background-size: contain; | |
129 | +} | |
130 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/layout/sideMenu.vue
... | ... | @@ -0,0 +1,310 @@ |
1 | +<template> | |
2 | + <nav class="gd gd1 pd1 sub-nav"> | |
3 | + <input type="text" placeholder="메뉴검색" class="mb2"> | |
4 | + <ul> | |
5 | + <li v-if="selectedItem"> | |
6 | + <div v-for="(sidetitle) in selectedItem.subMenuBox" :key="sidetitle.pathName" class="side-wrap"> | |
7 | + <p @click="toggleMenu(sidetitle)" :class="{ active: sidetitle.show }">{{ sidetitle.pathName }}</p> | |
8 | + <!-- <img src="../../../resources/img/component/chevron-down.svg" alt=""> --> | |
9 | + <ul class="sidemenu-wrap"> | |
10 | + <li v-for="(subMenu, idx) in sidetitle.subList" :key="idx"> | |
11 | + <router-link v-show="sidetitle.show" :to="subMenu.path" class="mb2" | |
12 | + @click="selectSubMenu(subMenu)" :class="{ 'active-text': subMenu.isActive }">{{ | |
13 | + subMenu.pathName | |
14 | + }}</router-link> | |
15 | + </li> | |
16 | + </ul> | |
17 | + </div> | |
18 | + </li> | |
19 | + </ul> | |
20 | + </nav> | |
21 | +</template> | |
22 | + | |
23 | +<script> | |
24 | + | |
25 | +export default { | |
26 | + props: { | |
27 | + selectedId: { | |
28 | + type: Number, | |
29 | + default: null, | |
30 | + }, | |
31 | + }, | |
32 | + data() { | |
33 | + return { | |
34 | + selectedId: 1, | |
35 | + selectedSubMenu: false, | |
36 | + menuList: [ | |
37 | + { | |
38 | + // 인사/급여관리 | |
39 | + id: 0, | |
40 | + subMenuBox: [ | |
41 | + | |
42 | + { | |
43 | + pathName: "기준정보", | |
44 | + show: false, | |
45 | + subList: [ | |
46 | + { path: "/", pathName: "(회계)공통코드 등록", isActive: false }, | |
47 | + { path: "/", pathName: "거래처 정보 등록", isActive: false }, | |
48 | + { path: "/", pathName: "계정과목 등록", isActive: false }, | |
49 | + { path: "/", pathName: "재무제표 양식 등록", isActive: false }, | |
50 | + { path: "/", pathName: "재무제표 계정 설정 등록", isActive: false }, | |
51 | + { path: "/", pathName: "은행 계좌 등록", isActive: false }, | |
52 | + ], | |
53 | + }, | |
54 | + { | |
55 | + pathName: "전표관리", | |
56 | + show: false, | |
57 | + subList: [ | |
58 | + { path: "/", pathName: "(회계)공통코드 등록" }, | |
59 | + { path: "/", pathName: "거래처 정보 등록" }, | |
60 | + { path: "/", pathName: "계정과목 등록" }, | |
61 | + { path: "/", pathName: "재무제표 양식 등록" }, | |
62 | + { path: "/", pathName: "재무제표 계정 설정 등록" }, | |
63 | + { path: "/", pathName: "은행 계좌 등록" }, | |
64 | + ], | |
65 | + }, | |
66 | + { | |
67 | + pathName: "기준정보", | |
68 | + show: false, | |
69 | + subList: [ | |
70 | + { path: "/", pathName: "(회계)공통코드 등록" }, | |
71 | + { path: "/", pathName: "거래처 정보 등록" }, | |
72 | + { path: "/", pathName: "계정과목 등록" }, | |
73 | + { path: "/", pathName: "재무제표 양식 등록" }, | |
74 | + { path: "/", pathName: "재무제표 계정 설정 등록" }, | |
75 | + { path: "/", pathName: "은행 계좌 등록" }, | |
76 | + ], | |
77 | + }, | |
78 | + ] | |
79 | + }, | |
80 | + | |
81 | + { | |
82 | + // 회계관리 | |
83 | + id: 1, | |
84 | + subMenuBox: [ | |
85 | + | |
86 | + { | |
87 | + pathName: "기준정보", | |
88 | + show: true, | |
89 | + | |
90 | + subList: [ | |
91 | + { path: "/Bi001.page", pathName: "(회계)공통코드 등록"}, | |
92 | + { path: "/Bi002.page", pathName: "거래처 정보 등록" }, | |
93 | + { path: "/Bi003.page", pathName: "계정과목 등록"}, | |
94 | + { path: "/Bi004.page", pathName: "재무제표 양식 등록"}, | |
95 | + { path: "/Bi005.page", pathName: "재무제표 계정 설정 등록"}, | |
96 | + { path: "/Bi006.page", pathName: "은행 계좌 등록" }, | |
97 | + { path: "/Bi007.page", pathName: "거래처 대장"}, | |
98 | + ], | |
99 | + }, | |
100 | + { | |
101 | + pathName: "전표관리", | |
102 | + show: false, | |
103 | + subList: [ | |
104 | + { path: "/Cm001.page", pathName: "잔액 이월 전표등록" }, | |
105 | + { path: "/Cm002.page", pathName: "전표 작성 (일반)" }, | |
106 | + { path: "/", pathName: "전표 작성 (계산서)" }, | |
107 | + { path: "/", pathName: "전표 작성 (법인카드)" }, | |
108 | + { path: "/", pathName: "전표 작성 (어음분할 발행)" }, | |
109 | + { path: "/", pathName: "전표 작성 (포장매출)" }, | |
110 | + { path: "/", pathName: "미전송 전표 조회" }, | |
111 | + { path: "/", pathName: "전표 확정 (일반)" }, | |
112 | + { path: "/", pathName: "전표 확정 (계산서)" }, | |
113 | + { path: "/", pathName: "전표 확정 (법인카드)" }, | |
114 | + { path: "/", pathName: "전표 확정 (포장매출)" }, | |
115 | + { path: "/", pathName: "전표 승인 및 반려등록" }, | |
116 | + { path: "/", pathName: "전표 조회" }, | |
117 | + { path: "/", pathName: "전표 조회 (부서별)" }, | |
118 | + { path: "/", pathName: "분개장 (전표기준)" }, | |
119 | + { path: "/", pathName: "계정별 명세서" }, | |
120 | + { path: "/", pathName: "계정별 명세서(부서별)" }, | |
121 | + { path: "/", pathName: "거래처별 명세서" }, | |
122 | + { path: "/", pathName: "거래처별 채원/채무리스트" }, | |
123 | + { path: "/", pathName: "미수금 관리 (제품)" }, | |
124 | + ], | |
125 | + }, | |
126 | + { | |
127 | + pathName: "채권채무관리", | |
128 | + show: false, | |
129 | + subList: [ | |
130 | + { path: "/", pathName: "월 채권채무 마감 작업" }, | |
131 | + { path: "/", pathName: "채무 연령표" }, | |
132 | + { path: "/", pathName: "채권 연령표" }, | |
133 | + ], | |
134 | + }, | |
135 | + { | |
136 | + pathName: "법인카드관리", | |
137 | + show: false, | |
138 | + subList: [ | |
139 | + { path: "/", pathName: "법인카드 관리 대장" }, | |
140 | + { path: "/", pathName: "법인카드 일자별 사용 명세" }, | |
141 | + { path: "/", pathName: "법인카드 일자별 사용 명세 (계정)" }, | |
142 | + { path: "/", pathName: "월별 사용액 현황(카드별)" }, | |
143 | + { path: "/", pathName: "월별 사용액 현황(상세)" }, | |
144 | + { path: "/", pathName: "계정과목별 사용액 현황(월)" }, | |
145 | + { path: "/", pathName: "월별 사용액 현황(요약)" }, | |
146 | + ], | |
147 | + }, | |
148 | + { | |
149 | + pathName: "자금관리", | |
150 | + show: false, | |
151 | + subList: [ | |
152 | + { path: "/", pathName: "분개장" }, | |
153 | + { path: "/", pathName: "현금출납장" }, | |
154 | + { path: "/", pathName: "일계표" }, | |
155 | + { path: "/", pathName: "자금 일일 원장" }, | |
156 | + { path: "/", pathName: "일 자금 마감 작업" }, | |
157 | + { path: "/", pathName: "잔액 이월 작업" }, | |
158 | + { path: "/", pathName: "기초 잔액 등록" }, | |
159 | + ], | |
160 | + }, | |
161 | + { | |
162 | + pathName: "어음관리", | |
163 | + show: false, | |
164 | + subList: [ | |
165 | + { path: "/", pathName: "받을어음 등록" }, | |
166 | + { path: "/", pathName: "받을어음 수탁 등록" }, | |
167 | + { path: "/", pathName: "받을어음 결제 및 반환 등록" }, | |
168 | + { path: "/", pathName: "받을어음 할인 등록" }, | |
169 | + { path: "/", pathName: "지급어음 결제 및 반환 등록" }, | |
170 | + { path: "/", pathName: "어음 용지 관리" }, | |
171 | + { path: "/", pathName: "받을어음 잔액 명세서" }, | |
172 | + { path: "/", pathName: "받을어음 수탁 명세서" }, | |
173 | + { path: "/", pathName: "받을어음 할인 명세서" }, | |
174 | + { path: "/", pathName: "지급어음 잔액 명세서" }, | |
175 | + ], | |
176 | + }, | |
177 | + { | |
178 | + pathName: "차입금관리", | |
179 | + show: false, | |
180 | + subList: [ | |
181 | + { path: "/", pathName: "차입금 등록" }, | |
182 | + { path: "/", pathName: "차입금 및 이자 상환 등록" }, | |
183 | + { path: "/", pathName: "차입금 잔액 명세서" }, | |
184 | + { path: "/", pathName: "차입금 상환 명세서" }, | |
185 | + { path: "/", pathName: "이자 지급 명세서" }, | |
186 | + ], | |
187 | + }, | |
188 | + { | |
189 | + pathName: "결산조정관리", | |
190 | + show: false, | |
191 | + subList: [ | |
192 | + { path: "/", pathName: "선급비용 발생 등록" }, | |
193 | + { path: "/", pathName: "선급비용 계상 전표 작성" }, | |
194 | + { path: "/", pathName: "선급비용 명세서" }, | |
195 | + { path: "/", pathName: "미지급이자 전표 작성" }, | |
196 | + { path: "/", pathName: "미지급이자 명세서" }, | |
197 | + { path: "/", pathName: "이자 비용 명세서" }, | |
198 | + ], | |
199 | + }, | |
200 | + { | |
201 | + pathName: "결산관리", | |
202 | + show: false, | |
203 | + subList: [ | |
204 | + { path: "/", pathName: "합계잔액시산표" }, | |
205 | + { path: "/", pathName: "재무상태표" }, | |
206 | + { path: "/", pathName: "손익계산서" }, | |
207 | + { path: "/", pathName: "제조원가명세서" }, | |
208 | + { path: "/", pathName: "결산 기초 정보 등록" }, | |
209 | + { path: "/", pathName: "월 결산 마감 작업" }, | |
210 | + ], | |
211 | + }, | |
212 | + { | |
213 | + pathName: "세무관리", | |
214 | + show: false, | |
215 | + subList: [ | |
216 | + { path: "/", pathName: "부가세 명세서" }, | |
217 | + { path: "/", pathName: "부가세 집계표(세금 및 계산서)" }, | |
218 | + { path: "/", pathName: "부가세 집계표(법인카드)" }, | |
219 | + { path: "/", pathName: "부가세 신고서 작성(세금 및 계산서)" }, | |
220 | + { path: "/", pathName: "부가세 신고서 작성(법인카드)" }, | |
221 | + { path: "/", pathName: "수출 실적 신고서 작성" }, | |
222 | + ], | |
223 | + }, | |
224 | + { | |
225 | + pathName: "담보관리", | |
226 | + show: false, | |
227 | + subList: [ | |
228 | + { path: "/", pathName: "담보 등록" }, | |
229 | + { path: "/", pathName: "담보 현황" }, | |
230 | + ], | |
231 | + }, | |
232 | + ] | |
233 | + } | |
234 | + | |
235 | + ] | |
236 | + } | |
237 | + }, | |
238 | + methods: { | |
239 | + | |
240 | + toggleMenu(menu) { | |
241 | + menu.show = !menu.show; | |
242 | + }, | |
243 | + selectSubMenu(subMenu) { | |
244 | + // 이전에 선택된 메뉴가 있다면 비활성화 | |
245 | + if (this.selectedSubMenu) { | |
246 | + this.selectedSubMenu.isActive = false; | |
247 | + } | |
248 | + | |
249 | + // 새로 선택된 메뉴를 활성화하고 저장 | |
250 | + subMenu.isActive = true; | |
251 | + this.selectedSubMenu = subMenu; | |
252 | + }, | |
253 | + | |
254 | + }, | |
255 | + watch: { | |
256 | + | |
257 | + }, | |
258 | + computed: { | |
259 | + | |
260 | + selectedItem() { | |
261 | + | |
262 | + console.log('Selected ID:', this.selectedId); // 선택된 ID를 콘솔에 출력 | |
263 | + const item = this.menuList.find(item => item.id === this.selectedId); | |
264 | + console.log('Found Item:', item); // 찾은 항목을 콘솔에 출력 | |
265 | + return item; | |
266 | + | |
267 | + | |
268 | + }, | |
269 | + }, | |
270 | + mounted() { | |
271 | + | |
272 | + } | |
273 | +} | |
274 | +</script> | |
275 | + | |
276 | +<style scoped> | |
277 | +nav { | |
278 | + height: 100%; | |
279 | + position: relative; | |
280 | + overflow-y: scroll; | |
281 | + background-color: var(--sidenavgray); | |
282 | + width: 100%; | |
283 | + | |
284 | +} | |
285 | +nav::-webkit-scrollbar{ | |
286 | + width: 2px; | |
287 | +} | |
288 | +nav::-webkit-scrollbar-thumb{ | |
289 | + background-color: var(--navbarblue); | |
290 | +} | |
291 | + | |
292 | +input { | |
293 | + width: 100%; | |
294 | + margin-bottom: 5%; | |
295 | +} | |
296 | + | |
297 | +.side-wrap p { | |
298 | + font-family: 'Pretendard'; | |
299 | + font-weight: 600; | |
300 | + color: #333; | |
301 | +} | |
302 | + | |
303 | + | |
304 | +.sidemenu-wrap li { | |
305 | + padding-left: 15%; | |
306 | + font-family: 'Pretendard'; | |
307 | + font-weight: 600; | |
308 | + color: #333; | |
309 | +} | |
310 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/login/Login.vue
... | ... | @@ -0,0 +1,138 @@ |
1 | +<template> | |
2 | + <div class="login-page"> | |
3 | + <div class="login-wrap flex-column justify-center align-center"> | |
4 | + <div class="login-content"> | |
5 | + <div class="logo"> | |
6 | + <!-- <img src="../../../resources/img/logo.png" alt="" /> --> | |
7 | + </div> | |
8 | + <div class="login-zone"> | |
9 | + <div class="input-wrap"> | |
10 | + <div class="inputContainer"> | |
11 | + <input required="" class="customInput" type="text" v-model="member.userId" v-on:keyup.enter="login" > | |
12 | + <label class="inputLabel">ID</label> | |
13 | + <div class="inputUnderline"></div> | |
14 | + </div> | |
15 | + <div class="inputContainer"> | |
16 | + <input required="" class="customInput" type="password" v-model="member.userPassword" v-on:keyup.enter="login"> | |
17 | + <label class="inputLabel">PASSWORD</label> | |
18 | + <div class="inputUnderline"></div> | |
19 | + </div> | |
20 | + </div> | |
21 | + <div class="found-zone flex justify-center"> | |
22 | + <router-link to="">아이디찾기</router-link> | |
23 | + <router-link to="">비밀번호 찾기</router-link> | |
24 | + <router-link to="/register.page">회원가입</router-link> | |
25 | + </div> | |
26 | + </div> | |
27 | + <button class="blue-btn large-btn" @click="login">로그인</button> | |
28 | + </div> | |
29 | + </div> | |
30 | + </div> | |
31 | +</template> | |
32 | + | |
33 | +<script> | |
34 | + | |
35 | +// import axios from 'axios'; | |
36 | +// import { useStore } from 'vuex'; | |
37 | +// import store from '../AppStore' | |
38 | + | |
39 | +export default { | |
40 | + data() { | |
41 | + return { | |
42 | + } | |
43 | + }, | |
44 | + methods: { | |
45 | + | |
46 | + }, | |
47 | + watch: { | |
48 | + | |
49 | + }, | |
50 | + computed: { | |
51 | + | |
52 | + }, | |
53 | + mounted() { | |
54 | + } | |
55 | +} | |
56 | +</script> | |
57 | + | |
58 | +<style scoped> | |
59 | +.login-page { | |
60 | + width: 100%; | |
61 | + height: 100%; | |
62 | +} | |
63 | + | |
64 | +.login-content { | |
65 | + min-width: 400px; | |
66 | + max-width: 400px; | |
67 | + padding: 30px; | |
68 | + border-radius: 10px; | |
69 | + background-color: #fff; | |
70 | + box-shadow: 0 0 20px #ddd; | |
71 | +} | |
72 | + | |
73 | +.logo { | |
74 | + width: 200px; | |
75 | + /* height: 50px; */ | |
76 | + margin: 0 auto; | |
77 | + margin-bottom: 50px; | |
78 | +} | |
79 | + | |
80 | +.logo>img { | |
81 | + display: block; | |
82 | + height: 100%; | |
83 | + margin: auto; | |
84 | +} | |
85 | +.inputContainer { | |
86 | + position: relative; | |
87 | + margin-bottom: 40px; | |
88 | +} | |
89 | + | |
90 | +.inputContainer:last-child{ | |
91 | + margin-bottom: 0; | |
92 | +} | |
93 | + | |
94 | +.customInput { | |
95 | + width: 100%; | |
96 | + padding: 10px; | |
97 | + font-size: 13px; | |
98 | + background-color: transparent; | |
99 | + border: none; | |
100 | + outline: none; | |
101 | + transition: border-color 0.3s ease; | |
102 | +} | |
103 | + | |
104 | + | |
105 | +.inputLabel { | |
106 | + position: absolute; | |
107 | + top: 0; | |
108 | + left: 0; | |
109 | + pointer-events: none; | |
110 | + padding: 5px; | |
111 | + font-size: 13px; | |
112 | + color: #eee; | |
113 | + transform: translateY(-80%); | |
114 | +} | |
115 | + | |
116 | + | |
117 | +.inputUnderline { | |
118 | + position: absolute; | |
119 | + bottom: 0; | |
120 | + left: 0; | |
121 | + width: 100%; | |
122 | + height: 2px; | |
123 | + background-color: #eee; | |
124 | +} | |
125 | + | |
126 | +.found-zone { | |
127 | + padding: 20px 0; | |
128 | +} | |
129 | + | |
130 | +.found-zone>a { | |
131 | + font-size: 1.3rem; | |
132 | + padding: 0 10px; | |
133 | +} | |
134 | + | |
135 | +.login-page .blue-btn { | |
136 | + margin-left: 0; | |
137 | + padding: 10px 0; | |
138 | +}</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/main/Main.vue
... | ... | @@ -0,0 +1,28 @@ |
1 | +<template> | |
2 | + <div class="row gd-10" >Main.vue</div> | |
3 | + | |
4 | +</template> | |
5 | + | |
6 | +<script> | |
7 | +export default { | |
8 | + data () { | |
9 | + return { | |
10 | + } | |
11 | + }, | |
12 | + methods: { | |
13 | + | |
14 | + }, | |
15 | + watch: { | |
16 | + | |
17 | + }, | |
18 | + computed: { | |
19 | + | |
20 | + }, | |
21 | + mounted() { | |
22 | + console.log('Main mounted'); | |
23 | + } | |
24 | +} | |
25 | +</script> | |
26 | +<style> | |
27 | + | |
28 | +</style>(파일 끝에 줄바꿈 문자 없음) |
--- gradle/wrapper/gradle-wrapper.jar
Binary file is not shown |
--- gradle/wrapper/gradle-wrapper.properties
... | ... | @@ -1,7 +0,0 @@ |
1 | -distributionBase=GRADLE_USER_HOME | |
2 | -distributionPath=wrapper/dists | |
3 | -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip | |
4 | -networkTimeout=10000 | |
5 | -validateDistributionUrl=true | |
6 | -zipStoreBase=GRADLE_USER_HOME | |
7 | -zipStorePath=wrapper/dists |
--- gradlew
... | ... | @@ -1,249 +0,0 @@ |
1 | -#!/bin/sh | |
2 | - | |
3 | -# | |
4 | -# Copyright © 2015-2021 the original authors. | |
5 | -# | |
6 | -# Licensed under the Apache License, Version 2.0 (the "License"); | |
7 | -# you may not use this file except in compliance with the License. | |
8 | -# You may obtain a copy of the License at | |
9 | -# | |
10 | -# https://www.apache.org/licenses/LICENSE-2.0 | |
11 | -# | |
12 | -# Unless required by applicable law or agreed to in writing, software | |
13 | -# distributed under the License is distributed on an "AS IS" BASIS, | |
14 | -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
15 | -# See the License for the specific language governing permissions and | |
16 | -# limitations under the License. | |
17 | -# | |
18 | - | |
19 | -############################################################################## | |
20 | -# | |
21 | -# Gradle start up script for POSIX generated by Gradle. | |
22 | -# | |
23 | -# Important for running: | |
24 | -# | |
25 | -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | |
26 | -# noncompliant, but you have some other compliant shell such as ksh or | |
27 | -# bash, then to run this script, type that shell name before the whole | |
28 | -# command line, like: | |
29 | -# | |
30 | -# ksh Gradle | |
31 | -# | |
32 | -# Busybox and similar reduced shells will NOT work, because this script | |
33 | -# requires all of these POSIX shell features: | |
34 | -# * functions; | |
35 | -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | |
36 | -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; | |
37 | -# * compound commands having a testable exit status, especially «case»; | |
38 | -# * various built-in commands including «command», «set», and «ulimit». | |
39 | -# | |
40 | -# Important for patching: | |
41 | -# | |
42 | -# (2) This script targets any POSIX shell, so it avoids extensions provided | |
43 | -# by Bash, Ksh, etc; in particular arrays are avoided. | |
44 | -# | |
45 | -# The "traditional" practice of packing multiple parameters into a | |
46 | -# space-separated string is a well documented source of bugs and security | |
47 | -# problems, so this is (mostly) avoided, by progressively accumulating | |
48 | -# options in "$@", and eventually passing that to Java. | |
49 | -# | |
50 | -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | |
51 | -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | |
52 | -# see the in-line comments for details. | |
53 | -# | |
54 | -# There are tweaks for specific operating systems such as AIX, CygWin, | |
55 | -# Darwin, MinGW, and NonStop. | |
56 | -# | |
57 | -# (3) This script is generated from the Groovy template | |
58 | -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | |
59 | -# within the Gradle project. | |
60 | -# | |
61 | -# You can find Gradle at https://github.com/gradle/gradle/. | |
62 | -# | |
63 | -############################################################################## | |
64 | - | |
65 | -# Attempt to set APP_HOME | |
66 | - | |
67 | -# Resolve links: $0 may be a link | |
68 | -app_path=$0 | |
69 | - | |
70 | -# Need this for daisy-chained symlinks. | |
71 | -while | |
72 | - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path | |
73 | - [ -h "$app_path" ] | |
74 | -do | |
75 | - ls=$( ls -ld "$app_path" ) | |
76 | - link=${ls#*' -> '} | |
77 | - case $link in #( | |
78 | - /*) app_path=$link ;; #( | |
79 | - *) app_path=$APP_HOME$link ;; | |
80 | - esac | |
81 | -done | |
82 | - | |
83 | -# This is normally unused | |
84 | -# shellcheck disable=SC2034 | |
85 | -APP_BASE_NAME=${0##*/} | |
86 | -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) | |
87 | -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit | |
88 | - | |
89 | -# Use the maximum available, or set MAX_FD != -1 to use that value. | |
90 | -MAX_FD=maximum | |
91 | - | |
92 | -warn () { | |
93 | - echo "$*" | |
94 | -} >&2 | |
95 | - | |
96 | -die () { | |
97 | - echo | |
98 | - echo "$*" | |
99 | - echo | |
100 | - exit 1 | |
101 | -} >&2 | |
102 | - | |
103 | -# OS specific support (must be 'true' or 'false'). | |
104 | -cygwin=false | |
105 | -msys=false | |
106 | -darwin=false | |
107 | -nonstop=false | |
108 | -case "$( uname )" in #( | |
109 | - CYGWIN* ) cygwin=true ;; #( | |
110 | - Darwin* ) darwin=true ;; #( | |
111 | - MSYS* | MINGW* ) msys=true ;; #( | |
112 | - NONSTOP* ) nonstop=true ;; | |
113 | -esac | |
114 | - | |
115 | -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | |
116 | - | |
117 | - | |
118 | -# Determine the Java command to use to start the JVM. | |
119 | -if [ -n "$JAVA_HOME" ] ; then | |
120 | - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |
121 | - # IBM's JDK on AIX uses strange locations for the executables | |
122 | - JAVACMD=$JAVA_HOME/jre/sh/java | |
123 | - else | |
124 | - JAVACMD=$JAVA_HOME/bin/java | |
125 | - fi | |
126 | - if [ ! -x "$JAVACMD" ] ; then | |
127 | - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | |
128 | - | |
129 | -Please set the JAVA_HOME variable in your environment to match the | |
130 | -location of your Java installation." | |
131 | - fi | |
132 | -else | |
133 | - JAVACMD=java | |
134 | - if ! command -v java >/dev/null 2>&1 | |
135 | - then | |
136 | - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |
137 | - | |
138 | -Please set the JAVA_HOME variable in your environment to match the | |
139 | -location of your Java installation." | |
140 | - fi | |
141 | -fi | |
142 | - | |
143 | -# Increase the maximum file descriptors if we can. | |
144 | -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | |
145 | - case $MAX_FD in #( | |
146 | - max*) | |
147 | - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | |
148 | - # shellcheck disable=SC2039,SC3045 | |
149 | - MAX_FD=$( ulimit -H -n ) || | |
150 | - warn "Could not query maximum file descriptor limit" | |
151 | - esac | |
152 | - case $MAX_FD in #( | |
153 | - '' | soft) :;; #( | |
154 | - *) | |
155 | - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | |
156 | - # shellcheck disable=SC2039,SC3045 | |
157 | - ulimit -n "$MAX_FD" || | |
158 | - warn "Could not set maximum file descriptor limit to $MAX_FD" | |
159 | - esac | |
160 | -fi | |
161 | - | |
162 | -# Collect all arguments for the java command, stacking in reverse order: | |
163 | -# * args from the command line | |
164 | -# * the main class name | |
165 | -# * -classpath | |
166 | -# * -D...appname settings | |
167 | -# * --module-path (only if needed) | |
168 | -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | |
169 | - | |
170 | -# For Cygwin or MSYS, switch paths to Windows format before running java | |
171 | -if "$cygwin" || "$msys" ; then | |
172 | - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | |
173 | - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | |
174 | - | |
175 | - JAVACMD=$( cygpath --unix "$JAVACMD" ) | |
176 | - | |
177 | - # Now convert the arguments - kludge to limit ourselves to /bin/sh | |
178 | - for arg do | |
179 | - if | |
180 | - case $arg in #( | |
181 | - -*) false ;; # don't mess with options #( | |
182 | - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath | |
183 | - [ -e "$t" ] ;; #( | |
184 | - *) false ;; | |
185 | - esac | |
186 | - then | |
187 | - arg=$( cygpath --path --ignore --mixed "$arg" ) | |
188 | - fi | |
189 | - # Roll the args list around exactly as many times as the number of | |
190 | - # args, so each arg winds up back in the position where it started, but | |
191 | - # possibly modified. | |
192 | - # | |
193 | - # NB: a `for` loop captures its iteration list before it begins, so | |
194 | - # changing the positional parameters here affects neither the number of | |
195 | - # iterations, nor the values presented in `arg`. | |
196 | - shift # remove old arg | |
197 | - set -- "$@" "$arg" # push replacement arg | |
198 | - done | |
199 | -fi | |
200 | - | |
201 | - | |
202 | -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |
203 | -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |
204 | - | |
205 | -# Collect all arguments for the java command: | |
206 | -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, | |
207 | -# and any embedded shellness will be escaped. | |
208 | -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be | |
209 | -# treated as '${Hostname}' itself on the command line. | |
210 | - | |
211 | -set -- \ | |
212 | - "-Dorg.gradle.appname=$APP_BASE_NAME" \ | |
213 | - -classpath "$CLASSPATH" \ | |
214 | - org.gradle.wrapper.GradleWrapperMain \ | |
215 | - "$@" | |
216 | - | |
217 | -# Stop when "xargs" is not available. | |
218 | -if ! command -v xargs >/dev/null 2>&1 | |
219 | -then | |
220 | - die "xargs is not available" | |
221 | -fi | |
222 | - | |
223 | -# Use "xargs" to parse quoted args. | |
224 | -# | |
225 | -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. | |
226 | -# | |
227 | -# In Bash we could simply go: | |
228 | -# | |
229 | -# readarray ARGS < <( xargs -n1 <<<"$var" ) && | |
230 | -# set -- "${ARGS[@]}" "$@" | |
231 | -# | |
232 | -# but POSIX shell has neither arrays nor command substitution, so instead we | |
233 | -# post-process each arg (as a line of input to sed) to backslash-escape any | |
234 | -# character that might be a shell metacharacter, then use eval to reverse | |
235 | -# that process (while maintaining the separation between arguments), and wrap | |
236 | -# the whole thing up as a single "set" statement. | |
237 | -# | |
238 | -# This will of course break if any of these variables contains a newline or | |
239 | -# an unmatched quote. | |
240 | -# | |
241 | - | |
242 | -eval "set -- $( | |
243 | - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | |
244 | - xargs -n1 | | |
245 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | |
246 | - tr '\n' ' ' | |
247 | - )" '"$@"' | |
248 | - | |
249 | -exec "$JAVACMD" "$@" |
--- gradlew.bat
... | ... | @@ -1,92 +0,0 @@ |
1 | -@rem | |
2 | -@rem Copyright 2015 the original author or authors. | |
3 | -@rem | |
4 | -@rem Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -@rem you may not use this file except in compliance with the License. | |
6 | -@rem You may obtain a copy of the License at | |
7 | -@rem | |
8 | -@rem https://www.apache.org/licenses/LICENSE-2.0 | |
9 | -@rem | |
10 | -@rem Unless required by applicable law or agreed to in writing, software | |
11 | -@rem distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -@rem See the License for the specific language governing permissions and | |
14 | -@rem limitations under the License. | |
15 | -@rem | |
16 | - | |
17 | -@if "%DEBUG%"=="" @echo off | |
18 | -@rem ########################################################################## | |
19 | -@rem | |
20 | -@rem Gradle startup script for Windows | |
21 | -@rem | |
22 | -@rem ########################################################################## | |
23 | - | |
24 | -@rem Set local scope for the variables with windows NT shell | |
25 | -if "%OS%"=="Windows_NT" setlocal | |
26 | - | |
27 | -set DIRNAME=%~dp0 | |
28 | -if "%DIRNAME%"=="" set DIRNAME=. | |
29 | -@rem This is normally unused | |
30 | -set APP_BASE_NAME=%~n0 | |
31 | -set APP_HOME=%DIRNAME% | |
32 | - | |
33 | -@rem Resolve any "." and ".." in APP_HOME to make it shorter. | |
34 | -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | |
35 | - | |
36 | -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |
37 | -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | |
38 | - | |
39 | -@rem Find java.exe | |
40 | -if defined JAVA_HOME goto findJavaFromJavaHome | |
41 | - | |
42 | -set JAVA_EXE=java.exe | |
43 | -%JAVA_EXE% -version >NUL 2>&1 | |
44 | -if %ERRORLEVEL% equ 0 goto execute | |
45 | - | |
46 | -echo. | |
47 | -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |
48 | -echo. | |
49 | -echo Please set the JAVA_HOME variable in your environment to match the | |
50 | -echo location of your Java installation. | |
51 | - | |
52 | -goto fail | |
53 | - | |
54 | -:findJavaFromJavaHome | |
55 | -set JAVA_HOME=%JAVA_HOME:"=% | |
56 | -set JAVA_EXE=%JAVA_HOME%/bin/java.exe | |
57 | - | |
58 | -if exist "%JAVA_EXE%" goto execute | |
59 | - | |
60 | -echo. | |
61 | -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | |
62 | -echo. | |
63 | -echo Please set the JAVA_HOME variable in your environment to match the | |
64 | -echo location of your Java installation. | |
65 | - | |
66 | -goto fail | |
67 | - | |
68 | -:execute | |
69 | -@rem Setup the command line | |
70 | - | |
71 | -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | |
72 | - | |
73 | - | |
74 | -@rem Execute Gradle | |
75 | -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | |
76 | - | |
77 | -:end | |
78 | -@rem End local scope for the variables with windows NT shell | |
79 | -if %ERRORLEVEL% equ 0 goto mainEnd | |
80 | - | |
81 | -:fail | |
82 | -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | |
83 | -rem the _cmd.exe /c_ return code! | |
84 | -set EXIT_CODE=%ERRORLEVEL% | |
85 | -if %EXIT_CODE% equ 0 set EXIT_CODE=1 | |
86 | -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% | |
87 | -exit /b %EXIT_CODE% | |
88 | - | |
89 | -:mainEnd | |
90 | -if "%OS%"=="Windows_NT" endlocal | |
91 | - | |
92 | -:omega |
+++ package-lock.json
This file is too big to display. |
+++ package.json
... | ... | @@ -0,0 +1,32 @@ |
1 | +{ | |
2 | + "dependencies": { | |
3 | + "@babel/cli": "^7.22.10", | |
4 | + "@babel/core": "^7.22.10", | |
5 | + "animate.css": "^4.1.1", | |
6 | + "axios": "^1.6.7", | |
7 | + "babel-loader": "^9.1.3", | |
8 | + "bootstrap": "^5.3.3", | |
9 | + "css-loader": "^6.8.1", | |
10 | + "express": "^4.18.2", | |
11 | + "express-http-proxy": "^1.6.3", | |
12 | + "file-loader": "^6.2.0", | |
13 | + "fs": "^0.0.1-security", | |
14 | + "new-line": "^1.1.1", | |
15 | + "vue": "^3.3.4", | |
16 | + "vue-loader": "^17.2.2", | |
17 | + "vue-router": "^4.2.4", | |
18 | + "vue-style-loader": "^4.1.3", | |
19 | + "webpack": "^5.88.2", | |
20 | + "webpack-cli": "^5.1.4" | |
21 | + }, | |
22 | + "scripts": { | |
23 | + "prod": "set NODE_ENV=production&&node ./server/modules/web/Server.js", | |
24 | + "dev": "set NODE_ENV=development&&node ./server/modules/web/Server.js", | |
25 | + "windows-prod": "set NODE_ENV=production&&node ./server/modules/web/Server.js", | |
26 | + "windows-dev": "set NODE_ENV=development&&node ./server/modules/web/Server.js", | |
27 | + "linux-prod": "export NODE_ENV=production&&node ./server/modules/web/Server.js", | |
28 | + "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/Server.js", | |
29 | + "webpack-build": "webpack", | |
30 | + "webpack-build-watch": "webpack --watch" | |
31 | + } | |
32 | +} |
+++ server/modules/log/Logger.js
... | ... | @@ -0,0 +1,131 @@ |
1 | +const { LOG_BASE_DIR, SERVICE_STATUS } = require('../../../Global'); | |
2 | +const fs = require('fs'); | |
3 | +const Queue = require('../util/Queue'); | |
4 | + | |
5 | +/** | |
6 | + * @author : 하석형 | |
7 | + * @since : 2023.08.24 | |
8 | + * @dscription : Log 생성기 모듈 입니다. | |
9 | + */ | |
10 | +const Logger = (function () { | |
11 | + | |
12 | + /* let testInterval = setInterval(() => { | |
13 | + const date = new Date(); | |
14 | + var now = `${date.getFullYear()}.${(date.getMonth()+1)}.${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}`; | |
15 | + console.log('now :', now); | |
16 | + }, 1000) */ | |
17 | + | |
18 | + //로그 쓰기 전, 대기 저장소 | |
19 | + const eventQueue = new Queue(); | |
20 | + //로그 쓰는 중인지 아닌지 상태값 | |
21 | + let isLogging = false; | |
22 | + | |
23 | + /** | |
24 | + * @author : 하석형 | |
25 | + * @since : 2023.08.24 | |
26 | + * @dscription : Log 처리 | |
27 | + */ | |
28 | + const logging = (message) => { | |
29 | + const date = new Date(); | |
30 | + let year = date.getFullYear(); | |
31 | + let month = prefixZero((date.getMonth() + 1), 2); | |
32 | + let day = prefixZero(date.getDate(), 2); | |
33 | + let hour = prefixZero(date.getHours(), 2); | |
34 | + let minute = prefixZero(date.getMinutes(), 2); | |
35 | + let second = prefixZero(date.getSeconds(), 2); | |
36 | + let millisecond = prefixZero(date.getMilliseconds(), 3); | |
37 | + | |
38 | + //로그에 쓰일 정보 | |
39 | + const logMessage = { | |
40 | + message: message, | |
41 | + datetime: `${year}.${month}.${day} ${hour}:${minute}:${second}.${millisecond}`, | |
42 | + logFolderDir: `${LOG_BASE_DIR}/${year}${month}`,//log 폴더 경로 | |
43 | + logFileName: `log-${year}${month}${day}.log`//log 파일명 | |
44 | + } | |
45 | + | |
46 | + //로그 쓰는 중이면, 대기 저장소에 등록 | |
47 | + if (isLogging == true) { | |
48 | + eventQueue.push(logMessage); | |
49 | + } else {//로그 쓰는 중이 아니면, 로그 쓰는 중인 상태로 변경 후, 로그 쓰기 | |
50 | + isLogging = true; | |
51 | + | |
52 | + try { | |
53 | + //log 폴더 생성 | |
54 | + if (!fs.existsSync(logMessage.logFolderDir)) { | |
55 | + fs.mkdirSync(logMessage.logFolderDir, { recursive: true/*재귀적 폴더 생성*/ }); | |
56 | + } | |
57 | + | |
58 | + //log 파일 Full Path | |
59 | + let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`; | |
60 | + //log 내용 | |
61 | + let logContent = `[${logMessage.datetime}] ${logMessage.message}`; | |
62 | + | |
63 | + //log 내용 쓰기 | |
64 | + writeLogFile(logFileFullPath, logContent); | |
65 | + } catch (error) { | |
66 | + console.log('logging error : ', error); | |
67 | + } finally { | |
68 | + isLogging = false; | |
69 | + } | |
70 | + } | |
71 | + } | |
72 | + | |
73 | + /** | |
74 | + * @author : 하석형 | |
75 | + * @since : 2023.08.24 | |
76 | + * @dscription : Log 내용 쓰기 | |
77 | + */ | |
78 | + const writeLogFile = (path, content) => { | |
79 | + if (SERVICE_STATUS == 'development') { | |
80 | + console.log(content); | |
81 | + } | |
82 | + | |
83 | + //파일 쓰기 | |
84 | + fs.appendFileSync(path, `${content}\n`, 'utf8'); | |
85 | + | |
86 | + //로그 쓰기 저장소에서 로그 메세지 꺼내기 | |
87 | + let logMessage = eventQueue.pop(); | |
88 | + //메세지가 존재하면 => Log 내용 쓰기 (재귀 호출) | |
89 | + if (logMessage != undefined) { | |
90 | + //log 파일 Full Path | |
91 | + let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`; | |
92 | + //log 내용 | |
93 | + let logContent = `[${logMessage.datetime}] ${logMessage.message}`; | |
94 | + //Log 내용 쓰기 (재귀 호출) | |
95 | + writeLogFile(logFileFullPath, logContent); | |
96 | + } else { | |
97 | + return; | |
98 | + } | |
99 | + } | |
100 | + | |
101 | + /** | |
102 | + * @author : 하석형 | |
103 | + * @since : 2023.08.24 | |
104 | + * @dscription : 특정 길이만큼 앞에 '0' 붙이기 | |
105 | + */ | |
106 | + const prefixZero = (target, length) => { | |
107 | + let zero = ''; | |
108 | + let suffix = target; | |
109 | + let result = ''; | |
110 | + | |
111 | + if ((typeof target) === "number") { | |
112 | + suffix = target.toString(); | |
113 | + } | |
114 | + if (suffix.length < length) { | |
115 | + for (i = 0; i < length - suffix.length; i++) { | |
116 | + zero += '0'; | |
117 | + } | |
118 | + } | |
119 | + result = zero + suffix; | |
120 | + return result; | |
121 | + } | |
122 | + | |
123 | + | |
124 | + return { | |
125 | + logging: logging | |
126 | + } | |
127 | + | |
128 | +})(); | |
129 | + | |
130 | +//Module Export | |
131 | +module.exports = Logger;(파일 끝에 줄바꿈 문자 없음) |
+++ server/modules/util/Queue.js
... | ... | @@ -0,0 +1,32 @@ |
1 | +/** | |
2 | + * @author : 하석형 | |
3 | + * @since : 2023.08.24 | |
4 | + * @dscription : Queue(선입선출) 자료형 객체 입니다. | |
5 | + */ | |
6 | +class Queue { | |
7 | + constructor() { | |
8 | + this._arr = []; | |
9 | + } | |
10 | + | |
11 | + //입력 | |
12 | + push (item) { | |
13 | + this._arr.push(item); | |
14 | + } | |
15 | + | |
16 | + //출력 후, 제거 | |
17 | + pop () { | |
18 | + return this._arr.shift(); | |
19 | + } | |
20 | + | |
21 | + //출력 대기 중인 item return | |
22 | + peek () { | |
23 | + return this._arr[0]; | |
24 | + } | |
25 | + | |
26 | + //확인 | |
27 | + showQueue () { | |
28 | + console.log('Queue : ', this._arr); | |
29 | + } | |
30 | +} | |
31 | + | |
32 | +module.exports = Queue;(파일 끝에 줄바꿈 문자 없음) |
+++ server/modules/web/Server.js
... | ... | @@ -0,0 +1,105 @@ |
1 | +/** | |
2 | + * @author : 하석형 | |
3 | + * @since : 2023.08.24 | |
4 | + * @dscription : Express 라이브러리 활용 HTTP Web Server 모듈입니다. | |
5 | + */ | |
6 | +const { BASE_DIR, PORT, API_SERVER_HOST } = require('../../../Global'); | |
7 | +const Logger = require('../log/Logger');//Logger(필수) | |
8 | + | |
9 | +const express = require('express'); | |
10 | +const webServer = express(); | |
11 | +const expressProxy = require('express-http-proxy'); | |
12 | + | |
13 | +//파일 시스템 관련 라이브러리 | |
14 | +const FS = require('fs'); | |
15 | +//stream: 특정 자원을 Streaming 하기 위한 라이브러리 => Transform: Streaming 중인 자원의 Data에 Data 수정 및 추가를 지원해주는 객체 | |
16 | +const Transform = require('stream').Transform; | |
17 | +//Streaming 중인 자원에 새로운 데이터를 stream 공간에 추가하기 위한 라이브러리 | |
18 | +const newLineStream = require('new-line'); | |
19 | + | |
20 | +/** | |
21 | + * @author : 하석형 | |
22 | + * @since : 2023.08.24 | |
23 | + * @dscription : HTTP Server start | |
24 | + */ | |
25 | +webServer.listen(PORT, function () { | |
26 | + Logger.logging(`★★★ Node.js를 활용한 Web Server 구동(Port:${PORT}) ★★★`); | |
27 | +}) | |
28 | + | |
29 | +/** | |
30 | + * @author : 하석형 | |
31 | + * @since : 2023.08.24 | |
32 | + * @dscription : Intercepter 역할을 하는 미들웨어 기능 | |
33 | + */ | |
34 | +webServer.use(function (request, response, next) { | |
35 | + let ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress; | |
36 | + Logger.logging(`[HTTP] ${request.url} (Method: ${request.method}, IP: ${ip})`); | |
37 | + next(); | |
38 | +}); | |
39 | + | |
40 | + | |
41 | + | |
42 | +/** | |
43 | + * @author : 하석형 | |
44 | + * @since : 2023.08.24 | |
45 | + * @dscription : ROOT URL -> index.html | |
46 | + */ | |
47 | +webServer.get('/', function (request, response) { | |
48 | + //response.sendFile을 통한 HTTP html reponse (html내용 Streaming) | |
49 | + response.sendFile(`${BASE_DIR}/client/views/index.html`); | |
50 | +}) | |
51 | + | |
52 | +/** | |
53 | + * @author : 하석형 | |
54 | + * @since : 2023.08.24 | |
55 | + * @dscription : 화면요청 URL 처리 | |
56 | + */ | |
57 | +webServer.get('*.page', function (request, response, next) { | |
58 | + //index.html 내용을 직접 Streaming하여 Response, Streaming 중간에 내용 수정 | |
59 | + //수정 내용 : URL 요청이 아닌, 브라우저에 표시된 URL만 변경하여, 해당하는 URL PATH의 Vue Component를 routing하기 위함 | |
60 | + const StreamTransform = new Transform(); | |
61 | + StreamTransform._transform = function (data, encoding, done) { | |
62 | + let fileContent = data.toString(); | |
63 | + let replaceBeforeContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '/';</script>`; | |
64 | + let replaceAfterContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '${request.params['0']}.page';</script>`; | |
65 | + fileContent.replace(replaceBeforeContent, replaceAfterContent); | |
66 | + this.push(fileContent); | |
67 | + done(); | |
68 | + } | |
69 | + //Streaming 진행 | |
70 | + FS.createReadStream(`${BASE_DIR}/client/views/index.html`).pipe(newLineStream()).pipe(StreamTransform).pipe(response); | |
71 | +}) | |
72 | + | |
73 | +/** | |
74 | + * @author : 하석형 | |
75 | + * @since : 2023.08.24 | |
76 | + * @dscription : REST API 서버에 데이터 요청 보내기(Proxy) | |
77 | + */ | |
78 | +webServer.use('*.json', expressProxy(API_SERVER_HOST, { | |
79 | + proxyReqPathResolver: function (request) { | |
80 | + //console.log('request : ', request.url, request.params[0]); | |
81 | + return `${request.params['0']}.json`; | |
82 | + } | |
83 | +})); | |
84 | + | |
85 | +/** | |
86 | + * @author : 하석형 | |
87 | + * @since : 2023.08.24 | |
88 | + * @dscription : ROOT URL, Router's, 화면요청 URL 등.. 이 외 나머지 정적 자원에 대한 처리 기능 | |
89 | + */ | |
90 | +webServer.get('*.*', function (request, response, next) { | |
91 | + response.sendFile(`${BASE_DIR}${request.params['0']}.${request.params['1']}`); | |
92 | +}) | |
93 | + | |
94 | +/** | |
95 | + * @author : 하석형 | |
96 | + * @since : 2023.08.24 | |
97 | + * @dscription : Global Error Handler (*맨 마지막에 적용해야됨) | |
98 | + */ | |
99 | +webServer.use(function (error, request, response, next) { | |
100 | + const errorCode = !error.statusCode ? 500 : error.statusCode; | |
101 | + response.status(errorCode).send('에러가 발생하였습니다. 관리자에게 문의바랍니다.'); | |
102 | + let message = `[Error:${errorCode}] ${request.url}/n ${error.stack}/n`; | |
103 | + Logger.logging(message); | |
104 | + //next(); | |
105 | +})(파일 끝에 줄바꿈 문자 없음) |
--- settings.gradle
... | ... | @@ -1,1 +0,0 @@ |
1 | -rootProject.name = 'ajinerp' |
--- src/main/java/com/ajin/ajinerp/AjinErpApplication.java
... | ... | @@ -1,42 +0,0 @@ |
1 | -package com.ajin.ajinerp; | |
2 | - | |
3 | -import com.fasterxml.jackson.databind.ObjectMapper; | |
4 | -import com.fasterxml.jackson.databind.SerializationFeature; | |
5 | -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; | |
6 | -import org.springframework.boot.SpringApplication; | |
7 | -import org.springframework.boot.autoconfigure.SpringBootApplication; | |
8 | -import org.springframework.context.annotation.Bean; | |
9 | -import org.springframework.web.servlet.view.json.MappingJackson2JsonView; | |
10 | - | |
11 | -@SpringBootApplication | |
12 | -public class AjinErpApplication { | |
13 | - | |
14 | - public static void main(String[] args) { | |
15 | - SpringApplication.run(AjinErpApplication.class, args); | |
16 | - System.out.println("test!!!123"); | |
17 | - } | |
18 | - | |
19 | - @Bean(name="jsonView") | |
20 | - public MappingJackson2JsonView getJsonView () { | |
21 | - ObjectMapper objectMapper = getObjectMapper(); | |
22 | - MappingJackson2JsonView jsonView = new MappingJackson2JsonView(objectMapper); | |
23 | - jsonView.setExtractValueFromSingleKeyModel(true); | |
24 | - return jsonView; | |
25 | - } | |
26 | - | |
27 | - @Bean(name = "objectMapper") | |
28 | - public ObjectMapper getObjectMapper() { | |
29 | - ObjectMapper mapper = new ObjectMapper(); | |
30 | - | |
31 | - mapper.registerModule(new JavaTimeModule()); | |
32 | - //기본 날짜 포맷 비활성화 | |
33 | - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); | |
34 | - | |
35 | - //새로운 날짜 포맷 세팅 | |
36 | - /*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
37 | - mapper.setDateFormat(dateFormat); | |
38 | - mapper.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));*/ | |
39 | - | |
40 | - return mapper; | |
41 | - } | |
42 | -} |
--- src/main/resources/application.properties
... | ... | @@ -1,28 +0,0 @@ |
1 | -#server default | |
2 | -server.port = 9090 | |
3 | - | |
4 | -#Datasource Configuration | |
5 | -spring.datasource.hikari.maximum-pool-size=4 | |
6 | -spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy | |
7 | -spring.datasource.url=jdbc:log4jdbc:postgresql://210.180.118.83:5432/bi_manager?currentSchema=bi_manager | |
8 | -spring.datasource.username=takensoft | |
9 | -spring.datasource.password=tts96314728!@ | |
10 | -spring.sql.init.platform=postgres | |
11 | - | |
12 | - | |
13 | -# Mapper Xml Location | |
14 | -mybatis.mapper-locations=classpath:/spring/mapper/**/*-SQL.xml | |
15 | -mybatis.config-location=classpath:/spring/mapper/mybatis-config.xml | |
16 | - | |
17 | - | |
18 | -# 업로드 파일 용량 설정 | |
19 | -spring.servlet.multipart.maxFileSize=200MB | |
20 | -spring.servlet.multipart.maxRequestSize=200MB | |
21 | -##catalina log 설정 | |
22 | -#logging.level.org.apache.catalina=INFO | |
23 | -#logging.file.name=logs/catalina.out | |
24 | -# | |
25 | -##access log 설정 | |
26 | -#server.tomcat.basedir=./ | |
27 | -#server.tomcat.accesslog.enabled=true | |
28 | -#server.tomcat.accesslog.directory=logs/access(파일 끝에 줄바꿈 문자 없음) |
--- src/main/resources/log4jdbc.log4j2.properties
... | ... | @@ -1,2 +0,0 @@ |
1 | -log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator | |
2 | -log4jdbc.dump.sql.maxlinelength=0(파일 끝에 줄바꿈 문자 없음) |
--- src/main/resources/logback.xml
... | ... | @@ -1,20 +0,0 @@ |
1 | -<configuration> | |
2 | - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |
3 | - <encoder> | |
4 | - <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern> | |
5 | - </encoder> | |
6 | - </appender> | |
7 | - | |
8 | - <logger name="jdbc" level="OFF"/> | |
9 | - <logger name="jdbc.sqlonly" level="OFF"/> | |
10 | - <logger name="jdbc.sqltiming" level="DEBUG"/> | |
11 | - <logger name="jdbc.audit" level="OFF"/> | |
12 | - <logger name="jdbc.resultset" level="OFF"/> | |
13 | - <logger name="jdbc.resultsettable" level="DEBUG"/> | |
14 | - <logger name="jdbc.connection" level="OFF"/> | |
15 | - | |
16 | - <root level="INFO"> | |
17 | - <appender-ref ref="STDOUT" /> | |
18 | - </root> | |
19 | - | |
20 | -</configuration>(파일 끝에 줄바꿈 문자 없음) |
--- src/main/resources/spring/mapper/mybatis-config.xml
... | ... | @@ -1,20 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" | |
3 | - "http://mybatis.org/dtd/mybatis-3-config.dtd"> | |
4 | -<configuration> | |
5 | - <settings> | |
6 | - <setting name="cacheEnabled" value="true"/> <!-- mapper 캐시 전역 사용여부 --> | |
7 | - <setting name="lazyLoadingEnabled" value="false"/> <!-- mybatis 지연 로딩 사용여부 --> | |
8 | - <setting name="multipleResultSetsEnabled" value="true"/> <!-- 한개의 구문에서 여러개의 ResultSet 허용 여부 --> | |
9 | - <setting name="useColumnLabel" value="true"/> <!-- 컬럼명 대신 컬럼라벨 사용 여부 --> | |
10 | - <setting name="useGeneratedKeys" value="false"/> <!-- 키자동생성 --> | |
11 | - <setting name="defaultExecutorType" value="SIMPLE"/> | |
12 | - <setting name="defaultStatementTimeout" value="25000"/> | |
13 | - <setting name="callSettersOnNulls" value="true"/> | |
14 | - </settings> | |
15 | - | |
16 | - <typeAliases> | |
17 | - | |
18 | - </typeAliases> | |
19 | - | |
20 | -</configuration>(파일 끝에 줄바꿈 문자 없음) |
--- src/main/resources/static/index.html
... | ... | @@ -1,10 +0,0 @@ |
1 | -<!DOCTYPE html> | |
2 | -<html lang="en"> | |
3 | -<head> | |
4 | - <meta charset="UTF-8"> | |
5 | - <title>Title</title> | |
6 | -</head> | |
7 | -<body> | |
8 | - good | |
9 | -</body> | |
10 | -</html>(파일 끝에 줄바꿈 문자 없음) |
--- src/test/java/com/ajin/ajinerp/AjinErpApplicationTests.java
... | ... | @@ -1,13 +0,0 @@ |
1 | -package com.ajin.ajinerp; | |
2 | - | |
3 | -import org.junit.jupiter.api.Test; | |
4 | -import org.springframework.boot.test.context.SpringBootTest; | |
5 | - | |
6 | -@SpringBootTest | |
7 | -class AjinErpApplicationTests { | |
8 | - | |
9 | - @Test | |
10 | - void contextLoads() { | |
11 | - } | |
12 | - | |
13 | -} |
+++ webpack.config.js
... | ... | @@ -0,0 +1,42 @@ |
1 | +const { VueLoaderPlugin } = require("vue-loader"); | |
2 | + | |
3 | +const {PROJECT_NAME, BASE_DIR, SERVICE_STATUS} = require('./Global'); | |
4 | + | |
5 | +module.exports = { | |
6 | + name: PROJECT_NAME, | |
7 | + mode: SERVICE_STATUS, | |
8 | + devtool: 'eval', | |
9 | + | |
10 | + entry: { | |
11 | + app: [`${BASE_DIR}/client/views/index.js`] | |
12 | + }, | |
13 | + | |
14 | + module: { | |
15 | + rules: [{ | |
16 | + test: /\.vue?$/, | |
17 | + loader: 'vue-loader', | |
18 | + }, { | |
19 | + test: /\.(js|jsx)?$/, | |
20 | + loader: 'babel-loader', | |
21 | + }, { | |
22 | + test: /\.css$/, | |
23 | + use: ['vue-style-loader', 'css-loader'] | |
24 | + }, { | |
25 | + test: /\.(jpe?g|png|gif|svg|ttf|eot|woff|woff2)$/i, | |
26 | + use: [{ | |
27 | + loader:'url-loader', | |
28 | + options:{ | |
29 | + limit:8192, | |
30 | + fallback:require.resolve('file-loader') | |
31 | + } | |
32 | + }] | |
33 | + }], | |
34 | + }, | |
35 | + | |
36 | + plugins: [new VueLoaderPlugin()], | |
37 | + | |
38 | + output: { | |
39 | + path: `${BASE_DIR}/client/build`, // __dirname: webpack.config.js 파일이 위치한 경로 | |
40 | + filename: 'bundle.js' | |
41 | + }, | |
42 | +}(파일 끝에 줄바꿈 문자 없음) |
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?