Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Hyunjong Lee
/
YTMT
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
hyunjong
2019-05-21 16:14:03 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
7c66ce7157693db59d9691292cacde142d4c4e7c
7c66ce71
1 parent
f2b0f3a6
프로젝트 진행하기 전 코드를 위해하기위한 주석달기
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
124 additions
and
62 deletions
app.js
bin/www
routes/index.js
routes/mytoons.js
routes/setting.js
routes/users.js
routes/yourtoons.js
app.js
View file @
7c66ce7
/*
bin - 이 폴더 안에는 www.js 파일이 잇으며 www.js는 http 서버를 구동시키는 로직이 들어있다.
node_modules - 모듈들이 설치되는 공간
public - http 서버의 root 폴더고 stylesheets나 images 같은 데이터를 저장할 때 사용한다.
routes - 라우팅을 해주는 역할, 주소를 입력했을 때 어디로 연결해 줄지 결정해주는 javaScript 파일들을 모아놓는 곳입니다.
views - 웹 브라우져에 보여질 디자인을 작성하는 곳이다
*/
// http웹 서버 구조를 쉽게 만들 수 있도록 도와주는 프레임워크
var
express
=
require
(
'express'
);
var
session
=
require
(
'express-session'
);
// 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈, https://horajjan.blog.me/221337515650
var
path
=
require
(
'path'
);
// favorites icon의 약자로 웹페이지나 웹사이트를 대표하는 아이콘
var
favicon
=
require
(
'serve-favicon'
);
// 웹 요청에 대해 로그를 출력하는 미들웨어, 외부 모듈이기 때문에 별도로 설치해서 사용
var
logger
=
require
(
'morgan'
);
// 쿠키를 제어하는 모듈
var
cookieParser
=
require
(
'cookie-parser'
);
// post 요청 데이터를 추출하는 미들웨어
var
bodyParser
=
require
(
'body-parser'
);
// mysql과 연동을 위한 모듈
var
mysql
=
require
(
'mysql'
);
// JQuery를 서버사이드에 맞게 수정한 것
var
cheerio
=
require
(
'cheerio'
);
// 웹페이지 크롤링과 파씽을 위한 HTTP 클라이언트 라이브러리
var
request
=
require
(
'request'
);
// 로그인, 인증관련 미들웨어
var
passport
=
require
(
'passport'
);
var
index
=
require
(
'./routes/index'
);
var
users
=
require
(
'./routes/users'
);
var
mytoons
=
require
(
'./routes/mytoons'
);
var
yourtoons
=
require
(
'./routes/yourtoons'
);
var
passport
=
require
(
'passport'
);
var
yourtoons
=
require
(
'./routes/yourtoons'
);
var
setting
=
require
(
'./routes/setting'
);
var
session
=
require
(
'express-session'
);
//
port
//
최초 로그인 성공시 (Strategy 성공시) 단 한번만 호출
passport
.
serializeUser
(
function
(
user
,
done
)
{
console
.
log
(
'serialized'
);
done
(
null
,
user
);
});
// 페이지 리로드마다 (서버로 들어오는 requset) 로그인한 사용자인지 조회
passport
.
deserializeUser
(
function
(
user
,
done
)
{
console
.
log
(
'deserialized'
);
done
(
null
,
user
);
...
...
@@ -33,13 +66,14 @@ app.set('views', path.join(__dirname, 'views'));
app
.
set
(
'view engine'
,
'ejs'
);
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
//
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app
.
use
(
logger
(
'dev'
));
app
.
use
(
bodyParser
.
json
());
app
.
use
(
bodyParser
.
urlencoded
({
extended
:
false
}));
app
.
use
(
cookieParser
());
app
.
use
(
express
.
static
(
path
.
join
(
__dirname
,
'public'
)));
//
connection
=
mysql
.
createConnection
({
host
:
'localhost'
,
user
:
'root'
,
...
...
@@ -48,12 +82,14 @@ connection = mysql.createConnection({
database
:
'YTMT'
});
//
app
.
use
(
session
({
secret
:
'secrettexthere'
,
saveUninitialized
:
true
,
resave
:
true
}));
//app.use(express.static('views'));
app
.
use
(
passport
.
initialize
());
app
.
use
(
passport
.
session
());
app
.
use
(
'/'
,
index
);
...
...
@@ -61,9 +97,8 @@ app.use('/users', users);
app
.
use
(
'/mytoons'
,
mytoons
);
app
.
use
(
'/setting'
,
setting
);
app
.
use
(
'/yourtoons'
,
yourtoons
);
//app.use(express.static('views'));
// catch 404 and forward to error handler
// catch 404 and forward to error handler
, for wrong page
app
.
use
(
function
(
req
,
res
,
next
)
{
var
err
=
new
Error
(
'Not Found'
);
err
.
status
=
404
;
...
...
@@ -81,5 +116,6 @@ app.use(function(err, req, res, next) {
res
.
render
(
'error'
);
});
//
var
server
=
app
.
listen
(
3000
);
module
.
exports
=
app
;
...
...
bin/www
View file @
7c66ce7
#!/usr/bin/env node
// www : http 서버를 구동시키는 logic
/**
* Module dependencies.
*/
...
...
@@ -12,7 +14,7 @@ var http = require('http');
* Get port from environment and store in Express.
*/
var
port
=
normalizePort
(
process
.
env
.
PORT
||
'
9
000'
);
var
port
=
normalizePort
(
process
.
env
.
PORT
||
'
3
000'
);
app
.
set
(
'port'
,
port
);
/**
...
...
routes/index.js
View file @
7c66ce7
var
express
=
require
(
'express'
);
var
cheerio
=
require
(
'cheerio'
);
var
request
=
require
(
'request'
);
var
router
=
express
.
Router
();
var
mysql
=
require
(
'mysql'
);
// 설명
var
client
=
require
(
'cheerio-httpcli'
);
var
passport
=
require
(
'passport'
),
KakaoStrategy
=
require
(
'passport-kakao'
).
Strategy
;
var
passport
=
require
(
'passport'
),
KakaoStrategy
=
require
(
'passport-kakao'
).
Strategy
;
var
router
=
express
.
Router
()
;
// 설명
passport
.
use
(
new
KakaoStrategy
({
clientID
:
'bd2e610396fb7bbb84cf91a786b3cc72'
,
callbackURL
:
'/auth/login/kakao/callback'
,
clientSecret
:
'eUtJGtlLoCZJufevp3LKfDP0KOtZUV7R'
},
function
(
accessToken
,
refreshToken
,
params
,
profile
,
done
){
//사용자 정보는 profile에
loginByThirdparty
(
accessToken
,
refreshToken
,
profile
);
},
function
(
accessToken
,
refreshToken
,
params
,
profile
,
done
){
//사용자 정보 -> profile
loginByThirdparty
(
accessToken
,
refreshToken
,
profile
);
console
.
log
(
"(!)로그인 : "
+
profile
.
_json
.
id
+
"("
+
profile
.
_json
.
properties
.
nickname
+
")"
);
//return done(null,profile)
return
done
(
null
,
{
'user_id'
:
profile
.
_json
.
id
,
'nickname'
:
profile
.
_json
.
properties
.
nickname
});
}
));
// kakao 로그인
router
.
get
(
'/auth/login/kakao'
,
// passport.authenticate('kakao',{state: "myStateValue"})
passport
.
authenticate
(
'kakao'
)
);
// kakao 로그인, // passport.authenticate('kakao',{state: "myStateValue"})
router
.
get
(
'/auth/login/kakao'
,
passport
.
authenticate
(
'kakao'
));
// kakao 로그인 연동 콜백
router
.
get
(
'/auth/login/kakao/callback'
,
passport
.
authenticate
(
'kakao'
,
{
router
.
get
(
'/auth/login/kakao/callback'
,
passport
.
authenticate
(
'kakao'
,
{
//session: false,
successRedirect
:
'/mytoons'
,
failureRedirect
:
'/'
})
);
// 설명
function
loginByThirdparty
(
accessToken
,
refreshToken
,
profile
)
{
//예전 코드는 MySQL 버젼이 맞지 않음
//
예전 코드는 MySQL 버젼이 맞지 않음
// var sql = 'INSERT INTO `user`(id) VALUES(?) ON DUPLICATE KEY(PRIMARY) UPDATE id=(?);'
var
sql
=
"INSERT INTO `user` (id) VALUES (?) ON DUPLICATE KEY UPDATE id=id"
;
var
kid
=
[
profile
.
_json
.
id
];
...
...
@@ -54,27 +57,38 @@ function loginByThirdparty(accessToken, refreshToken, profile) {
});
}
// 설명
router
.
get
(
'/auth/logout/kakao'
,
function
(
req
,
res
)
{
req
.
logout
();
res
.
redirect
(
'/'
);
})
allWebtoons
=
new
Array
();
//
function
getLatestToon
(
titleid
,
day
,
cb
)
{
}
// 설명
allWebtoons
=
new
Array
();
// 설명
function
getAllToons
()
{
allWebtoonList
=
new
Array
();
//월요일 다음 웹툰
//월요일 다음 웹툰
var
mon
=
'mon'
;
var
mon_name
=
'MON'
;
var
daum
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
mon
}
?timeStamp=1515819276574`
;
var
site
=
'daum'
;
client
.
fetch
(
daum
,
{},
function
(
err
,
$
,
res
,
body
)
{
var
data
=
JSON
.
parse
(
body
);
var
list
=
data
[
"data"
];
list
.
forEach
(
function
(
item
,
idx
)
{
var
webtoon_link
=
'http://webtoon.daum.net/webtoon/view/'
+
item
.
nickname
.
toString
();
var
webtoon
=
{
toon_index
:
item
.
id
,
...
...
@@ -85,19 +99,22 @@ function getAllToons() {
site
:
site
,
latest
:
0
};
allWebtoonList
.
push
(
webtoon
);
});
});
//화요일 다음 웹툰
//화요일 다음 웹툰
var
tue
=
'tue'
;
var
tue_name
=
'TUE'
;
var
daum1
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
tue
}
?timeStamp=1515819276574`
;
client
.
fetch
(
daum1
,
{},
function
(
err
,
$
,
res
,
body
)
{
var
data
=
JSON
.
parse
(
body
);
var
list
=
data
[
"data"
];
list
.
forEach
(
function
(
item
,
idx
){
var
webtoon_link
=
'http://webtoon.daum.net/webtoon/view/'
+
item
.
nickname
.
toString
();
var
webtoon
=
{
toon_index
:
item
.
id
,
...
...
@@ -108,17 +125,18 @@ function getAllToons() {
site
:
site
,
latest
:
0
};
allWebtoonList
.
push
(
webtoon
);
});
});
//수요일 다음 웹툰
//수요일 다음 웹툰
var
wed
=
'wed'
;
var
wed_name
=
'WED'
;
var
daum2
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
wed
}
?timeStamp=1515819276574`
;
client
.
fetch
(
daum2
,
{},
function
(
err
,
$
,
res
,
body
)
{
var
data
=
JSON
.
parse
(
body
);
var
list
=
data
[
"data"
];
...
...
@@ -134,19 +152,23 @@ function getAllToons() {
site
:
site
,
latest
:
0
};
allWebtoonList
.
push
(
webtoon
);
});
});
//목요일 다음 웹툰
//목요일 다음 웹툰
var
thu
=
'thu'
;
var
daum3
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
thu
}
?timeStamp=1515819276574`
;
var
thu_name
=
'THU'
;
client
.
fetch
(
daum3
,
{},
function
(
err
,
$
,
res
,
body
)
{
var
data
=
JSON
.
parse
(
body
);
var
list
=
data
[
"data"
];
list
.
forEach
(
function
(
item
,
idx
){
var
webtoon_link
=
'http://webtoon.daum.net/webtoon/view/'
+
item
.
nickname
.
toString
();
var
webtoon
=
{
toon_index
:
item
.
id
,
...
...
@@ -157,12 +179,13 @@ function getAllToons() {
site
:
site
,
latest
:
0
};
allWebtoonList
.
push
(
webtoon
);
});
});
//금요일 다음 웹툰
//금요일 다음 웹툰
var
fri
=
'fri'
;
var
daum4
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
fri
}
?timeStamp=1515819276574`
;
var
fri_name
=
'FRI'
;
...
...
@@ -185,7 +208,7 @@ function getAllToons() {
});
//토요일 다음 웹툰
//토요일 다음 웹툰
var
sat
=
'sat'
;
var
daum5
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
sat
}
?timeStamp=1515819276574`
;
var
sat_name
=
'SAT'
;
...
...
@@ -208,7 +231,7 @@ function getAllToons() {
});
//일요일 다음 웹툰
//일요일 다음 웹툰
var
sun
=
'sun'
;
var
daum6
=
`http://webtoon.daum.net/data/pc/webtoon/list_serialized/
${
sun
}
?timeStamp=1515819276574`
;
var
sun_name
=
'SUN'
;
...
...
@@ -216,7 +239,6 @@ function getAllToons() {
var
data
=
JSON
.
parse
(
body
);
var
list
=
data
[
"data"
];
list
.
forEach
(
function
(
item
,
idx
){
//다음 웹툰 아이디, 제목, 요일
var
webtoon_link
=
'http://webtoon.daum.net/webtoon/view/'
+
item
.
nickname
.
toString
();
var
webtoon
=
{
toon_index
:
item
.
id
,
...
...
@@ -231,7 +253,7 @@ function getAllToons() {
});
});
//네이버 웹툰
//네이버 웹툰
var
allWeeklyToonsUrl
=
"http://comic.naver.com/webtoon/weekday.nhn"
;
request
(
allWeeklyToonsUrl
,
function
(
err
,
res
,
html
)
{
if
(
!
err
){
...
...
@@ -255,19 +277,20 @@ function getAllToons() {
};
allWebtoonList
.
push
(
webtoon
);
});
p
.
then
(
function
()
{
i
=
0
;
allWebtoonList
.
forEach
(
function
(
webtoon
)
{
var
sql
=
"INSERT INTO `toon` (toon_index, name, thum_link, webtoon_link, week, site, latest) VALUES(?) ON DUPLICATE KEY UPDATE latest=latest"
;
var
values
=
[
webtoon
.
toon_index
,
webtoon
.
name
,
webtoon
.
thum_link
,
webtoon
.
webtoon_link
,
webtoon
.
week
,
webtoon
.
site
,
webtoon
.
latest
];
connection
.
query
(
sql
,[
values
],
function
(
err
,
result
){
if
(
err
)
{
console
.
log
(
"웹툰 DB 에러 : "
+
err
);
}
else
{
//
console.log("웹툰 DB처리 완료!");
console
.
log
(
"웹툰 DB처리 완료!"
);
}
});
//});
})
});
}
...
...
@@ -275,24 +298,25 @@ function getAllToons() {
allWebtoons
=
allWebtoonList
;
};
getAllToons
();
//처음 한번 수행
setInterval
(
getAllToons
,
5
*
60
*
1000
);
getAllToons
();
//5분에 한번 수행
setInterval
(
getAllToons
,
5
*
60
*
1000
);
/* GET home page. */
router
.
get
(
'/'
,
function
(
req
,
res
,
next
){
if
(
req
.
isAuthenticated
())
{
router
.
get
(
'/'
,
function
(
req
,
res
,
next
)
{
if
(
req
.
isAuthenticated
())
{
res
.
redirect
(
'/mytoons'
);
console
.
log
(
"(!)이미 로그인
"
);
}
else
{
console
.
log
(
"(!)Already logined
"
);
}
else
{
console
.
log
(
"(!)로그인세션 없음"
);
res
.
render
(
'index'
,{
title
:
"니툰내툰"
,
list
:
allWebtoons
});
}
});
});
module
.
exports
=
router
;
...
...
routes/mytoons.js
View file @
7c66ce7
routes/setting.js
View file @
7c66ce7
...
...
@@ -2,39 +2,38 @@ var express = require('express');
var
router
=
express
.
Router
();
function
addMyToons
(
id
,
index
,
cb
){
connection
.
query
(
"INSERT INTO user_toon_relation SET ?;"
,
{
user_id
:
id
,
toon_index
:
index
},
function
(
err
)
{
connection
.
query
(
"INSERT INTO user_toon_relation SET ?;"
,
{
user_id
:
id
,
toon_index
:
index
},
function
(
err
)
{
if
(
err
)
{
throw
err
;
console
.
log
(
"내 웹툰 추가
중 에러!"
)
console
.
log
(
"내 웹툰 추가
중 에러!"
)
}
else
{
// alert("추가되었습니다.")
cb
();
}
});
}
//내툰 수정하기
router
.
post
(
'/toggle_toon'
,
function
(
req
,
res
,
next
){
var
index
=
req
.
body
.
toon_index
;
var
id
=
req
.
user
.
user_id
;
connection
.
query
(
"SELECT COUNT(*) FROM user_toon_relation WHERE user_id='"
+
id
+
"' && toon_index='"
+
index
+
"'"
,
[
id
,
index
],
function
(
err
,
rows
,
result
)
{
if
(
err
){
console
.
log
(
"내웹툰 등록중 에러!"
);
}
else
{
connection
.
query
(
"SELECT COUNT(*) FROM user_toon_relation WHERE user_id='"
+
id
+
"' && toon_index='"
+
index
+
"'"
,
[
id
,
index
],
function
(
err
,
rows
,
result
)
{
if
(
err
)
{
console
.
log
(
"내 웹툰 등록 중 에러!"
);
}
else
{
var
count
=
rows
[
0
][
"COUNT(*)"
];
if
(
count
>
0
){
//이미 등록되어 있는 것이라면,
connection
.
query
(
"DELETE FROM user_toon_relation WHERE user_id='"
+
id
+
"' && toon_index='"
+
index
+
"';"
,
[
id
,
index
],
function
(
err
,
rows
,
result
)
{
if
(
count
>
0
)
{
//이미 등록되어 있는 것이라면,
connection
.
query
(
"DELETE FROM user_toon_relation WHERE user_id='"
+
id
+
"' && toon_index='"
+
index
+
"';"
,
[
id
,
index
],
function
(
err
,
rows
,
result
)
{
if
(
err
)
{
console
.
log
(
"내 웹툰 제거중 에러!"
);
throw
err
;
}
else
{
//
alert("제거되었습니다.")
}
else
{
//
alert("제거되었습니다.")
res
.
redirect
(
'/setting'
);
}
});
}
else
{
}
else
{
addMyToons
(
id
,
index
,
function
(){
res
.
redirect
(
'/setting'
);
});
...
...
@@ -43,6 +42,7 @@ router.post('/toggle_toon',function(req,res,next){
});
});
//
function
getMyToons
(
id
,
cb
){
//mysql5.7 syntax에 맞게 수정 => 로그인한 유저의
var
sqlquery
=
"SELECT t.toon_index, t.name, t.thum_link, t.webtoon_link, t.week, t.site FROM user u, user_toon_relation ur, toon t WHERE u.id = '"
+
id
+
"' && u.id=ur.user_id && t.toon_index=ur.toon_index;"
;
...
...
routes/users.js
View file @
7c66ce7
routes/yourtoons.js
View file @
7c66ce7
Please
register
or
login
to post a comment