Showing
5 changed files
with
63 additions
and
44 deletions
... | @@ -48,8 +48,22 @@ DB구조 - board에서 사용됨(*idx, name, title, content, regdate, modidate, | ... | @@ -48,8 +48,22 @@ DB구조 - board에서 사용됨(*idx, name, title, content, regdate, modidate, |
48 | *idx int, name varchar(50), title varchar(50), content mediumtext, regdate datetime, modidate datetime, passwd varchar(50), hit int<br> | 48 | *idx int, name varchar(50), title varchar(50), content mediumtext, regdate datetime, modidate datetime, passwd varchar(50), hit int<br> |
49 | 49 | ||
50 | 50 | ||
51 | -LF 오류시 git config --global core.autocrlf true 입력<br><br> | 51 | +<h2>LF 오류시 git config --global core.autocrlf true 입력<h2><br> |
52 | +<h2>게시글 reset 후 idx의 값이 1부터 시작하지 않을 경우 | ||
53 | +ALTER TABLE board AUTO_INCREMENT = 1; | ||
54 | +SET @COUNT = 0; | ||
55 | +UPDATE board SET idx = @COUNT:=@COUNT+1; | ||
56 | +입력<h2><br><br> | ||
52 | 57 | ||
53 | -최종 수정: 2021-11-19 16:28<br> | 58 | +최종 수정: 2021-11-20 12:32<br> |
54 | -최종 수정 내용: 버그 수정, 게시글 조회수 구현, 프로필 수정 세션 연동, about/사이트 git 링크 추가, 프로필 추가<br> | 59 | +최종 수정 내용: |
55 | -수정 내용: 메뉴바/하단 추가, 게시판에 기본 서식 추가, 로그인시에만 게시판 관련 경로에 접근가능하게 함, 사용자 로그 생성, 경로 지정 수정, 제목 추가, userDB, 회원가입에 nickname요소 추가, 세션에 ID + 닉네임 전달기능 추가, 게시판의 글쓰기 및 글 열람 기능 추가. | 60 | +<h2>★★필수입력★★<h2> |
61 | +alter table board drop passwd; | ||
62 | +alter table board add ID varchar(20) not null; | ||
63 | +alter table board change name nickname; | ||
64 | +alter table board modify nickname varchar(20); | ||
65 | + | ||
66 | +게시글 수정 및 삭제 세션+권한 연동/DB수정, 버그 수정, 게시글 조회수 구현, 프로필 수정 세션 연동<br> | ||
67 | +수정 내용: about/사이트 git 링크 추가, 프로필 추가, 메뉴바/하단 추가, 게시판에 기본 서식 추가, 로그인시에만 게시판 관련 경로에 접근가능하게 함, 사용자 로그 생성, 경로 지정 수정, 제목 추가, userDB, 회원가입에 nickname요소 추가, 세션에 ID + 닉네임 전달기능 추가, 게시판의 글쓰기 및 글 열람 기능 추가. | ||
68 | + | ||
69 | +<!-- http://khuhub.khu.ac.kr/2017104034/Singer-Composer --> | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -13,7 +13,7 @@ router.get('/list/:page', function(req, res, next) { | ... | @@ -13,7 +13,7 @@ router.get('/list/:page', function(req, res, next) { |
13 | if(!id) res.redirect('/board/list/1') | 13 | if(!id) res.redirect('/board/list/1') |
14 | else{ | 14 | else{ |
15 | var page = req.params.page; | 15 | var page = req.params.page; |
16 | - var sql = "select idx, name, title, date_format(modidate,'%Y-%m-%d %H:%i:%s') modidate, " + | 16 | + var sql = "select idx, nickname, title, date_format(modidate,'%Y-%m-%d %H:%i:%s') modidate, " + |
17 | "date_format(regdate,'%Y-%m-%d %H:%i:%s') regdate, hit from board order by idx desc"; | 17 | "date_format(regdate,'%Y-%m-%d %H:%i:%s') regdate, hit from board order by idx desc"; |
18 | board.query(sql, function(err,rows) { | 18 | board.query(sql, function(err,rows) { |
19 | if (err) console.error("err : " + err); | 19 | if (err) console.error("err : " + err); |
... | @@ -43,22 +43,15 @@ router.get('/write', function(req,res,next){ | ... | @@ -43,22 +43,15 @@ router.get('/write', function(req,res,next){ |
43 | }) | 43 | }) |
44 | 44 | ||
45 | router.post('/write', function(req,res,next){ | 45 | router.post('/write', function(req,res,next){ |
46 | - var id = req.user.ID | 46 | + var nickname = req.user.nickname // var name = req.body.name |
47 | - var nickname = req.user.nickname | ||
48 | - //var name = req.body.name | ||
49 | var title = req.body.title | 47 | var title = req.body.title |
50 | var content = req.body.content | 48 | var content = req.body.content |
51 | - //var passwd = req.body.passwd | 49 | + var ID = req.user.ID |
52 | - var datas = [ID, nickname,title,content] | 50 | + var datas = [nickname, title, content, ID] |
53 | 51 | ||
54 | - var id; | 52 | + var sql = "insert into board(nickname, title, content, regdate, modidate, hit, ID) values(?,?,?,now(),now(),0, ?)"; |
55 | - var nickname; | 53 | + board.query(sql, datas, function (err, rows) { |
56 | - var sql = "insert into board(name, title, content, regdate, modidate, passwd, hit) values(?,?,?,now(),now(),?,0)"; | ||
57 | - board.query(sql,datas, function (err, rows) { | ||
58 | if (err) console.error("err : " + err); | 54 | if (err) console.error("err : " + err); |
59 | - | ||
60 | - id = req.user.ID; | ||
61 | - nickname = req.user.nickname; | ||
62 | }); | 55 | }); |
63 | 56 | ||
64 | var idx_; | 57 | var idx_; |
... | @@ -67,6 +60,9 @@ router.post('/write', function(req,res,next){ | ... | @@ -67,6 +60,9 @@ router.post('/write', function(req,res,next){ |
67 | if(err) console.error("err : " + err); | 60 | if(err) console.error("err : " + err); |
68 | idx_ = rows[0].idx; | 61 | idx_ = rows[0].idx; |
69 | 62 | ||
63 | + if(!idx_) // 글이 없으면 NULL | ||
64 | + idx_ = 1; | ||
65 | + | ||
70 | console.log(req.user.ID+'('+nickname+') 유저가 '+idx_+'번 게시글을 작성했습니다.') | 66 | console.log(req.user.ID+'('+nickname+') 유저가 '+idx_+'번 게시글을 작성했습니다.') |
71 | res.redirect('/board/read/'+idx_); | 67 | res.redirect('/board/read/'+idx_); |
72 | }); | 68 | }); |
... | @@ -74,9 +70,9 @@ router.post('/write', function(req,res,next){ | ... | @@ -74,9 +70,9 @@ router.post('/write', function(req,res,next){ |
74 | 70 | ||
75 | router.get('/read/:idx', function(req,res,next){ | 71 | router.get('/read/:idx', function(req,res,next){ |
76 | var idx = req.params.idx | 72 | var idx = req.params.idx |
77 | - var sql = "select idx, name, title, content, date_format(modidate,'%Y-%m-%d %H:%i:%s') modidate, " + | 73 | + var sql = "select idx, nickname, title, content, date_format(modidate,'%Y-%m-%d %H:%i:%s') modidate, " + |
78 | - "date_format(regdate,'%Y-%m-%d %H:%i:%s') regdate, hit from board where idx=?"; | 74 | + "date_format(regdate,'%Y-%m-%d %H:%i:%s') regdate, hit, ID from board where idx=?"; |
79 | - board.query(sql,[idx], function(err,row){ | 75 | + board.query(sql, [idx], function(err,row){ |
80 | if(err) console.error(err) | 76 | if(err) console.error(err) |
81 | 77 | ||
82 | var id = req.user; | 78 | var id = req.user; |
... | @@ -98,18 +94,17 @@ router.get('/read/:idx', function(req,res,next){ | ... | @@ -98,18 +94,17 @@ router.get('/read/:idx', function(req,res,next){ |
98 | }) | 94 | }) |
99 | 95 | ||
100 | router.post('/update', function(req,res,next){ | 96 | router.post('/update', function(req,res,next){ |
97 | + var ID = req.user.ID; | ||
101 | var idx = req.body.idx | 98 | var idx = req.body.idx |
102 | - var name = req.body.name | ||
103 | var title = req.body.title | 99 | var title = req.body.title |
104 | var content = req.body.content | 100 | var content = req.body.content |
105 | - var passwd = req.body.passwd | 101 | + var datas = [title, content, idx, ID] |
106 | - var datas = [name, title, content, idx, passwd] | ||
107 | 102 | ||
108 | - var sql = "update board set name = ?,title=?,content=?,modidate=now() where idx =? and passwd=?" | 103 | + var sql = "update board set title=?,content=?,modidate=now() where idx =? and ID=?" |
109 | board.query(sql,datas,function(err,result){ | 104 | board.query(sql,datas,function(err,result){ |
110 | if(err) console.error(err) | 105 | if(err) console.error(err) |
111 | if(result.affectedRows==0){ | 106 | if(result.affectedRows==0){ |
112 | - res.send("<script>alert('패스워드가 일치하지 않습니다.');history.back();</script>") | 107 | + res.send("<script>alert('게시글 작성자가 아닙니다.');history.back();</script>") |
113 | } | 108 | } |
114 | else{ | 109 | else{ |
115 | var id = req.user.ID; | 110 | var id = req.user.ID; |
... | @@ -122,22 +117,40 @@ router.post('/update', function(req,res,next){ | ... | @@ -122,22 +117,40 @@ router.post('/update', function(req,res,next){ |
122 | 117 | ||
123 | router.post('/delete', function(req,res,next){ | 118 | router.post('/delete', function(req,res,next){ |
124 | var idx = req.body.idx | 119 | var idx = req.body.idx |
125 | - var passwd = req.body.passwd | 120 | + var ID = req.user.ID; |
126 | - var datas = [idx,passwd] | 121 | + var datas = [idx,ID] |
127 | - | ||
128 | - var sql = "delete from board where idx=? and passwd=?" | ||
129 | 122 | ||
123 | + var sql = "delete from board where idx=? and ID=?" | ||
130 | board.query(sql,datas, function(err,result){ | 124 | board.query(sql,datas, function(err,result){ |
131 | if(err) console.error(err) | 125 | if(err) console.error(err) |
126 | + | ||
127 | + // 삭제를 요청한 사용자가 작성자가 아닌 경우 | ||
132 | if(result.affectedRows == 0){ | 128 | if(result.affectedRows == 0){ |
133 | - res.send("<script>alert('패스워드가 일치하지 않습니다.');history.back();</script>"); | 129 | + // 운영자세요? |
130 | + var sql_ = 'select type from userdb where ID="'+ID+'"'; | ||
131 | + board.query(sql_, function(err_, result_){ | ||
132 | + if(err_) console.error(err_) | ||
133 | + | ||
134 | + if(result_[0].type == "운영자"){ // 작성자는 아니나 유저 타입이 운영자인 경우 | ||
135 | + var sqlAdmin = 'delete from board where idx="'+idx+'"'; | ||
136 | + board.query(sqlAdmin, function(err__, result__){ | ||
137 | + if(err__) console.error(err__) | ||
138 | + | ||
139 | + var nickname = req.user.nickname; | ||
140 | + res.send("<script>alert('게시글이 운영자에 의해 삭제되었습니다.');window.location.href='/board/list/';</script>"); | ||
141 | + console.log("[Admin] "+req.user.ID+'('+nickname+') 유저가 '+idx+'번 게시글을 삭제했습니다.') | ||
142 | + }) | ||
143 | + } | ||
144 | + else{ // 작성자도, 운영자도 아니면 | ||
145 | + res.send("<script>alert('게시글 작성자가 아닙니다');history.back();</script>"); | ||
146 | + } | ||
147 | + }) | ||
134 | } | 148 | } |
135 | - else | 149 | + else{ // 작성자인 경우 |
136 | - { | ||
137 | var id = req.user.ID; | 150 | var id = req.user.ID; |
138 | var nickname = req.user.nickname; | 151 | var nickname = req.user.nickname; |
152 | + res.send("<script>alert('게시글이 삭제되었습니다.');window.location.href='/board/list/';</script>"); | ||
139 | console.log(req.user.ID+'('+nickname+') 유저가 '+idx+'번 게시글을 삭제했습니다.') | 153 | console.log(req.user.ID+'('+nickname+') 유저가 '+idx+'번 게시글을 삭제했습니다.') |
140 | - res.redirect('/board/list/'); | ||
141 | } | 154 | } |
142 | }) | 155 | }) |
143 | }) | 156 | }) | ... | ... |
... | @@ -52,7 +52,7 @@ | ... | @@ -52,7 +52,7 @@ |
52 | %> | 52 | %> |
53 | <tr> | 53 | <tr> |
54 | <td><%=data.idx%></td> | 54 | <td><%=data.idx%></td> |
55 | - <td><%=data.name%></td> | 55 | + <td><%=data.nickname%></td> |
56 | <td><a href="/board/read/<%=data.idx%>"><%=data.title%></a></td> | 56 | <td><a href="/board/read/<%=data.idx%>"><%=data.title%></a></td> |
57 | <td><%=data.hit%></td> | 57 | <td><%=data.hit%></td> |
58 | <td><%=data.modidate%></td> | 58 | <td><%=data.modidate%></td> | ... | ... |
... | @@ -43,7 +43,7 @@ | ... | @@ -43,7 +43,7 @@ |
43 | <input type="hidden" name="idx" value="<%=row.idx%>"/> | 43 | <input type="hidden" name="idx" value="<%=row.idx%>"/> |
44 | <tr> | 44 | <tr> |
45 | <td>작성자</td> | 45 | <td>작성자</td> |
46 | - <td><input type="text" name="name" id="name" value="<%=row.name%>" required/></td> | 46 | + <td><%=nickname%></td> |
47 | </tr> | 47 | </tr> |
48 | <tr> | 48 | <tr> |
49 | <td>제목</td> | 49 | <td>제목</td> |
... | @@ -54,10 +54,6 @@ | ... | @@ -54,10 +54,6 @@ |
54 | <td><textarea name="content" id="content" cols="30" rows="10" required><%=row.content%></textarea></td> | 54 | <td><textarea name="content" id="content" cols="30" rows="10" required><%=row.content%></textarea></td> |
55 | </tr> | 55 | </tr> |
56 | <tr> | 56 | <tr> |
57 | - <td>패스워드</td> | ||
58 | - <td><input type="password" name="passwd" id="passwd" required/></td> | ||
59 | - </tr> | ||
60 | - <tr> | ||
61 | <td>변경일</td> | 57 | <td>변경일</td> |
62 | <td><%=row.modidate%></td> | 58 | <td><%=row.modidate%></td> |
63 | </tr> | 59 | </tr> | ... | ... |
... | @@ -35,7 +35,7 @@ | ... | @@ -35,7 +35,7 @@ |
35 | <table border="1"> | 35 | <table border="1"> |
36 | <tr> | 36 | <tr> |
37 | <td>작성자</td> | 37 | <td>작성자</td> |
38 | - <td><input type="text" name="name" id="name" required/></td> | 38 | + <td><%=nickname%></td> |
39 | </tr> | 39 | </tr> |
40 | <tr> | 40 | <tr> |
41 | <td>제목</td> | 41 | <td>제목</td> |
... | @@ -46,10 +46,6 @@ | ... | @@ -46,10 +46,6 @@ |
46 | <td><textarea name="content" id="content" cols="30" rows="10" required></textarea></td> | 46 | <td><textarea name="content" id="content" cols="30" rows="10" required></textarea></td> |
47 | </tr> | 47 | </tr> |
48 | <tr> | 48 | <tr> |
49 | - <td>패스워드</td> | ||
50 | - <td><input type="password" name="passwd" id="passwd" required/></td> | ||
51 | - </tr> | ||
52 | - <tr> | ||
53 | <td colspan="2"> | 49 | <td colspan="2"> |
54 | <button type="submit">글쓰기</button> | 50 | <button type="submit">글쓰기</button> |
55 | </td> | 51 | </td> | ... | ... |
-
Please register or login to post a comment