Showing
10 changed files
with
171 additions
and
30 deletions
api/deck/crawler.js
0 → 100644
1 | +const request=require('request') | ||
2 | +const iconv=require('iconv-lite') | ||
3 | +const charset=require('charset') | ||
4 | + | ||
5 | +exports.Crawl=(deckCode)=>{ | ||
6 | + return new Promise((resolve,reject)=>{ | ||
7 | + request({ | ||
8 | + url:`https://deck.codes/${deckCode}`, | ||
9 | + encoding:null, | ||
10 | + method:'GET', | ||
11 | + timeout:10000, | ||
12 | + followRedirect:true, | ||
13 | + maxRedirects:10, | ||
14 | + },(err,res,body)=>{ | ||
15 | + if(!err && res.statusCode===200){ | ||
16 | + const enc=charset(res.headers,body) | ||
17 | + const decodedResult=iconv.decode(body,enc) | ||
18 | + resolve(decodedResult) | ||
19 | + } | ||
20 | + else console.log(`error : ${res.statusCode}`) | ||
21 | + }) | ||
22 | + }) | ||
23 | +} | ||
24 | + | ||
25 | + | ||
26 | + | ||
27 | + | ||
28 | + | ||
29 | + | ||
30 | + |
1 | const express=require('express') | 1 | const express=require('express') |
2 | const router=express.Router() | 2 | const router=express.Router() |
3 | 3 | ||
4 | +const newDeck=require('./newDeck') | ||
5 | + | ||
6 | +router.post('/newdeck',newDeck.NewDeck) | ||
7 | + | ||
4 | module.exports=router | 8 | module.exports=router |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
api/deck/newDeck.js
0 → 100644
1 | +const rp=require('request-promise') | ||
2 | +const mysql=require('../../database/mysql') | ||
3 | +const crawler=require('./crawler') | ||
4 | +const cheerio=require('cheerio') | ||
5 | + | ||
6 | + | ||
7 | +exports.NewDeck=(req,res)=>{ | ||
8 | + const deckOwner=req.session.sid | ||
9 | + const deckTitle=req.body.deckTitle | ||
10 | + const deckClass='paladin' | ||
11 | + let deckCode=req.body.deckCode | ||
12 | + let cards=[] | ||
13 | + | ||
14 | + console.log(deckOwner,deckTitle,deckCode) | ||
15 | + | ||
16 | + const DataCheck=()=>{ | ||
17 | + return new Promise((resolve,reject)=>{ | ||
18 | + if(!deckTitle || !deckCode){ | ||
19 | + return reject({ | ||
20 | + code: 'request_body_error', | ||
21 | + message: 'request body is not defined' | ||
22 | + }) | ||
23 | + } | ||
24 | + else resolve() | ||
25 | + }) | ||
26 | + } | ||
27 | + const CrawlPage=()=>{ | ||
28 | + return crawler.Crawl(deckCode) | ||
29 | + } | ||
30 | + const DeckCrawl=(result)=>{ | ||
31 | + //console.log(result) | ||
32 | + const $=cheerio.load(result) | ||
33 | + let cardCosts=$('div.hs-tile-info').children('.hs-tile-info-left.mdc-list-item__start-detail') | ||
34 | + let cardNames=$('div.hs-tile-info').find('span').find('span') | ||
35 | + let cardNums=$('div.hs-tile-info').children('.hs-tile-info-right.mdc-list-item__end-detail') | ||
36 | + | ||
37 | + for(let i=0;i<cardNames.length;i++) { | ||
38 | + let cardCost=$(cardCosts[i]).text() | ||
39 | + let cardName=$(cardNames[i]).text() | ||
40 | + let cardNum=$(cardNums[i]).text() | ||
41 | + if(cardNum.trim()==='') | ||
42 | + cardNum='1' | ||
43 | + else | ||
44 | + cardNum=cardNum.trim() | ||
45 | + cards.push({cardCost: cardCost, cardName: cardName, cardNum: cardNum}) | ||
46 | + } | ||
47 | + console.log(cards) | ||
48 | + } | ||
49 | + | ||
50 | + const AddDeck=()=>{ | ||
51 | + mysql.getConnection((err,connection)=>{ | ||
52 | + if (err) throw err | ||
53 | + connection.query(`insert into deck (deckOwner,deckTitle,deckClass,deckCode) values (\'${deckOwner}\',\'${deckTitle}\',\'${deckClass}\',\'${deckCode}\');`,(err,results,fields)=>{ | ||
54 | + if (err) throw err | ||
55 | + connection.release() | ||
56 | + }) | ||
57 | + }) | ||
58 | + } | ||
59 | + | ||
60 | + DataCheck() | ||
61 | + .then(CrawlPage) | ||
62 | + .then(DeckCrawl) | ||
63 | + .then(AddDeck) | ||
64 | + .then(()=>{ | ||
65 | + res.status(200).json({message:'Complete Adding Deck'}) | ||
66 | + }) | ||
67 | + .catch((err)=>{ | ||
68 | + console.log(err) | ||
69 | + res.status(500).json(err || err.message) | ||
70 | + }) | ||
71 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | const findById=require('../../database/user/findById') | 1 | const findById=require('../../database/user/findById') |
2 | -const mysql=require('../../mysql') | ||
3 | const bcrypt=require('bcrypt-nodejs') | 2 | const bcrypt=require('bcrypt-nodejs') |
4 | -const session=require('express-session') | ||
5 | -const app=require('express')() | ||
6 | - | ||
7 | -app.use(session({ | ||
8 | - secret:'ambc@!vsmkv#!&*!#EDNAnsv#!$()_*#@', | ||
9 | - resave:false, | ||
10 | - saveUninitialized:true | ||
11 | -})) | ||
12 | - | ||
13 | 3 | ||
14 | exports.Login=(req,res)=>{ | 4 | exports.Login=(req,res)=>{ |
15 | const userId=req.body.userId | 5 | const userId=req.body.userId |
... | @@ -17,9 +7,7 @@ exports.Login=(req,res)=>{ | ... | @@ -17,9 +7,7 @@ exports.Login=(req,res)=>{ |
17 | 7 | ||
18 | const DataCheck=()=>{ | 8 | const DataCheck=()=>{ |
19 | return new Promise((resolve,reject)=>{ | 9 | return new Promise((resolve,reject)=>{ |
20 | - console.log('1') | ||
21 | if(!userId || !password){ | 10 | if(!userId || !password){ |
22 | - console.log('1 err') | ||
23 | return reject({ | 11 | return reject({ |
24 | code: 'request_body_error', | 12 | code: 'request_body_error', |
25 | message: 'request body is not defined' | 13 | message: 'request body is not defined' |
... | @@ -45,22 +33,19 @@ exports.Login=(req,res)=>{ | ... | @@ -45,22 +33,19 @@ exports.Login=(req,res)=>{ |
45 | 33 | ||
46 | const PwCheck=(user)=>{ | 34 | const PwCheck=(user)=>{ |
47 | if (user[0]==null){ | 35 | if (user[0]==null){ |
48 | - console.log('2 err') | ||
49 | return Promise.reject({ | 36 | return Promise.reject({ |
50 | code:'id_wrong', | 37 | code:'id_wrong', |
51 | message:'id wrong' | 38 | message:'id wrong' |
52 | }) | 39 | }) |
53 | } | 40 | } |
54 | - console.log('3') | ||
55 | if(bcrypt.compareSync(password,user[0].password)){ | 41 | if(bcrypt.compareSync(password,user[0].password)){ |
56 | - console.log(`3 success\nLogin : ${userId}`) | 42 | + console.log(`Login : ${userId}`) |
57 | req.session.sid=userId | 43 | req.session.sid=userId |
58 | req.session.save(()=>{ | 44 | req.session.save(()=>{ |
59 | res.status(200).json({userId:userId}) | 45 | res.status(200).json({userId:userId}) |
60 | }) | 46 | }) |
61 | } | 47 | } |
62 | else{ | 48 | else{ |
63 | - console.log('3 err') | ||
64 | return Promise.reject({ | 49 | return Promise.reject({ |
65 | code:'pw_wrong', | 50 | code:'pw_wrong', |
66 | message:'pw wrong' | 51 | message:'pw wrong' | ... | ... |
... | @@ -3,7 +3,7 @@ | ... | @@ -3,7 +3,7 @@ |
3 | const express=require('express') | 3 | const express=require('express') |
4 | const session=require('express-session') | 4 | const session=require('express-session') |
5 | const findById=require('../../database/user/findById') | 5 | const findById=require('../../database/user/findById') |
6 | -const mysql=require('../../mysql') | 6 | +const mysql=require('../../database/mysql') |
7 | const bcrypt=require('bcrypt-nodejs') | 7 | const bcrypt=require('bcrypt-nodejs') |
8 | 8 | ||
9 | exports.SignUp=(req,res)=>{ | 9 | exports.SignUp=(req,res)=>{ |
... | @@ -44,11 +44,9 @@ exports.SignUp=(req,res)=>{ | ... | @@ -44,11 +44,9 @@ exports.SignUp=(req,res)=>{ |
44 | } | 44 | } |
45 | const hash=bcrypt.hashSync(password,bcrypt.genSaltSync(10),null) | 45 | const hash=bcrypt.hashSync(password,bcrypt.genSaltSync(10),null) |
46 | mysql.getConnection((err,connection)=>{ | 46 | mysql.getConnection((err,connection)=>{ |
47 | - if(err) | 47 | + if(err) throw err |
48 | - throw err | ||
49 | connection.query(`insert into user (userId,password) values (\'${userId}\',\'${hash}\');`,(err,results,fields)=>{ | 48 | connection.query(`insert into user (userId,password) values (\'${userId}\',\'${hash}\');`,(err,results,fields)=>{ |
50 | - if(err) | 49 | + if(err) throw err |
51 | - throw err | ||
52 | connection.release() | 50 | connection.release() |
53 | }) | 51 | }) |
54 | }) | 52 | }) | ... | ... |
File moved
... | @@ -108,6 +108,16 @@ | ... | @@ -108,6 +108,16 @@ |
108 | "qs": "6.5.2", | 108 | "qs": "6.5.2", |
109 | "raw-body": "2.3.3", | 109 | "raw-body": "2.3.3", |
110 | "type-is": "~1.6.16" | 110 | "type-is": "~1.6.16" |
111 | + }, | ||
112 | + "dependencies": { | ||
113 | + "iconv-lite": { | ||
114 | + "version": "0.4.23", | ||
115 | + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", | ||
116 | + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", | ||
117 | + "requires": { | ||
118 | + "safer-buffer": ">= 2.1.2 < 3" | ||
119 | + } | ||
120 | + } | ||
111 | } | 121 | } |
112 | }, | 122 | }, |
113 | "boolbase": { | 123 | "boolbase": { |
... | @@ -125,6 +135,11 @@ | ... | @@ -125,6 +135,11 @@ |
125 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", | 135 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", |
126 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" | 136 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" |
127 | }, | 137 | }, |
138 | + "charset": { | ||
139 | + "version": "1.0.1", | ||
140 | + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", | ||
141 | + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==" | ||
142 | + }, | ||
128 | "cheerio": { | 143 | "cheerio": { |
129 | "version": "1.0.0-rc.2", | 144 | "version": "1.0.0-rc.2", |
130 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", | 145 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", |
... | @@ -495,9 +510,9 @@ | ... | @@ -495,9 +510,9 @@ |
495 | } | 510 | } |
496 | }, | 511 | }, |
497 | "iconv-lite": { | 512 | "iconv-lite": { |
498 | - "version": "0.4.23", | 513 | + "version": "0.4.24", |
499 | - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", | 514 | + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", |
500 | - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", | 515 | + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", |
501 | "requires": { | 516 | "requires": { |
502 | "safer-buffer": ">= 2.1.2 < 3" | 517 | "safer-buffer": ">= 2.1.2 < 3" |
503 | } | 518 | } |
... | @@ -756,6 +771,16 @@ | ... | @@ -756,6 +771,16 @@ |
756 | "http-errors": "1.6.3", | 771 | "http-errors": "1.6.3", |
757 | "iconv-lite": "0.4.23", | 772 | "iconv-lite": "0.4.23", |
758 | "unpipe": "1.0.0" | 773 | "unpipe": "1.0.0" |
774 | + }, | ||
775 | + "dependencies": { | ||
776 | + "iconv-lite": { | ||
777 | + "version": "0.4.23", | ||
778 | + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", | ||
779 | + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", | ||
780 | + "requires": { | ||
781 | + "safer-buffer": ">= 2.1.2 < 3" | ||
782 | + } | ||
783 | + } | ||
759 | } | 784 | } |
760 | }, | 785 | }, |
761 | "readable-stream": { | 786 | "readable-stream": { | ... | ... |
... | @@ -15,11 +15,13 @@ | ... | @@ -15,11 +15,13 @@ |
15 | "dependencies": { | 15 | "dependencies": { |
16 | "bcrypt-nodejs": "0.0.3", | 16 | "bcrypt-nodejs": "0.0.3", |
17 | "body-parser": "^1.18.3", | 17 | "body-parser": "^1.18.3", |
18 | + "charset": "^1.0.1", | ||
18 | "cheerio": "^1.0.0-rc.2", | 19 | "cheerio": "^1.0.0-rc.2", |
19 | "dotenv": "^6.1.0", | 20 | "dotenv": "^6.1.0", |
20 | "express": "^4.16.4", | 21 | "express": "^4.16.4", |
21 | "express-session": "^1.15.6", | 22 | "express-session": "^1.15.6", |
22 | "fs": "0.0.1-security", | 23 | "fs": "0.0.1-security", |
24 | + "iconv-lite": "^0.4.24", | ||
23 | "morgan": "^1.9.1", | 25 | "morgan": "^1.9.1", |
24 | "mysql": "^2.16.0", | 26 | "mysql": "^2.16.0", |
25 | "path": "^0.12.7", | 27 | "path": "^0.12.7", | ... | ... |
... | @@ -32,6 +32,30 @@ | ... | @@ -32,6 +32,30 @@ |
32 | } | 32 | } |
33 | }) | 33 | }) |
34 | }) | 34 | }) |
35 | + $('#newDeckButton').click(function(){ | ||
36 | + var data=new Object() | ||
37 | + data.deckTitle=$('#deckTitle').val() | ||
38 | + data.deckCode=$('#deckCode').val() | ||
39 | + const stringData=JSON.stringify(data) | ||
40 | + console.log(stringData) | ||
41 | + $.ajax({ | ||
42 | + type:'POST', | ||
43 | + url:'/api/deck/newdeck', | ||
44 | + data:stringData, | ||
45 | + dataType:'JSON', | ||
46 | + contentType:'application/json; charset=utf-8', | ||
47 | + traditional:true, | ||
48 | + processdata:false, | ||
49 | + success:function(result){ | ||
50 | + alert('덱 생성 성공!') | ||
51 | + window.location.href='/decklist' | ||
52 | + }, | ||
53 | + error:function(result){ | ||
54 | + alert(`덱 생성 실패!\nmessage:${result['message']}`) | ||
55 | + return false | ||
56 | + } | ||
57 | + }) | ||
58 | + }) | ||
35 | }) | 59 | }) |
36 | </script> | 60 | </script> |
37 | </head> | 61 | </head> |
... | @@ -61,11 +85,13 @@ | ... | @@ -61,11 +85,13 @@ |
61 | <div class="padding" style="width:100px"></div> | 85 | <div class="padding" style="width:100px"></div> |
62 | <div class="container" style="width:50%;"> | 86 | <div class="container" style="width:50%;"> |
63 | <h3 class="form-signin-heading">덱 추가</h3> | 87 | <h3 class="form-signin-heading">덱 추가</h3> |
64 | - <label class="sr-only" for="deckTitle">덱 이름</label> | 88 | + <form id="addDeckForm"> |
65 | - <input class="form-control" id="deckTitle" autofocus="" required="" type="text" placeholder="덱 이름" name="userId"> | 89 | + <label class="sr-only" for="deckTitle">덱 이름</label> |
66 | - <label class="sr-only" for="deckCode">덱 코드</label> | 90 | + <input class="form-control" id="deckTitle" autofocus="" required="" type="text" placeholder="덱 이름" name="deckTitle"> |
67 | - <textarea class="form-control" id="deckCode" required="" placeholder="덱 코드" name="password" style="resize:none;height:150px;"></textarea> | 91 | + <label class="sr-only" for="deckCode">덱 코드</label> |
68 | - <input type="button" class="btn btn-primary btn-block" value="확인" /> | 92 | + <textarea class="form-control" id="deckCode" required="" placeholder="덱 코드" style="resize:none;height:150px;" name="deckCode"></textarea> |
93 | + </form> | ||
94 | + <input type="button" class="btn btn-primary btn-block" id="newDeckButton" value="확인" /> | ||
69 | </div> | 95 | </div> |
70 | </div> | 96 | </div> |
71 | 97 | ... | ... |
-
Please register or login to post a comment