choi

Add the bulletin reading function

...@@ -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>
......