hyunjong

프로젝트 진행하기 전 코드를 위해하기위한 주석달기

/*
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');
var mysql = require('mysql');
// 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;
......
#!/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 || '9000');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
......
var express = require('express');
var cheerio = require('cheerio');
var request = require('request');
var router = express.Router();
var mysql = require('mysql');
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);
clientSecret : 'eUtJGtlLoCZJufevp3LKfDP0KOtZUV7R'
}, 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', {
//session: false,
successRedirect: '/mytoons',
failureRedirect: '/'
router.get('/auth/login/kakao/callback', passport.authenticate('kakao', {
//session: false,
successRedirect: '/mytoons',
failureRedirect: '/'
})
);
// 설명
function loginByThirdparty(accessToken, refreshToken, profile) {
//예전 코드는 MySQL 버젼이 맞지 않음
// var sql = 'INSERT INTO `user`(id) VALUES(?) ON DUPLICATE KEY(PRIMARY) UPDATE id=(?);'
// 예전 코드는 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];
connection.query(sql,kid,function(err,result){
......@@ -54,50 +57,64 @@ 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,
name: item.title,
thum_link: item.pcThumbnailImage.url,
webtoon_link: webtoon_link,
week :mon_name,
site: site,
latest: 0
};
allWebtoonList.push(webtoon);
});
//월요일 다음 웹툰
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,
name: item.title,
thum_link: item.pcThumbnailImage.url,
webtoon_link: webtoon_link,
week :mon_name,
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);
});
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);
});
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처리 완료!");
}
});
//});
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처리 완료!");
}
});
})
});
}
......@@ -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()){
res.redirect('/mytoons');
console.log("(!)이미 로그인");
}else{
console.log("(!)로그인세션 없음");
res.render('index',{
title: "니툰내툰",
list: allWebtoons
});
}
});
router.get('/', function(req,res,next) {
if(req.isAuthenticated()) {
res.redirect('/mytoons');
console.log("(!)Already logined");
} else {
console.log("(!)로그인세션 없음");
res.render('index',{
title: "니툰내툰",
list: allWebtoons
});
}
});
module.exports = router;
......
......@@ -40,4 +40,4 @@ router.get('/', function(req, res, next) {
}
});
module.exports = router;
\ No newline at end of file
module.exports = router;
......
......@@ -2,47 +2,47 @@ 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) {
if(err) {
throw err;
console.log("내 웹툰 추가중 에러!")
} else{
// alert("추가되었습니다.")
cb();
}
});
connection.query("INSERT INTO user_toon_relation SET ?;", {user_id : id,toon_index : index},function (err) {
if(err) {
throw err;
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{
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(err) {
console.log("내 웹툰 제거중 에러!");
throw err;
}else{
// alert("제거되었습니다.")
res.redirect('/setting');
}
});
}else{
addMyToons(id,index,function(){
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(err) {
console.log("내 웹툰 제거중 에러!");
throw err;
} else {
//alert("제거되었습니다.")
res.redirect('/setting');
});
}
}
});
} else {
addMyToons(id,index,function(){
res.redirect('/setting');
});
}
});
}
});
});
//
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;";
......@@ -68,4 +68,4 @@ router.get('/', function(req, res, next) {
})
});
module.exports = router;
\ No newline at end of file
module.exports = router;
......
......@@ -3,7 +3,7 @@ var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with a resource');
res.send('respond with a resource');
});
module.exports = router;
......
......@@ -40,4 +40,4 @@ router.get('/', function(req, res, next) {
}
});
module.exports = router;
\ No newline at end of file
module.exports = router;
......