ataTable.addColumn('number', '날짜');구글 차트를 이용한 데이터 시각화를 하려고 한다.
날자 to 날자를 선택하면
해당 기간에 쓴글을 표로 보여주고 표를 토대로
구글차트를 이용하여 데이터시각화를 보여주려고 한다.
우선 가장 기본이 되는 sql문 부터 보자 .
<select id="admin_findDate" resultType="hashmap">
select board_type,count(board_type)as count from job_board where board_regdate
BETWEEN TO_DATE(#{date1}, 'MM-DD-YY') and TO_DATE(#{date2}, 'MM-DD-YY')
GROUP by board_type
</select>
<select id="adminUserList2"
resultMap="UserInfo">
select u.*,
(select count(*) from job_board where board_writer = u.user_id) as board_cnt,
(select count(*) from job_comment where com_writer = u.user_id) as comment_cnt
from user_info u
order by u.user_no desc
</select>
유저의 모든것을 조회하면서
게시물수와 댓글 갯수를 as __cnt 라는것으로
끌고 온다.
이렇게 끌고오면 게시글과 댓글수가 끌고와지는데
꼭 VO에 추가해주어야한다.
그래야 자료를 활용할 수있다.
public class UserVO {
private int userNo;
private String userId;
private String userName;
private String userPw;
private String userPh;
private int userAdr1;
private String userAdr2;
private String userAdr3;
private String userAdr4;
private int userStatus;
private String userEmail;
private String userCompany;
private int adminType;
private int userPass;
private Timestamp userDate;
private int boardCnt;
private int commentCnt;
package com.community.shy.board.controller;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.community.shy.board.JobBoard.service.IBoardService;
import com.community.shy.board.JobComment.service.ICommentService;
import com.community.shy.board.command.BoardVO;
import com.community.shy.board.command.CommentVO;
import com.community.shy.user.UserVO;
import com.community.shy.user.service.IUserService;
@Controller
@RequestMapping("/admin")
public class AdminController {
@Autowired
private IBoardService service;
@Autowired
private IUserService UserService;
@Autowired ICommentService comService;
@GetMapping("/admin_main")
public void main(Model model) {
System.out.println("메인 페이지로 이동");
model.addAttribute("boardList", service.getAdminList());
model.addAttribute("userInfo",UserService.adminUserList());
}
@GetMapping("/admin_boardList")
public void mainList(Model model) {
System.out.println("어드민메인 게시판 리스트");
model.addAttribute("allBoard", service.getAllboard());
}
// 어드민 회원 관리
@GetMapping("/admin_userList")
public void user_list(Model model) {
//회원 기본정보 페이징(x)
System.out.println("/admin_userList 요청");
List<UserVO> list = UserService.adminUserList2();
model.addAttribute("userInfo",list);
};
@ResponseBody
@PostMapping("/getuserInfo")
public UserVO getuserInfo(String id) {
System.out.println("유저 인포 아작스");
UserVO user = UserService.getInfo(id);
return user;
}
@ResponseBody
@PostMapping("/getUserBoardList")
public List<BoardVO> getUserBoardList(String board_writer) {
System.out.println("open! user boardList ajax!");
System.out.println("조회할 회원 아이디 : " + board_writer);
List<BoardVO> list = service.getUserBoardList(board_writer);
return list;
}
@ResponseBody
@PostMapping("/getCommentList")
public List<CommentVO> getCommentList(String com_writer){
System.out.println("open! user Comment List ajax!");
System.out.println("조회할 회원 아이디 : " + com_writer);
List<CommentVO> list = comService.getComList(com_writer);
System.out.println(list);
return list;
}
@ResponseBody
@PostMapping("/successId")
public void successId(String id) {
System.out.println(id);
System.out.println("open! user sign success Id ajax!");
UserService.successId(id);
}
@ResponseBody
@PostMapping("/failId")
public void failId(String id) {
System.out.println(id);
System.out.println("open! user sign failId Id ajax!");
UserService.failed(id);
}
@ResponseBody
@PostMapping("/deleteBoard")
public void deleteBoard(int board_no) {
System.out.println("삭제할 게시물 : " + board_no);
service.JBoardDelete(board_no);
}
@GetMapping("/admin_dataTotal")
public void admin_dataTotal(Model model) {
model.addAttribute("allTotal", service.getAllTotal());
}
@ResponseBody
@PostMapping("/findDate")
public List<HashMap<String, Object>> admin_findDate(String date1 , String date2) {
System.out.println(date1);
System.out.println(date2);
List<HashMap<String, Object>> list = service.admin_findDate(date1, date2);
System.out.println(service.admin_findDate(date1, date2));
return list;
}
@ResponseBody
@PostMapping("/dropId")
public void dropID(String id) {
UserService.dropUser(id);
}
}
우선 main으로 이동시켜 주어 model 객체로
유저리스트와 게시판을 실시간으로 업데이트 해준다.
그 뒤 어드민 페이지로 이동해 모든 회원 정보를 불러온다.
<select id="adminUserList2"
resultMap="UserInfo">
select u.*,
(select count(*) from job_board where board_writer = u.user_id) as board_cnt,
(select count(*) from job_comment where com_writer = u.user_id) as comment_cnt
from user_info u
order by u.user_no desc
</select>
매퍼에서 이렇게 가져올 경우
VO도 수정해 주어야 한다 서브쿼리로 board_cnt와 comment_cnt가 추가 되어
불러오려면
private int userNo;
private String userId;
private String userName;
private String userPw;
private String userPh;
private int userAdr1;
private String userAdr2;
private String userAdr3;
private String userAdr4;
private int userStatus;
private String userEmail;
private String userCompany;
private int adminType;
private int userPass;
private Timestamp userDate;
private int boardCnt;
private int commentCnt
public class BoardVO {
private int board_no;
private String board_title;
private String board_writer;
private String board_content;
private int board_hit;
private int board_like;
private int board_hate;
private String board_img;
private String board_img_path;
private int board_type;
private Timestamp board_regdate;
}
vo 객체 생성 뒤 페이징 및 검색을 위한 객체 생성
@Getter
@Setter
public class PageVO {
//사용자가 선택한 페이지 정보를 담을 변수.
private int pageNum;
private int countPerPage;
//검색에 필요한 데이터를 변수로 선언.
private String keyword;
private String condition;
public PageVO() {
this.pageNum = 1;
this.countPerPage = 5;
}
}
페이징을 위한 다음 이전 등 버튼 개수를 위한 클래스 제작
@Setter
@Getter
@ToString
public class PageCreator {
private PageVO paging;
private int articleTotalCount;
private int endPage;
private int beginPage;
private boolean prev;
private boolean next;
private final int buttonNum = 5;
private void calcDataOfPage() {
endPage = (int) (Math.ceil(paging.getPageNum() / (double) buttonNum) * buttonNum);
beginPage = (endPage - buttonNum) + 1;
prev = (beginPage == 1) ? false : true;
next = articleTotalCount <= (endPage * paging.getCountPerPage()) ? false : true;
if(!next) {
endPage = (int) Math.ceil(articleTotalCount / (double) paging.getCountPerPage());
}
}
//컨트롤러가 총 게시물의 개수를 PageCreator에게 전달한 직후에
//바로 페이징 버튼 알고리즘이 돌아갈 수 있도록 setter를 커스텀.
public void setArticleTotalCount(int articleTotalCount) {
this.articleTotalCount = articleTotalCount;
calcDataOfPage();
}
}