Woojin Lee

퀴즈 스켈레톤 코드 작성

1 var express = require('express'); 1 var express = require('express');
2 var app = express(); 2 var app = express();
3 +
4 +app.set('view engine', 'ejs');
5 +
6 +app.get('/quiz', function (req, res) {
7 + res.render('quiz');
8 +})
9 +
3 app.get('/', function (req, res) { 10 app.get('/', function (req, res) {
4 res.send('Hello World'); 11 res.send('Hello World');
5 }) 12 })
6 13
7 -var server = app.listen(3000, function () { 14 +var server = app.listen(23000, function () {
8 var host = server.address().address 15 var host = server.address().address
9 var port = server.address().port 16 var port = server.address().port
10 console.log("Example app listening at http://%s:%s", host, port) 17 console.log("Example app listening at http://%s:%s", host, port)
......
...@@ -13,11 +13,29 @@ ...@@ -13,11 +13,29 @@
13 "negotiator": "0.6.2" 13 "negotiator": "0.6.2"
14 } 14 }
15 }, 15 },
16 + "ansi-styles": {
17 + "version": "3.2.1",
18 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
19 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
20 + "requires": {
21 + "color-convert": "^1.9.0"
22 + }
23 + },
16 "array-flatten": { 24 "array-flatten": {
17 "version": "1.1.1", 25 "version": "1.1.1",
18 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 26 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
19 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 27 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
20 }, 28 },
29 + "async": {
30 + "version": "0.9.2",
31 + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
32 + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
33 + },
34 + "balanced-match": {
35 + "version": "1.0.0",
36 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
37 + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
38 + },
21 "body-parser": { 39 "body-parser": {
22 "version": "1.19.0", 40 "version": "1.19.0",
23 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 41 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
...@@ -35,11 +53,48 @@ ...@@ -35,11 +53,48 @@
35 "type-is": "~1.6.17" 53 "type-is": "~1.6.17"
36 } 54 }
37 }, 55 },
56 + "brace-expansion": {
57 + "version": "1.1.11",
58 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
59 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
60 + "requires": {
61 + "balanced-match": "^1.0.0",
62 + "concat-map": "0.0.1"
63 + }
64 + },
38 "bytes": { 65 "bytes": {
39 "version": "3.1.0", 66 "version": "3.1.0",
40 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 67 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
41 "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 68 "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
42 }, 69 },
70 + "chalk": {
71 + "version": "2.4.2",
72 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
73 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
74 + "requires": {
75 + "ansi-styles": "^3.2.1",
76 + "escape-string-regexp": "^1.0.5",
77 + "supports-color": "^5.3.0"
78 + }
79 + },
80 + "color-convert": {
81 + "version": "1.9.3",
82 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
83 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
84 + "requires": {
85 + "color-name": "1.1.3"
86 + }
87 + },
88 + "color-name": {
89 + "version": "1.1.3",
90 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
91 + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
92 + },
93 + "concat-map": {
94 + "version": "0.0.1",
95 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
96 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
97 + },
43 "content-disposition": { 98 "content-disposition": {
44 "version": "0.5.3", 99 "version": "0.5.3",
45 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 100 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
...@@ -86,6 +141,14 @@ ...@@ -86,6 +141,14 @@
86 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 141 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
87 "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 142 "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
88 }, 143 },
144 + "ejs": {
145 + "version": "3.1.3",
146 + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz",
147 + "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==",
148 + "requires": {
149 + "jake": "^10.6.1"
150 + }
151 + },
89 "encodeurl": { 152 "encodeurl": {
90 "version": "1.0.2", 153 "version": "1.0.2",
91 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 154 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
...@@ -96,6 +159,11 @@ ...@@ -96,6 +159,11 @@
96 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 159 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
97 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 160 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
98 }, 161 },
162 + "escape-string-regexp": {
163 + "version": "1.0.5",
164 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
165 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
166 + },
99 "etag": { 167 "etag": {
100 "version": "1.8.1", 168 "version": "1.8.1",
101 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 169 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
...@@ -138,6 +206,14 @@ ...@@ -138,6 +206,14 @@
138 "vary": "~1.1.2" 206 "vary": "~1.1.2"
139 } 207 }
140 }, 208 },
209 + "filelist": {
210 + "version": "1.0.1",
211 + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz",
212 + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==",
213 + "requires": {
214 + "minimatch": "^3.0.4"
215 + }
216 + },
141 "finalhandler": { 217 "finalhandler": {
142 "version": "1.1.2", 218 "version": "1.1.2",
143 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 219 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
...@@ -162,6 +238,11 @@ ...@@ -162,6 +238,11 @@
162 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 238 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
163 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 239 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
164 }, 240 },
241 + "has-flag": {
242 + "version": "3.0.0",
243 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
244 + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
245 + },
165 "http-errors": { 246 "http-errors": {
166 "version": "1.7.2", 247 "version": "1.7.2",
167 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 248 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
...@@ -192,6 +273,17 @@ ...@@ -192,6 +273,17 @@
192 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 273 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
193 "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 274 "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
194 }, 275 },
276 + "jake": {
277 + "version": "10.8.2",
278 + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
279 + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
280 + "requires": {
281 + "async": "0.9.x",
282 + "chalk": "^2.4.2",
283 + "filelist": "^1.0.1",
284 + "minimatch": "^3.0.4"
285 + }
286 + },
195 "media-typer": { 287 "media-typer": {
196 "version": "0.3.0", 288 "version": "0.3.0",
197 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 289 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
...@@ -225,6 +317,14 @@ ...@@ -225,6 +317,14 @@
225 "mime-db": "1.44.0" 317 "mime-db": "1.44.0"
226 } 318 }
227 }, 319 },
320 + "minimatch": {
321 + "version": "3.0.4",
322 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
323 + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
324 + "requires": {
325 + "brace-expansion": "^1.1.7"
326 + }
327 + },
228 "ms": { 328 "ms": {
229 "version": "2.0.0", 329 "version": "2.0.0",
230 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 330 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
...@@ -341,6 +441,14 @@ ...@@ -341,6 +441,14 @@
341 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 441 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
342 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 442 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
343 }, 443 },
444 + "supports-color": {
445 + "version": "5.5.0",
446 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
447 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
448 + "requires": {
449 + "has-flag": "^3.0.0"
450 + }
451 + },
344 "toidentifier": { 452 "toidentifier": {
345 "version": "1.0.0", 453 "version": "1.0.0",
346 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 454 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
13 "author": "", 13 "author": "",
14 "license": "ISC", 14 "license": "ISC",
15 "dependencies": { 15 "dependencies": {
16 + "ejs": "^3.1.3",
16 "express": "^4.17.1" 17 "express": "^4.17.1"
17 } 18 }
18 } 19 }
......
1 +<!DOCTYPE html>
2 +<html>
3 +
4 +<head>
5 + <meta charset="utf-8">
6 + <title>로드뷰에 마커와 인포윈도우 올리기</title>
7 + <style>
8 + .screen_out {
9 + display: block;
10 + overflow: hidden;
11 + position: absolute;
12 + left: -9999px;
13 + width: 1px;
14 + height: 1px;
15 + font-size: 0;
16 + line-height: 0;
17 + text-indent: -9999px
18 + }
19 +
20 + .wrap_content {
21 + overflow: hidden;
22 + width: 1500px;
23 + height: 600px;
24 + }
25 +
26 + .wrap_map {
27 + width: 400px;
28 + height: 400px;
29 + float: left;
30 + }
31 +
32 + .wrap_roadview {
33 + width: 1100px;
34 + height: 100%;
35 + float: left;
36 + }
37 + </style>
38 +</head>
39 +
40 +<body>
41 + <div class="wrap_content">
42 + <div class="wrap_roadview">
43 + <div id="roadview" style="width:100%;height:100%"></div> <!-- 로드뷰를 표시할 div 입니다 -->
44 + </div>
45 + <div class="wrap_map">
46 + <div id="map" style="width:100%;height:100%"></div> <!-- 지도를 표시할 div 입니다 -->
47 + </div>
48 + <button onclick="checkResult()">정답 확인</button>
49 + <div id=distance></div>
50 + </div>
51 +
52 + <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=1c8aa0e80b11e6e96520d80aaeb85a4e"></script>
53 + <script>
54 + var mapContainer = document.getElementById('map'), // 지도를 표시할 div
55 + answerLocation = new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심 좌표
56 + mapOption = {
57 + center: answerLocation, // 지도의 중심 좌표
58 + level: 4 // 지도의 확대 레벨
59 + };
60 +
61 + // 지도를 표시할 div와 지도 옵션으로 지도를 생성합니다
62 + var map = new kakao.maps.Map(mapContainer, mapOption);
63 +
64 + var userLocation = null;
65 +
66 + // 지도를 클릭한 위치에 표출할 마커입니다
67 + var marker = new kakao.maps.Marker({
68 + // 지도 중심좌표에 마커를 생성합니다
69 + position: map.getCenter()
70 + });
71 + // 지도에 마커를 표시합니다
72 + marker.setMap(map);
73 +
74 + // 지도에 클릭 이벤트를 등록합니다
75 + // 지도를 클릭하면 마지막 파라미터로 넘어온 함수를 호출합니다
76 + kakao.maps.event.addListener(map, 'click', function (mouseEvent) {
77 +
78 + // 클릭한 위도, 경도 정보를 가져옵니다
79 + userLocation = mouseEvent.latLng;
80 +
81 + // 마커 위치를 클릭한 위치로 옮깁니다
82 + marker.setPosition(userLocation);
83 +
84 + // var message = '클릭한 위치의 위도는 ' + userLocation.getLat() + ' 이고, ';
85 + // message += '경도는 ' + userLocation.getLng() + ' 입니다';
86 + });
87 +
88 + var rvContainer = document.getElementById('roadview'); // 로드뷰를 표시할 div
89 + var rv = new kakao.maps.Roadview(rvContainer); // 로드뷰 객체 생성
90 + var rc = new kakao.maps.RoadviewClient(); // 좌표를 통한 로드뷰의 panoid를 추출하기 위한 로드뷰 help객체 생성
91 + var rvResetValue = {} //로드뷰의 초기화 값을 저장할 변수
92 + rc.getNearestPanoId(answerLocation, 50, function (panoId) {
93 + rv.setPanoId(panoId, answerLocation);//좌표에 근접한 panoId를 통해 로드뷰를 실행합니다.
94 + rvResetValue.panoId = panoId;
95 + });
96 +
97 + // 로드뷰 초기화 이벤트
98 + kakao.maps.event.addListener(rv, 'init', function () {
99 +
100 + });
101 +
102 + //지도 이동 이벤트 핸들러
103 + function moveKakaoMap(self) {
104 +
105 + var center = map.getCenter(),
106 + lat = center.getLat(),
107 + lng = center.getLng();
108 +
109 + self.href = 'https://map.kakao.com/link/map/' + encodeURIComponent('스페이스 닷원') + ',' + lat + ',' + lng; //Kakao 지도로 보내는 링크
110 + }
111 +
112 + //지도 초기화 이벤트 핸들러
113 + function resetKakaoMap() {
114 + map.setCenter(answerLocation); //지도를 초기화 했던 값으로 다시 셋팅합니다.
115 + map.setLevel(mapOption.level);
116 + }
117 +
118 + //로드뷰 이동 이벤트 핸들러
119 + function moveKakaoRoadview(self) {
120 + var panoId = rv.getPanoId(); //현 로드뷰의 panoId값을 가져옵니다.
121 + var viewpoint = rv.getViewpoint(); //현 로드뷰의 viewpoint(pan,tilt,zoom)값을 가져옵니다.
122 + self.href = 'https://map.kakao.com/?panoid=' + panoId + '&pan=' + viewpoint.pan + '&tilt=' + viewpoint.tilt + '&zoom=' + viewpoint.zoom; //Kakao 지도 로드뷰로 보내는 링크
123 + }
124 +
125 + //로드뷰 초기화 이벤트 핸들러
126 + function resetRoadview() {
127 + //초기화를 위해 저장해둔 변수를 통해 로드뷰를 초기상태로 돌립니다.
128 + rv.setViewpoint({
129 + pan: rvResetValue.pan, tilt: rvResetValue.tilt, zoom: rvResetValue.zoom
130 + });
131 + rv.setPanoId(rvResetValue.panoId);
132 + }
133 +
134 + function checkResult() {
135 + var linePath = [answerLocation, userLocation];
136 +
137 + var distanceLine = new kakao.maps.Polyline({
138 + path: linePath, // 선을 구성하는 좌표배열 입니다
139 + strokeWeight: 5, // 선의 두께 입니다
140 + strokeColor: '#FFAE00', // 선의 색깔입니다
141 + strokeOpacity: 0.7, // 선의 불투명도 입니다 1에서 0 사이의 값이며 0에 가까울수록 투명합니다
142 + strokeStyle: 'solid' // 선의 스타일입니다
143 + });
144 +
145 + distanceLine.setMap(map);
146 +
147 + var distance = Math.round(distanceLine.getLength());
148 + var message = '거리: ' + distance + 'm'
149 +
150 + var resultDiv = document.getElementById('distance');
151 + resultDiv.innerHTML = message;
152 + }
153 + </script>
154 +</body>
155 +
156 +</html>
...\ No newline at end of file ...\ No newline at end of file