반응형
backend단 준비
1) 리스트 데이터 모듈 생성
2) 페이징 처리에 필요한 데이터 전달
frontend단 준비
1) 리스트 데이터를 받아 화면 처리
2) 페이징 처리
1. backend단
파일경로 : back/route/api/board/dao.js
const db = require('../../../config/db');
const conn = db.init();
exports.list = (req,res) => { //리스트 모듈
let ipp = 10;
let totalCount = 0;
let block = 10;
let total_page = 0;
let page = 1;
let start = 0;
let end = ipp;
let start_page = 1;
let end_page = block;
let where = "";
body = req.query; //get
if(body.keyword) where += ` AND subject like '%${body.keyword}%' `;
sql = ` SELECT count(*) cnt FROM tb_board WHERE board_code = ? ${where} `;
conn.query(sql,[body.board_code],(err,data)=>{
if(err) throw err;
totalCount = data[0].cnt;
total_page = Math.ceil(totalCount/ipp);
if(body.page) page = body.page;
start = (page - 1) * 10;
start_page = Math.ceil(page / block);
end_page = start_page * block;
if(total_page < end_page) end_page = total_page;
let paging = {
"totalCount":totalCount
,"total_page": total_page
,"page":page
,"start_page":start_page
,"end_page":end_page
,"ipp":ipp
}
sql = ` SELECT * FROM tb_board WHERE board_code = ? ${where} ORDER BY num DESC LIMIT ?, ? `;
conn.query(sql,[body.board_code, start, end],(err,list)=> {
if(err) throw err;
res.send({success:true,list:list,paging:paging});
})
})
}
exports.add = (req,res) => { //등록 프로세스 모듈
body = req.body; //전송된 데이터를 받는다.
sql = " INSERT INTO tb_board (board_code, subject, cont, id, regdate) values (?, ?, ?, ?,now()) ";
conn.query(sql,
[body.board_code
, body.subject
, body.cont
, body.id]
,(err,result)=>{
if(err) throw err;
res.send({success:true});
})
}
2. frontend단
파일경로 : front/src/components/board/List.vue
<template>
<div>
<h2>게시판 리스트</h2>
<div class="searchWrap">
<input type="text" v-model="keyword" @keyup.enter="fnSearch" /><a href="javascript:;" @click="fnSearch" class="btnSearch btn">검색</a>
</div>
<div class="listWrap">
<table class="tbList">
<colgroup>
<col width="6%" />
<col width="*" />
<col width="10%" />
<col width="15%" />
</colgroup>
<tr>
<th>no</th>
<th>제목</th>
<th>아이디</th>
<th>날짜</th>
</tr>
<tr v-for="(row, idx) in list" :key="idx">
<td>{{no-idx}}</td>
<td class="txt_left"><a href="javascript:;">{{row.subject}}</a></td>
<td>{{row.id}}</td>
<td>{{row.regdate.substring(0,10)}}</td>
</tr>
<tr v-if="list.length == 0">
<td colspan="4">데이터가 없습니다.</td>
</tr>
</table>
</div>
<div class="pagination" v-if="paging.totalCount > 0">
<a href="javascript:;" @click="fnPage(1)" class="first"><<</a>
<a href="javascript:;" v-if="paging.start_page > 10" @click="fnPage(`${paging.start_page-1}`)" class="prev"><</a>
<template v-for=" (n,index) in paginavigation()">
<template v-if="paging.page==n">
<strong :key="index">{{n}}</strong>
</template>
<template v-else>
<a href="javascript:;" @click="fnPage(`${n}`)" :key="index">{{n}}</a>
</template>
</template>
<a href="javascript:;" v-if="paging.total_page > paging.end_page" @click="fnPage(`${paging.end_page+1}`)" class="next">></a>
<a href="javascript:;" @click="fnPage(`${paging.total_page}`)" class="last">>></a>
</div>
<div class="btnRightWrap">
<a @click="fnAdd" class="btn">등록</a>
</div>
</div>
</template>
<script>
export default {
data() { //변수생성
return{
body:'' //리스트 페이지 데이터전송
,board_code:'news' //게시판코드
,list:'' //리스트 데이터
,no:'' //게시판 숫자처리
,paging:'' //페이징 데이터
,start_page:'' //시작페이지
,page:this.$route.query.page ? this.$route.query.page:1
,keyword:this.$route.query.keyword
,paginavigation:function() { //페이징 처리 for문 커스텀
var pageNumber = [];
var start_page = this.paging.start_page;
var end_page = this.paging.end_page;
for (var i = start_page; i <= end_page; i++) pageNumber.push(i);
return pageNumber;
}
}
}
,mounted() { //페이지 시작하면은 자동 함수 실행
this.fnGetList();
}
, methods:{
fnGetList() { //데이터 가져오기 함수
this.body = { // 데이터 전송
board_code:this.board_code
,keyword:this.keyword
,page:this.page
}
this.$axios.get('http://localhost:3000/api/board',{params:this.body})
.then((res)=>{
if(res.data.success) {
this.list = res.data.list;
this.paging = res.data.paging;
this.no = this.paging.totalCount - ((this.paging.page-1) * this.paging.ipp);
} else {
alert("실행중 실패했습니다.\n다시 이용해 주세요.");
}
})
.catch((err)=>{
console.log(err);
})
}
,fnAdd() {
this.$router.push("./write");
}
,getList() {
this.$axios.get("http://localhost:3000/api/board")
.then((res)=>{
console.log(res);
})
.then((err)=>{
console.log(err);
})
}
,fnSearch() { //검색
this.paging.page = 1;
this.fnGetList();
}
, fnPage(n) {//페이징 이
if(this.page != n) {
this.page = n;
this.fnGetList();
}
}
}
}
</script>
<style scoped>
.searchWrap{border:1px solid #888; border-radius:5px; text-align:center; padding:20px 0; margin-bottom:40px;}
.searchWrap input{width:60%; height:36px; border-radius:3px; padding:0 10px; border:1px solid #888;}
.searchWrap .btnSearch{display:inline-block; margin-left:10px;}
.tbList th{border-top:1px solid #888;}
.tbList th, .tbList td{border-bottom:1px solid #eee; padding:5px 0;}
.tbList td.txt_left{text-align:left;}
.btnRightWrap{text-align:right; margin:10px 0 0 0;}
.pagination{margin:20px 0 0 0; text-align:center;}
.first, .prev, .next, .last{border:1px solid #666; margin:0 5px;}
.pagination span{display:inline-block; padding:0 5px; color:#333;}
.pagination a{text-decoration:none; display:inline-blcok; padding:0 5px; color:#666;}
</style>
웹화면에서 확인!!
리스트화면이 잘 보인다.
검색 및 다른 페이지로 이동도 클릭~~
반응형
'IT > vue' 카테고리의 다른 글
vuejs 게시판 만들기 #9 (수정하기) (3) | 2020.06.22 |
---|---|
vuejs 게시판 만들기 #8 (상세페이지) (0) | 2020.06.22 |
vuejs 게시판 만들기 #6 (등록 화면 및 데이터 저장 프로세스) (2) | 2020.06.19 |
vuejs 게시판 만들기 #5 (axios 사용해서 데이터를 가져오자) (1) | 2020.06.19 |
vuejs 게시판 만들기 #4 (router 사용하기) (15) | 2020.06.17 |