20240304 Spring 14 - 관리자 페이지 (2)

Leafy·2024년 3월 4일
0

중앙_자바

목록 보기
51/76


./board라고 하지 않으면 /admin/board가 아닌 /board로 가서 url에서 admin 경로가 빠지게 된다.

한 화면에 보이는 게시글 수 변경 기능

AdminController.java

@GetMapping("/board")
public String board(@RequestParam(value="page", defaultValue="1") String page, 
		@RequestParam(value="perPage", defaultValue="1", required=false) String perPage, 
		@RequestParam(value="search", required=false) String search, 
		Model model) {
	//페이징 + 검색 + 한 화면에 보이는 게시글 수 변경 기능
	//페이지 limit 바꿔서 나오는 화면의 수 다르게도 할 수 있게
	
	//전체 글 수 뽑기
	int totalRecordCount = adminService.totalRecordCount();
	int recordCountPerPage = util.str2Int(perPage) * 10;
	
	PaginationInfo paginationInfo = new PaginationInfo();
	paginationInfo.setCurrentPageNo(util.str2Int(page));
	paginationInfo.setRecordCountPerPage(recordCountPerPage);
	paginationInfo.setPageSize(10);
	paginationInfo.setTotalRecordCount(totalRecordCount);
	
	SearchDTO searchDTO = new SearchDTO();
	searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
	searchDTO.setSearch(search);
	searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
	
	List<BoardDTO> list = adminService.adminBoardList(searchDTO);
	model.addAttribute("list", list);
	model.addAttribute("paginationInfo", paginationInfo);
	model.addAttribute("page", page);
	model.addAttribute("perPage", perPage);
	return "admin/board";
}

/admin/board.jsp

<script type="text/javascript">
  function linkPage(page) {
  location.href="./board?perPage=${perPage}&search=${search}&page="+page;
}
$(function(){
  $("#perPage").change(function(){//select 드롭다운을 변경했을 시
    location.href="./board?page=${page}&perPage="+$("#perPage").val();
  })
});
</script>
<select name="perPage" id="perPage" class="form-control">
	<option value="1">10</option>
	<option value="2">20</option>
	<option value="3">30</option>
	<option value="4">40</option>
	<option value="5">50</option>
	<option value="10">100</option>
</select>

if일때 where 쓴다는 mybatis

검색 기능 - search option 추가

board.jsp에서 검색창에 select 태그를 통해 검색 옵션을 추가한다.

board.jsp

function linkPage(page) {
	location.href="./board?page="+page+"&perPage=${perPage}&searchOption=${searchOption}&search=${search}";
}
$(function(){
	$("#perPage").change(function(){//select 드롭다운을 변경했을 시 (ajax 쓰는게 좋을거같다..)
		location.href="./board?page=1&perPage="+$("#perPage").val()+"&searchOption=${searchOption}&search=${search}";
	})
	$("#searchBtn").click(function(){
		location.href="./board?page=1&perPage=${perPage}&searchOption="+$('#searchOption').val()+"&search="+$("#search").val();
	});
});
<div class="col-7 input-group">
	<select name="searchOption" id="searchOption" class="form-control col-3">
		<option value="1" <c:if test="${searchOption eq 1 }">selected="selected"</c:if>>제목 검색</option>
		<option value="2" <c:if test="${searchOption eq 2 }">selected="selected"</c:if>>본문 검색</option>
		<option value="3" <c:if test="${searchOption eq 3 }">selected="selected"</c:if>>작성자 검색</option>
	</select>
	<input type="text" name="search" id="search" class="form-control" value="${search }">
	<button type="button" class="btn btn-info" id="searchBtn">search</button>
</div>

value="${search }" <- input에 이렇게 써주면 검색어 유지

controller에서 searchOption 파라미터를 받아서 SearchDTO를 사용해서
검색키워드 search와 검색옵션 searchOption을 담아 totalRecordCount()에 전달
=> 그래야 검색 결과에 대한 페이징이 가능

그 다음 boardList를 출력할 때 searchDTO에 추가로 페이지네이션 정보를 세팅한다.

@GetMapping("/board")
public String board(@RequestParam(value="page", defaultValue="1") String page, 
		@RequestParam(value="perPage", defaultValue="1", required=false) String perPage, 
		@RequestParam(value="searchOption", required=false) String searchOption, 
		@RequestParam(value="search", required=false) String search, 
		Model model) {
	//페이징 + 검색 + 한 화면에 보이는 게시글 수 변경 기능
	//페이지 limit 바꿔서 나오는 화면의 수 다르게도 할 수 있게
	
	//전체 글 수에 DTO보내기
	SearchDTO searchDTO = new SearchDTO();
	searchDTO.setSearch(search);
	searchDTO.setSearchOption(searchOption);
	
	//전체 글 수 뽑기
	int totalRecordCount = adminService.totalRecordCount(searchDTO);
	int recordCountPerPage = util.str2Int(perPage) * 10;
	
	PaginationInfo paginationInfo = new PaginationInfo();
	paginationInfo.setCurrentPageNo(util.str2Int(page));
	paginationInfo.setRecordCountPerPage(recordCountPerPage);
	paginationInfo.setPageSize(10);
	paginationInfo.setTotalRecordCount(totalRecordCount);
	
	//페이징 결과 boardList에 보내기
	searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
	searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
	
	List<BoardDTO> list = adminService.adminBoardList(searchDTO);
	model.addAttribute("list", list);
	model.addAttribute("paginationInfo", paginationInfo);
	model.addAttribute("search", search);
	model.addAttribute("searchOption", searchOption);
	model.addAttribute("page", page);
	model.addAttribute("perPage", perPage);
	return "admin/board";
}
  • mapper
    if 태그를 여러 개 쓸 수 있다.
<select id="totalRecordCount" resultType="int" parameterType="searchDTO">
	SELECT COUNT(0) 
	FROM board b JOIN member m ON b.mno=m.mno 
	<where>
		<if test="searchOption == 1">
			b.board_title LIKE CONCAT('%', #{search}, '%') 
		</if>
		<if test="searchOption == 2">
			b.board_content LIKE CONCAT('%', #{search}, '%') 
		</if>
		<if test="searchOption == 3">
			m.mname LIKE CONCAT('%', #{search}, '%') 
		</if>
	</where>
</select>

<select id="boardList" parameterType="searchDTO" resultType="boardDTO">
	SELECT b.board_no, b.mno, b.board_del, m.mname, 
	(select count(0) from `visitcount` where `visitcount`.`board_no` = `b`.`board_no`) AS board_count, 
	board_title, board_date, board_ip, 
	(select count(0) from `comment` where `comment`.`board_no` = `b`.`board_no`) AS `comment` 
	FROM board b JOIN member m ON b.mno=m.mno 
	<where>
		<if test="searchOption == 1">
			b.board_title LIKE CONCAT('%', #{search}, '%') 
		</if>
		<if test="searchOption == 2">
			b.board_content LIKE CONCAT('%', #{search}, '%') 
		</if>
		<if test="searchOption == 3">
			m.mname LIKE CONCAT('%', #{search}, '%') 
		</if>
	</where>
	ORDER BY b.board_no DESC 
	LIMIT #{pageNo}, #{recordCountPerPage}
</select>

소소하게 작성자 누르면 작성자가 쓴 글 검색한 걸로 해주기

글 보이기 숨기기

아이콘 누르면 글 삭제하는 거
아이콘에을 줘도 되고,
제이쿼리로 부모의 형제의 value로 글번호를 받아와도 된다.

아이콘을 토글 버튼으로 만들기

postDel() 하나의 스크립트 함수를 써서 쿼리문으로 해결하려고 한다...
mybatis selectKey를 써도 되고 if문(되는지 모름) 써봐도 된다고 하심

  • (참고) 다른분꺼 뭔진 모르겟지만 작동한다
<update id="postDel" parameterType="int">
     Update board SET board_del= CASE WHEN board_del='0' THEN '1'
     ELSE '0' END WHERE board_no=#{no}
</update>

새 창으로 detail

DTO 대신 map 쓰기
.do 프로젝트

3개의 댓글

comment-user-thumbnail
2024년 3월 4일

그러쿠낭

1개의 답글
comment-user-thumbnail
2024년 3월 4일

ㄷㄷ 보법이다르시네요 잘보고갑니다

답글 달기