본문 바로가기
ICIA 수업일지

2021.08.06 수업일지 {MySQL, html, css, java script(jQuery), node.js}

by 주성씨 2021. 8. 7.

- 플러그인 - 라이브러리에 모아 놓은 특정 기능을 가지고와서 사용할 수 있는 기능

- nodemon은 한번만 설치하면 다시 설치 안해도 된다.

 

ex04>routes>app.js

// 2021.08.06 연결해주는 코드의 역할을 한다.
// 라우터 뿌려준다고 생각하자.
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
app.use('/', indexRouter); // '/' 를 하면 routes>index.js
app.use('/users', usersRouter); // '/users' 를 하면 routes>users.js

 

ex04>views>index.ejs

<!DOCTYPE html>
<html>

<head>
  <title><%= title %></title>
  <link rel='stylesheet' href='/stylesheets/style.css' />
</head>

<body>
  <div id="container">
    <div id="header"></div>
    <div id="content"></div>
    <div id="footer"></div>
  </div>
</body>

</html>

 

[new] ex04>public>stylesheet>style.css

#container {
  width: 940px;
  padding: 20px;
  border: 1px solid burlywood;
  margin: 0px auto;
}
#header {
  padding: 20px;
  border: 1px solid burlywood;
  margin-bottom: 10px;
}
#content {
  padding: 20px;
  border: 1px solid burlywood;
  margin-bottom: 10px;
}
#footer {
  padding: 20px;
  border: 1px solid burlywood;
}

 

초기 틀

 

    <div id="header">
      <img src="/images/back.jpg" width=900/>
    </div>

 

- [new] DB 

#2021.08.06
#데이터 베이스 생성
create database furnituredb;

 

 

#유저 생성
create user 'furniture'@'localhost' identified by 'pass';
#유저에게 데이터베이스 권한 부여
grant all privileges on furnituredb.* to 'furniture'@'localhost';

 

create table product(
	id int auto_increment primary key,
    title nvarchar(100) not null,
    image nvarchar(100),
    price int default 0
    );

 

 

insert into product(title, image, price)
values('5단원목 서랍장', '/images/img01.jpg', 150000);
insert into product(title, image, price)
values('슈퍼싱글 원목침대', '/images/img02.jpg', 500000);
insert into product(title, image, price)
values('싱글 원목침대', '/images/img03.jpg', 450000);
insert into product(title, image, price)
values('4인용 가죽 쇼파', '/images/img04.jpg', 1250000);
insert into product(title, image, price)
values('12자 원목 장농', '/images/img05.jpg', 1150000);
insert into product(title, image, price)
values('3단 원목 서랍장', '/images/img06.jpg', 120000);
insert into product(title, image, price)
values('퀀 가죽 침대(흰색)', '/images/img07.jpg', 2150000);
insert into product(title, image, price)
values('퀸 가죽 침대(아이보리)', '/images/img08.jpg', 2150000);
insert into product(title, image, price)
values('12자 원목 슬라이드 장농', '/images/img09.jpg', 1150000);
insert into product(title, image, price)
values('TV 장식장(거울포함)', '/images/img10.jpg', 50000);
insert into product(title, image, price)
values('4인용 가죽 쇼파(스툴포함)', '/images/img11.jpg', 1150000);
insert into product(title, image, price)
values('6인용 원목식탁', '/images/img12.jpg', 850000);
select * from product;

ㄴ 확인

[new] ex04>db.js

var mysql = require('mysql');
var conn;
exports.connect = function () {
    conn = mysql.createPool({
        connectionLimit: 100,
        host: 'localhost',
        user: 'furniture', //*****/
        password: 'pass', //*****/
        database: 'furnituredb' /*****/
    });
}
exports.get = function () {
    return conn;
};

 

ex04>app,js

//2021.08.06
//데이타베이스 연결
var db = require('./db');
db.connect(function(err){
  if(err){
    console.log('DB error.......');
    process.exit(1);
  }else{
    console.log('DB Success......');
  }
});
app.use('/furniture', require('./routes/furniture'))

 

[new] ex04>routes>furniture.js

var express = require('express');
var router = express.Router();
var db = require('../db'); // new

/* GET users listing. */ // new
router.get('/', function(req, res, next) {
    var sql = 'select *, format(price,0) fprice from product;';
    db.get().query(sql,[], function(err,rows){
        res.send(rows);
    });
});

module.exports = router;

 

- 터미널에서 mysql을 설치

C:\data\node\ex04>npm install mysql
+ mysql@2.18.1
added 9 packages from 14 contributors and audited 64 packages in 1.681s
found 0 vulnerabilities


C:\data\node\ex04>

 

db와 연결됨을 확인할 수 있다.

 

- select tag를 이용하여 몇개씩 출력할지 선택하고, 선택된 갯수를 기준으로 다음 페이지로 넘어갈 수 있는 버튼을 만들어보자.

ex04>routes>furniture.js

var express = require('express');
var router = express.Router();
var db = require('../db'); // new

/* GET users listing. */ // new
router.get('/', function(req, res, next) {
    var perPageNum = parseInt(req.query.perPageNum);
    var page = parseInt(req.query.page);
    var sql = 'select *, format(price,0) fprice from product limit ?,?;';
    db.get().query(sql,[(page-1)*perPageNum, perPageNum], function(err,rows){
        res.send(rows);
    });
});

module.exports = router;

 

ex04\public\stylesheets\style.css

@font-face {
  font-family: 'IBMPlexSansKR-Regular';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_20-07@1.0/IBMPlexSansKR-Regular.woff') format('woff');
  font-weight: normal;
  font-style: normal;
}

body{
  font-family: 'IBMPlexSansKR-Regular';
}

#container {
  width: 940px;
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin: 0px auto;
}

#container h3{
  text-align: center;
}

#header {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin-bottom: 10px;
}
#content {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin-bottom: 10px;
}
#footer {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
}
#product {
  width: 800px;
  margin: 0px auto;
  overflow: hidden;
}
.box {
  width: 170px;
  float: left;
  background-color: rgb(250, 239, 234);
  border: 1px solid rgb(245, 224, 214);
  margin-left: 15px;
  margin-bottom: 20px;
  box-shadow: 5px 5px 5px rgb(248, 215, 211);
  padding: 5px;
}
.box img {
  margin-left: 10px;
}
.box .title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin: 5px;
  font-size: 18px;
}

 

 

ex04\views\index.ejs

<!DOCTYPE html>
<html>

<head>
  <title><%= title %></title>
  <link rel='stylesheet' href='/stylesheets/style.css' />
  <script src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>

<body>
  <div id="container">
    <div id="header">
      <img src="/images/back.jpg" width=900 />
    </div>
    <div id="content">
      <h3>상품목록</h3>
      <div style="border:1px solid dotted rgb(233, 137, 126); padding: 5px;">
        <select id="perPageNum" style="height: 30px;">
          <option value="4">4개씩 출력</option>
          <option value="8">8개씩 출력</option>
          <option value="12">12개씩 출력</option>
          <option value="16">16개씩 출력</option>
        </select>
      </div>
      <div id="product"></div>
      <div id="pagination" style="text-align: center; padding: 10px;">
        <button id="prev">&lt;</button>
        <span id="page">1</span>
        <button id="next">&gt;</button>
      </div>
    </div>
    <div id="footer">
      <h3>COPYRIGHT F.Y.B ALL RIGHT RESERVED.</h3>
    </div>
  </div>
</body>

<script>
  // getList(); 이전에 변수 선언
  var page = 1;

  // 목록 출력
  getList();

  // 이전 버튼
  $('#prev').on('click',function(){
    page--;
    getList();
  });

  // 다음 버튼
  $('#next').on('click',function(){
    page++;
    getList();
  });

  // #perPageNum 이 바뀔때 마다 다시 목록 출력
  $('#perPageNum').on('change',function(){
    page=1;
    getList();
  });
  
  // 목록 출력 함수
  function getList() {
    var perPageNum = $('#perPageNum').val();
    $('#page').html(page); 
    // db에서 정보 가지고 오는 ajax
    $.ajax({
      type: 'get',
      url: '/furniture',
      dataType: 'json',
      data: {'perPageNum':perPageNum, 'page':page},
      success: function (data) {
        var str = '';
        $(data).each(function () {
          var id = this.id;
          var title = this.title;
          var price = this.fprice;
          var image = this.image;
          str += `<div class="box">`;
          str += `<img src="${image}" width=150 height=150/>`;
          str += `<div class="title">${id} : ${title}</div>`;
          str += `<div class="price">${price}원</div>`;
          str += `</div>`;
        });
        $('#product').html(str);
      }
    });

    //
  };
</script>

</html>

 

중간 결과

 

- 기능추가
1. 상품조건순 정렬
2. 상품 title 검색으로 정렬 + 상품수 바뀜

ex04\routes\furniture.js

var express = require('express');
var router = express.Router();
var db = require('../db');

/* GET users listing. */
router.get('/', function(req, res, next) {
    var perPageNum = parseInt(req.query.perPageNum);
    var page = parseInt(req.query.page);
    var order = req.query.order; // new
    var search = req.query.search; // new
    var sql = `select *, format(price,0) fprice from product where title like '%${search}%' order by ${order} limit ?,?;`; // new
    db.get().query(sql,[(page-1)*perPageNum, perPageNum], function(err,rows){
        var data = rows;
        // 전체 데이터 갯수 출력
        sql = `select count(*) cnt from product where title like '%${search}%'`;
        db.get().query(sql,[],function(err,rows){
            var count=rows[0].cnt;
            res.send({'rows':data,'count':count});
        });
        // 결과 출력
    });
});

module.exports = router;

 

ex04\views\index.ejs

<!DOCTYPE html>
<html>

<head>
  <title><%= title %></title>
  <link rel='stylesheet' href='/stylesheets/style.css' />
  <script src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>

<body>
  <div id="container">
    <div id="header">
      <img src="/images/back.jpg" width=900 />
    </div>
    <div id="content">
      <h3>상품목록</h3>
      <div id="selectbox">
        <select id="order" style="height: 30px;">
          <option value="id">상품번호순</option>
          <option value="price">상품저가순</option>
          <option value="price desc">상품고가순</option>
          <option value="title">상품이름순</option>
        </select>
        <select id="perPageNum" style="height: 30px;">
          <option value="4">4개씩 출력</option>
          <option value="8">8개씩 출력</option>
          <option value="12">12개씩 출력</option>
          <option value="16">16개씩 출력</option>
        </select>
        <span id="totalCount"></span> <!-- new -->
        <input type="text" placeholder="검색입력" id="txtSearch"/>
      <div id="product"></div>
      <div id="pagination" style="text-align: center; padding: 10px;">
        <button id="prev">&lt;</button>
        <span id="page">1</span>
        <button id="next">&gt;</button>
      </div>
    </div>
    <div id="footer">
      <h3>COPYRIGHT F.Y.B ALL RIGHT RESERVED.</h3>
    </div>
  </div>
</body>

<script>
  // getList(); 이전에 변수 선언
  var page = 1;

  // 목록 출력
  getList();

  // 검색어 상자에서 엔터키를 입력할 경우
  $('#txtSearch').on('keypress',function(e){
    if(e.keyCode==13){
      page==1;
      getList();
    };
  });

  // 정렬키가 바뀔경우 // new
  $('#order').on('change',function(){
    page=1;
    getList();
  });

  // 이전 버튼
  $('#prev').on('click', function () {
    page--;
    getList();
  });

  // 다음 버튼
  $('#next').on('click', function () {
    page++;
    getList();
  });

  // #perPageNum 이 바뀔때 마다 다시 목록 출력
  $('#perPageNum').on('change', function () {
    page = 1;
    getList();
  });

  // 목록 출력 함수
  function getList() {
    var perPageNum = $('#perPageNum').val();
    var order = $('#order').val(); // new
    var search = $('#txtSearch').val(); // new
    // db에서 정보 가지고 오는 ajax
    $.ajax({
      type: 'get',
      url: '/furniture',
      dataType: 'json',
      data: {
        'perPageNum': perPageNum,
        'page': page,
        'order': order, // new
        'search': search // new
      },
      success: function (data) {
        var str = '';
        var count = data.count;
        //.ceil ; 나눠서 올림
        var lastPage = Math.ceil(count/perPageNum);
        $('#page').html(page+'/'+lastPage);
        $('#totalCount').html('상품수:'+count);
        $(data.rows).each(function () {
          var id = this.id;
          var title = this.title;
          var price = this.fprice;
          var image = this.image;
          str += `<div class="box">`;
          str += `<img src="${image}" width=150 height=150/>`;
          str += `<div class="title">${id} : ${title}</div>`;
          str += `<div class="price">${price}원</div>`;
          str += `</div>`;
        });
        $('#product').html(str);
        
        // 첫번째 page일때
        if (page == 1) $('#prev').attr('disabled', true);
        else $('#prev').attr('disabled', false);

        if (page == lastPage) $('#next').attr('disabled', true);
        else $('#prev').attr('disabled', false);

      }
    });
  };
</script>

</html>

 

ex04\public\stylesheets\style.css

@font-face {
  font-family: 'IBMPlexSansKR-Regular';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_20-07@1.0/IBMPlexSansKR-Regular.woff') format('woff');
  font-weight: normal;
  font-style: normal;
}

body {
  font-family: 'IBMPlexSansKR-Regular';
}

#container {
  width: 940px;
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin: 0px auto;
}

#container h3 {
  text-align: center;
}

#header {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin-bottom: 10px;
}

#content {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin-bottom: 10px;
}

#footer {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
}

#product {
  width: 800px;
  margin: 0px auto;
  overflow: hidden;
}

.box {
  width: 170px;
  float: left;
  background-color: rgb(250, 239, 234);
  border: 1px solid rgb(245, 224, 214);
  margin-left: 15px;
  margin-bottom: 20px;
  box-shadow: 5px 5px 5px rgb(248, 215, 211);
  padding: 5px;
}

.box img {
  margin-left: 10px;
}

.box .title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin: 5px;
  font-size: 18px;
}

#txtSearch {
  height: 20px;
  float: right;
}

#selectbox {
  margin-bottom: 20px;
  border: 1px solid dotted rgb(233, 137, 126);
  padding: 5px;
}

 

ex04\app.js

app.use('/notice', require('./routes/notice'))

 

[new] ex04\routes\notice.js

var express = require('express');
var router = express.Router();
var db = require('../db');

/* 공지사항 목록및 갯수*/
router.get('/', function(req, res, next) {
  var num = parseInt(req.query.num)

  //공지사항 목록
  var sql = `select *, date_format(wdate,"%Y-%m-%d %h:%i:%s") fdate from notice order by id desc limit ?,5`;
  db.get().query(sql, [num], function(err, rows){
    var result=rows;

    //공지사항 글수
    sql = 'select format(count(*),0) cnt from notice';
    db.get().query(sql, [], function(err, rows){
        var count = rows[0].cnt;
        res.send({'rows': result, 'count':count});
    });
  });
});

module.exports = router;

 

ex04\views\index.ejs

        <h3>공지사항</h3>
        <div id="notice"></div>
        <div id="more">더보기</div>

ㄴ footer위에 추가

	// 상위에 변수 추가
	var noticeNum = 0;
    // function 불러오기
    getNotice();
 
  // row를 누르면 content가 나오게 한다.
  $('#notice').on('click', '.row', function () {
    //모든 content를 숨긴다.
    $('#notice .row .content').each(function () {
      $(this).hide();
    });
    //현재 선택한 content를 보여준다.
    var content = $(this).find('.content');
    content.show();
  });

  //#more button click
  $('#more').on('click', function () {
    noticeNum += 5;
    getNotice();
  });

  // 공지사항목록출력
  function getNotice() {
    $.ajax({
      type: 'get',
      url: '/notice',
      dataType: 'json',
      data: {
        'num': noticeNum
      },
      success: function (data) {
        var str = '';
        $(data.rows).each(function () {
          var id = this.id;
          var title = this.title;
          var content = this.content;
          var fdate = this.fdate;
          str += `<div class="row" style="border-bottom:1px solid; padding:10px;">`;
          str += `<span class="no">[${id}]</span>`
          str += `<span class="title">${title}</span>`
          str += `<span class="fdate">${fdate}</span>`
          str += `<div class="content" style="margin-top:20px;">${content}</div>`
          str += `</div>`;
        });
        $('#notice').append(str);
      }
    });
  };

ㄴ script에 추가

 

 

- 최종본

C:\data\node\ex04\public\stylesheets\style.css

@font-face {
  font-family: 'IBMPlexSansKR-Regular';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_20-07@1.0/IBMPlexSansKR-Regular.woff') format('woff');
  font-weight: normal;
  font-style: normal;
}

body {
  font-family: 'IBMPlexSansKR-Regular';
}

#container {
  width: 940px;
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin: 0px auto;
}

#container h3 {
  text-align: center;
}

#header {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin-bottom: 10px;
}

#content {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
  margin-bottom: 10px;
}

#footer {
  padding: 20px;
  border: 1px solid rgb(181, 90, 48);
}

#product {
  width: 800px;
  margin: 0px auto;
  overflow: hidden;
}

.box {
  width: 170px;
  float: left;
  background-color: rgb(250, 239, 234);
  border: 1px solid rgb(245, 224, 214);
  margin-left: 15px;
  margin-bottom: 20px;
  box-shadow: 5px 5px 5px rgb(248, 215, 211);
  padding: 5px;
}

.box img {
  margin-left: 10px;
}

.box .title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin: 5px;
  font-size: 18px;
}

#txtSearch {
  height: 20px;
  float: right;
}

#selectbox {
  margin-bottom: 20px;
  border: 1px solid dotted rgb(233, 137, 126);
  padding: 5px;
}

#notice .content {
  display: none;
}

#notice .title {
  cursor: pointer;
}

#more {
  cursor: pointer;
  text-align: center;
  margin: 20px 0px 30px 0px;
  color: rosybrown;
  text-decoration: underline;
}

#slider{
  position: relative;
  overflow: hidden;
  width: 770px;
  height: 150px;
  border: 1px solid rgb(224, 50, 31);
  margin: 0px auto;
}

#items{
  position: absolute;
  overflow: hidden;
  width: 1320px;
}

#items .item {
  float: left;
  margin-left: 10px;
  width: 100px;
}

 

C:\data\node\ex04\routes\furniture.js

var express = require('express');
var router = express.Router();
var db = require('../db');

// 베스트상품
router.get('/best',function(req,res){
    var sql = 'select * from product order by price asc limit 0,12';
    db.get().query(sql,[],function(err,rows){
        res.send(rows);
    });
});

/* GET 상품목록과 갯수. */
router.get('/', function(req, res, next) {
    var perPageNum = parseInt(req.query.perPageNum);
    var page = parseInt(req.query.page);
    var order = req.query.order; // new
    var search = req.query.search; // new
    var sql = `select *, format(price,0) fprice from product where title like '%${search}%' order by ${order} limit ?,?;`; // new
    db.get().query(sql,[(page-1)*perPageNum, perPageNum], function(err,rows){
        var data = rows;
        // 전체 데이터 갯수 출력
        sql = `select count(*) cnt from product where title like '%${search}%'`;
        db.get().query(sql,[],function(err,rows){
            var count=rows[0].cnt;
            res.send({'rows':data,'count':count});
        });
        // 결과 출력
    });
});

module.exports = router;

 

C:\data\node\ex04\routes\notice.js

var express = require('express');
var router = express.Router();
var db = require('../db');

/* 공지사항 목록및 갯수*/
router.get('/', function(req, res, next) {
  var num = parseInt(req.query.num)

  //공지사항 목록
  var sql = `select *, date_format(wdate,"%Y-%m-%d %h:%i:%s") fdate from notice order by id desc limit ?,5`;
  db.get().query(sql, [num], function(err, rows){
    var result=rows;

    //공지사항 글수
    sql = 'select format(count(*),0) cnt from notice';
    db.get().query(sql, [], function(err, rows){
        var count = rows[0].cnt;
        res.send({'rows': result, 'count':count});
    });
  });
});

module.exports = router;

 

 

C:\data\node\ex04\views\index.ejs

<!DOCTYPE html>
<html>

<head>
  <title><%= title %></title>
  <link rel='stylesheet' href='/stylesheets/style.css' />
  <script src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>

<body>
  <div id="container">
    <div id="header">
      <img src="/images/back.jpg" width=900 />
    </div>
    <div id="content">
      <h3>상품목록</h3>
      <div id="selectbox">
        <select id="order" style="height: 30px;">
          <option value="id">상품번호순</option>
          <option value="price">상품저가순</option>
          <option value="price desc">상품고가순</option>
          <option value="title">상품이름순</option>
        </select>
        <select id="perPageNum" style="height: 30px;">
          <option value="4">4개씩 출력</option>
          <option value="8">8개씩 출력</option>
          <option value="12">12개씩 출력</option>
          <option value="16">16개씩 출력</option>
        </select>
        <span id="totalCount"></span> <!-- new -->
        <input type="text" placeholder="검색입력" id="txtSearch" />
        <div id="product"></div>
        <div id="pagination" style="text-align: center; padding: 10px;">
          <button id="prev">&lt;</button>
          <span id="page">1</span>
          <button id="next">&gt;</button>
        </div>

        <h3>&#128525;BEST 상품&#128525;</h3>
        <div id="slider">
          <div id="items"></div>
        </div>
        <div style="text-align: center; margin-top: 10px;">
          <button id="left" disabled>&lt;</button>
          <button id="right">&gt;</button>
        </div>
        <h3>공지사항</h3>
        <div id="notice"></div>
        <div id="more">더보기</div>
      </div>
      <div id="footer">
        <h3>COPYRIGHT F.Y.B ALL RIGHT RESERVED.</h3>
      </div>
    </div>
</body>

<script>
  // getList(); 이전에 변수 선언
  var page = 1;

  var noticeNum = 0;
  
  // 목록 출력
  getList();
  getNotice();
  getBest();
  
  var sliderNum = 0;

  // click right
  $('#right').on('click', function () {
    sliderNum++;
    slider();
  });

  // click left
  $('#left').on('click', function () {
    sliderNum--;
    slider();
  });
  
  function slider() {
    $('#items').animate({
      left: -(sliderNum) * 110
    }, 100);
    if (sliderNum == 0) $('#left').attr('disabled', true);
    else $('#left').attr('disabled', false);
    if (sliderNum == 3) $('#right').attr('disabled', true);
    else $('#right').attr('disabled', false);
  };

  // best 상품 출력
  function getBest() {
    $.ajax({
      type: 'get',
      url: '/furniture/best',
      dataType: 'json',
      success: function (data) {
        var str = '';
        $(data).each(function () {
          var image = this.image;
          var id = this.id;
          str += `<div class="item">`;
          str += `<img src="${image}" width=100 height=100/>`;
          str += `<div>${id}</div>`;
          str += `</div>`;
        });
        $('#items').html(str);

      }
    })
  }

  // row를 누르면 content가 나오게 한다.
  $('#notice').on('click', '.row', function () {
    //모든 content를 숨긴다.
    $('#notice .row .content').each(function () {
      $(this).hide();
    });
    //현재 선택한 content를 보여준다.
    var content = $(this).find('.content');
    content.show();
  });

  //#more button click
  $('#more').on('click', function () {
    noticeNum += 5;
    getNotice();
  });

  // 공지사항목록출력
  function getNotice() {
    $.ajax({
      type: 'get',
      url: '/notice',
      dataType: 'json',
      data: {
        'num': noticeNum
      },
      success: function (data) {
        var str = '';
        $(data.rows).each(function () {
          var id = this.id;
          var title = this.title;
          var content = this.content;
          var fdate = this.fdate;
          str += `<div class="row" style="border-bottom:1px solid; padding:10px;">`;
          str += `<span class="no">[${id}]</span>`
          str += `<span class="title">${title}</span>`
          str += `<span class="fdate">${fdate}</span>`
          str += `<div class="content" style="margin-top:20px;">${content}</div>`
          str += `</div>`;
        });
        $('#notice').append(str);
      }
    });
  };


  // 검색어 상자에서 엔터키를 입력할 경우
  $('#txtSearch').on('keypress', function (e) {
    if (e.keyCode == 13) {
      page == 1;
      getList();
    };
  });

  // 정렬키가 바뀔경우 // new
  $('#order').on('change', function () {
    page = 1;
    getList();
  });

  // 이전 버튼
  $('#prev').on('click', function () {
    page--;
    getList();
  });

  // 다음 버튼
  $('#next').on('click', function () {
    page++;
    getList();
  });

  // #perPageNum 이 바뀔때 마다 다시 목록 출력
  $('#perPageNum').on('change', function () {
    page = 1;
    getList();
  });

  // 목록 출력 함수
  function getList() {
    var perPageNum = $('#perPageNum').val();
    var order = $('#order').val(); // new
    var search = $('#txtSearch').val(); // new
    // db에서 정보 가지고 오는 ajax
    $.ajax({
      type: 'get',
      url: '/furniture',
      dataType: 'json',
      data: {
        'perPageNum': perPageNum,
        'page': page,
        'order': order, // new
        'search': search // new
      },
      success: function (data) {
        var str = '';
        var count = data.count;
        //.ceil ; 나눠서 올림
        var lastPage = Math.ceil(count / perPageNum);
        $('#page').html(page + '/' + lastPage);
        $('#totalCount').html('상품수:' + count);
        $(data.rows).each(function () {
          var id = this.id;
          var title = this.title;
          var price = this.fprice;
          var image = this.image;
          str += `<div class="box">`;
          str += `<img src="${image}" width=150 height=150/>`;
          str += `<div class="title">${id} : ${title}</div>`;
          str += `<div class="price">${price}원</div>`;
          str += `</div>`;
        });
        $('#product').html(str);

        // 첫번째 page일때
        if (page == 1) $('#prev').attr('disabled', true);
        else $('#prev').attr('disabled', false);

        if (page == lastPage) $('#next').attr('disabled', true);
        else $('#prev').attr('disabled', false);

      }
    });
  };
</script>

</html>

 

C:\data\node\ex04\app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');


var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 2021.08.06 연결해주는 코드의 역할을 한다.
// 라우터 뿌려준다고 생각하자.
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var noticeRouter = require('./routes/notice');
app.use('/', indexRouter); // '/' 를 하면 routes>index.js
app.use('/users', usersRouter); // '/users' 를 하면 routes>users.js
app.use('/furniture', require('./routes/furniture'));
app.use('/notice',noticeRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

//2021.08.06
//데이타베이스 연결
var db = require('./db');
db.connect(function(err){
  if(err){
    console.log('DB error.......');
    process.exit(1);
  }else{
    console.log('DB Success......');
  }
});

module.exports = app;

 

C:\data\node\ex04\db.js

var mysql = require('mysql');
var conn;
exports.connect = function () {
    conn = mysql.createPool({
        connectionLimit: 100,
        host: 'localhost',
        user: 'furniture', //*****/
        password: 'pass', //*****/
        database: 'furnituredb' /*****/
    });
}
exports.get = function () {
    return conn;
};