본문 바로가기
study/Vue

[Vue] 28. 게시판 목록 조회하기 (boardlist.html, SiteMeshFilter.java, AjaxController.java, ShopService.java, BoardDao.java, BoardMapper.java)

by 금이패런츠 2022. 6. 3.
728x90
반응형

boardlist.html

<!DOCTYPE html>
<!-- /springmvc2/src/main/webapp/vue/boardlist.html -->
<html>
<head>
<meta charset="UTF-8">
<title>게시판 목록 조회하기</title>
<script type="text/javascript" src="https:unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="simple">
	<p>
		이름 : <input type="text" v-model="writer" v-on:keyup.enter="search" placeholder="두글자 이상 입력하세요" />
	</p>
	<table id="list">
		<thead>
			<tr>
				<th>번호</th>
				<th>이름</th>
				<th>제목</th>
				<th>조회수</th>
			</tr>
		</thead>
		<tbody>
			<tr v-for="board in boardlist">
				<td>{{board.NUM}}</td>
				<td>{{board.WRITER}}</td>
				<td>{{board.SUBJECT}}</td>
				<td>{{board.READCNT}}</td>
			</tr>
		</tbody>
	</table>
	<div v-show="isProcessing === true">조회중</div>
</div>
<script>
	let model = {
			writer : "",
			boarderlist : [],
			isProcessing : false
	};
	let simple = new Vue ({
		el : "#simple",
		data : model,
		methods : {
			//e : 키 이벤트 객체
			search : function(e) { //enter키가 눌려진 경우.
				let val = e.target.value;
				if (val.length >= 2) {
					this.fetchContacts();
				} else {
					this.boardlist = [];
				}
			},
			fetchContacts : function() {
				this.contactlist = [];
				this.isProcessing = true;
				let url="/springmvc2/ajax/boardlist?boardid=1";
				let vm = this;
				let writer = this.writer //입력된 값
				//response.json() : json 객체로 리턴
				fetch(url).then(function(response) {return response.json()}).then(function(json) {
					//filter 함수 : 배열객체의 요소중 리턴값이 true인 객체만 리턴
		/*
		 * json :
		 *	 
		 * [
		 * {NUM:1, WRITER:'홍길동', SUBJECT:'제목', READCNT:1},
		 * {NUM:2, WRITER:'김길동', SUBJECT:'제목2', READCNT:0},
		 * ...
		 * ]
		   cont : {NUM:1, WRITER:'홍길동', SUBJECT:'제목', READCNT:1},
		   cont.WRITER.toUpperCase() : 글작성자의 값을 대문자로 리턴
		   includes() : True/False 값 리턴
		   writer : 입력한 값
		 */					
					vm.boardlist = json.filter //글 작성자가 입력된 이름을 포함하면 True
					(cont => cont.WRITER.toUpperCase().includes(writer.toUpperCase()))
					vm.isProcessing = false;
				})
				.catch(function(ex) {
					console.log('parsing failed', ex);
					vm.boardlist = [];
					vm.isProcessing = false;
				})
			}
		}
	})
</script>
</body>
</html>

 SiteMeshFilter.java

package sitemesh;

import javax.servlet.annotation.WebFilter;
import org.sitemesh.builder.SiteMeshFilterBuilder;
import org.sitemesh.config.ConfigurableSiteMeshFilter;

/*
 * sitemesh 설정 : 화면에 공통부분을 설정 모듈
 * 1. sitemesh-3.0.1.jar 파일을 pom.xml에 sitemesh 관련 설정 추가
 * 2. webapp/layout 폴더 생성. 폴더에 kiclayout.jsp 복사
 * 3. webapp/css 폴더 생성. 폴더에 main.css 복사
 * 4. webapp/image 폴더 생성. 폴더에 logo.png 복사
 */
@WebFilter("/*") //url 요청 정보
public class SiteMeshFilter extends ConfigurableSiteMeshFilter {
	@Override
	protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
		builder.addDecoratorPath("/*", "/layout/kiclayout.jsp")
			   .addExcludedPath("/board/imgupload*")
			   .addExcludedPath("/user/idsearch*")
			   .addExcludedPath("/user/pwsearch*")
			   .addExcludedPath("*.html");
	}
}

AjaxController.java

package controller;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import logic.ShopService;
import logic.User;

/*
 * @Controller : @Component(객체화) + 요청을 받아주는 클래스
 * 		메서드 리턴타입 : String => 뷰의 이름 리턴
 * 		메서드 리턴타입 : ModelAndView => 뷰의 전달할 객체 + 뷰의 이름 리턴
 * 
 * @RestController : @Component(객체화) + 요청을 받아주는 클래스 + 클라이언트(브라우저)에 값을 뷰가 아닌 직접 전달
 * 		메서드 리턴타입 : String => 값 : 이전버전 @ResponseBody 기능
 * 		메서드 리턴타입 : Object => 값
 */
@RestController
@RequestMapping("ajax")
public class AjaxController {
	@Autowired
	ShopService service;
	
	@RequestMapping("idchk")
	public String idchk (String userid) {
		String chk = null;
		User user = service.userSelectOne(userid);
		if (user == null) chk = "false"; //등록된 회원이 없는 경우
		else chk = "true";
		return chk;
	}
	//produces : 클라이언트에 한글 인코딩 방식 설정
	//text/plain : 순수 문자열 (MIME 형식 : )
	@RequestMapping(value="select", produces="text/plain; charset=utf-8")
	public String select (String si, String gu, HttpServletRequest request) {
		BufferedReader fr = null;
		try {
			fr = new BufferedReader(new FileReader(request.getServletContext().getRealPath("/") + "file/sido.txt"));
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
		Set<String> set = new LinkedHashSet<>(); //순서 유지 + 중복불가 가능한 Set객체
		String data = null;
		if (si == null && gu == null) {
			try {
				while ((data = fr.readLine()) != null) {
					String[] arr = data.split("\\s+");
					if(arr.length >= 3) set.add(arr[0].trim());
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else if (gu == null) { //si 파라미터 존재
			si = si.trim();
			try {
				while ((data = fr.readLine()) != null) {
					String[] arr = data.split("\\s+");
					if(arr.length >= 3 && arr[0].equals(si) && !arr[0].equals(arr[1])) {
						set.add(arr[1].trim());
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else { //si 파라미터 존재, gu 파라미터 존재
			si = si.trim();
			gu = gu.trim();
			try {
				while ((data = fr.readLine()) != null) {
					String[] arr = data.split("\\s+");
					if(arr.length >= 3 && arr[0].trim().equals(si) && arr[1].trim().equals(gu) && !arr[1].equals(arr[2])) {
						if(arr.length > 3) arr[2] += " " + arr[3];
						set.add(arr[2].trim());
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		List<String> list = new ArrayList(set);
		return list.toString();
	}
	@RequestMapping("exchange1")
	public Map<String, Object> exchange1() {
		Map<String, Object> map = new HashMap<String, Object>();
		Document doc = null;
		List<List<String>> trlist = new ArrayList<List<String>>();
		String url = "https://www.koreaexim.go.kr/wg/HPHKWG057M01";
		String exdate = null;
		try {
			doc = Jsoup.connect(url).get();
			Elements trs = doc.select("tr");
			exdate = doc.select("p.table-unit").html();
			for (Element tr : trs) {
				List<String> tdlist = new ArrayList<String>();
				Elements tds = tr.select("td");
				for(Element td : tds) {
					tdlist.add(td.html());
				}
				trlist.add(tdlist);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		map.put("date", exdate);
		List <List<String>> arrayList = new ArrayList<>();
		for (List<String> tds : trlist) {
			if (tds.size() == 0) continue;
			if (tds.get(0).equals("USD") || tds.get(0).equals("CNH") || tds.get(0).equals("JPY(100)") || tds.get(0).equals("EUR")) {
				List<String> exarr = new ArrayList<>();
				exarr.add(tds.get(1)); //통화명
				exarr.add(tds.get(0)); //통화코드
				exarr.add(tds.get(4)); //매매기준율
				exarr.add(tds.get(2)); //받을때 환율
				exarr.add(tds.get(3)); //보낼때 환율
				arrayList.add(exarr);
			}
		}
		Collections.sort(arrayList, (l1, l2) -> l2.get(1).compareTo(l1.get(1)));
		map.put("list", arrayList);
		System.out.println(map);
		return map;
	}
	@RequestMapping("boardlist")
	public List<Map<String,Object>> boardlist (String boardid) {
		/*
		 * [
		 * {NUM:1, WRITER:'홍길동', SUBJECT:'제목', READCNT:1},
		 * {NUM:2, WRITER:'김길동', SUBJECT:'제목2', READCNT:0},
		 * ...
		 * ] => 클라이언트에 JSON형태의 데이터로 전달
		 */
		return service.boardlist(boardid);
	}
}

ShopService.java

package logic;

import java.io.File;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import dao.BoardDao;
import dao.ItemDao;
import dao.SaleDao;
import dao.SaleItemDao;
import dao.UserDao;

@Service
public class ShopService {
	
	@Autowired //ItemDao 객체 주입
	ItemDao itemDao; //itemDao : ItemDao 객체 참조
	@Autowired //UserDao 객체 주입
	UserDao userDao; //userDao : UserDao 객체 참조
	@Autowired
	private SaleDao saleDao;
	@Autowired
	private SaleItemDao saleItemDao;
	@Autowired
	private BoardDao boardDao;
	
	public List<Item> itemList() {
		return itemDao.list();
	}

	public Item getItem(Integer id) {
		return itemDao.selectOne(id);
	}

	//item : 화면에서 입력된 파라미터, 파일의 내용 정보
	//request : 요청 객체
	public void itemCreate(Item item, HttpServletRequest request) {
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //파일업로드가 존재
			uploadFileCreate(item.getPicture(),request,"img/");
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //업로드 된 파일이름
		}
		//maxid : db에 저장된 item 테이블 레코드의 최대 id값
		int maxid = itemDao.maxId();
		item.setId(maxid+1);
		//item  테이블의 컬럼 : id, name, price, description, pictureUrl
		/*
		 * id : item 테이블에 등록된 최대 id값 + 1
		 * name, price, description : 화면에서 입력된 파라미터 값
		 * pictureUrl : 업로드된 파일 이름
		 */
		itemDao.insert(item);
	}
	private void uploadFileCreate(MultipartFile file, HttpServletRequest request, String upath) {
		//file : 업로드된 파일의 내용 저장
		//request : 요청객체
		//upath : 파일위치
		String orgFile = file.getOriginalFilename(); //업로드된 파일의 원래 이름
		//업로드될 폴더의 절대경로
		String uploadPath = request.getServletContext().getRealPath("/") + upath;
		File fpath = new File(uploadPath);
		if(!fpath.exists()) fpath.mkdirs(); //폴더 생성
		try {
			//transferTo : file(업로드되는 파일내용)을 업로드폴더의 원본파일 이름으로 저장
			file.transferTo(new File(uploadPath + orgFile));
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void itemUpdate(Item item, HttpServletRequest request) {
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { 
			uploadFileCreate(item.getPicture(),request,"img/");
			item.setPictureUrl(item.getPicture().getOriginalFilename());
		}
		itemDao.update(item);
	}

	public void itemDelete(Integer id) {
		itemDao.delete(id);
	}

	public void userInsert(User user) {
		userDao.insert(user);
	}

	public User userSelectOne(String userid) {
		return userDao.selectOne(userid);
	}
	/*
	 * sale,saleitem 테이블에 저장하기
	 * 1. sale 테이블의 saleid의 최대값 조회 : 최대값+1
	 * 2. sale 정보 저장 : userid,sysdate
	 * 3. Cart데이터에서 saleitem 데이터 추출. insert
	 * 4. saleitem 정보를 sale 데이터 저장.
	 * 5. sale 데이터 리턴
	 */
	public Sale checkend(User loginUser, Cart cart) {
		//1. sale 테이블의 saleid의 최대값 조회 : 최대값+1
		int maxid = saleDao.getMaxSaleId();
		//2. sale 테이블 등록
		Sale sale = new Sale();
		sale.setSaleid(maxid + 1);
		sale.setUserid(loginUser.getUserid());
		sale.setUser(loginUser);
		saleDao.insert(sale);
		//3. Cart데이터에서 saleitem 데이터 추출. insert
		int seq = 0;
		for(ItemSet is : cart.getItemSetList()) {
			SaleItem saleitem = new SaleItem(sale.getSaleid(), ++seq, is);
			sale.getItemList().add(saleitem);
			saleItemDao.insert(saleitem);
		}
		return sale;
	}

	public List<Sale> salelist(String id) {
		List<Sale> list = saleDao.list(id); //sale 테이블에서 사용자 id에 해당하는 목록 조회
		for(Sale sa : list) {
			//주문번호에 해당하는 주문상품 목록 조회
			List<SaleItem> saleitemlist = saleItemDao.list(sa.getSaleid());
			for(SaleItem si : saleitemlist) {
				Item item = itemDao.selectOne(si.getItemid()); //주문상품의 상품데이터(item) 조회
				si.setItem(item);
			}
			sa.setItemList(saleitemlist);
		}
		return list;
	}

	public void userUpdate(@Valid User user) {
		userDao.update(user);
	}

	public void userChgPassword(String userid, String chgpass) {
		userDao.passwordupdate(userid,chgpass);
	}

	public void userDelete(String userid) {
		userDao.delete(userid);
	}

	public List<User> userlist() {
		return userDao.list();
	}

	public String getSearch(User user, String url) {
		return userDao.search(user, url);
	}

	public int boardcount(String boardid) {
		return boardDao.count(boardid);
	}

	public List<Board> boardlist(Integer pageNum, int limit, String boardid) {
		return boardDao.list(pageNum, limit, boardid);
	}
	//board : 화면에서 입력한 파라미터정보, 업로드된 파일 정보
	public void boardwrite(Board board, HttpServletRequest request) {
		//파일 업로드
		if(board.getFile1() != null && !board.getFile1().isEmpty()) { //업로드된 파일이 존재.
			uploadFileCreate(board.getFile1(), request, "board/file/"); //파일 업로드
			board.setFileurl(board.getFile1().getOriginalFilename());
		}
		//db에 insert
		boardDao.write(board);
	}

	public Board getBoard(Integer num) {
		return boardDao.selectOne(num);
	}

	public void readcntadd(Integer num) {
		boardDao.readcntadd(num);
	}
	public void boardUpdate(Board board, HttpServletRequest request) {
		if(board.getFile1() != null && !board.getFile1().isEmpty()) { //첨부파일이 수정된 경우
			uploadFileCreate(board.getFile1(), request, "board/file/"); //파일 업로드
			board.setFileurl(board.getFile1().getOriginalFilename());
		}
		boardDao.update(board);
	}
	public void boardReply(Board board) {
		boardDao.grpStepAdd(board);
		boardDao.reply(board);
	}

	public void boardDelete(int num) {
		boardDao.delete(num);
	}

	public List<Map<String, Object>> boardlist(String boardid) {
		return boardDao.boardlist(boardid);
	}
}

BoardDao.java

package dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import dao.mapper.BoardMapper;
import logic.Board;

@Repository
public class BoardDao {
	@Autowired //객체 주입. DI
	private SqlSessionTemplate template;
	private Class<BoardMapper> cls = BoardMapper.class;
	private Map<String,Object> param = new HashMap<String,Object>();
	
	public int count(String boardid) {
		return template.getMapper(cls).count(boardid);
	}
	public List<Board> list(Integer pageNum, int limit, String boardid) {
		param.clear();
		int startrow = (pageNum - 1) * limit + 1;
		int endrow = startrow + limit - 1;
		param.put("startrow", startrow);
		param.put("endrow", endrow);
		param.put("boardid", boardid);
		return template.getMapper(cls).list(param);
	}
	
	public void write(Board board) {
		int num = maxNum() + 1; 
		board.setNum(num);
		board.setGrp(num);
		template.getMapper(cls).write(board);
	}
	private int maxNum() {
		return template.getMapper(cls).maxNum(param);
	}
	public Board selectOne(Integer num) {
		param.clear();
		param.put("num", num);
		return template.getMapper(cls).selectOne(param);	
	}
	
	public void readcntadd(Integer num) {
		template.getMapper(cls).readcntadd(num);
	}
	public void update(Board board) {
		template.getMapper(cls).update(board);
	}
	public void grpStepAdd(Board board) {
		template.getMapper(cls).grpStepAdd(board);		
	}
	
	public void reply(Board board) {
		board.setNum(maxNum() + 1); //답글의 num 저장
		board.setGrplevel(board.getGrplevel()+1); //답글의 grplevel로 저장 : 원글 level + 1
		board.setGrpstep(board.getGrpstep()+1);	  //답글의 grpstep로 저장 : 원글 step + 1
		template.getMapper(cls).reply(board);
	}
	public void delete(int num) {
		template.getMapper(cls).delete(num); //db에 데이터 삭제하기
	}
	public List<Map<String, Object>> boardlist(String boardid) {
		return template.getMapper(cls).boardlist(boardid);
	}
}

BoardMapper.java

package dao.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import logic.Board;

public interface BoardMapper {

	@Select("select count(*) from board where boardid=#{boardid}")
	int count(String boardid);
	
	@Select("select * from "
				+ "(select rownum rnum, num, writer, subject, content, file1 fileurl, regdate, "
				+ " grp, grplevel, grpstep, pass, readcnt from "
				+ "(select * from board where boardid =#{boardid} order by grp desc, grpstep asc))"
				+ " where rnum >= #{startrow} and rnum <= #{endrow}")
	List<Board> list(Map<String, Object> param);

	@Insert("insert into board "
			+ "(num, writer, pass, subject, content, file1, boardid, regdate, readcnt, grp, grplevel, grpstep, ip)"
			+ "values " 
			+ "(#{num}, #{writer}, #{pass}, #{subject}, #{content}, #{fileurl}, #{boardid}, sysdate, 0, #{grp}, #{grplevel}, #{grpstep}, #{ip})")
	void write(Board board);

	@Select("select nvl(max(num),0) from board")
	int maxNum(Map<String, Object> param);

	@Select("select num, writer, subject, content, file1 as fileurl, regdate, "
			+ " grp, grplevel, grpstep, pass, readcnt, boardid from board where num=#{num}")
	Board selectOne(Map<String, Object> param);

	
	@Update("update board set readcnt = readcnt + 1 where num=#{num}")
	void readcntadd(Integer num);

	@Update("update board set writer=#{writer}, subject=#{subject}, content=#{content}, "
	+ " file1=#{fileurl} where num=#{num}")
	void update(Board board);

	@Update("update board set grpstep = grpstep+1 "
			+ " where grp=#{grp} and grpstep >#{grpstep}")
	void grpStepAdd(Board board);

	@Insert("insert into board "
			+ " (num, writer, pass, subject, content, file1, boardid, regdate, readcnt, grp, grplevel, grpstep, ip)"
			+ " values " 
			+ " (#{num}, #{writer}, #{pass}, #{subject}, #{content}, #{fileurl}, #{boardid}, sysdate, 0, #{grp}, #{grplevel}, #{grpstep}, #{ip})")
	void reply(Board board);

	@Delete("delete from board where num=#{num}")
	void delete(int num);
	
	@Select("select num, writer, subject, readcnt from board where boardid=#{value}")
	List<Map<String, Object>> boardlist(String boardid);
}
728x90
반응형