Jeongmin Seo

merge release_v0.2.0 branch

1 -MIT License
2 -Copyright (c) 2022 Jeongmin Seo
3 -Permission is hereby granted, free of charge, to any person obtaining a copy
4 -of this software and associated documentation files (the "Software"), to deal
5 -in the Software without restriction, including without limitation the rights
6 -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 -copies of the Software, and to permit persons to whom the Software is
8 -furnished to do so, subject to the following conditions:
9 -The above copyright notice and this permission notice shall be included in all
10 -copies or substantial portions of the Software.
11 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12 -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14 -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15 -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16 -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17 -SOFTWARE.
...\ No newline at end of file ...\ No newline at end of file
...@@ -115,4 +115,10 @@ dist ...@@ -115,4 +115,10 @@ dist
115 .yarn/unplugged 115 .yarn/unplugged
116 .yarn/build-state.yml 116 .yarn/build-state.yml
117 .yarn/install-state.gz 117 .yarn/install-state.gz
118 -.pnp.*
...\ No newline at end of file ...\ No newline at end of file
118 +<<<<<<< HEAD
119 +.pnp.*
120 +=======
121 +.pnp.*
122 +
123 +.package-lock.json
124 +>>>>>>> release_v0.2.0
......
...@@ -5,6 +5,7 @@ const bodyParser = require("body-parser"); ...@@ -5,6 +5,7 @@ const bodyParser = require("body-parser");
5 //환경변수 (운영체제간 gap 없애고자) 5 //환경변수 (운영체제간 gap 없애고자)
6 const dotenv = require("dotenv"); 6 const dotenv = require("dotenv");
7 dotenv.config(); 7 dotenv.config();
8 +<<<<<<< HEAD
8 9
9 const compression = require("compression"); 10 const compression = require("compression");
10 const methodOverride = require("method-override"); 11 const methodOverride = require("method-override");
...@@ -18,23 +19,68 @@ const home = require("./src/routes/home"); ...@@ -18,23 +19,68 @@ const home = require("./src/routes/home");
18 const port = 3000; 19 const port = 3000;
19 20
20 const jwtMiddleware = require("./src/config/jwtMiddleware"); 21 const jwtMiddleware = require("./src/config/jwtMiddleware");
22 +=======
23 +const compression = require("compression");
24 +const methodOverride = require("method-override");
25 +const path = require("path")
26 +const socketIO = require("socket.io")
27 +const moment = require("moment")
28 +const http = require("http");
29 +const app = express();
30 +const server = http.createServer(app);
31 +
32 +var cors = require("cors");
33 +const { logger } = require("./src/config/winston");
34 +//app이라는 express 객체 생성
35 +//라우팅
36 +const home = require("./src/routes/home");
37 +const port = 3000;
38 +const jwtMiddleware = require("./src/config/jwtMiddleware");
39 +const io = socketIO(server);
40 +>>>>>>> release_v0.2.0
21 41
22 // 앱 세팅 42 // 앱 세팅
23 app.set("views", "./src/views"); 43 app.set("views", "./src/views");
24 app.set("view engine", "ejs"); 44 app.set("view engine", "ejs");
25 app.use(express.static(`${__dirname}/src/public`)); 45 app.use(express.static(`${__dirname}/src/public`));
46 +<<<<<<< HEAD
47 +app.use(bodyParser.json());
48 +//url통해 전달되는 데이터에 한글, 공백 등의 문자 오류 해결
49 +app.use(bodyParser.urlencoded({extended: true}));
50 +=======
51 +app.use(express.static(path.join(__dirname, "src")))
52 +
26 app.use(bodyParser.json()); 53 app.use(bodyParser.json());
27 //url통해 전달되는 데이터에 한글, 공백 등의 문자 오류 해결 54 //url통해 전달되는 데이터에 한글, 공백 등의 문자 오류 해결
28 app.use(bodyParser.urlencoded({extended: true})); 55 app.use(bodyParser.urlencoded({extended: true}));
56 +
57 +>>>>>>> release_v0.2.0
29 app.use(compression()); // HTTP 요청을 압축 및 해제 58 app.use(compression()); // HTTP 요청을 압축 및 해제
30 app.use(express.json()); 59 app.use(express.json());
31 app.use(express.urlencoded({ extended: true })); 60 app.use(express.urlencoded({ extended: true }));
32 app.use(methodOverride()); 61 app.use(methodOverride());
33 app.use(cors()); 62 app.use(cors());
34 // app.use("/restaurants", require("../app/src/routes/home/restaurant.route")); 63 // app.use("/restaurants", require("../app/src/routes/home/restaurant.route"));
64 +<<<<<<< HEAD
35 require("../app/src/routes/home/restaurant.route")(app); 65 require("../app/src/routes/home/restaurant.route")(app);
36 66
37 app.use("/", home); //미들웨어 등록해주는 method 67 app.use("/", home); //미들웨어 등록해주는 method
68 +=======
69 +// require("../app/src/routes/home/restaurant.route")(app);
70 +
71 +app.use("/", home); //미들웨어 등록해주는 method
72 +
73 +io.on('connection', (socket) => {
74 + socket.on("chatting", (data)=>{
75 + const { name, msg } = data;
76 + io.emit("chatting", {
77 + name,
78 + msg,
79 + time : moment(new Date()).format("h:ss A")})
80 + })
81 +});
82 +
83 +>>>>>>> release_v0.2.0
38 logger.info(`${process.env.NODE_ENV} - API Server Start At Port ${port}`); 84 logger.info(`${process.env.NODE_ENV} - API Server Start At Port ${port}`);
39 85
40 module.exports = app; 86 module.exports = app;
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -19,6 +19,24 @@ ...@@ -19,6 +19,24 @@
19 "kuler": "^2.0.0" 19 "kuler": "^2.0.0"
20 } 20 }
21 }, 21 },
22 +<<<<<<< HEAD
23 +=======
24 + "@types/component-emitter": {
25 + "version": "1.2.11",
26 + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
27 + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
28 + },
29 + "@types/cookie": {
30 + "version": "0.4.1",
31 + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
32 + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
33 + },
34 + "@types/cors": {
35 + "version": "2.8.12",
36 + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
37 + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
38 + },
39 +>>>>>>> release_v0.2.0
22 "@types/mysql": { 40 "@types/mysql": {
23 "version": "2.15.21", 41 "version": "2.15.21",
24 "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", 42 "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz",
...@@ -103,6 +121,14 @@ ...@@ -103,6 +121,14 @@
103 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 121 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
104 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 122 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
105 }, 123 },
124 +<<<<<<< HEAD
125 +=======
126 + "base64id": {
127 + "version": "2.0.0",
128 + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
129 + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
130 + },
131 +>>>>>>> release_v0.2.0
106 "bcrypt-pbkdf": { 132 "bcrypt-pbkdf": {
107 "version": "1.0.2", 133 "version": "1.0.2",
108 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 134 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
...@@ -239,6 +265,14 @@ ...@@ -239,6 +265,14 @@
239 "delayed-stream": "~1.0.0" 265 "delayed-stream": "~1.0.0"
240 } 266 }
241 }, 267 },
268 +<<<<<<< HEAD
269 +=======
270 + "component-emitter": {
271 + "version": "1.3.0",
272 + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
273 + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
274 + },
275 +>>>>>>> release_v0.2.0
242 "compressible": { 276 "compressible": {
243 "version": "2.0.18", 277 "version": "2.0.18",
244 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 278 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
...@@ -406,6 +440,51 @@ ...@@ -406,6 +440,51 @@
406 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 440 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
407 "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 441 "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
408 }, 442 },
443 +<<<<<<< HEAD
444 +=======
445 + "engine.io": {
446 + "version": "6.2.0",
447 + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
448 + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
449 + "requires": {
450 + "@types/cookie": "^0.4.1",
451 + "@types/cors": "^2.8.12",
452 + "@types/node": ">=10.0.0",
453 + "accepts": "~1.3.4",
454 + "base64id": "2.0.0",
455 + "cookie": "~0.4.1",
456 + "cors": "~2.8.5",
457 + "debug": "~4.3.1",
458 + "engine.io-parser": "~5.0.3",
459 + "ws": "~8.2.3"
460 + },
461 + "dependencies": {
462 + "cookie": {
463 + "version": "0.4.2",
464 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
465 + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
466 + },
467 + "debug": {
468 + "version": "4.3.4",
469 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
470 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
471 + "requires": {
472 + "ms": "2.1.2"
473 + }
474 + },
475 + "ms": {
476 + "version": "2.1.2",
477 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
478 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
479 + }
480 + }
481 + },
482 + "engine.io-parser": {
483 + "version": "5.0.4",
484 + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
485 + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
486 + },
487 +>>>>>>> release_v0.2.0
409 "escape-html": { 488 "escape-html": {
410 "version": "1.0.3", 489 "version": "1.0.3",
411 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 490 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
...@@ -1255,6 +1334,67 @@ ...@@ -1255,6 +1334,67 @@
1255 "is-arrayish": "^0.3.1" 1334 "is-arrayish": "^0.3.1"
1256 } 1335 }
1257 }, 1336 },
1337 +<<<<<<< HEAD
1338 +=======
1339 + "socket.io": {
1340 + "version": "4.5.1",
1341 + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz",
1342 + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==",
1343 + "requires": {
1344 + "accepts": "~1.3.4",
1345 + "base64id": "~2.0.0",
1346 + "debug": "~4.3.2",
1347 + "engine.io": "~6.2.0",
1348 + "socket.io-adapter": "~2.4.0",
1349 + "socket.io-parser": "~4.0.4"
1350 + },
1351 + "dependencies": {
1352 + "debug": {
1353 + "version": "4.3.4",
1354 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1355 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1356 + "requires": {
1357 + "ms": "2.1.2"
1358 + }
1359 + },
1360 + "ms": {
1361 + "version": "2.1.2",
1362 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1363 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1364 + }
1365 + }
1366 + },
1367 + "socket.io-adapter": {
1368 + "version": "2.4.0",
1369 + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
1370 + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
1371 + },
1372 + "socket.io-parser": {
1373 + "version": "4.0.4",
1374 + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
1375 + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
1376 + "requires": {
1377 + "@types/component-emitter": "^1.2.10",
1378 + "component-emitter": "~1.3.0",
1379 + "debug": "~4.3.1"
1380 + },
1381 + "dependencies": {
1382 + "debug": {
1383 + "version": "4.3.4",
1384 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1385 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1386 + "requires": {
1387 + "ms": "2.1.2"
1388 + }
1389 + },
1390 + "ms": {
1391 + "version": "2.1.2",
1392 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1393 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1394 + }
1395 + }
1396 + },
1397 +>>>>>>> release_v0.2.0
1258 "sqlstring": { 1398 "sqlstring": {
1259 "version": "2.3.1", 1399 "version": "2.3.1",
1260 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1400 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
...@@ -1467,6 +1607,14 @@ ...@@ -1467,6 +1607,14 @@
1467 } 1607 }
1468 } 1608 }
1469 }, 1609 },
1610 +<<<<<<< HEAD
1611 +=======
1612 + "ws": {
1613 + "version": "8.2.3",
1614 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1615 + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
1616 + },
1617 +>>>>>>> release_v0.2.0
1470 "yallist": { 1618 "yallist": {
1471 "version": "4.0.0", 1619 "version": "4.0.0",
1472 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1620 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
......
...@@ -16,10 +16,18 @@ ...@@ -16,10 +16,18 @@
16 "express": "^4.18.1", 16 "express": "^4.18.1",
17 "jsonwebtoken": "^8.5.1", 17 "jsonwebtoken": "^8.5.1",
18 "method-override": "^3.0.0", 18 "method-override": "^3.0.0",
19 +<<<<<<< HEAD
20 +=======
21 + "moment": "^2.29.3",
22 +>>>>>>> release_v0.2.0
19 "mysql": "^2.18.1", 23 "mysql": "^2.18.1",
20 "mysql2": "^2.2.0", 24 "mysql2": "^2.2.0",
21 "regex-email": "^1.0.2", 25 "regex-email": "^1.0.2",
22 "request": "^2.88.2", 26 "request": "^2.88.2",
27 +<<<<<<< HEAD
28 +=======
29 + "socket.io": "^4.5.1",
30 +>>>>>>> release_v0.2.0
23 "winston": "^3.2.1", 31 "winston": "^3.2.1",
24 "winston-daily-rotate-file": "^4.2.1" 32 "winston-daily-rotate-file": "^4.2.1"
25 }, 33 },
...@@ -31,7 +39,11 @@ ...@@ -31,7 +39,11 @@
31 "prod": "NODE_ENV=production node index.js" 39 "prod": "NODE_ENV=production node index.js"
32 }, 40 },
33 "author": "Jeongmin Seo, Jumi Yang", 41 "author": "Jeongmin Seo, Jumi Yang",
42 +<<<<<<< HEAD
34 "license": "ISC", 43 "license": "ISC",
44 +=======
45 + "license": "MIT",
46 +>>>>>>> release_v0.2.0
35 "keywords": [], 47 "keywords": [],
36 "description": "Node.js API Server" 48 "description": "Node.js API Server"
37 } 49 }
......
...@@ -12,6 +12,7 @@ class User { ...@@ -12,6 +12,7 @@ class User {
12 12
13 async login() { 13 async login() {
14 const client = this.body; 14 const client = this.body;
15 +<<<<<<< HEAD
15 16
16 try { 17 try {
17 try { 18 try {
...@@ -36,6 +37,34 @@ class User { ...@@ -36,6 +37,34 @@ class User {
36 } 37 }
37 } 38 }
38 39
40 +=======
41 +
42 + try {
43 + const connection = await pool.getConnection(async (conn) => conn);
44 + try {
45 + const { id, password } = await UserStorage.getUserInfo(
46 + connection,
47 + client.id
48 + );
49 + if (id) {
50 + if (id === client.id && password === client.password) {
51 + return { success: true };
52 + }
53 + return { success: false, msg: "비밀번호가 틀렸습니다." };
54 + }
55 + return { success: false, msg: "존재하지 않는 아이디입니다." };
56 + } catch (err) {
57 + return { success: false, msg: err };
58 + } finally {
59 + connection.release();
60 + }
61 + } catch (err) {
62 + logger.error(`login DB Connection error\n: ${JSON.stringify(err)}`);
63 + return false;
64 + }
65 + }
66 +
67 +>>>>>>> release_v0.2.0
39 async register() { 68 async register() {
40 const client = this.body; 69 const client = this.body;
41 try { 70 try {
......
...@@ -13,6 +13,7 @@ class UserStorage { ...@@ -13,6 +13,7 @@ class UserStorage {
13 13
14 // static getUsers(isAll, ...fields) {} 14 // static getUsers(isAll, ...fields) {}
15 static async getUserInfo(connection, id) { 15 static async getUserInfo(connection, id) {
16 +<<<<<<< HEAD
16 return new Promise((resolve, reject) => { 17 return new Promise((resolve, reject) => {
17 const query = "SELECT * FROM users WHERE id = ?;"; 18 const query = "SELECT * FROM users WHERE id = ?;";
18 connection.query(query, [id], (err, data) => { 19 connection.query(query, [id], (err, data) => {
...@@ -23,6 +24,20 @@ class UserStorage { ...@@ -23,6 +24,20 @@ class UserStorage {
23 }); 24 });
24 }); 25 });
25 } 26 }
27 +=======
28 + const query = `SELECT * FROM users WHERE id = '${id}';`;
29 + console.log(query);
30 + let [row] = await connection.query(query);
31 + console.log(row[0]);
32 + return row[0];
33 + // , [id], (err, data) => {
34 + // console.log("44444444");
35 + // if (err) reject(`${err}`);
36 + // resolve(data[0]);
37 + // pool.releaseConnection(conn);
38 + // });
39 + }
40 +>>>>>>> release_v0.2.0
26 41
27 static async save (connection, userInfo) { 42 static async save (connection, userInfo) {
28 const query = "INSERT INTO users(id, name, password) VALUES(?, ?, ?);"; 43 const query = "INSERT INTO users(id, name, password) VALUES(?, ?, ?);";
......
1 +* {
2 + margin: 0;
3 + padding: 0;
4 +}
5 +
6 +html, body {
7 + height : 100%;
8 +}
9 +
10 +.wrapper {
11 + height : 100%;
12 + width: 100%;
13 + display: flex;
14 + flex-direction: column;
15 + overflow: hidden;
16 +}
17 +
18 +.user-container {
19 + background: rebeccapurple;
20 + flex: 1;
21 + display: flex;
22 + justify-content: flex-start;
23 + align-items: center;
24 + padding: 0.5rem;
25 +}
26 +
27 +.user-container .nickname {
28 + font-size : 14px;
29 + margin-right : 1.5rem;
30 + margin-left : 1rem;
31 + color:#fff;
32 +}
33 +
34 +.user-container input {
35 + border-radius: 3px;
36 + border: none;
37 + height: 80%;
38 +}
39 +
40 +.display-container {
41 + background: #D2D2FF;
42 + flex : 12;
43 + overflow-y:scroll;
44 +}
45 +
46 +.input-container {
47 + flex:1;
48 + display:flex;
49 + justify-content: stretch;
50 + align-items: stretch;
51 +}
52 +
53 +.input-container span {
54 + display: flex;
55 + justify-content: flex-start;
56 + align-items:center;
57 + padding: 0.3rem;
58 + width: 100%;
59 +}
60 +
61 +.chatting-input {
62 + font-size:12px;
63 + height:100%;
64 + flex:8;
65 + border:none;
66 +}
67 +
68 +.send-button {
69 + flex:1;
70 + background: rebeccapurple;
71 + color:#fff;
72 + border:none;
73 + height:100%;
74 + border-radius:3px;
75 +}
76 +
77 +.chatting-list li {
78 + width:50%;
79 + padding:0.3rem;
80 + display:flex;
81 + justify-content: flex-start;
82 + align-items:flex-end;
83 + margin-top:0.5rem;
84 +}
85 +
86 +.profile {
87 + display: flex;
88 + flex-direction: column;
89 + align-items: center;
90 + justify-content: center;
91 + flex: 1;
92 +}
93 +
94 +.profile .user {
95 + font-size: 10px;
96 + margin-bottom: 0.3rem;
97 +}
98 +
99 +.profile .image {
100 + border-radius: 50%;
101 + object-fit: cover;
102 + width: 50px;
103 + height: 50px;
104 +}
105 +
106 +.message {
107 + border-radius: 5px;
108 + padding: 0.5rem;
109 + font-size: 12px;
110 + margin: 0 5px;
111 + flex: 10;
112 +}
113 +
114 +.time {
115 + font-size: 10px;
116 + margin: 0 5px;
117 +}
118 +
119 +.sent {
120 + flex-direction: row-reverse;
121 + float: right;
122 +}
123 +
124 +.sent .message {
125 + background: #9986EE;
126 + color: #fff;
127 +}
128 +
129 +.received .message {
130 + background: #fff;
131 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -40,7 +40,11 @@ ...@@ -40,7 +40,11 @@
40 cursor: pointer; 40 cursor: pointer;
41 font-family: inherit; 41 font-family: inherit;
42 color :lightslategray; 42 color :lightslategray;
43 +<<<<<<< HEAD
43 margin-right: 30px; 44 margin-right: 30px;
45 +=======
46 + margin-right: 0px;
47 +>>>>>>> release_v0.2.0
44 } 48 }
45 49
46 .category-title { 50 .category-title {
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
7 } 7 }
8 8
9 .infowindow-title { 9 .infowindow-title {
10 +<<<<<<< HEAD
10 font-size: 3rem; 11 font-size: 3rem;
11 } 12 }
12 13
...@@ -16,4 +17,17 @@ ...@@ -16,4 +17,17 @@
16 17
17 .infowindow-btn { 18 .infowindow-btn {
18 font-size: 1.6rem; 19 font-size: 1.6rem;
20 +=======
21 + font-size: 15px;
22 + color: rebeccapurple;
23 + font-weight: 600;
24 +}
25 +
26 +.infowindow-address {
27 + font-size: 8px;
28 +}
29 +
30 +.infowindow-btn {
31 + font-size: 8px;
32 +>>>>>>> release_v0.2.0
19 } 33 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -4,8 +4,13 @@ ...@@ -4,8 +4,13 @@
4 4
5 var container = document.getElementById('map'); //지도를 담을 영역의 DOM 레퍼런스 5 var container = document.getElementById('map'); //지도를 담을 영역의 DOM 레퍼런스
6 var options = { //지도를 생성할 때 필요한 기본 옵션 6 var options = { //지도를 생성할 때 필요한 기본 옵션
7 +<<<<<<< HEAD
7 center: new kakao.maps.LatLng(37.54, 126.96), //지도의 중심좌표. 8 center: new kakao.maps.LatLng(37.54, 126.96), //지도의 중심좌표.
8 level: 7 //지도의 레벨(확대, 축소 정도) 9 level: 7 //지도의 레벨(확대, 축소 정도)
10 +=======
11 + center: new kakao.maps.LatLng(37.248, 127.08), //지도의 중심좌표.
12 + level: 4 //지도의 레벨(확대, 축소 정도)
13 +>>>>>>> release_v0.2.0
9 }; 14 };
10 15
11 var map = new kakao.maps.Map(container, options); //지도 생성 및 객체 리턴 16 var map = new kakao.maps.Map(container, options); //지도 생성 및 객체 리턴
...@@ -18,6 +23,7 @@ ...@@ -18,6 +23,7 @@
18 * 2. 데이터 준비하기(제목, 주소, 카테고리) 23 * 2. 데이터 준비하기(제목, 주소, 카테고리)
19 */ 24 */
20 25
26 +<<<<<<< HEAD
21 const dataSet = [ 27 const dataSet = [
22 { 28 {
23 title: "희락돈까스", 29 title: "희락돈까스",
...@@ -53,6 +59,46 @@ const dataSet = [ ...@@ -53,6 +59,46 @@ const dataSet = [
53 // } 59 // }
54 60
55 // getDataSet(); 61 // getDataSet();
62 +=======
63 +// const dataSet = [
64 +// {
65 +// title: "희락돈까스",
66 +// address: "서울 영등포구 양산로 210",
67 +// category: "양식",
68 +// },
69 +// {
70 +// title: "즉석우동짜장",
71 +// address: "서울 영등포구 대방천로 260",
72 +// category: "한식",
73 +// },
74 +// {
75 +// title: "아카사카",
76 +// address: "서울 서초구 서초대로74길 23",
77 +// category: "일식",
78 +// }
79 +// ];
80 +
81 + async function getDataSet(category) {
82 + let qs = category;
83 + if(!qs) {
84 + qs = "";
85 + }
86 +
87 + const dataSet = await axios({
88 + method: "get", // http method
89 + url: `http://localhost:3000/restaurants?category=${qs}`,
90 + headers: {},
91 + data: {},
92 + });
93 + // console.log(dataSet);
94 +
95 + return dataSet.data.result;
96 +}
97 +
98 +// }
99 +
100 + getDataSet();
101 +>>>>>>> release_v0.2.0
56 102
57 /****************************************************************************** 103 /******************************************************************************
58 * 3. 여러개 마커찍기 104 * 3. 여러개 마커찍기
...@@ -75,7 +121,11 @@ const dataSet = [ ...@@ -75,7 +121,11 @@ const dataSet = [
75 }); 121 });
76 } 122 }
77 123
124 +<<<<<<< HEAD
78 setMap(dataSet); 125 setMap(dataSet);
126 +=======
127 +// setMap(dataSet);
128 +>>>>>>> release_v0.2.0
79 129
80 /* 130 /*
81 ************************************************************* 131 *************************************************************
...@@ -170,6 +220,10 @@ const dataSet = [ ...@@ -170,6 +220,10 @@ const dataSet = [
170 const categoryId = event.target.id; 220 const categoryId = event.target.id;
171 const category = categoryMap[categoryId]; 221 const category = categoryMap[categoryId];
172 222
223 +<<<<<<< HEAD
224 +=======
225 +
226 +>>>>>>> release_v0.2.0
173 try { 227 try {
174 // 데이터 분류 228 // 데이터 분류
175 let categorizedDataSet = await getDataSet(category); 229 let categorizedDataSet = await getDataSet(category);
...@@ -194,6 +248,7 @@ const dataSet = [ ...@@ -194,6 +248,7 @@ const dataSet = [
194 } 248 }
195 } 249 }
196 250
251 +<<<<<<< HEAD
197 setMap(dataSet); 252 setMap(dataSet);
198 253
199 // async function setting() { 254 // async function setting() {
...@@ -206,4 +261,16 @@ const dataSet = [ ...@@ -206,4 +261,16 @@ const dataSet = [
206 // } 261 // }
207 // } 262 // }
208 263
209 -// setting();
...\ No newline at end of file ...\ No newline at end of file
264 +// setting();
265 +=======
266 + async function setting() {
267 + try {
268 + const dataSet = await getDataSet();
269 + setMap(dataSet);
270 + } catch (error) {
271 + console.error(error);
272 + }
273 + }
274 +
275 + setting();
276 +>>>>>>> release_v0.2.0
......
1 +"use strict";
2 +
3 +const socketIO = require("socket.io");
4 +const http = require("http");
5 +const app = express();
6 +const server = http.createServer(app);
7 +const io = socketIO(server);
8 +const socket = io();
9 +//.connect("http://localhost:3000/chat", {transports:['websocket']});
10 +
11 +const nickname = document.querySelector("#nickname")
12 +const chatlist = document.querySelector(".chatting-list")
13 +const chatInput = document.querySelector(".chatting-input")
14 +const sendButton = document.querySelector(".send-button")
15 +const displayContainer = document.querySelector(".display-container")
16 +
17 +chatInput.addEventListener("keypress", (event)=> {
18 + if(event.keyCode === 13) {
19 + send()
20 + }
21 +})
22 +
23 +function send() {
24 + const param = {
25 + name: nickname.value,
26 + msg: chatInput.value
27 + }
28 + socket.emit("chatting", param)
29 +}
30 +
31 +sendButton.addEventListener("click", send)
32 +
33 +socket.on("chatting", (data)=>{
34 + console.log(data)
35 + const {name, msg, time} = data;
36 + const item = new LiModel(name, msg, time);
37 + item.makeLi()
38 + displayContainer.scrollTo(0, displayContainer.scrollHeight)
39 +})
40 +
41 +//console.log(socket);
42 +
43 +function LiModel(name, msg, time) {
44 + this.name = name;
45 + this.msg = msg;
46 + this.time = time;
47 +
48 + this.makeLi = ()=>{
49 + const li = document.createElement("li");
50 + li.classList.add(nickname.value === this.name ? "sent":"received")
51 + const dom = `<span class="profile">
52 + <span class="user">${this.name}</span>
53 + <img class="image" src="https://placeimg.com/50/50/any" alt="any">
54 + </span>
55 + <span class="message">${this.msg}</span>
56 + <span class="time">${this.time}</span>`;
57 +
58 + li.innerHTML = dom;
59 + chatlist.appendChild(li)
60 + }
61 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -12,6 +12,10 @@ function login() { ...@@ -12,6 +12,10 @@ function login() {
12 password : password.value, 12 password : password.value,
13 }; 13 };
14 14
15 +<<<<<<< HEAD
16 +=======
17 + // console.log("login value : ", id.value);
18 +>>>>>>> release_v0.2.0
15 fetch("/login", { 19 fetch("/login", {
16 method: "POST", 20 method: "POST",
17 headers: { 21 headers: {
......
...@@ -12,7 +12,10 @@ async function register() { ...@@ -12,7 +12,10 @@ async function register() {
12 if(!id.value) { 12 if(!id.value) {
13 return alert("아이디를 입력해주세요.") 13 return alert("아이디를 입력해주세요.")
14 } 14 }
15 +<<<<<<< HEAD
15 16
17 +=======
18 +>>>>>>> release_v0.2.0
16 if(!name.value) { 19 if(!name.value) {
17 return alert("이름을 입력해주세요.") 20 return alert("이름을 입력해주세요.")
18 } 21 }
...@@ -25,13 +28,18 @@ async function register() { ...@@ -25,13 +28,18 @@ async function register() {
25 if (password.value !== confirmPassword.value) { 28 if (password.value !== confirmPassword.value) {
26 return alert("비밀번호가 일치하지 않습니다.") 29 return alert("비밀번호가 일치하지 않습니다.")
27 } 30 }
31 +<<<<<<< HEAD
28 32
33 +=======
34 +
35 +>>>>>>> release_v0.2.0
29 const req = { 36 const req = {
30 id: id.value, 37 id: id.value,
31 name: name.value, 38 name: name.value,
32 password: password.value, 39 password: password.value,
33 }; 40 };
34 41
42 +<<<<<<< HEAD
35 console.log("id : ", req.id); 43 console.log("id : ", req.id);
36 try { 44 try {
37 const response = await fetch("/register", { 45 const response = await fetch("/register", {
...@@ -45,5 +53,39 @@ async function register() { ...@@ -45,5 +53,39 @@ async function register() {
45 } catch(e) { 53 } catch(e) {
46 console.log(e); 54 console.log(e);
47 } 55 }
56 +=======
57 + fetch("/register", {
58 + method: "POST",
59 + headers: {
60 + "Content-Type": "application/json",
61 + },
62 + body: JSON.stringify(req),
63 + })
64 + .then((res) => res.json())
65 + .then((res) => {
66 + if (res.success) {
67 + location.href = "/login";
68 + } else {
69 + if (res.err) return alert(res.err);
70 + alert(res.msg);
71 + }
72 + })
73 + .catch((err) => {
74 + console.error("회원가입 중 에러 발생");
75 + });
76 +
77 + // try {
78 + // const response = await fetch("/register", {
79 + // method: "POST",
80 + // headers: {
81 + // "Content-Type": "application/json"
82 + // },
83 + // body: JSON.stringify(req),
84 + // });
85 + // console.log("테스트 : ", response);
86 + // } catch(e) {
87 + // console.log(e);
88 + // }
89 +>>>>>>> release_v0.2.0
48 90
49 } 91 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -16,6 +16,13 @@ const output = { ...@@ -16,6 +16,13 @@ const output = {
16 res.render("home/register"); 16 res.render("home/register");
17 }, 17 },
18 18
19 +<<<<<<< HEAD
20 +=======
21 + chat: (req, res) => {
22 + res.render("home/chat");
23 + },
24 +
25 +>>>>>>> release_v0.2.0
19 // restaurants: (req, res) => { 26 // restaurants: (req, res) => {
20 // res.render("home/restaurants"); 27 // res.render("home/restaurants");
21 // } 28 // }
...@@ -31,6 +38,10 @@ const process = { ...@@ -31,6 +38,10 @@ const process = {
31 register: async (req, res) => { 38 register: async (req, res) => {
32 const user = new User(req.body); 39 const user = new User(req.body);
33 const response = await user.register(); 40 const response = await user.register();
41 +<<<<<<< HEAD
42 +=======
43 + // console.log("req.body", req.body);
44 +>>>>>>> release_v0.2.0
34 // console.log(res.json(response)); 45 // console.log(res.json(response));
35 // console.log(res.json(response).statusCode); => 이거도 잘 찍혔음. 46 // console.log(res.json(response).statusCode); => 이거도 잘 찍혔음.
36 return res.json(response); 47 return res.json(response);
......
...@@ -6,10 +6,19 @@ const jwtMiddleware = require("../../config/jwtMiddleware"); ...@@ -6,10 +6,19 @@ const jwtMiddleware = require("../../config/jwtMiddleware");
6 // const Restaurant = require("../../models/Restaurant"); 6 // const Restaurant = require("../../models/Restaurant");
7 7
8 const ctrl = require("./home.ctrl"); 8 const ctrl = require("./home.ctrl");
9 +<<<<<<< HEAD
10 +=======
11 +const index = require("../../models/Restaurant");
12 +>>>>>>> release_v0.2.0
9 13
10 router.get("/", ctrl.output.hello); 14 router.get("/", ctrl.output.hello);
11 router.get("/login", ctrl.output.login); 15 router.get("/login", ctrl.output.login);
12 router.get("/register", ctrl.output.register); 16 router.get("/register", ctrl.output.register);
17 +<<<<<<< HEAD
18 +=======
19 +router.get("/restaurants", index.readRestaurants);
20 +router.get("/chat", ctrl.output.chat);
21 +>>>>>>> release_v0.2.0
13 // router.get("/restaurants", Restaurant.restaurants); 22 // router.get("/restaurants", Restaurant.restaurants);
14 // router.get("/restaurants", ctrl.output.restaurants); 23 // router.get("/restaurants", ctrl.output.restaurants);
15 24
......
...@@ -4,7 +4,37 @@ ...@@ -4,7 +4,37 @@
4 <meta charset="UTF-8" /> 4 <meta charset="UTF-8" />
5 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 +<<<<<<< HEAD
7 <title>채팅</title> 8 <title>채팅</title>
8 </head> 9 </head>
9 <body></body> 10 <body></body>
11 +=======
12 + <title>채팅방</title>
13 + <link rel="stylesheet" href="/css/home/chat.css" />
14 + </head>
15 + <body>
16 + <div class="wrapper">
17 + <div class="user-container">
18 + <lable class="nickname" for="nickname">닉네임설정</lable>
19 + <input type="text" id="nickname" />
20 + </div>
21 + <div class="display-container">
22 + <ul class="chatting-list"></ul>
23 + </div>
24 + <div class="input-container">
25 + <span>
26 + <input type="text" class="chatting-input" />
27 + <button class="send-button">전송</button>
28 + </span>
29 + </div>
30 + </div>
31 + <script
32 + src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.1/socket.io.js"
33 + integrity="sha512-9mpsATI0KClwt+xVZfbcf2lJ8IFBAwsubJ6mI3rtULwyM3fBmQFzj0It4tGqxLOGQwGfJdk/G+fANnxfq9/cew=="
34 + crossorigin="anonymous"
35 + referrerpolicy="no-referrer"
36 + ></script>
37 + <script src="/js/home/chat.js"></script>
38 + </body>
39 +>>>>>>> release_v0.2.0
10 </html> 40 </html>
......
...@@ -9,14 +9,22 @@ ...@@ -9,14 +9,22 @@
9 <meta name="description" content="맛집지도 서비스" /> 9 <meta name="description" content="맛집지도 서비스" />
10 <meta name="keywords" content="맛집지도, 맛집추천, 실시간채팅" /> 10 <meta name="keywords" content="맛집지도, 맛집추천, 실시간채팅" />
11 <link rel="stylesheet" href="/css/home/index.css" /> 11 <link rel="stylesheet" href="/css/home/index.css" />
12 +<<<<<<< HEAD
12 <script src="/js/home/axios-index.js"></script> 13 <script src="/js/home/axios-index.js"></script>
14 +=======
15 + <link rel="stylesheet" href="/css/home/map.css" />
16 +>>>>>>> release_v0.2.0
13 </head> 17 </head>
14 <body> 18 <body>
15 <nav> 19 <nav>
16 <div class="inner"> 20 <div class="inner">
17 <div class="nav-container"> 21 <div class="nav-container">
18 <h1 class="nav-title">맛집지도</h1> 22 <h1 class="nav-title">맛집지도</h1>
23 +<<<<<<< HEAD
19 <button class="nav-contact">Chatting Rooms</button> 24 <button class="nav-contact">Chatting Rooms</button>
25 +=======
26 + <button class="nav-contact">Contact : balljm@naver.com</button>
27 +>>>>>>> release_v0.2.0
20 </div> 28 </div>
21 </div> 29 </div>
22 </nav> 30 </nav>
...@@ -49,11 +57,20 @@ ...@@ -49,11 +57,20 @@
49 type="text/javascript" 57 type="text/javascript"
50 src="//dapi.kakao.com/v2/maps/sdk.js?appkey=e55f753363b95e27b799aa6286a6c398&libraries=services" 58 src="//dapi.kakao.com/v2/maps/sdk.js?appkey=e55f753363b95e27b799aa6286a6c398&libraries=services"
51 ></script> 59 ></script>
60 +<<<<<<< HEAD
52 <!-- <script 61 <!-- <script
62 +=======
63 + <script
64 +>>>>>>> release_v0.2.0
53 src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.0.0-alpha.1/axios.min.js" 65 src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.0.0-alpha.1/axios.min.js"
54 integrity="sha512-xIPqqrfvUAc/Cspuj7Bq0UtHNo/5qkdyngx6Vwt+tmbvTLDszzXM0G6c91LXmGrRx8KEPulT+AfOOez+TeVylg==" 66 integrity="sha512-xIPqqrfvUAc/Cspuj7Bq0UtHNo/5qkdyngx6Vwt+tmbvTLDszzXM0G6c91LXmGrRx8KEPulT+AfOOez+TeVylg=="
55 crossorigin="anonymous" 67 crossorigin="anonymous"
56 referrerpolicy="no-referrer" 68 referrerpolicy="no-referrer"
69 +<<<<<<< HEAD
57 ></script> --> 70 ></script> -->
71 +=======
72 + ></script>
73 + <script src="/js/home/axios-index.js"></script>
74 +>>>>>>> release_v0.2.0
58 </body> 75 </body>
59 </html> 76 </html>
......