Showing
11 changed files
with
72 additions
and
36 deletions
... | @@ -45,11 +45,9 @@ | ... | @@ -45,11 +45,9 @@ |
45 | <form class="form-subscribe" id="contactForm" data-sb-form-api-token="API_TOKEN"> | 45 | <form class="form-subscribe" id="contactForm" data-sb-form-api-token="API_TOKEN"> |
46 | <!-- ID input--> | 46 | <!-- ID input--> |
47 | <div class="row"> | 47 | <div class="row"> |
48 | - <div class="col"> | 48 | + <div class="row"> |
49 | - <input class="form-control form-control-lg" id="IDBelow" type="text" placeholder="ID" data-sb-validations="required" /> | 49 | + <a class="btn btn-primary" href="/board/list">임시게시판</a> |
50 | - <div class="invalid-feedback text-white" data-sb-feedback="IDBelow:required">ID를 입력하세요.</div> | ||
51 | </div> | 50 | </div> |
52 | - <div class="col-auto"><button class="btn btn-primary btn-lg disabled" id="submitButton" type="submit">회원가입</button></div> | ||
53 | </div> | 51 | </div> |
54 | <!-- Submit success message--> | 52 | <!-- Submit success message--> |
55 | <!----> | 53 | <!----> | ... | ... |
... | @@ -43,6 +43,11 @@ | ... | @@ -43,6 +43,11 @@ |
43 | <div class="invalid-feedback" data-sb-feedback="passwordConfirm:required">비밀번호 확인을 해주세요.</div> | 43 | <div class="invalid-feedback" data-sb-feedback="passwordConfirm:required">비밀번호 확인을 해주세요.</div> |
44 | </div> | 44 | </div> |
45 | <div class="form-floating mb-3"> | 45 | <div class="form-floating mb-3"> |
46 | + <input class="form-control" name="nickname" id="nickname" type="text" required minlength='1' maxlength='20' placeholder="nickname" data-sb-validations="required" /> | ||
47 | + <label for="nickname">닉네임</label> | ||
48 | + <div class="invalid-feedback" data-sb-feedback="nickname:required">닉네임을 입력하세요.</div> | ||
49 | + </div> | ||
50 | + <div class="form-floating mb-3"> | ||
46 | <select class="form-select" name="type" id="type" aria-label="사용자 유형"> | 51 | <select class="form-select" name="type" id="type" aria-label="사용자 유형"> |
47 | <option value="작곡가">작곡가</option> | 52 | <option value="작곡가">작곡가</option> |
48 | <option value="가수">가수</option> | 53 | <option value="가수">가수</option> | ... | ... |
... | @@ -21,6 +21,19 @@ sql 사용 파일<br> | ... | @@ -21,6 +21,19 @@ sql 사용 파일<br> |
21 | DB 구조(*ID, password, type) -> 형식에 맞게 추가<br> | 21 | DB 구조(*ID, password, type) -> 형식에 맞게 추가<br> |
22 | *ID varchar(20), password varchar(20), type varchar(10) // type이 운영자인 경우 서버에서 변경<br> | 22 | *ID varchar(20), password varchar(20), type varchar(10) // type이 운영자인 경우 서버에서 변경<br> |
23 | 추가된 형식에 맞는 로그인 및 세션 등 변경<br> | 23 | 추가된 형식에 맞는 로그인 및 세션 등 변경<br> |
24 | +alter table userDB add nickname varchar(20) not null;<br> | ||
25 | + | ||
26 | +CREATE TABLE `board` ( | ||
27 | + `idx` int(11) NOT NULL AUTO_INCREMENT, | ||
28 | + `name` varchar(50) NOT NULL, | ||
29 | + `title` varchar(50) NOT NULL, | ||
30 | + `content` mediumtext NOT NULL, | ||
31 | + `regdate` datetime NOT NULL, | ||
32 | + `modidate` datetime NOT NULL, | ||
33 | + `passwd` varchar(50) NOT NULL, | ||
34 | + `hit` int(11) NOT NULL DEFAULT '0', | ||
35 | + PRIMARY KEY (`idx`) | ||
36 | +); | ||
24 | 37 | ||
25 | DB구조 - board에서 사용됨(*idx, name, title, content, regdate, modidate, passwd, hit)<br> | 38 | DB구조 - board에서 사용됨(*idx, name, title, content, regdate, modidate, passwd, hit)<br> |
26 | *idx int, name varchar(50), title varchar(50), content mediumtext, regdate datetime, modidate datetime, passwd varchar(50), hit int<br> | 39 | *idx int, name varchar(50), title varchar(50), content mediumtext, regdate datetime, modidate datetime, passwd varchar(50), hit int<br> |
... | @@ -30,4 +43,7 @@ LF 오류시 git config --global core.autocrlf true 입력<br><br> | ... | @@ -30,4 +43,7 @@ LF 오류시 git config --global core.autocrlf true 입력<br><br> |
30 | 43 | ||
31 | 44 | ||
32 | 최종 수정: 2021-11-17 06:01<br> | 45 | 최종 수정: 2021-11-17 06:01<br> |
33 | -최종 수정 내용: 게시판의 글쓰기 및 글 열람 기능 추가. | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
46 | +최종 수정 내용: 게시판의 글쓰기 및 글 열람 기능 추가. | ||
47 | +최종 수정: 2021-11-17 14:25<br> | ||
48 | +최종 수정 내용: 세션에 ID + 닉네임 전달기능 추가 | ||
49 | +수정 내용: 경로 지정 수정, 제목 추가, userDB, 회원가입에 nickname요소 추가 | ... | ... |
... | @@ -14,9 +14,10 @@ router.get('/list/:page', function(req, res, next) { | ... | @@ -14,9 +14,10 @@ router.get('/list/:page', function(req, res, next) { |
14 | 14 | ||
15 | board.query(sql, function(err,rows) { | 15 | board.query(sql, function(err,rows) { |
16 | if (err) console.error("err : " + err); | 16 | if (err) console.error("err : " + err); |
17 | - var id = req.user; | 17 | + var id = req.user.ID; |
18 | - if(!id) id = "수정예정" | 18 | + var nickname = req.user.nickname; |
19 | - res.render('list.ejs', {'ID':id, title: '게시판 리스트', rows: rows}) | 19 | + if(!id) nickname = "손님" // 수정 예정 |
20 | + res.render('list.ejs', {'ID':id, 'nickname': nickname, title: '게시판 리스트', rows: rows}) | ||
20 | }) | 21 | }) |
21 | }); | 22 | }); |
22 | 23 | ... | ... |
... | @@ -24,12 +24,14 @@ router.get('/', function(req, res){ | ... | @@ -24,12 +24,14 @@ router.get('/', function(req, res){ |
24 | }) | 24 | }) |
25 | 25 | ||
26 | passport.serializeUser(function(user, done){ | 26 | passport.serializeUser(function(user, done){ |
27 | - console.log('passport session save: '+ user.ID) | 27 | + console.log('passport session save: '+ user.ID + '(' + user.nickname + ')') |
28 | - done(null, user.ID) | 28 | + done(null, user) |
29 | }); | 29 | }); |
30 | -passport.deserializeUser(function(ID, done){ | 30 | +passport.deserializeUser(function(user, done){ |
31 | - console.log('passport session get ID: '+ ID) | 31 | + var ID = user.ID; |
32 | - done(null, ID); // 세션에서 값을 뽑아서 페이지에 전달하는 역할 | 32 | + var nickname = user.nickname; |
33 | + console.log('passport session get ID: '+ ID + '(' + nickname + ')') | ||
34 | + done(null, {'ID': ID, 'nickname':nickname}); // 세션에서 값을 뽑아서 페이지에 전달하는 역할 | ||
33 | }) | 35 | }) |
34 | 36 | ||
35 | passport.use('local-login', new LocalStrategy({ | 37 | passport.use('local-login', new LocalStrategy({ |
... | @@ -42,8 +44,8 @@ passport.use('local-login', new LocalStrategy({ | ... | @@ -42,8 +44,8 @@ passport.use('local-login', new LocalStrategy({ |
42 | 44 | ||
43 | if(rows.length){ // database에 입력한 ID값이 있는가? | 45 | if(rows.length){ // database에 입력한 ID값이 있는가? |
44 | if(password == rows[0].password){ // 비밀번호와 확인이 같은가? | 46 | if(password == rows[0].password){ // 비밀번호와 확인이 같은가? |
45 | - console.log("알림: "+ID+" 유저 로그인") | 47 | + console.log("알림: "+ ID +"(" + rows[0].nickname + ") 유저 로그인") |
46 | - return done(null, {'ID' : ID}); | 48 | + return done(null, {'ID' : ID, 'nickname' : rows[0].nickname}); |
47 | } | 49 | } |
48 | else{ | 50 | else{ |
49 | console.log("알림: 잘못된 비밀번호입니다.") | 51 | console.log("알림: 잘못된 비밀번호입니다.") | ... | ... |
... | @@ -3,7 +3,7 @@ var app = express() | ... | @@ -3,7 +3,7 @@ var app = express() |
3 | var router = express.Router(); | 3 | var router = express.Router(); |
4 | 4 | ||
5 | router.get('/', function(req, res){ | 5 | router.get('/', function(req, res){ |
6 | - console.log(req.user+" 유저가 로그아웃합니다.") | 6 | + console.log(req.user.ID+"("+req.user.nickname+") 유저가 로그아웃합니다.") |
7 | req.logout(); | 7 | req.logout(); |
8 | req.session.save(function(){ | 8 | req.session.save(function(){ |
9 | res.redirect('/'); | 9 | res.redirect('/'); | ... | ... |
... | @@ -5,11 +5,12 @@ var path = require('path') // 상대경로 | ... | @@ -5,11 +5,12 @@ var path = require('path') // 상대경로 |
5 | 5 | ||
6 | // main page는 login이 된 상태(세션정보가 있을때만) 접근이 가능하게 하자 -> info에 구현해놓음. | 6 | // main page는 login이 된 상태(세션정보가 있을때만) 접근이 가능하게 하자 -> info에 구현해놓음. |
7 | router.get('/', function(req, res){ | 7 | router.get('/', function(req, res){ |
8 | - var id = req.user; | 8 | + var id = req.user.ID; |
9 | if(!id) res.sendFile(path.join(__dirname, "../../public/main.html")) | 9 | if(!id) res.sendFile(path.join(__dirname, "../../public/main.html")) |
10 | if(id){ | 10 | if(id){ |
11 | - console.log(req.user, '유저가 작업 중입니다.') | 11 | + var nickname = req.user.nickname; |
12 | - res.render('main.ejs', {'ID': id}); | 12 | + console.log(req.user.ID+'('+nickname+') 유저가 작업 중입니다.') |
13 | + res.render('main.ejs', {'ID': id, 'nickname': nickname}); | ||
13 | } | 14 | } |
14 | }); | 15 | }); |
15 | 16 | ... | ... |
... | @@ -24,12 +24,14 @@ router.get('/', function(req, res){ | ... | @@ -24,12 +24,14 @@ router.get('/', function(req, res){ |
24 | }) | 24 | }) |
25 | 25 | ||
26 | passport.serializeUser(function(user, done){ | 26 | passport.serializeUser(function(user, done){ |
27 | - console.log('passport session save: '+ user.ID) | 27 | + console.log('passport session save: '+ user.ID + '(' + user.nickname + ')') |
28 | - done(null, user.ID) | 28 | + done(null, user) |
29 | }); | 29 | }); |
30 | -passport.deserializeUser(function(ID, done){ | 30 | +passport.deserializeUser(function(user, done){ |
31 | - console.log('passport session get ID: '+ ID) | 31 | + var ID = user.ID; |
32 | - done(null, ID); // 세션에서 값을 뽑아서 페이지에 전달하는 역할 | 32 | + var nickname = user.nickname; |
33 | + console.log('passport session get ID: '+ ID + '(' + nickname + ')') | ||
34 | + done(null, {'ID': ID, 'nickname':nickname}); // 세션에서 값을 뽑아서 페이지에 전달하는 역할 | ||
33 | }) | 35 | }) |
34 | 36 | ||
35 | passport.use('local-join', new LocalStrategy({ | 37 | passport.use('local-join', new LocalStrategy({ |
... | @@ -37,6 +39,7 @@ passport.use('local-join', new LocalStrategy({ | ... | @@ -37,6 +39,7 @@ passport.use('local-join', new LocalStrategy({ |
37 | passwordField: 'password', | 39 | passwordField: 'password', |
38 | pwcomField: 'pw_com', | 40 | pwcomField: 'pw_com', |
39 | usertypeField: 'type', | 41 | usertypeField: 'type', |
42 | + nicknameField: 'nickname', | ||
40 | passReqToCallback: true | 43 | passReqToCallback: true |
41 | }, function(req, ID, password, done){ | 44 | }, function(req, ID, password, done){ |
42 | var query = connection.query('select * from userDB where ID=?', [ID], function(err, rows){ | 45 | var query = connection.query('select * from userDB where ID=?', [ID], function(err, rows){ |
... | @@ -52,11 +55,20 @@ passport.use('local-join', new LocalStrategy({ | ... | @@ -52,11 +55,20 @@ passport.use('local-join', new LocalStrategy({ |
52 | return done(null, false, {message : '비밀번호가 일치하지 않습니다.'}) | 55 | return done(null, false, {message : '비밀번호가 일치하지 않습니다.'}) |
53 | } | 56 | } |
54 | else{ | 57 | else{ |
55 | - var sql = {ID: ID, password: password, type:req.body.type}; | 58 | + var subqry = connection.query('select * from userDB where nickname=?', [req.body.nickname], function(err, rows_){ |
56 | - var query = connection.query('insert into userDB set ?', sql, function(err, rows){ | 59 | + if(err) return done(err); |
57 | - if(err) throw err | 60 | + if(rows_.length){ |
58 | - console.log("알림: 사용자가 추가되었습니다.(" + ID +")") | 61 | + console.log("알림: 중복된 닉네임입니다.") |
59 | - return done(null, {'ID' : ID}); | 62 | + return done(null, false, {message : '중복된 닉네임입니다.'}) |
63 | + } | ||
64 | + else{ | ||
65 | + var sql = {ID: ID, password: password, type:req.body.type, nickname:req.body.nickname}; | ||
66 | + var query = connection.query('insert into userDB set ?', sql, function(err, rows){ | ||
67 | + if(err) throw err | ||
68 | + console.log("알림: 사용자가 추가되었습니다.(" + ID +", " + req.body.nickname + ")") | ||
69 | + return done(null, {'ID' : ID, 'nickname' : req.body.nickname}); | ||
70 | + }) | ||
71 | + } | ||
60 | }) | 72 | }) |
61 | } | 73 | } |
62 | } | 74 | } | ... | ... |
... | @@ -12,7 +12,7 @@ | ... | @@ -12,7 +12,7 @@ |
12 | <div class="container"> | 12 | <div class="container"> |
13 | <a class="navbar-brand" href="/main">묵호의 놀이터</a> | 13 | <a class="navbar-brand" href="/main">묵호의 놀이터</a> |
14 | <div class="user"> | 14 | <div class="user"> |
15 | - <a> <%= ID %> 님 안녕하세요 </section></a> | 15 | + <a> <%= nickname %> 님 안녕하세요 </section></a> |
16 | <a class="btn btn-primary" href="/logout">로그아웃</a> | 16 | <a class="btn btn-primary" href="/logout">로그아웃</a> |
17 | </div> | 17 | </div> |
18 | </div> | 18 | </div> | ... | ... |
... | @@ -21,7 +21,7 @@ | ... | @@ -21,7 +21,7 @@ |
21 | <div class="container"> | 21 | <div class="container"> |
22 | <a class="navbar-brand" href="/main">묵호의 놀이터</a> | 22 | <a class="navbar-brand" href="/main">묵호의 놀이터</a> |
23 | <div class="user"> | 23 | <div class="user"> |
24 | - <a> <%= ID %> 님 안녕하세요 </a> | 24 | + <a> <%=nickname%> 님 안녕하세요 </a> |
25 | <a class="btn btn-primary" href="/logout">로그아웃</a> | 25 | <a class="btn btn-primary" href="/logout">로그아웃</a> |
26 | </div> | 26 | </div> |
27 | </div> | 27 | </div> |
... | @@ -45,11 +45,7 @@ | ... | @@ -45,11 +45,7 @@ |
45 | <form class="form-subscribe" id="contactForm" data-sb-form-api-token="API_TOKEN"> | 45 | <form class="form-subscribe" id="contactForm" data-sb-form-api-token="API_TOKEN"> |
46 | <!-- ID input--> | 46 | <!-- ID input--> |
47 | <div class="row"> | 47 | <div class="row"> |
48 | - <div class="col"> | 48 | + <a class="btn btn-primary" href="/board/list">임시게시판</a> |
49 | - <input class="form-control form-control-lg" id="IDBelow" type="text" placeholder="ID" data-sb-validations="required" /> | ||
50 | - <div class="invalid-feedback text-white" data-sb-feedback="IDBelow:required">ID를 입력하세요.</div> | ||
51 | - </div> | ||
52 | - <div class="col-auto"><button class="btn btn-primary btn-lg disabled" id="submitButton" type="submit">회원가입</button></div> | ||
53 | </div> | 49 | </div> |
54 | <!-- Submit success message--> | 50 | <!-- Submit success message--> |
55 | <!----> | 51 | <!----> | ... | ... |
... | @@ -44,6 +44,11 @@ | ... | @@ -44,6 +44,11 @@ |
44 | <div class="invalid-feedback" data-sb-feedback="passwordConfirm:required">비밀번호 확인을 해주세요.</div> | 44 | <div class="invalid-feedback" data-sb-feedback="passwordConfirm:required">비밀번호 확인을 해주세요.</div> |
45 | </div> | 45 | </div> |
46 | <div class="form-floating mb-3"> | 46 | <div class="form-floating mb-3"> |
47 | + <input class="form-control" name="nickname" id="nickname" type="text" required minlength='1' maxlength='20' placeholder="nickname" data-sb-validations="required" /> | ||
48 | + <label for="nickname">닉네임</label> | ||
49 | + <div class="invalid-feedback" data-sb-feedback="nickname:required">닉네임을 입력하세요.</div> | ||
50 | + </div> | ||
51 | + <div class="form-floating mb-3"> | ||
47 | <select class="form-select" name="type" id="type" aria-label="사용자 유형"> | 52 | <select class="form-select" name="type" id="type" aria-label="사용자 유형"> |
48 | <option value="작곡가">작곡가</option> | 53 | <option value="작곡가">작곡가</option> |
49 | <option value="가수">가수</option> | 54 | <option value="가수">가수</option> | ... | ... |
-
Please register or login to post a comment