Heeyeon

Connecting youtube api

...@@ -6,7 +6,7 @@ const fs=require('fs'); ...@@ -6,7 +6,7 @@ const fs=require('fs');
6 const router = express.Router() 6 const router = express.Router()
7 const fileStore = require('session-file-store')(session); 7 const fileStore = require('session-file-store')(session);
8 const app = express(); 8 const app = express();
9 -var flash = require('connect-flash'); 9 +var flash = require('connect-flash');
10 var NaverStrategy = require('passport-naver').Strategy; 10 var NaverStrategy = require('passport-naver').Strategy;
11 var KakaoStrategy = require('passport-kakao').Strategy; 11 var KakaoStrategy = require('passport-kakao').Strategy;
12 12
...@@ -38,7 +38,7 @@ passport.deserializeUser(function(id, done) { //읽기 ...@@ -38,7 +38,7 @@ passport.deserializeUser(function(id, done) { //읽기
38 38
39 //첫 페이지 39 //첫 페이지
40 app.get('/',(req,res)=>{ 40 app.get('/',(req,res)=>{
41 - let page = getFirstPage('Passport','This is Passport Example Page',authInfo(req)); 41 + let page = getFirstPage('Welcome!','Food Recipe',authInfo(req));
42 res.send(page); 42 res.send(page);
43 }); 43 });
44 44
...@@ -57,7 +57,7 @@ app.get('/main',(req,res)=>{ ...@@ -57,7 +57,7 @@ app.get('/main',(req,res)=>{
57 //로그인 페이지 57 //로그인 페이지
58 app.get('/login',(req,res)=>{ 58 app.get('/login',(req,res)=>{
59 let page = getLoginButton(`<a href="/">뒤로가기</a>`); 59 let page = getLoginButton(`<a href="/">뒤로가기</a>`);
60 - res.send(page); 60 + res.send(page);
61 }); 61 });
62 62
63 63
...@@ -75,7 +75,7 @@ passport.use(new LocalStrategy({ ...@@ -75,7 +75,7 @@ passport.use(new LocalStrategy({
75 console.log(user); 75 console.log(user);
76 76
77 //아이디가 다를때 77 //아이디가 다를때
78 - if (id !== user.email){ 78 + if (id !== user.email){
79 //alert("존재하는 아이디가 없습니다.") 79 //alert("존재하는 아이디가 없습니다.")
80 return done(null, false, { message: '아이디가 다르다' });} 80 return done(null, false, { message: '아이디가 다르다' });}
81 //비밀번호가 다를때 81 //비밀번호가 다를때
...@@ -89,18 +89,18 @@ passport.use(new LocalStrategy({ ...@@ -89,18 +89,18 @@ passport.use(new LocalStrategy({
89 89
90 //로그인 처리 (Passport) 90 //로그인 처리 (Passport)
91 app.post('/login', 91 app.post('/login',
92 -passport.authenticate('local', { 92 +passport.authenticate('local', {
93 //성공시, 메인페이지 이동 93 //성공시, 메인페이지 이동
94 //실패시 로그인 페이지 이동 94 //실패시 로그인 페이지 이동
95 successRedirect: '/', 95 successRedirect: '/',
96 failureRedirect: '/login', 96 failureRedirect: '/login',
97 badRequestMessage : 'Missing username or password.', 97 badRequestMessage : 'Missing username or password.',
98 - failureFlash: true 98 + failureFlash: true
99 })); 99 }));
100 100
101 //로그 아웃 처리 101 //로그 아웃 처리
102 app.get('/logout',(req,res)=>{ 102 app.get('/logout',(req,res)=>{
103 - 103 +
104 //passport 정보 삭제 104 //passport 정보 삭제
105 req.logout(); 105 req.logout();
106 //서버측 세션 삭제 106 //서버측 세션 삭제
...@@ -124,20 +124,20 @@ const authInfo = (req)=>{ ...@@ -124,20 +124,20 @@ const authInfo = (req)=>{
124 // naver 로그인 124 // naver 로그인
125 app.get('/naverlogin', passport.authenticate('naver')); 125 app.get('/naverlogin', passport.authenticate('naver'));
126 passport.use('naver',new NaverStrategy({ 126 passport.use('naver',new NaverStrategy({
127 - clientID: 'CGVVomc0bhMhzfzbytK2', 127 + clientID: 'CGVVomc0bhMhzfzbytK2',
128 - clientSecret: 'XHylcjnZxG', 128 + clientSecret: 'XHylcjnZxG',
129 callbackURL: "http://localhost:3000/", 129 callbackURL: "http://localhost:3000/",
130 svcType: 0, 130 svcType: 0,
131 authType: 'reauthenticate' // enable re-authentication 131 authType: 'reauthenticate' // enable re-authentication
132 - }, 132 + },
133 - 133 +
134 - function(accessToken, refreshToken, profile, done) { 134 + function(accessToken, refreshToken, profile, done) {
135 var _profile = profile._json; 135 var _profile = profile._json;
136 console.log(_profile.id); 136 console.log(_profile.id);
137 console.log(_profile.properties.nickname); 137 console.log(_profile.properties.nickname);
138 - } 138 + }
139 )); 139 ));
140 - 140 +
141 141
142 // kakao 로그인 142 // kakao 로그인
143 app.get('/kakaologin', passport.authenticate('kakao-login')); 143 app.get('/kakaologin', passport.authenticate('kakao-login'));
...@@ -230,7 +230,7 @@ app.get('/join',(req,res)=>{ ...@@ -230,7 +230,7 @@ app.get('/join',(req,res)=>{
230 </style><link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> 230 </style><link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
231 <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script> 231 <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
232 <script src="//code.jquery.com/jquery-1.11.1.min.js"></script> 232 <script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
233 - 233 +
234 </head> 234 </head>
235 235
236 <body> 236 <body>
...@@ -254,7 +254,7 @@ app.get('/join',(req,res)=>{ ...@@ -254,7 +254,7 @@ app.get('/join',(req,res)=>{
254 </button> 254 </button>
255 </form> 255 </form>
256 </html> 256 </html>
257 - 257 +
258 `,'<a href="/login">뒤로가기</a>'); 258 `,'<a href="/login">뒤로가기</a>');
259 res.send(page); 259 res.send(page);
260 }); 260 });
...@@ -378,7 +378,7 @@ const getLoginButton = (auth) =>{ ...@@ -378,7 +378,7 @@ const getLoginButton = (auth) =>{
378 <button type="submit" class="btn btn btn-primary"> 378 <button type="submit" class="btn btn btn-primary">
379 <a href="/join" style="color:white;text-decoration-line:none;"> 회원가입</a> 379 <a href="/join" style="color:white;text-decoration-line:none;"> 회원가입</a>
380 </form> 380 </form>
381 - 381 +
382 </div> 382 </div>
383 </div> 383 </div>
384 </div> 384 </div>
...@@ -387,8 +387,8 @@ const getLoginButton = (auth) =>{ ...@@ -387,8 +387,8 @@ const getLoginButton = (auth) =>{
387 <a href="/naverlogin" class="btn btn-block btn-lg btn-success btn_login">Naver</a> 387 <a href="/naverlogin" class="btn btn-block btn-lg btn-success btn_login">Naver</a>
388 <a href="/kakaologin" class="btn btn-block btn-lg btn-warning btn_login">KaKao</a> 388 <a href="/kakaologin" class="btn btn-block btn-lg btn-warning btn_login">KaKao</a>
389 </div> 389 </div>
390 - 390 +
391 - 391 +
392 </body> 392 </body>
393 </html> 393 </html>
394 `; 394 `;
...@@ -397,6 +397,7 @@ const getLoginButton = (auth) =>{ ...@@ -397,6 +397,7 @@ const getLoginButton = (auth) =>{
397 397
398 //첫 페이지 화면 398 //첫 페이지 화면
399 const getFirstPage =(title, content, auth) =>{ 399 const getFirstPage =(title, content, auth) =>{
400 +<<<<<<< HEAD
400 return ` 401 return `
401 <!DOCTYPE html> 402 <!DOCTYPE html>
402 <html lang="en"> 403 <html lang="en">
...@@ -420,6 +421,76 @@ const getFirstPage =(title, content, auth) =>{ ...@@ -420,6 +421,76 @@ const getFirstPage =(title, content, auth) =>{
420 </body> 421 </body>
421 </html> 422 </html>
422 `; 423 `;
424 +=======
425 + return `
426 + <!DOCTYPE html>
427 + <html lang="en">
428 + <head>
429 + <meta charset="UTF-8">
430 + <meta http-equiv="X-UA-Compatible" content="IE=edge">
431 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
432 + <title>Passport Example</title>
433 + <style>
434 + body{
435 + height: 100vh;
436 + background-image: url('https://images.unsplash.com/photo-1614548539924-5c1f205b3747?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1170&q=80');
437 + background-position: center;
438 + background-repeat: no-repeat;
439 + background-size: cover;
440 + background-attachment: scroll;
441 + }
442 + h1 {
443 + position: absolute;
444 + left: 50%;
445 + top: 30%;
446 + transform: translate(-50%, -30%);
447 + text-align: center;
448 + font-size: 5em;
449 + font-family: cursive;;
450 + }
451 + p {
452 + position: relative;
453 + left: 50%;
454 + top: 47%;
455 + transform: translate(-50%, -47%);
456 + font-size: 3em;
457 + text-align: center;
458 + }
459 + div {
460 + position: relative;
461 + font-size: 1.3em;
462 + text-align: center;
463 + }
464 + .box1{
465 + position: relative;
466 + left: 50%;
467 + top: 50%;
468 + transform: translate(-50%, -50%);
469 + }
470 + .box2{
471 + position: relative;
472 + left: 50%;
473 + top: 54%;
474 + transform: translate(-50%, -54%);
475 + }
476 + </style>
477 + </head>
478 + <body>
479 + <h1>${title}</h1>
480 + <p>${content}</p>
481 + <div class="box1">
482 + ${auth}
483 + </div>
484 + <div class="box2">
485 + <input type="button" value="레시피 보러가기" onClick="movepage()"/>
486 + </div>
487 + <script type="text/javascript">
488 + function movepage(){
489 + location.href="main";
490 + }</script>
491 + </body>
492 + </html>
493 + `;
494 +>>>>>>> fdaabc0a001fe31ed43809b64f9073ff18fd1db6
423 495
424 } 496 }
425 -
......
This diff is collapsed. Click to expand it.
...@@ -4,23 +4,69 @@ ...@@ -4,23 +4,69 @@
4 box-sizing:border-box; 4 box-sizing:border-box;
5 } 5 }
6 .containter{ 6 .containter{
7 + position:relative;
7 width:90%; 8 width:90%;
8 height:auto; 9 height:auto;
9 max-width:1200px; 10 max-width:1200px;
10 - margin:0 auto; 11 + margin:0;/*auto*/
12 + color:black;
11 } 13 }
12 form{ 14 form{
13 - width:50%; 15 + width:90%;
14 - max-width:400px;
15 border-radius:4px; 16 border-radius:4px;
17 + margin-top:-10px;
18 + margin-left:10px;
19 + background-color:white;
20 +}
21 +form{
22 + display:inline-block;
16 } 23 }
17 -form input{ 24 +.search-result{
25 + /*여러줄로 보여주기 위해선 grid 사용해야하는데, 우선은 영상목록 뽑아보고 결정*/
26 + /*grid로 바꿔놓음. 여러 열로 사진들이 정렬됨*/
27 + display:grid;
28 + grid-gap:25px;
29 + grid-template:auto/repeat(auto-fit,minmax(300px,1fr));
30 + margin-top:50px;
18 width:100%; 31 width:100%;
32 + margin-left:265px;
33 +}
34 +/*form input{
35 + width:80%;
36 + padding:10px;
37 + border:none;
38 + outline:none;
39 + font-size:1.8rem;
40 + display:inline-block;
19 } 41 }
20 form ion-icon{ 42 form ion-icon{
21 width:9%; 43 width:9%;
22 font-size:3rem; 44 font-size:3rem;
23 - margin:-15px; 45 + margin-left:10px;
46 + margin-top:15px;
24 color:rgb(75,75,75); 47 color:rgb(75,75,75);
25 -
26 -}
...\ No newline at end of file ...\ No newline at end of file
48 +}*/
49 +.search-box{
50 + margin-left:-10px;
51 + margin-top:10px;
52 +}
53 +img{
54 + width:80%;
55 + height:80%;
56 + object-fit:cover;
57 +}
58 +html{
59 + font-size:12px;
60 +}
61 +section{
62 + min-height:10vh;
63 + width:100%;
64 + display:flex;
65 + padding:100px 0;
66 +}
67 +.brand{
68 + margin-top:-70px;
69 + font-size:4rem;
70 + color:black;
71 + margin-bottom:30px;
72 +}
......
1 - 1 +<!DOCTYPE html>
2 - <!DOCTYPE html> 2 +<html lang="en">
3 - <html lang="en"> 3 +<head>
4 - <head> 4 + <meta charset="UTF-8">
5 - <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Document</title>
7 - <title>Document</title> 7 + <link rel="stylesheet" href="main.css">
8 - <link rel="style sheet" href="main.css"> 8 +</head>
9 - </head> 9 +<body>
10 - <body> 10 + <section>
11 - <section> 11 + <div class="container">
12 - <div class="container"> 12 + <h1 class="brand">Recipe APP</h1>
13 - <h1 class="brand">Recipe APP</h1> 13 + <form>
14 - <div class="serach-box"> 14 + <input id="name" type="text" placeholder="Search Your Recipe...">
15 - <form> 15 + <ion-icon name="search"></ion-icon>
16 - <input id="name" type="text" placeholder="Search Your Recipe..."> 16 + </form>
17 - <ion-icon name="search"></ion-icon> 17 + <div class="search-result">
18 - </form> 18 + <!--<div class="item">
19 + <img src="./0.jpg" alt="">
20 + <div class="flex-container">
21 + <h1 class="title">This is a recipe</h1>
22 + <a href="#">View Recipe</a>
19 </div> 23 </div>
20 - <div class="search-result"> 24 + <p class="item-data">Calories: 120</p>
21 - <!--<div class="item"> 25 + </div>-->
22 - <img src="./0.jpg" alt=""> 26 + </div>
23 - <div class="flex-container"> 27 + </div>
24 - <h1 class="title">This is a recipe</h1> 28 + </section>
25 - <a href="#">View Recipe</a> 29 + <script src="./main.js"></script>
26 - </div> 30 + <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
27 - <p class="item-data">Calories: 120</p> 31 + <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
28 - </div>--> 32 +</body>
29 - </div> 33 +</html>
30 - </div>
31 - </section>
32 - <script src="./main.js"></script>
33 - <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
34 - <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
35 - </body>
36 - </html>
......
...@@ -12,7 +12,7 @@ searchForm.addEventListener('submit', function(event){ ...@@ -12,7 +12,7 @@ searchForm.addEventListener('submit', function(event){
12 event.preventDefault(); 12 event.preventDefault();
13 } 13 }
14 else{ 14 else{
15 - event.preventDefault(); 15 + event.preventDefault();
16 searchQuery = event.target.querySelector('input').value; 16 searchQuery = event.target.querySelector('input').value;
17 fetchAPI(); 17 fetchAPI();
18 } 18 }
...@@ -27,6 +27,9 @@ async function fetchAPI(){ ...@@ -27,6 +27,9 @@ async function fetchAPI(){
27 function boxinfo(results){ 27 function boxinfo(results){
28 let boxsinfo =''; 28 let boxsinfo ='';
29 results.map(result => { 29 results.map(result => {
30 + const object = {
31 + cal: result.recipe.calories.toFixed(0)
32 + };
30 boxsinfo += 33 boxsinfo +=
31 ` 34 `
32 <style> 35 <style>
...@@ -34,25 +37,35 @@ function boxinfo(results){ ...@@ -34,25 +37,35 @@ function boxinfo(results){
34 display:flex; 37 display:flex;
35 flex-wrap:wrap; 38 flex-wrap:wrap;
36 margin-left:50px auto; 39 margin-left:50px auto;
37 - } 40 + }
38 .container{ 41 .container{
39 display:flex; 42 display:flex;
40 flex-wrap:wrap; 43 flex-wrap:wrap;
41 margin-left:50px auto; 44 margin-left:50px auto;
42 - 45 + }
43 - }
44 <!--검색결과사진,레시피정보 모두 검색창 옆으로 가게하는거까지는 되었고 2열씩 정렬하려 했는데 2열 정렬 부분이 미완성. 우선 사진 옆으로 정보만 수평으로 뜸--> 46 <!--검색결과사진,레시피정보 모두 검색창 옆으로 가게하는거까지는 되었고 2열씩 정렬하려 했는데 2열 정렬 부분이 미완성. 우선 사진 옆으로 정보만 수평으로 뜸-->
45 <!--검색결과 뜰 시에 검색창 위치가 바뀌는 문제 있음--> 47 <!--검색결과 뜰 시에 검색창 위치가 바뀌는 문제 있음-->
46 -
47 -
48 </style> 48 </style>
49 <div class="item"> 49 <div class="item">
50 <img src="${result.recipe.image}" alt=""> 50 <img src="${result.recipe.image}" alt="">
51 <div class="flex-container"> 51 <div class="flex-container">
52 <h1 class="title">${result.recipe.label}</h1> 52 <h1 class="title">${result.recipe.label}</h1>
53 <a href="${result.recipe.url}" target="_blank">View Recipe</a> 53 <a href="${result.recipe.url}" target="_blank">View Recipe</a>
54 + <!--result.recipe.labe에 + home + recipe 한 검색결과 페이지를 버튼에 링크시켜놓음-->
55 + <a href="https://www.youtube.com/results?search_query=${result.recipe.label}+home+recipe" target="_blank">View Videos</a>
54 </div> 56 </div>
55 - <p class="item-data">Calories: ${result.recipe.calories.toFixed(0)}</p> 57 + ${(cal => {
58 + if (cal >= 2000) {
59 + return `<p style="color:red">${cal}</p>`;
60 + }
61 + else if(cal >= 1000 && cal < 2000){
62 + return `<p style="color:yellow">${cal}</p>`;
63 + }
64 + else {
65 + return `<p style="color:green">${cal}</p>`;
66 + }
67 + })(object.cal)
68 + }
56 </div> 69 </div>
57 ` 70 `
58 }) 71 })
......
1 +{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"flash":{"error":["Missing username or password.","Missing username or password."]},"__lastAccess":1638672404811}
...\ No newline at end of file ...\ No newline at end of file