Showing
22 changed files
with
321 additions
and
1 deletions
... | @@ -4,4 +4,35 @@ const fs=require('fs') | ... | @@ -4,4 +4,35 @@ const fs=require('fs') |
4 | const session=require('express-session') | 4 | const session=require('express-session') |
5 | const path=require('path') | 5 | const path=require('path') |
6 | const bcrypt=require('bcrypt-nodejs') | 6 | const bcrypt=require('bcrypt-nodejs') |
7 | +const rp=require('request-promise') | ||
8 | +const morgan=require('morgan') | ||
9 | +const cheerio=require('cheerio') | ||
7 | const app=express() | 10 | const app=express() |
11 | + | ||
12 | +app.use(morgan('[:date[iso]] :method :status :url :response-time(ms) :user-agent')) | ||
13 | + | ||
14 | +app.use(express.static(path.join(__dirname, '/static'))) | ||
15 | +app.use(bodyParser.urlencoded({extended:false})) | ||
16 | +app.use(bodyParser.json()) | ||
17 | +app.use(function (req, res, next) { | ||
18 | + res.header('Access-Control-Allow-Origin', '*') | ||
19 | + res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH') | ||
20 | + res.header('Access-Control-Allow-Headers', 'content-type, x-access-token') | ||
21 | + next() | ||
22 | +}) | ||
23 | + | ||
24 | +app.use(session({ | ||
25 | + secret:'ambc@!vsmkv#!&*!#EDNAnsv#!$()_*#@', | ||
26 | + resave:false, | ||
27 | + saveUninitialized:true | ||
28 | +})) | ||
29 | + | ||
30 | +app.get('/',(req,res)=>{ | ||
31 | + res.redirect('/main') | ||
32 | +}) | ||
33 | + | ||
34 | +app.get('/main',(req,res)=>{ | ||
35 | + fs.readFile('./views/main') | ||
36 | + res.writeHead(200,{'Content-Type':'text/html'}) | ||
37 | + | ||
38 | +}) | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -15,9 +15,12 @@ | ... | @@ -15,9 +15,12 @@ |
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 | + "cheerio": "^1.0.0-rc.2", | ||
18 | "express": "^4.16.4", | 19 | "express": "^4.16.4", |
19 | "express-session": "^1.15.6", | 20 | "express-session": "^1.15.6", |
20 | "fs": "0.0.1-security", | 21 | "fs": "0.0.1-security", |
21 | - "path": "^0.12.7" | 22 | + "morgan": "^1.9.1", |
23 | + "path": "^0.12.7", | ||
24 | + "request-promise": "^4.2.2" | ||
22 | } | 25 | } |
23 | } | 26 | } | ... | ... |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
No preview for this file type
static/bootstrap-3.3.2-dist/js/bootstrap.js
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
static/bootstrap-3.3.2-dist/js/npm.js
0 → 100644
1 | +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. | ||
2 | +require('../../js/transition.js') | ||
3 | +require('../../js/alert.js') | ||
4 | +require('../../js/button.js') | ||
5 | +require('../../js/carousel.js') | ||
6 | +require('../../js/collapse.js') | ||
7 | +require('../../js/dropdown.js') | ||
8 | +require('../../js/modal.js') | ||
9 | +require('../../js/tooltip.js') | ||
10 | +require('../../js/popover.js') | ||
11 | +require('../../js/scrollspy.js') | ||
12 | +require('../../js/tab.js') | ||
13 | +require('../../js/affix.js') | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
static/main.css
0 → 100644
1 | +body | ||
2 | +{ | ||
3 | + background-color:white; | ||
4 | + font-family:"맑은 고딕",verdana,굴림; | ||
5 | +} | ||
6 | +h1 | ||
7 | +{ | ||
8 | + color:#4C4C4C; | ||
9 | + text-align:center; | ||
10 | + font-size:60px; | ||
11 | + font-weight:bold; | ||
12 | +} | ||
13 | +h3.form-signin-heading | ||
14 | +{ | ||
15 | + color:#4C4C4C; | ||
16 | + text-align:center; | ||
17 | + font-weight:bold; | ||
18 | +} | ||
19 | +p | ||
20 | +{ | ||
21 | + font-family:verdana,맑은 고딕; | ||
22 | + font-size:20px; | ||
23 | +} | ||
24 | +p.lead | ||
25 | +{ | ||
26 | + text-align:center; | ||
27 | + font-family:verdana,맑은 고딕; | ||
28 | + font-size:30px; | ||
29 | + font-weight:bold; | ||
30 | + color:#A6A6A6; | ||
31 | +} | ||
32 | +form.form-signin | ||
33 | +{ | ||
34 | + max-width:500px; | ||
35 | + margin: auto; | ||
36 | +} | ||
37 | +table | ||
38 | +{ | ||
39 | + border-collapse:separate; | ||
40 | + margin:auto; | ||
41 | + font-size:auto; | ||
42 | +} | ||
43 | +th | ||
44 | +{ | ||
45 | + text-align:center; | ||
46 | + background-color:#EAEAEA; | ||
47 | +} | ||
48 | +td | ||
49 | +{ | ||
50 | + padding:0px !important; | ||
51 | + height:4px !important; | ||
52 | + width:100px; | ||
53 | +} | ||
54 | +td.first | ||
55 | +{ | ||
56 | + font-size:15px; | ||
57 | + font-weight:bold; | ||
58 | + text-align:center; | ||
59 | + vertical-align:middle !important; | ||
60 | + background-color:#B2CCFF; | ||
61 | +} | ||
62 | +div.padding | ||
63 | +{ | ||
64 | + padding-top:150px; | ||
65 | +} | ||
66 | +div.grid | ||
67 | +{ | ||
68 | + display:block; | ||
69 | + height:50px; | ||
70 | + line-height:50px; | ||
71 | + box-sizing:border-box; | ||
72 | + border-top:1px solid #EAEAEA; | ||
73 | +} | ||
74 | +div.box | ||
75 | +{ | ||
76 | + font-size:32px; | ||
77 | + border:2px solid black; | ||
78 | + border-radius:5px; | ||
79 | + padding-top:10px; | ||
80 | + padding-bottom:10px; | ||
81 | +} | ||
82 | +input.search | ||
83 | +{ | ||
84 | + margin-bottom:5px; | ||
85 | + border-width:5px; | ||
86 | + border-color:#EAEAEA; | ||
87 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
views/html/login.html
0 → 100644
1 | +<!DOCTYPE html> | ||
2 | +<html lang="ko"> | ||
3 | +<head> | ||
4 | + <meta charset="utf-8"> | ||
5 | + <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||
6 | + <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
7 | + <title>Who Are You? - 하스스톤 멀리건 도우미</title> | ||
8 | + | ||
9 | + <!-- 부트스트랩 --> | ||
10 | + <link href="../../static/bootstrap-3.3.2-dist/css/bootstrap.min.css?ver=1" rel="stylesheet"> | ||
11 | + <link href="../../static/main.css" rel="stylesheet"> | ||
12 | + <!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js --> | ||
13 | + <!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. --> | ||
14 | + <!--[if lt IE 9]> | ||
15 | + <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> | ||
16 | + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> | ||
17 | + <![endif]--> | ||
18 | +</head> | ||
19 | +<body> | ||
20 | + <nav class="navbar-default navbar-fixed-top"> | ||
21 | + <div class="container"> | ||
22 | + <div class="navbar-header"> | ||
23 | + <button class="navbar-toggle collapsed" aria-expanded="false" aria-controls="navbar" type="button" data-toggle="collapse" data-target="#navbar"> | ||
24 | + <span class="sr-only">Toggle navigation</span> | ||
25 | + <span class="icon-bar"></span> | ||
26 | + <span class="icon-bar"></span> | ||
27 | + <span class="icon-bar"></span> | ||
28 | + </button> | ||
29 | + <a class="navbar-brand" href="#">Who Are You?</a> | ||
30 | + </div> | ||
31 | + <div class="navbar-collapse collapse" id="navbar" aria-expanded="false" style="height: 1px;"> | ||
32 | + <ul class="nav navbar-nav"> | ||
33 | + </ul> | ||
34 | + <div class="navbar-right"> | ||
35 | + <a href="#"><button class="btn navbar-btn" style="color:#000;">로그인</button></a> | ||
36 | + </div> | ||
37 | + </div> | ||
38 | + </div> | ||
39 | + </nav> | ||
40 | + | ||
41 | + <div class="container show-grid"> | ||
42 | + <div class="padding"></div> | ||
43 | + <form class="form-signin" id="loginForm"> | ||
44 | + <h3 class="form-signin-heading">로그인</h3> | ||
45 | + <label class="sr-only" for="userId">아이디</label> | ||
46 | + <input class="form-control" id="userId" autofocus="" required="" type="text" placeholder="아이디" name="userId"> | ||
47 | + <label class="sr-only" for="password">비밀번호</label> | ||
48 | + <input class="form-control" id="password" required="" type="password" placeholder="비밀번호" name="password"> | ||
49 | + <br> | ||
50 | + <div class="col-md-6"> | ||
51 | + <input class="btn btn-lg btn-primary btn-block" type="button" id="loginButton" value="로그인" /> | ||
52 | + </div> | ||
53 | + <div class="col-md-6"> | ||
54 | + <input class="btn btn-lg btn-primary btn-block" type="button" id="goSignup" value="회원가입" /> | ||
55 | + </div> | ||
56 | + </form> | ||
57 | + </div> | ||
58 | + | ||
59 | + <!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) --> | ||
60 | + <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> | ||
61 | + <!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 --> | ||
62 | + <script src="../../static/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script> | ||
63 | +</body> | ||
64 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
views/html/signup.html
0 → 100644
1 | +<!DOCTYPE html> | ||
2 | +<html lang="ko"> | ||
3 | +<head> | ||
4 | + <meta charset="utf-8"> | ||
5 | + <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||
6 | + <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
7 | + <title>Who Are You? - 하스스톤 멀리건 도우미</title> | ||
8 | + | ||
9 | + <!-- 부트스트랩 --> | ||
10 | + <link href="../../static/bootstrap-3.3.2-dist/css/bootstrap.min.css?ver=1" rel="stylesheet"> | ||
11 | + <link href="../../static/main.css?after" rel="stylesheet"> | ||
12 | + <!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js --> | ||
13 | + <!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. --> | ||
14 | + <!--[if lt IE 9]> | ||
15 | + <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js?after"></script> | ||
16 | + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js?after"></script> | ||
17 | + <![endif]--> | ||
18 | +</head> | ||
19 | +<body> | ||
20 | + <nav class="navbar-default navbar-fixed-top"> | ||
21 | + <div class="container"> | ||
22 | + <div class="navbar-header"> | ||
23 | + <button class="navbar-toggle collapsed" aria-expanded="false" aria-controls="navbar" type="button" data-toggle="collapse" data-target="#navbar"> | ||
24 | + <span class="sr-only">Toggle navigation</span> | ||
25 | + <span class="icon-bar"></span> | ||
26 | + <span class="icon-bar"></span> | ||
27 | + <span class="icon-bar"></span> | ||
28 | + </button> | ||
29 | + <a class="navbar-brand" href="#">Who Are You?</a> | ||
30 | + </div> | ||
31 | + <div class="navbar-collapse collapse" id="navbar" aria-expanded="false" style="height: 1px;"> | ||
32 | + <ul class="nav navbar-nav"> | ||
33 | + </ul> | ||
34 | + <div class="navbar-right"> | ||
35 | + <a href="#"><button class="btn navbar-btn" style="color:#000;">로그인</button></a> | ||
36 | + </div> | ||
37 | + </div> | ||
38 | + </div> | ||
39 | + </nav> | ||
40 | + | ||
41 | + <div class="container"> | ||
42 | + <div class="padding"></div> | ||
43 | + <form class="form-signin" id="loginForm"> | ||
44 | + <h3 class="form-signin-heading">회원가입</h3> | ||
45 | + <label class="sr-only" for="userId">아이디</label> | ||
46 | + <input class="form-control" id="userId" autofocus="" required="" type="text" placeholder="아이디" name="userId"> | ||
47 | + <label class="sr-only" for="password">비밀번호</label> | ||
48 | + <input class="form-control" id="password" required="" type="password" placeholder="비밀번호" name="password"> | ||
49 | + <label class="sr-only" for="repeatPassword">비밀번호</label> | ||
50 | + <input class="form-control" id="repeatPassword" required="" type="password" placeholder="비밀번호 확인" name="repeatPassword"> | ||
51 | + <br> | ||
52 | + <input class="btn btn-lg btn-primary btn-block" type="button" id="signupButton" value="회원가입" /> | ||
53 | + </form> | ||
54 | + </div> | ||
55 | + | ||
56 | + <!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) --> | ||
57 | + <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> | ||
58 | + <!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 --> | ||
59 | + <script src="../../static/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script> | ||
60 | +</body> | ||
61 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
오픈소스SW 프로젝트.txt
0 → 100644
1 | +1. 목적 : 사용자가 게임 시작 시, 직업만 선택하면 상위 픽률 3개의 덱타입을 알려줌. 사용자의 덱 정보를 바탕으로 어떤 카드를 멀리건으로 잡을때, 승률이 높은지, 5개의 카드를 알려줌. | ||
2 | +2. 작동 순서 | ||
3 | +1) 회원가입 | ||
4 | +2) 로그인 | ||
5 | +3) 덱 선택 | ||
6 | +4-1) 덱 등록 | ||
7 | +4-2) 덱 삭제 | ||
8 | +5) 상대 직업 선택 | ||
9 | +6) 멀리건 추천 | ||
10 | +7) 로그아웃 | ||
11 | + | ||
12 | +3. 구현 방법 (2번 참고) | ||
13 | +1) db에 저장 | ||
14 | +2) db에서 불러오기, 세션 유지 | ||
15 | +3) 덱 이름, 덱 코드 변환 (deck.code 파싱), db에 저장 | ||
16 | +4-1) db에서 가져오기, 세션 유지 | ||
17 | +4-2) db에서 삭제시키기 | ||
18 | +5) hsreplay.net 파싱 | ||
19 | +6) hsreplay.net 파싱 | ||
20 | +7) 세션 삭제 | ||
21 | + | ||
22 | +4. 필요한 페이지 | ||
23 | +1) 로그인 페이지 | ||
24 | +2) 회원가입 페이지 | ||
25 | +3) 메인 페이지 (덱 추가/게임 시작) | ||
26 | +4) 덱 리스트 출력 및 선택 | ||
27 | +5) 덱 리스트 추가 | ||
28 | +6) 덱 리스트 삭제 | ||
29 | +7) 상대 덱 선택 | ||
30 | +8) 상위 픽률 3개의 덱 출력 | ||
31 | +9) 멀리건 5개 출력 | ||
32 | + | ||
33 | +5. 해결해야 할 문제 | ||
34 | +1) MySQL 배우기(row 추가, 변경, 삭제) | ||
35 | +2) deck.code에서 가져 올 수 있는 정보는 직업, 덱에 들어간 카드의 영어 이름, 갯수만 나옴. -> hsreplay.net의 덱들과 매치시키는 문제 => hsreplay에 | ||
36 | +3) 상대의 직업을 안다고 해도, 어그로, 미드레인지, 컨트롤 구분하기 힘듦. => 추천 | ||
37 | + | ||
38 | +6. 기술스택 | ||
39 | +웹프론트: html+css+javascript+ejs | ||
40 | +웹서버 : node.js express | ||
41 | +데이터베이스 : mySQL | ||
42 | + | ||
43 | +7. 데이터 정보 | ||
44 | +<User> | ||
45 | +userId(string): 유저의 ID | ||
46 | +password(string): 유저의 비밀번호 | ||
47 | +decks(Array): 덱 리스트 | ||
48 | + | ||
49 | +<Deck> | ||
50 | +deckTitle(string): 덱의 이름 | ||
51 | +deckClass(string): 덱의 직업 | ||
52 | +deckCode(string): 덱 코드 | ||
53 | +cards(Array): 카드 리스트 | ||
54 | + | ||
55 | +<Card> | ||
56 | +cardClass(string): 카드의 직업 | ||
57 | +cardCost(Number): 카드의 코스트 | ||
58 | +cardName(string): 카드의 이름 | ||
59 | +cardNum(Number): 카드의 개수 | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment