NODE.JS 페이징(게시판) (1)

oracledb.OBJECT : 불러온 db를 키, 값 형태로 가져오기

create sequence test_num : 1부터 1씩 증가시키겠다

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NODE.JS 페이징(게시판) (2)

 

const oracledb = require("oracledb");
const dbConfig = require("./../../config/db_config");

oracledb.outFormat = oracledb.OBJECT; //키, 값 형태로 가져오기
oracledb.autoCommit = true;

const daoRead = {
  list: async () => {
    const con = await oracledb.getConnection(dbConfig);
    let result = await con.execute("select * from paging");
    return result;
  },
  content: async (num) => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = `select * from paging where num='${num}'`;
    const data = await con.execute(sql);
    return data;
  }
};

const daoInsert = {
  write: async (body) => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = `insert into paging values(test_num.nextval,:title, sysdate, 0)`;
    let result = 0;
    try {
      result = await con.execute(sql, body);
    } catch (err) {
      console.log(err);
    }
  },
};

const daoUpdate = {
    upHit: async (num) => {
        const con = await oracledb.getConnection(dbConfig);
        const sql = `update paging set count=count+1 where num='${num}'`;
        await con.execute(sql);
    }
}
module.exports = { daoRead, daoInsert, daoUpdate };

 

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NODE.JS 페이징(게시판) (3)

* 한 페이지당 몇개의 글을 보여줄지 적용하는 방식

rownum : 글을 삭제하거나 추가하더라도, 개수만을 세어주는 역할이기 때문에 공백없이 잘 가져올 수 있다

 

Controller

const service = require("../service/page_service");
const views = {
  index: (req, res) => {
    res.render("index");
  },
  list: async (req, res) => {
    console.log("req.query.start : ", req.query.start);
    const totalContent = await service.pageRead.totalContent();

    const data = await service.pageRead.list(req.query.start, totalContent);

    //const list = await service.pageRead.list();
    console.log("data : ", data);
    console.log("data.list : ", data.list);
    console.log("data.start : ", data.start);
    res.render("list", { list: data.list, page: data.page, start: data.start, totalContent });
  },
  writeForm: (req, res) => {
    res.render("write_form");
  },
  content: async (req, res) => {
    const data = await service.pageRead.content(req.params.num);
    res.render("content", { data });
  },
};
const process = {
  write: async (req, res) => {
    const msg = await service.pageInsert.write(req.body);
    res.redirect("/page/list");
  },
};
module.exports = { views, process };

Service

const dao = require("../database/pageDAO");
const pageRead = {
  list: async (start, totalC) => {
    start = start && start > 1 ? Number(start) : 1;

    const page = pageOperation(start, totalC);

    const list = await dao.daoRead.list(page.startNum, page.endNum);
    console.log("service : ", list);

    data = {};
    data.page = page; 
    data.start = start;
    data.list = list.rows;

    return data;
  },
  content: async (num) => {
    await pageUpdate.upHit(num);

    const data = await dao.daoRead.content(num);
    return data.rows[0];
  },
  totalContent: async () => {
    const totalContent = await dao.daoRead.totalContent();
    console.log(totalContent);
    return totalContent.rows[0]["COUNT(*)"];
  },
};

const pageOperation = (start, totalContent) => {
  let page = {};
  const pageNum = 3; //하나의 페이지에 몇개의 게시물을 보여줄 지...
  const num = (totalContent % pageNum == 0) ? 0 : 1; 
  page.totPage = parseInt(totalContent / pageNum) + num;// 총 페이지 수
  page.startNum = (start - 1) * pageNum + 1; //start에 따라 페이지에 처음으로 보여줄 게시물
  page.endNum = start * pageNum;  //start에 따라 페이지에 마지막으로 보여줄 게시물
  return page;
};

const pageUpdate = {
  upHit: async (num) => {
    await dao.daoUpdate.upHit(num);
  },
};
const pageInsert = {
  write: async (body) => {
    const result = await dao.daoInsert.write(body);
  },
};
module.exports = { pageRead, pageInsert, pageOperation };

DAO

const oracledb = require("oracledb");
const dbConfig = require("./../../config/db_config");

oracledb.outFormat = oracledb.OBJECT; //키, 값 형태로 가져오기
oracledb.autoCommit = true;

const daoRead = {
  list: async (s, e) => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = `select B.* from
                    (select rownum rn, A.* from
                        (select * from paging order by num desc)A)B 
                            where rn between ${s} and ${e}`;
    let result = await con.execute(sql);
    return result;
  },
  content: async (num) => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = `select * from paging where num='${num}'`;
    const data = await con.execute(sql);
    return data;
  },
  totalContent: async () => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = "select count(*) from paging";
    const totalContent = await con.execute(sql);
    return totalContent;
  },
};

const daoInsert = {
  write: async (body) => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = `insert into paging values(test_num.nextval,:title, sysdate, 0)`;
    let result = 0;
    try {
      result = await con.execute(sql, body);
    } catch (err) {
      console.log(err);
    }
  },
};

const daoUpdate = {
  upHit: async (num) => {
    const con = await oracledb.getConnection(dbConfig);
    const sql = `update paging set count=count+1 where num='${num}'`;
    await con.execute(sql);
  },
};
module.exports = { daoRead, daoInsert, daoUpdate };

ejs

<table border="1">
    <tr>
        <th>번호</th> <th>제목</th> <th>등록날짜</th> <th>조회수</th>
    </tr>
<% list.forEach( data => { %>
    <tr>
        <td><%= data.NUM %></td>  
        <td><a href="/page/content/<%= data.NUM %>"><%= data.TITLE %></a></td>
        <td><%= data.PDATE %></td> 
        <td><%= data.COUNT %></td>
    </tr>
<% });
if( list.length == 0 ){%>
    <tr><td colspan="4"><b>등록된 정보가 없습니다</b></td></tr>
<%} %>
    <tr><td colspan="4">
        <% if( start <= 1){ %>
            <button disabled>이전</button>
        <%}else{%>
            <button type="button" onclick="
                location.href='/page/list?start=<%=start - 1%>'">이전</button>
        <% }for(let i=1 ; i <= page.totPage ; i++ ){ %>
            <a href="/page/list?start=<%= i %>"><%= i %></a>
        <% }if( start < page.totPage ){%>
            <button type="button" onclick="
                location.href='/page/list?start=<%=start + 1%>'">다음</button>
        <% }else{ %>
            <button disabled>다음</button>
        <% } %>
            <br>
        start : <%= start %> / <%= page.totPage %> / <a href="/page/write_form">글 등록</a>
    </td></tr>
</table>

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NODE.JS 페이징(게시판) (4)

quiz_dbconnect_board.zip
3.00MB

 

 

 

위 파일에 이어서 작업

 

<link href="/static/css/header.css" rel="stylesheet" />
<script>
  window.onload = () => {
    console.log(document.cookie);
    let msg = "<li><a href='/'>HOME</a></li>";

    msg += "<li><a href='/board/list'>BOARD</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 />
<%- 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>

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NODE.JS 페이징(게시판) (5)

const service = require("../../service/board/board_service");
const common = require("../../service/ser_common");

const board_views = {
  list: async (req, res) => {
    const list = await service.boardRead.list();
    res.render("board/list", { list });
  },
  writeForm: (req, res) => {
    const session = req.session;
    const msg = common.sessionCheck(session);
    if (msg != 0) {
      return res.send(msg);
    }
    res.render("board/write_form", { username: session.username });

  },
};
const board_process = {
    write : async (req, res) => {
        const msg = await service.boardInsert.write(
            req.body, req.file, req.fileValidation
        );
        res.send(msg);
    }
}
module.exports = { board_views, board_process };
const dao = require("../../database/board/board_dao");
const common = require("../ser_common");

const boardRead = {
  list: async () => {
    let list = await dao.boardRead.list();
    list = common.timeModify(list.rows);
    return list;
  },
};
const boardInsert = {
  write: async (body, file, fileValidation) => {
    let msg, url;
    if (fileValidation) {
      msg = fileValidation;
      url = "/board/write_form";
      return common.getMessage(msg, url);
    }
    console.log("file : ", file);
    if (file != undefined) {
      body.origin_file_name = file.originalname;
      body.change_file_name = file.filename;
    } else {
      body.origin_file_name = "nan";
      body.change_file_name = "nan";
    }
    console.log("body : ", body);
    const result = await dao.boardInsert.write(body);
    if (result.rowsAffected === 1) {
        msg = "등록되었습니다!!!";
        url = "/board/list"
    }else{
        msg = "문제 발생!!!";
        url = "/board/write_form";
    }
    return common.getMessage(msg, url)
  },
};
module.exports = { boardRead, boardInsert };
const con = require("../common_dao");
const boardRead = {
  list: async () => {
    const sql = "select * from board";
    console.log("con : ", con);
    const list = (await con).execute(sql);
    return list;
  },
};
const boardInsert = {
    write: async (body) => {
        const sql = `insert into board(write_no, id, title, content, origin_file_name,
        change_file_name) values(board_seq.nextval, :id, :title, :content, 
        :origin_file_name, :change_file_name)`;
        const result = await (await con).execute(sql, body);
        console.log("result : ", result);
        return result;
    }
}
module.exports = { boardRead, boardInsert };

<link href="/static/css/header.css" rel="stylesheet" />
<script>
  window.onload = () => {
    console.log(document.cookie);
    let msg = "<li><a href='/'>HOME</a></li>";

    msg += "<li><a href='/board/list'>BOARD</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 />
<%- 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>
<%- 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>

 

실행 결과

 

'node.js' 카테고리의 다른 글

NODE.JS 활용 (8)  (0) 2024.04.09
NODE.JS 활용 (6)  (0) 2024.04.05
NODE.JS 활용 (5)  (0) 2024.04.04
NODE.JS 활용 (4)  (0) 2024.04.02
NODE.JS 활용 (3)  (0) 2024.04.01

+ Recent posts