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
반응형
'study > Vue' 카테고리의 다른 글
[Vue] 28. Todo List (vueex5.html ) (0) | 2022.06.02 |
---|---|
[Vue] 28. 1부터 100까지 입력하기 (vueex4.html ) (0) | 2022.06.02 |
[Vue] 28. CSS와 연결하기 (vueex3.html ) (0) | 2022.06.02 |
[Vue] 28. style 설정하기 (vueex2.html ) (0) | 2022.06.02 |
[Vue] 28. 마우스 이벤트 (vueex1.html) (0) | 2022.06.02 |