게시판 구현 ( 페이징, 답변 )
create table paging(
num number not null,
title varchar2(30) not null,
pdate varchar2(10) not null,
count number not null,
primary key(num)
);
create sequence test_num;
DB 테이블 생성
npm install express --save npm install ejs --save npm install oracledb@5.5.0 --save npm install supervisor --save npm install body-parser --save |
npm 설치
게시판 목록보기 구현
게시판 목록보기 구현 완료
글 작성기능 구현
글 작성부분 구현 완료
글 상세보기 구현
글 상세보기 구현 완료
조회수 증가시키는 부분 구현
글 조회수 증가 구현 완료
페이징 처리
rownum : 가상의 행의 수
( 의미는 없지만, 만약 글의 번호로 데이터를 처리한다고 가정했을 때 한 페이지에 글을 5개씩 출력하고자 할 때 2번째 작성 글이 삭제되었다면 오류가 발생하거나 첫번째 페이지에 1, 3, 4, 5 글 4개만 출력되게 된다..... 그래서 오라클에서 지원하는 가상의 행{결과 값이 출력되는 행만큼 임의의 번호를 붙여주는 rownum}인 rownum 을 사용하여 글이 삭제되었어도 빈 값이 없이 1, 3, 4, 5, 6 식으로 출력되게끔 설정한다 )
페이징 처리 완료
댓글
create table board(
write_no number(10) primary key,
title varchar2(100),
content varchar2(300),
save_date date default sysdate,
hit number(10) default 0,
origin_file_name varchar(100),
change_file_name varchar(100),
id varchar(20) not null,
constraint fk_test foreign key(id) references members(id) on delete cascade
);
create sequence board_seq;
sql developer 에서 쿼리문 작성하여 테이블 생성
write no : 글 번호
title : 제목
content : 내용
save_date : 저장 날짜
id : 글 작성자
npm install multer@1.4.4 --save |
multer npm 설치
( multer - 파일 업로드를 위해 사용되는 Node.js 의 미들웨어 )
* { margin: 0; }
.wrap { width: 1000px; margin: auto; }
.header { width: 1000px; }
.navdiv { width: 100%; background-color: olive; }
.nav { background-color: olive; width: 1000px;}
.nav ul { list-style: none; display: flex;
justify-content: end; }
.nav ul li { padding: 10px; }
.nav ul li a { text-decoration:none; color:white; }
.nav ul li a:hover{
color: orange; border-bottom: 2px solid black;
transition : all 0.25s; padding-bottom: 3px;
}
.title{ text-shadow: 10px 10px 15px black;
font-size: 70pt;
text-align: center;
margin-top: 0;
padding-bottom: 20px;
color: burlywood;
font-family: Gabriola;
}
.content { margin-top: 50px; }
header.css 코드
<link href="/static/css/header.css" rel="stylesheet">
<script >
window.onload = () =>{
console.log(document.cookie);
let msg ="<li><a href='/'>HOME</a></li>";
if(document.cookie.indexOf("isLogin=true") !== -1 ){
msg += '<li><a href="/member/logout">로그아웃</a></li>';
msg += '<li><a href="/member/list">회원정보</a></li>';
}else{
msg += '<li><a href="/member/login">로그인</a></li>';
msg += '<li><a href="/member/login">회원정보</a></li>';
}
document.querySelector("#nav ul").innerHTML = msg
}
</script>
<div class="wrap">
<div class="header">
<h1 class="title">CARE LAB</h1>
</div>
</div>
<div class="navdiv">
<div class="wrap">
<nav id="nav" class="nav">
<ul></ul>
</nav>
</div>
</div>
<hr>
header.ejs 코드 변경 ( link 로 외부 css 파일 적용 )
<%- include ("../default/header") %>
<div class="content wrap">
<table border="1" style="width:100%;">
<tr>
<th>번호</th> <th>id</th> <th>제목</th> <th>날짜</th>
<th>조회수</th> <th>원본 이미지이름</th> <th>변경 이미지이름</th>
</tr>
<% if( list.length == 0){ %>
<tr>
<th colspan="7">등록된 글이 없습니다</th>
</tr>
<%}else{
list.forEach(data=>{%>
<tr>
<td><%=data.WRITE_NO%></td><td><%=data.ID%></td>
<td><%=data.TITLE%></td><td><%=data.SAVE_DATE%></td>
<td><%=data.HIT%></td><td><%=data.ORIGIN_FILE_NAME%></td>
<td><%=data.CHANGE_FILE_NAME%></td>
</tr>
<%})
}%>
<tr>
<td colspan="7" align="right">
<a href="/board/write_form">글 작성</a>
</td>
</tr>
</table>
</div>
list.ejs 코드
<%- include ("../default/header") %>
<script src="/static/js/image_read.js"></script>
<div class="content wrap">
<div style="width: 400px; margin: 0 auto; ">
<h1 style="text-align: center">글쓰기</h1>
<form method="post" action="/board/write"
enctype="multipart/form-data">
<b>작성자</b><br> <!-- readonly : 읽기 전용 -->
<input type="text" name="id" value="<%= username %>" readonly />
<hr>
<b>제목</b> <br> <input type="text" size="50" name="title" /><hr>
<b>내용</b> <br>
<textarea name="content" rows="10" cols="50"></textarea><hr>
<b>이미지파일 첨부</b><br>
<input type="file" name="image_file_name" onchange="readURL(this);" />
<img id="img" src="#" width=100 height=100 alt="선택된 이미지가 없습니다" />
<hr>
<input type="submit" value="글쓰기">
<input type=button value="목록보기" onClick="location.href='/board/list'">
</form>
</div>
</div>
write_form.ejs 코드
const readURL = (input) => {
console.log(input);
console.log(input.files[0]);
const file = input.files[0];
if(file != ""){
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = (e) => {
console.log(e.target.result);
// 파일에 대한 정보가 담겨있는 곳
document.getElementById("img").src = e.target.result;
}
}
}
image_read.js 코드
const multer = require("multer");
const stg = multer.diskStorage({
destination : ( req , file, cb ) => {
cb(null, "upload_file")
},
filename : ( req, file, cb) => {
cb(null, Date.now()+"-"+file.originalname );
}
})
const f_filter = (req, file, cb)=>{
const type = file.mimetype.split("/");
if( type[0] == "image" ){
cb(null, true);
}else{
req.fileValidation = "이미지만 저장하세요";
cb(null, false);
}
}
const upload = multer({storage : stg, fileFilter : f_filter })
module.exports = upload;
file_config.js 코드
'BE > Node.js' 카테고리의 다른 글
[Node.js] 게시판 구현 2 ( 댓글 기능 추가, 페이징, 게시글 수정, 게시글 삭제, 이미지 수정 ) (0) | 2024.04.09 |
---|---|
[Node.js] css 파일, script 파일을 분리하여 관리 (0) | 2024.04.05 |
[Node.js] 파일(이미지) 업로드, 다운로드, 수정, 삭제 (0) | 2024.04.05 |
[Node.js] get, post, put, delete (0) | 2024.04.05 |
[Node.js] 암호화, fetch, spa (1) | 2024.04.04 |