기능소개(관리자 페이지) - lee-geon-hee/pandang GitHub Wiki

📃 관리자 페이지

📌 회원 관리, 신고 관리, 게시글 관리

  • 각 관리 탭 이동은 페이지 로딩이 없는 AJAX 사용
  • Json 으로 데이터를 보내주기 위해 Gson과 JsonObject를 사용
  • 검색 기능 구현을 위해 DB Like 사용

💻 코드

Controller

AdminFrontController.java
public class AdminFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String target = req.getRequestURI().substring(req.getContextPath().length());
		
		switch(target) {
		case "/admin.ad" :
			req.getRequestDispatcher("/app/admin/login.jsp").forward(req, resp);
			break;
		case "/admin/loginOk.ad" : 
			new LoginOkController().execute(req, resp);
			break;
		case "/admin/reportSnsListOk.ad" :
			new ReportSnsListOkController().execute(req, resp);
			break;
		case "/admin/reportSnsAjaxListOk.ad" :
			new ReportSnsListAjaxOkController().execute(req,resp);
			break;
		case "/admin/reportStoreListOk.ad" :
			new ReportStoreListOkController().execute(req, resp);
			break;
		case "/admin/logoutOk.ad" :
			new LogoutOkController().execute(req, resp);
			break;
		case "/admin/memberListOk.ad" :
			new MemberListOkController().execute(req, resp);
			break;
		case "/admin/memberBanOk.ad" :
			new MemberBanOkController().execute(req, resp);
			break;
		case "/admin/memberRestoreOk.ad" :
			new MemberRestoreOkController().execute(req, resp);
			break;
		case "/admin/findMemberOk.ad" :
			new FindMemberOkController().execute(req, resp);
			break;
		case "/admin/findSnsOk.ad" :
			new FindSnsOkController().execute(req, resp);
			break;
		case "/admin/findStoreOk.ad" :
			new FindStoreOkController().execute(req, resp);
			break;
		}
	}
}
FindMemberOkController.java
public class FindMemberOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		AdminDAO adminDAO = new AdminDAO();
		MemberDTO memberDTO = new MemberDTO();
		Gson gson = new Gson();
		int total =adminDAO.findGetTotal(req.getParameter("input"));
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
		String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가장 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      Map<String, Object> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
      pageMap.put("memberId", req.getParameter("input"));
      
      List<MemberDTO> members = adminDAO.findMember(pageMap);
      JsonArray memberList = new JsonArray();
      
      members.stream()
      .map(gson::toJson)
      .map(JsonParser::parseString)
      .forEach(memberList::add);
      
      
      JsonObject result = new JsonObject();
      result.add("list", JsonParser.parseString(memberList.toString()));
      result.addProperty("startPage", startPage);
      result.addProperty("endPage", endPage);
      result.addProperty("page", page);
      result.addProperty("prev", prev);
      result.addProperty("next", next);
      
      
      resp.setContentType("application/json; charset=utf-8");
      PrintWriter out = resp.getWriter();
      out.print(result.toString());
      out.close();
	}

}
FindSnsOkController.java
public class FindSnsOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ReportSnsDAO reportSnsDAO = new ReportSnsDAO();
		ReportSnsDTO reportSnsDTO = new ReportSnsDTO();
		Gson gson = new Gson();
		int total =reportSnsDAO.findSnsGetTotal(req.getParameter("input"));
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
		String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가낭 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      Map<String, Object> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
      pageMap.put("reportTitle", req.getParameter("input"));
      
      List<ReportSnsVO> reports = reportSnsDAO.findSns(pageMap);
      JsonArray reportList = new JsonArray();
      
      reports.stream()
      .map(gson::toJson)
      .map(JsonParser::parseString)
      .forEach(reportList::add);
      
      
      JsonObject result = new JsonObject();
      result.add("list", JsonParser.parseString(reportList.toString()));
      result.addProperty("startPage", startPage);
      result.addProperty("endPage", endPage);
      result.addProperty("page", page);
      result.addProperty("prev", prev);
      result.addProperty("next", next);
      
      
      resp.setContentType("application/json; charset=utf-8");
      PrintWriter out = resp.getWriter();
      out.print(result.toString());
      out.close();
	}
	

}
FindStoreOkController.java
public class FindStoreOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ReportStoreDAO reportStoreDAO = new ReportStoreDAO();
		ReportStoreDTO reportStoreDTO = new ReportStoreDTO();
		Gson gson = new Gson();
		int total =reportStoreDAO.findStoreGetTotal(req.getParameter("input"));
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
		String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가낭 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      Map<String, Object> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
      pageMap.put("reportTitle", req.getParameter("input"));
      
      List<ReportStoreVO> reports = reportStoreDAO.findStore(pageMap);
      JsonArray reportList = new JsonArray();
      
      reports.stream()
      .map(gson::toJson)
      .map(JsonParser::parseString)
      .forEach(reportList::add);
      
      
      JsonObject result = new JsonObject();
      result.add("list", JsonParser.parseString(reportList.toString()));
      result.addProperty("startPage", startPage);
      result.addProperty("endPage", endPage);
      result.addProperty("page", page);
      result.addProperty("prev", prev);
      result.addProperty("next", next);
      
      
      resp.setContentType("application/json; charset=utf-8");
      PrintWriter out = resp.getWriter();
      out.print(result.toString());
      out.close();
	}

}
LoginOkController.java
public class LoginOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		AdminDAO adminDAO = new AdminDAO();
		MemberDTO memberDTO = new MemberDTO();
		
		int memberNumber = -1;
		String memberId = req.getParameter("memberId");
		String memberPassword = req.getParameter("memberPassword");
		
		String path = null;
		HttpSession session = req.getSession();
		
		
		memberDTO.setMemberId(memberId);
		memberDTO.setMemberPassword(memberPassword);
		
		System.out.println(memberDTO);
		
		try {
			memberNumber = adminDAO.login(memberDTO);
			path = "/admin/reportSnsListOk.ad";
			session.setAttribute("memberNumber", memberNumber);
		} catch (NullPointerException e) {
			path = "/app/admin/login.jsp";
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
		resp.sendRedirect(path);
	}

}
LogoutOkController.java
public class LogoutOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().invalidate();
		resp.sendRedirect("/admin.ad");
	}

}
MemberBanOkController.java
public class MemberBanOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		AdminDAO adminDAO = new AdminDAO();
		adminDAO.banMember(Integer.parseInt(req.getParameter("memberNumber")));
	}

}
MemberListOkController.java
public class MemberListOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		AdminDAO adminDAO = new AdminDAO();
		
		int total = adminDAO.getTotal();
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
      String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가낭 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      Map<String, Integer> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
		
      List<MemberDTO> members = adminDAO.getAllMember(pageMap);
      Gson gson = new Gson();
      JsonArray memberList = new JsonArray();
      
      members.stream()
      .map(gson::toJson)
      .map(JsonParser::parseString)
      .forEach(memberList::add);
      
      JsonObject result = new JsonObject();
      result.add("list", JsonParser.parseString(memberList.toString()));
      result.addProperty("startPage", startPage);
      result.addProperty("endPage", endPage);
      result.addProperty("page", page);
      result.addProperty("prev", prev);
      result.addProperty("next", next);
      
      resp.setContentType("application/json; charset=utf-8");
      PrintWriter out = resp.getWriter();
      out.print(result.toString());
      out.close();
      
	}

}
MemberRestoreOkController.java
public class MemberRestoreOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		AdminDAO adminDAO = new AdminDAO();
		adminDAO.restoreMember(Integer.parseInt(req.getParameter("memberNumber")));
	}

}
ReportSnsListAjaxOkController.java
public class ReportSnsListAjaxOkController implements Execute{
	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		ReportSnsDAO reportSnsDAO = new ReportSnsDAO();
		int total = reportSnsDAO.getTotal();
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
		String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가낭 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      Map<String, Integer> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
      
      
      List<ReportSnsVO> reports = reportSnsDAO.selectAll(pageMap);
      Gson gson = new Gson();
      JsonArray reportList = new JsonArray();
      
      reports.stream()
      .map(gson::toJson)
      .map(JsonParser::parseString)
      .forEach(reportList::add);
      
      
      JsonObject result = new JsonObject();
      result.add("list", JsonParser.parseString(reportList.toString()));
      result.addProperty("startPage", startPage);
      result.addProperty("endPage", endPage);
      result.addProperty("page", page);
      result.addProperty("prev", prev);
      result.addProperty("next", next);
      
      resp.setContentType("application/json; charset=utf-8");
      PrintWriter out = resp.getWriter();
      out.print(result.toString());
      out.close();
      
      
	}
}
ReportSnsListOkController.java
public class ReportSnsListOkController implements Execute{
	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ReportSnsDAO reportSnsDAO = new ReportSnsDAO();
		int total = reportSnsDAO.getTotal();
		
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
      String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가낭 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      
      
      
      Map<String, Integer> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
      
      List<ReportSnsVO> reports = reportSnsDAO.selectAll(pageMap);
      
      req.setAttribute("reportList", reports);
      req.setAttribute("page", page);
      req.setAttribute("startPage", startPage);
      req.setAttribute("endPage", endPage);
      req.setAttribute("prev", prev);
      req.setAttribute("next", next);
      
      req.getRequestDispatcher("/app/admin/reportList.jsp").forward(req, resp);
	}
}
ReportStoreListOkController.java
public class ReportStoreListOkController implements Execute{
	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		ReportStoreDAO reportStoreDAO = new ReportStoreDAO();
		int total = reportStoreDAO.getTotal();
//      처음 게시판 페이지에 진입하면 페이지에 대한 정보가 없다.
//      그러므로 temp에는 null이 들어가게 된다.
      String temp = req.getParameter("page");
      
//      null인 경우는 게시판에 처음 이동하는 것이므로 1페이지를 띄워주면 된다.
      int page = temp == null ? 1 : Integer.valueOf(temp);
      
//      한 페이지에 몇 개의 게시물? 10개
      int rowCount = 10;
//      페이지 버튼 세트는? 5개씩
      int pageCount = 5;
      
//       * 0, 10 -> 1페이지
//       * 10, 10 -> 2페이지
//       * 20, 10 -> 3페이지
      int startRow = (page-1) * rowCount;
      
//      Math.ceil() 올림처리
      int endPage = (int)(Math.ceil(page/(double)pageCount) * pageCount);
//      endPage는 페이지 세트 당 마지막 번호를 의미한다.
      
      int startPage = endPage - (pageCount - 1);
//      startPage는 페이지 세트 당 첫 번째 번호를 의미한다.
      
      int realEndPage = (int)Math.ceil(total / (double)rowCount);
//      realEndPage는 전체 페이지 중 가낭 마지막 번호를 의미한다.
      
      endPage = endPage > realEndPage ? realEndPage : endPage;
//      첫 번째 페이지 세트가 1~5
//      두 번째 페이지 세트가 6~10이어도
//      realEndPage가 7이라면 두 번째 페이지 세트의 마지막 번호는 7이어야 한다.
      
      boolean prev = startPage > 1;
      boolean next = endPage != realEndPage;
      
      
      
      
      Map<String, Integer> pageMap = new HashMap<>();
      pageMap.put("startRow", startRow);
      pageMap.put("rowCount", rowCount);
      
      
      
      List<ReportStoreVO> reports = reportStoreDAO.selectAll(pageMap);
      Gson gson = new Gson();
      JsonArray reportList = new JsonArray();
      
      
      reports.stream()
      .map(gson::toJson)
      .map(JsonParser::parseString)
      .forEach(reportList::add);
      
      JsonObject result = new JsonObject();
      result.add("list", JsonParser.parseString(reportList.toString()));
      result.addProperty("startPage", startPage);
      result.addProperty("endPage", endPage);
      result.addProperty("page", page);
      result.addProperty("prev", prev);
      result.addProperty("next", next);
      
      resp.setContentType("application/json; charset=utf-8");
      PrintWriter out = resp.getWriter();
      out.print(result.toString());
      out.close();
      
      
	}
}

DAO

AdminDAO.java
public class AdminDAO {
	public SqlSession sqlSession;
	
	public AdminDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}
	
	public int login(MemberDTO memberDTO) {
		return sqlSession.selectOne("member.adminLogin", memberDTO);
	}
	
	public List<MemberDTO> getAllMember(Map<String, Integer> pageMap) {
		return sqlSession.selectList("member.adminAllMember", pageMap);
	}
	
	public int getTotal() {
		return sqlSession.selectOne("member.adminGetTotal");
	}
	
	public void banMember(int memberNumber) {
		sqlSession.update("member.adminBanMember", memberNumber);
	}
	
	public void restoreMember(int memberNumber) {
		sqlSession.update("member.adminRestoreMember", memberNumber);
	}
	
	public List<MemberDTO> findMember(Map<String, Object> pageMap) {
		return sqlSession.selectList("member.adminFindMember", pageMap);
	}
	
	public int findGetTotal(String memberId) {
		return sqlSession.selectOne("member.adminFindGetTotal", memberId);
	}
	
}

Mapper

ReportMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="report">
	<select id="selectSnsAll" resultType="ReportSnsVO" parameterType="map">
		select r.report_number, r.report_title, r.report_content, r.report_date, r.report_member_number
		, r.report_sns_number, m.member_id, me.member_id reported_member_id
		from tbl_member m 
		join tbl_report_sns r on m.member_number = r.report_member_number
		join tbl_sns s on r.report_sns_number = s.sns_number
		join tbl_member me on s.member_number = me.member_number 
		order by report_number desc
		limit #{startRow}, #{rowCount}
	</select>	
	
	<select id="getSnsTotal" resultType="_int">
		select count(report_number) from tbl_report_sns
	</select>
	
	<select id="selectStoreAll" resultType="ReportStoreVO" parameterType="map">
		select r.report_number, r.report_title, r.report_content, r.report_date, r.report_member_number
		, r.report_store_number, m.member_id, me.member_id reported_member_id
		from tbl_member m 
		join tbl_report_store r on m.member_number = r.report_member_number
		join tbl_store s on r.report_store_number = s.store_number
		join tbl_member me on s.member_number = me.member_number 
		order by report_number desc
		limit #{startRow}, #{rowCount}
	</select>	
	
	<select id="getStoreTotal" resultType="_int">
		select count(report_number) from tbl_report_store
	</select>
	
	<select id="findSns" parameterType="map" resultType="ReportSnsVO">
		select r.report_number, r.report_title, r.report_content, r.report_date, r.report_member_number
		, r.report_sns_number, m.member_id, me.member_id reported_member_id
		from tbl_member m 
		join tbl_report_sns r on m.member_number = r.report_member_number
		join tbl_sns s on r.report_sns_number = s.sns_number
		join tbl_member me on s.member_number = me.member_number 
		where r.report_title like concat('%', #{reportTitle}, '%')
		order by report_number desc
		limit #{startRow}, #{rowCount}
	</select>
	
	<select id="findSnsGetTotal" parameterType="string" resultType="_int">
		select count(report_number) from tbl_report_sns
		where report_title like concat('%', #{reportTitle}, '%')
	</select>
	
	<select id="findStore" parameterType="map" resultType="ReportStoreVO">
		select r.report_number, r.report_title, r.report_content, r.report_date, r.report_member_number
		, r.report_store_number, m.member_id, me.member_id reported_member_id
		from tbl_member m 
		join tbl_report_store r on m.member_number = r.report_member_number
		join tbl_store s on r.report_store_number = s.store_number
		join tbl_member me on s.member_number = me.member_number 
		where r.report_title like concat('%', #{reportTitle}, '%')
		order by report_number desc
		limit #{startRow}, #{rowCount}
	</select>
	
	<select id="findStoreGetTotal" parameterType="string" resultType="_int">
		select count(report_number) from tbl_report_store
		where report_title like concat('%', #{reportTitle}, '%')
	</select>
	
	<select id="profileImg" parameterType="string" resultType="string">
		select tcf.channel_file_system_name  from tbl_channel_file tcf 
		left join tbl_channel tc 
		on tcf.channel_number = tc.channel_number 
		left join tbl_member tm 
		on tm.member_number = tc.member_number 
		where tm.member_id = #{memberId}
	</select>

</mapper>
SnsMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="sns">


	<select id="sessionProfileImg" resultType='string' parameterType="_int">
		select tcf.channel_file_system_name  from tbl_channel_file tcf 
		left join tbl_channel tc 
		on tc.channel_number = tcf.channel_number 
		left join tbl_member tm 
		on tm.member_number = tc.member_number 
		where tm.member_number = #{memberNumber}
	</select>
	
	<select id="selectAll" resultType="SnsVO" parameterType="_int">
	select ts.sns_number, ts.sns_title, ts.sns_content, ts.sns_date,
	ts.sns_view_cnt,
	count(tsl.sns_number) as like_cnt, tsf.sns_file_system_name
	from tbl_member tm
	left join tbl_sns ts on tm.member_number = ts.member_number
	left join tbl_sns_like tsl on ts.sns_number = tsl.sns_number
	left join tbl_sns_file tsf on tsl.sns_number = tsf.sns_number
	where tm.member_number = #{memberNumber}
	group by ts.sns_number, ts.sns_title, ts.sns_content, ts.sns_date,
	ts.sns_view_cnt, tsf.sns_file_system_name
	order by ts.sns_date desc
	</select>

	<!-- snsHostHeader 부분 -->
	<select id="memberInfo" resultType="SnsHeaderVO" parameterType="_int">
		select
		m.member_number,
		m.member_nickname,
		c.channel_name ,
		(select count(*) from tbl_follow where member_number_from = m.member_number)
		as from_count,
		(select count(*) from tbl_follow where member_number_to = m.member_number) as
		to_count,
		count(distinct s.sns_number) as sns_count,
		c.channel_comment,
		tcf.channel_file_system_name 
		from
		tbl_member m
		left join tbl_follow f on m.member_number = f.member_number_from
		left join tbl_sns s on m.member_number = s.member_number
		left join tbl_channel c on m.member_number = c.member_number
		left join tbl_channel_file tcf on c.channel_number =tcf.channel_number 
		where
		m.member_number = #{memberNumber}
		group by
		m.member_number,
		m.member_nickname,
		c.channel_name ,
		from_count,
		to_count,
		channel_comment,
		tcf.channel_file_system_name 
	</select>
	
	
	<!-- post hover시에 보이는 정보들 -->
	<select id="snsPostInfo" resultType="SnsPostInfoVO" parameterType="map">
    select ts.sns_number, ts.sns_title as snsTitle, ts.sns_date as snsDate, ts.sns_view_cnt as snsViewCnt,
    count(tsl.sns_number) as likeCnt,
  	 (select sns_file_system_name  from tbl_sns_file tsf
  	 where sns_number= ts.sns_number
  	 limit 0, 1) sns_file_system_name 
    from tbl_sns ts
    left join tbl_sns_like tsl
    on ts.sns_number = tsl.sns_number
    where ts.member_number = #{memberNumber}
    group by ts.sns_number, ts.sns_title, ts.sns_date, ts.sns_view_cnt
    order by ts.sns_number desc
    limit #{startRow}, #{rowCount}
	</select>

	<!-- 전체 sns 게시글 수 가져오기 -->
	<select id="getTotal" parameterType="_int" resultType="_int">
		select count(sns_number) from tbl_sns ts
		where member_number = #{memberNumber}
	</select>
	
	<!-- view 업데이트 -->
	<update id="updateSnsViewCnt" parameterType="_int">
		update tbl_sns 
		set sns_view_cnt = sns_view_cnt + 1
		where sns_number = #{snsNumber}
	</update>
	
	<update id="updateStoreViewCnt" parameterType="_int">
		update tbl_store
		set store_view_cnt = store_view_cnt + 1
		where store_number = #{storeNumber}
	</update>
	
	<!-- 좋아요 업데이트 -->
	<select id="liked" parameterType="map" resultType="_int">
		select count(sns_number) from tbl_sns_like 
 		where sns_number = #{snsNumber} and member_number = #{memberNumber}
	</select>
	
	
	<insert id="updateSnsLikeCnt" parameterType="SnsDTO">
		insert into tbl_sns_like
		(sns_number, member_number)
		values(#{snsNumber}, #{memberNumber})
	</insert>
	
	<delete id="deleteSnsLikeCnt" parameterType="SnsDTO">
		delete from tbl_sns_like
		where sns_number = #{snsNumber}  and member_number= #{memberNumber}
	</delete>
	
	<!-- 팔로우 업데이트 -->
	<select id="followed" parameterType="map" resultType="_int">
		select count(member_number_from) from tbl_follow
 		where member_number_from = #{memberNumberFrom} and member_number_to = #{memberNumberTo}
	</select>
	
	<insert id="updateSnsFollow" parameterType="SnsFollowVO">
		insert into tbl_follow
		(member_number_from, member_number_to)
		values(#{memberNumberFrom}, #{memberNumberTo})
	</insert>
	
	<delete id="deleteSnsFollow" parameterType="SnsFollowVO">
		delete from tbl_follow 
		where member_number_from = #{memberNumberFrom} and member_number_to = #{memberNumberTo}
	</delete>
	
	<!-- 게시글 삭제 -->
	<delete id="deleteSnsPost" parameterType="_int">
		delete from tbl_sns
		where sns_number = #{snsNumber}
	</delete>
	
	<delete id="deleteSnsLikeFromHost" parameterType="_int">
		delete from tbl_sns_like
		where sns_number = #{snsNumber}
	</delete>
	
	<delete id="deleteSnsCommentFromHost" parameterType="_int">
		delete from tbl_sns_comment
		where sns_number = #{snsNumber}
	</delete>
	
	<delete id="deleteSnsFileFromHost" parameterType="_int">
		delete from tbl_sns_file 
		where sns_number = #{snsNumber}
	</delete>
	
	<delete id="deleteSnsReportFromHost" parameterType="_int">
		delete from tbl_report_sns
		where report_sns_number = #{snsNumber}
	</delete>
	
	<!-- 스토어 게시글 삭제 -->
	<delete id="deleteStorePost" parameterType="_int">
		delete from tbl_store
		where store_number = #{storeNumber}
	</delete>
	
	<delete id="deleteStoreLikeFromHost" parameterType="_int">
		delete from tbl_store_like
		where store_number = #{storeNumber}
	</delete>
	
	<delete id="deleteStoreCommentFromHost" parameterType="_int">
		delete from tbl_store_comment
		where store_number = #{storeNumber}
	</delete>
	
	<delete id="deleteStoreFileFromHost" parameterType="_int">
		delete from tbl_store_file 
		where store_number = #{storeNumber}
	</delete>
	
	<delete id="deleteStoreBasketFromHost" parameterType="_int">
		delete from tbl_basket 
		where store_number = #{storeNumber}
	</delete>
	
	<delete id="deleteStoreBuyFromHost" parameterType="_int">
		delete from tbl_buy
		where store_number = #{storeNumber}
	</delete>
	
	<delete id="deleteStoreReportFromHost" parameterType="_int">
		delete from tbl_report_store
		where report_store_number = #{storeNumber}
	</delete>

	
	<!-- 게시글 불러오기 -->
	<select id="showSnsPost" parameterType="map" resultType="SnsPostVO">
	select ts.sns_number , ts.sns_title , ts.sns_content , sns_date,
	count(tsl.sns_number) as like_cnt,
	tc.channel_name ,
	tcf.channel_file_system_name ,
	ts.member_number
	from tbl_sns ts
	left join tbl_sns_like tsl
	on ts.sns_number = tsl.sns_number
	left join tbl_member tm
	on ts.member_number = tm.member_number
	left join tbl_channel tc
	on tm.member_number = tc.member_number
	left join tbl_channel_file tcf
	on tc.channel_number = tcf.channel_number
	where ts.sns_number = #{snsNumber}
	group by 
	tc.channel_name ,
	tcf.channel_file_system_name,
	ts.sns_number
	</select>
	
	
	<!-- 댓글 읽어오기 -->
	<select id="snsCommentList" parameterType="map"
		resultType="SnsCommentVO">
		select ts.sns_number , tsc.sns_comment_number , tsc.sns_comment_content ,
		tm.member_nickname , tc.channel_name  ,tsc.member_number ,
		tsc.sns_comment_date,
		tcf.channel_file_system_name 
		from tbl_sns ts left join tbl_sns_comment tsc
		on ts.sns_number = tsc.sns_number
		left join tbl_member tm
		on tsc.member_number = tm.member_number
		left join tbl_channel tc
		on tm.member_number = tc.member_number
		left join tbl_channel_file tcf 
		on tc.channel_number = tcf.channel_number 
		where ts.sns_number = #{snsNumber}
	</select>

	<insert id="snsWrite" parameterType="SnsDTO">
		insert into tbl_sns
		(sns_title, sns_content, member_number)
		values(#{snsTitle}, #{snsContent}, #{memberNumber})
	</insert>
	
	<select id="getSequence" resultType="_int">
		select last_insert_id()
	</select>

	<!-- 댓글 작성 -->
	<insert id="snsCommentInsert" parameterType="snsCommentDTO">
		insert into tbl_sns_comment
		(sns_comment_content,sns_number, member_number)
		values(#{snsCommentContent},  #{snsNumber}, #{memberNumber})
	</insert>
	
	
	
	<!-- 댓글 삭제 -->
	<delete id="snsCommentDelete" parameterType="_int">
		delete from tbl_sns_comment
		where sns_comment_number= #{snsCommentNumber}
	</delete>
	
	
	
	<!-- 댓글 수정 -->
	<update id="snsCommentUpdate" parameterType="snsCommentDTO">
		update tbl_sns_comment
		set sns_comment_content= #{snsCommentContent}
		where sns_comment_number= #{snsCommentNumber}
	</update>
	
	<select id="snsFile" parameterType="_int" resultType="string">
		select sns_file_system_name, sns_number from tbl_sns_file 
		where sns_number = #{snsNumber}
	</select>
	
	<select id="storeFile" parameterType="_int" resultType="string">
		select store_file_system_name, store_number from tbl_store_file 
		where store_number = #{storeNumber}
	</select>
	
	<!-- 전체 store 게시글 수  -->
	<select id="getStoreTotal" resultType="_int" parameterType="_int">
		select count(store_number) from tbl_store ts 
		where member_number = #{memberNumber}
	</select>
	
	
	<!-- sns store탭 게시글 불러오기 -->
	<select id="storePostInfo" parameterType="map" resultType="SnsStoreVO">
		select ts.store_number , ts.store_title as storeTitle, ts.store_date as
		storeDate, ts.store_view_cnt as storeViewCnt,
		count(tsl.store_number) as likeCnt,
		(select store_file_system_name  from tbl_store_file tsf
  	 	where store_number= ts.store_number
  	 	limit 0, 1) store_file_system_name 
		from tbl_store ts
		left join tbl_store_like tsl
		on ts.store_number = tsl.store_number
		where ts.member_number = #{memberNumber}
		group by ts.store_number , ts.store_title , ts.store_date ,
		ts.store_view_cnt
		order by ts.store_date desc
	</select>
	
	
	<!-- sns store탭 게시글 1개 읽어오기 -->
	<select id="showStoreInfo" parameterType="_int" resultType="snsStoreVO">
		select ts.store_title, ts.store_number, ts.store_content, ts.store_price,
		ts.store_date, th.hashtag_name,  th.hashtag_number, ts.store_view_cnt from tbl_store ts 
		join tbl_hashtag th 
		on ts.hashtag_number = th.hashtag_number
		where ts.store_number = #{storeNumber}
	</select>
	
	<select id="showStoreLikeCnt" parameterType="_int" resultType="_int">
		select count(store_number) from tbl_store_like
		where store_number  = #{storeNumber}
	</select>
	
	<select id="showStoreCommentCnt" parameterType="_int" resultType="_int">
		select count(store_number) from tbl_store_comment 
		where store_number  = #{storeNumber}
	</select>
	
	<!-- store 댓글 읽어오기 -->
	<select id="snsStoreCommentList" parameterType="map"
		resultType="SnsStoreCommentVO">
		select ts.store_number , tsc.store_comment_number , tsc.store_comment_content ,
		tm.member_nickname , tc.channel_name  ,tsc.member_number ,
		tsc.store_comment_date,
		tcf.channel_file_system_name
		from tbl_store ts left join tbl_store_comment tsc
		on ts.store_number = tsc.store_number
		left join tbl_member tm
		on tsc.member_number = tm.member_number
		left join tbl_channel tc
		on tm.member_number = tc.member_number
		left join tbl_channel_file tcf 
		on tc.channel_number = tcf.channel_number 
		where ts.store_number = #{storeNumber}
	</select>
	
	<!-- store 댓글 작성 -->
	<insert id="snsStoreCommentInsert" parameterType="snsStoreCommentVO">
		insert into tbl_store_comment
		(store_comment_content,store_number, member_number)
		values(#{storeCommentContent},  #{storeNumber}, #{memberNumber})
	</insert>
	
	<!-- 댓글 삭제 -->
	<delete id="snsStoreCommentDelete" parameterType="_int">
		delete from tbl_store_comment
		where store_comment_number= #{storeCommentNumber}
	</delete>
	
	<!-- 댓글 수정 -->
	<update id="snsStoreCommentUpdate" parameterType="snsStoreCommentVO">
		update tbl_store_comment
		set store_comment_content= #{storeCommentContent}
		where store_comment_number= #{storeCommentNumber}
	</update>
	
	<!-- 좋아요 업데이트 -->
	<insert id="updateStoreLikeCnt" parameterType="snsStoreVO">
		insert into tbl_store_like
		(store_number, member_number)
		values(#{storeNumber}, #{memberNumber})
	</insert>
	
	<delete id="deleteStoreLikeCnt" parameterType="snsStoreVO">
		delete from tbl_store_like
		where store_number = #{storeNumber}  and member_number= #{memberNumber}
	</delete>
	
	<select id="ifLiked" parameterType="map" resultType="_int">
		select count(ts.store_number) from tbl_store ts 
	 	left join tbl_store_like tsl 
	 	on ts.store_number = tsl.store_number 
	 	where tsl.store_number = #{storeNumber} and tsl.member_number = #{memberNumber}
	</select>

	<!-- 신고하기 -->
	<insert id="reportPost" parameterType="reportSnsDTO">
		insert into tbl_report_sns
		(report_title, report_content, report_member_number, report_sns_number)
		values(#{reportTitle}, #{reportContent}, #{reportMemberNumber}, #{reportSnsNumber})
	</insert>
	
	<update id="updatePost" parameterType="snsDTO">
		update tbl_sns
		set sns_title=#{snsTitle}, sns_content=#{snsContent}
		where sns_number=#{snsNumber}
	</update>
	
	<insert id="reportStorePost" parameterType="reportStoreDTO">
		insert into tbl_report_store
		(report_title, report_content, report_member_number, report_store_number)
		values(#{reportTitle}, #{reportContent}, #{reportMemberNumber}, #{reportStoreNumber})
	</insert>
	
</mapper>
StoreMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="store">
	<select id="selectAll" resultType="StoreVO" parameterType="map">
		select store_number, store_title, store_content, store_date,
		store_price, store_view_cnt, (select count(store_number) from
		tbl_store_like where store_number =s.store_number) store_like_cnt,
		h.hashtag_number, m.member_number,
		c.channel_name, (select
		store_file_system_name
		from tbl_store_file sf
		where store_number
		=s.store_number
		limit 0,1) store_file_system_name,
		channel_file_system_name
		from tbl_member m
		join tbl_store s on
		m.member_number = s.member_number
		join tbl_channel c on
		m.member_number = c.member_number
		left join tbl_channel_file cf on
		cf.channel_number = c.channel_number
		join tbl_hashtag h on
		s.hashtag_number = h.hashtag_number
		where h.hashtag_number =#{hashtagNumber}
		order by store_view_cnt + store_like_cnt desc
		limit
		#{startRow}, #{rowCount}
	</select>

	<select id="selectAllByLike" resultType="StoreVO"
		parameterType="map">
		select store_number, store_title, store_content, store_date,
		store_price, store_view_cnt, (select count(store_number) from
		tbl_store_like where store_number =s.store_number) store_like_cnt,
		h.hashtag_number, m.member_number,
		c.channel_name, (select
		store_file_system_name
		from tbl_store_file sf
		where store_number
		=s.store_number
		limit 0,1) store_file_system_name,
		channel_file_system_name
		from tbl_member m
		join tbl_store s on
		m.member_number = s.member_number
		join tbl_channel c on
		m.member_number = c.member_number
		left join tbl_channel_file cf on
		cf.channel_number = c.channel_number
		join tbl_hashtag h on
		s.hashtag_number = h.hashtag_number
		where h.hashtag_number =#{hashtagNumber}
		order by store_like_cnt desc
		limit
		#{startRow},
		#{rowCount}
	</select>

	<select id="selectAllByDate" resultType="StoreVO"
		parameterType="map">
		select store_number, store_title, store_content, store_date,
		store_price, store_view_cnt, (select count(store_number) from
		tbl_store_like where store_number =s.store_number) store_like_cnt,
		h.hashtag_number, m.member_number,
		c.channel_name, (select
		store_file_system_name
		from tbl_store_file sf
		where store_number
		=s.store_number
		limit 0,1) store_file_system_name,
		channel_file_system_name
		from tbl_member m
		join tbl_store s on
		m.member_number = s.member_number
		join tbl_channel c on
		m.member_number = c.member_number
		left join tbl_channel_file cf on
		cf.channel_number = c.channel_number
		join tbl_hashtag h on
		s.hashtag_number = h.hashtag_number
		where h.hashtag_number =#{hashtagNumber}
		order by store_date desc
		limit
		#{startRow}, #{rowCount}
	</select>

	<select id="selectAllByFree" resultType="StoreVO"
		parameterType="map">
	select store_number, store_title, store_content, store_date,
		store_price, store_view_cnt, (select count(store_number) from
		tbl_store_like where store_number =s.store_number) store_like_cnt,
		h.hashtag_number, m.member_number,
		c.channel_name, (select
		store_file_system_name
		from tbl_store_file sf
		where store_number
		=s.store_number
		limit 0,1) store_file_system_name,
		channel_file_system_name
		from tbl_member m
		join tbl_store s on
		m.member_number = s.member_number
		join tbl_channel c on
		m.member_number = c.member_number
		left join tbl_channel_file cf on
		cf.channel_number = c.channel_number
		join tbl_hashtag h on
		s.hashtag_number = h.hashtag_number
		where h.hashtag_number =#{hashtagNumber} and store_price = 0
		order by store_date desc
		limit
		#{startRow}, #{rowCount}
	</select>

	<select id="getTotal" resultType="_int" parameterType="_int">
		select
		count(store_number) from tbl_store
		where hashtag_number =
		#{hashtagNumber}
	</select>

	<insert id="insert" parameterType="StoreDTO">
		insert into
		tbl_store(store_title, store_content, store_date, store_price,
		store_view_cnt, hashtag_number, member_number)
		values(#{storeTitle},
		#{storeContent}, #{storeDate}, #{storePrice}, #{storeViewCnt},
		#{hashtagNumber}, #{memberNumber})
	</insert>

	<select id="getSequence" resultType="_int">
		select last_insert_id()
	</select>

	<!-- <select id="select" parameterType="_int" resultType="StoreVO"> select 
		store_number, store_title, store_content, store_date, store_price, store_view_cnt, 
		hashtag_number, member_number) </select> -->

	<update id="updateViewCnt" parameterType="_int">
		update tbl_store
		set
		store_view_cnt = store_view_cnt + 1
		where store_number=#{storeNumber}
	</update>

	<select id="selectModal" parameterType="_int"
		resultType="StoreUpdateVO">
		select j2.store_number, store_title , store_content ,
		store_date , store_price , store_view_cnt , j2.member_number,
		like_count, comment_count, tc.channel_number , tc.channel_name ,
		cf.channel_file_system_name , j2.hashtag_number, th.hashtag_name
		from(
		select j.store_number, store_title , store_content , store_date ,
		store_price , store_view_cnt , j.member_number,
		like_count,
		count(c.member_number) comment_count , hashtag_number
		from (
		select
		s.store_number, store_title , store_content , store_date ,
		store_price
		, store_view_cnt , s.member_number, s.hashtag_number,
		count(l.store_number) like_count
		from tbl_store s
		left join
		tbl_store_like l
		on s.store_number = l.store_number
		group by
		s.store_number
		)j left join tbl_store_comment c
		on j.store_number =
		c.store_number
		group by j.store_number
		)j2
		join tbl_channel tc
		on
		j2.store_number =
		#{storeNumber} and j2.member_number =
		tc.member_number
		left join tbl_channel_file cf
		on tc.channel_number =
		cf.channel_number
		join tbl_hashtag th
		on j2.hashtag_number =
		th.hashtag_number
	</select>

	<select id="buy" parameterType="_int" resultType="BasketVO">
		select ts.store_number , ts.store_title , ts.store_price,
	(select store_file_system_name  from tbl_store_file tsf
  	 where tsf.store_number= ts.store_number
  	 limit 0, 1) store_file_system_name  from tbl_store ts 
  	 where ts.store_number = #{storeNumber}
	</select>

	<insert id="storeWrite" parameterType="StoreDTO">
		insert into tbl_store
		(store_title, store_content, store_price, hashtag_number,
		member_number)
		values(#{storeTitle}, #{storeContent}, #{storePrice},
		#{hashtagNumber}, #{memberNumber})
	</insert>

	<select id="search" parameterType="map" resultType="StoreVO">
		select
		store_number, store_title, store_content, store_date,
		store_price,
		store_view_cnt, (select count(store_number) from tbl_store_like where
		store_number =s.store_number) store_like_cnt,
		h.hashtag_number,
		m.member_number,
		m.member_nickname, (select store_file_system_name
		from
		tbl_store_file sf
		where store_number =s.store_number
		limit 0,1)
		store_file_system_name, channel_file_system_name
		from tbl_member m
		join
		tbl_channel c on m.member_number = c.member_number
		join
		tbl_channel_file cf on cf.channel_number = c.channel_number
		join
		tbl_store s on m.member_number = s.member_number
		join tbl_hashtag h on
		s.hashtag_number = h.hashtag_number
		where s.store_title like
		concat('%',#{searchInput},'%')
		order by store_view_cnt + store_like_cnt
		desc
		limit #{startRow}, #{rowCount}
	</select>

	<select id="searchGetTotal" parameterType="string"
		resultType="_int">
		select count(store_number)
		from tbl_store
		where store_title
		like concat('%', #{searchInput}, '%')
	</select>

	<delete id="deleteStorePost" parameterType="_int">
		delete from tbl_store
		where store_number = #{storeNumber}
	</delete>
	

	<delete id="deleteStoreBasket" parameterType="_int">
		delete from tbl_basket
		where store_number = #{storeNumber}
	</delete> 
	
	
	<delete id="deleteStoreReport" parameterType="_int">
		delete from tbl_report_store
		where report_store_number = #{storeNumber}
	</delete>

	<delete id="deleteStoreLike" parameterType="_int">
		delete from
		tbl_store_like
		where store_number = #{storeNumber}
	</delete>

<!-- 	<delete id="deleteStoreLike" parameterType="_int">
		delete from
		tbl_store_like
		where store_number = #{storeNumber}
	</delete> -->

	<delete id="deleteStoreComment" parameterType="_int">
		delete from
		tbl_store_comment
		where store_number = #{storeNumber}
	</delete>

	<delete id="deleteStoreFile" parameterType="_int">
		delete from
		tbl_store_file
		where store_number = #{storeNumber}
	</delete>

	<insert id="reportPost" parameterType="reportStoreDTO">
		insert into tbl_report_sns
		(report_title, report_content, report_member_number,
		report_store_number)
		values(#{reportTitle}, #{reportContent},
		#{reportMemberNumber}, #{reportStoreNumber})
	</insert>

	<update id="updateStore" parameterType="storeDTO">
		update tbl_store
		set
		store_title=#{storeTitle}, store_content=#{storeContent} ,
		store_price=#{storePrice},
		hashtag_number=#{hashtagNumber}
		where
		store_number=#{storeNumber}
	</update>

	<insert id="reportStorePost" parameterType="reportStoreDTO">
		insert into
		tbl_report_store
		(report_title, report_content, report_member_number,
		report_store_number)
		values(#{reportTitle}, #{reportContent},
		#{reportMemberNumber}, #{reportStoreNumber})
	</insert>

	<insert id="insertBasket" parameterType="BasketDTO">
		insert into tbl_basket
		(basket_cnt, store_number, member_number)
		values(1, #{storeNumber},
		#{memberNumber})
	</insert>

	<update id="updatePost" parameterType="storeDTO">
		update tbl_store
		set
		store_title=#{storeTitle}, store_content=#{storeContent},
		store_price=#{storePrice}, hashtag_number=#{hashtagNumber}
		where
		store_number=#{storeNumber}
	</update>

	<select id="StoreLike" parameterType="map" resultType="_int">
		select count(store_number) from tbl_store_like 
 		where store_number = #{storeNumber} and member_number = #{memberNumber}
	</select>

	<insert id="updateStoreLikeCnt" parameterType="StoreVO">
		insert into tbl_store_like
		(store_number, member_number)
		values(#{storeNumber}, #{memberNumber})
	</insert>
	
	<delete id="deleteStoreLikeCnt" parameterType="StoreVO">
		delete from tbl_store_like
		where store_number = #{storeNumber}  and member_number= #{memberNumber}
	</delete>

	<select id="storefollow" parameterType="map" resultType="_int">
		select count(member_number_from) from tbl_follow
 		where member_number_from = #{memberNumberFrom} and member_number_to = #{memberNumberTo}
	</select>
	
	<insert id="updateStoreFollow" parameterType="StoreFollowVO">
		insert into tbl_follow
		(member_number_from, member_number_to)
		values(#{memberNumberFrom}, #{memberNumberTo})
	</insert>
	
	<delete id="deleteStoreFollow" parameterType="StoreFollowVO">
		delete from tbl_follow 
		where member_number_from = #{memberNumberFrom} and member_number_to = #{memberNumberTo}
	</delete>

</mapper>
MemberMapper.xml
        <select id="adminLogin" parameterType="MemberDTO" resultType="_int" >
		select member_number from tbl_member
		where member_number=0 and member_id=#{memberId} and member_password=#{memberPassword}
	</select>
	
	<select id="adminAllMember" resultType="MemberDTO" parameterType="map">
		select member_number, member_id, member_name, member_status
		from tbl_member
		where member_number != 0
		limit #{startRow}, #{rowCount}
	</select>
	
	<select id="adminGetTotal" resultType='_int'>
		select count(member_number) from tbl_member
		where member_number != 0
	</select>
	
	<select id="adminFindMember" resultType = "MemberDTO" parameterType="map">
		select member_number, member_id, member_name, member_status 
		from tbl_member 
		where member_id like concat('%', #{memberId}, '%') and member_number != 0 
		limit #{startRow}, #{rowCount}
	</select>
	
	<select id="adminFindGetTotal" parameterType="string" resultType="_int">
		select count(member_number) from tbl_member
		where member_id like concat('%', #{memberId}, '%') and member_number != 0
	</select>
	
	<update id="adminBanMember" parameterType="_int">
		update tbl_member
		set member_status=2
		where member_number=#{memberNumber}
	</update>
	
	<update id="adminRestoreMember" parameterType="_int">
		update tbl_member
		set member_status=1
		where member_number=#{memberNumber}
	</update>

JavaScript

admin_report-list.js
let reportSnsNumber;
let reportMemberId;
function showReport(result) {
	$(".report-list").html('');
	for (let i = 0; i < result.list.length; i++) {

		$('.report-list').append(`<div class="board-list">
		          <div class="board-list-number">${result.list[i].reportNumber}</div>
					
		          <!-- 게시물 제목 클릭하면 밑에 신고 상세내용 보이게 한다. -->
		          <a href="#" class="board-list-title">${result.list[i].reportTitle}</a>
		          <div class="board-list-author">${result.list[i].memberId}</div>
		          <div class="board-list-date">${result.list[i].reportDate}</div>
		        </div>
		
		        <!-- 게시물 제목 클릭 시 신고내용이 보여진다. -->
		        <div class="report-contents-wrap">
		          <div class="report-content">
		            <p>
		              ${result.list[i].reportContent}
		            </p>
		          </div>
		          <div class="report-btn-wrap">
					<input type="hidden" class="reportSnsNumber" value="${result.list[i].reportSnsNumber}">
		            <!-- 클릭 시 해당 회원정보로 이동 -->
		            <span class="go-member-btn">${result.list[i].reportedMemberId}</span>
					
		            <!-- 클릭 시 해당 게시물로 이동 -->
		            <button class="go-post-btn">게시물 보기</button>
		          </div>
		        </div>`)

	}
};

function showReportStore(result) {
	$(".report-list").html('');
	for (let i = 0; i < result.list.length; i++) {

		$('.report-list').append(`<div class="board-list">
		          <div class="board-list-number">${result.list[i].reportNumber}</div>
					
		          <!-- 게시물 제목 클릭하면 밑에 신고 상세내용 보이게 한다. -->
		          <a href="#" class="board-list-title">${result.list[i].reportTitle}</a>
		          <div class="board-list-author">${result.list[i].memberId}</div>
		          <div class="board-list-date">${result.list[i].reportDate}</div>
		        </div>
		
		        <!-- 게시물 제목 클릭 시 신고내용이 보여진다. -->
		        <div class="report-contents-wrap">
		          <div class="report-content">
		            <p>
		              ${result.list[i].reportContent}
		            </p>
		          </div>
		          <div class="report-btn-wrap">
					<input type="hidden" class="reportStoreNumber" value="${result.list[i].reportStoreNumber}">
		            <!-- 클릭 시 해당 회원정보로 이동 -->
		            <span class="go-member-btn">${result.list[i].reportedMemberId}</span>
					
		            <!-- 클릭 시 해당 게시물로 이동 -->
		            <button class="go-post-btn">게시물 보기</button>
		          </div>
		        </div>`)

	}
};

function showPagination(result) {
	$('.pagination').html('');
	$('.pagination').append(`<input class="startPage" type="hidden" name="startPage" value="${result.startPage}">`)
	$('.pagination').append(`<input class="endPage" type="hidden" name="endPage" value="${result.endPage}">`)
	if (result.prev) {
		$('.pagination').append(`<li><a href="" class="prev">&lt;</a></li>`);
	};
	for (let i = result.startPage; i < result.endPage + 1; i++) {
		if (!(i == result.page)) {
			$('.pagination').append(`<li>
	                        <a href="" class='number-btn'>
	                           ${i}
	                        </a>
	                     </li>`);
		} else {
			$('.pagination').append(`<li>
	                        <a href="#" class="active number-btn">
	                           ${i}
	                        </a>
	                     </li>`);
		}
	};

	if (result.next) {
		$('.pagination').append(`<li><a href="" class="next">&gt;</a></li>`);
	};

};

function showMember(result) {
	$('.report-list').html('');
	for (let i = 0; i < result.list.length; i++) {
		if (result.list[i].memberStatus == 1) {
			$('.report-list').append(`<div class="member-list">
				          <div class="member-list-number">${result.list[i].memberNumber}</div>
				          <div class="member-list-id">${result.list[i].memberId}</div>
				          <div class="member-list-author">${result.list[i].memberName}</div>
				          <!-- 관리자가 부여한 상태에 따라 텍스트 변환
				              ex) 활동, 정지 등 -->
				          <div class="member-list-status">활동</div>
				          <div class="member-list-control">
				            <button class="control-btn">정지</button>
				          </div>
				        </div>`);
		} else if (result.list[i].memberStatus == 2) {
			$('.report-list').append(`<div class="member-list">
				          <div class="member-list-number">${result.list[i].memberNumber}</div>
				          <div class="member-list-id">${result.list[i].memberId}</div>
				          <div class="member-list-author">${result.list[i].memberName}</div>
				          <!-- 관리자가 부여한 상태에 따라 텍스트 변환
				              ex) 활동, 정지 등 -->
				          <div class="member-list-status">정지</div>
				          <div class="member-list-control">
				            <button class="control-btn">복구</button>
				          </div>
				        </div>`);
		} else if (result.list[i].memberStatus == 3) {
			$('.report-list').append(`<div class="member-list">
				          <div class="member-list-number">${result.list[i].memberNumber}</div>
				          <div class="member-list-id">${result.list[i].memberId}</div>
				          <div class="member-list-author">${result.list[i].memberName}</div>
				          <!-- 관리자가 부여한 상태에 따라 텍스트 변환
				              ex) 활동, 정지 등 -->
				          <div class="member-list-status">탈퇴</div>
				          <div class="member-list-control">
				            <button class="control-btn">복구</button>
				          </div>
				        </div>`);
		}
	}
};

let params = {
	type: 'get',
	dataType: 'json',
	data: { page: $('.active').text().trim() },
	url: '/admin/reportSnsAjaxListOk.ad',
	success: showReport
};

let findParams = {
	type: 'get',
	dataType: 'json',
	data: {
		page: 1,
		input: $('.search-input').val().trim()
	},
	success: function(result) {
		showReport
	}
};

$(".report-list").on("click", ".board-list-title", function(e) {
	if ($(e.target).parent().next().css("display") == "none") {
		$(e.target).parent().next().css("display", "block");
	} else {
		$(e.target).parent().next().css("display", "none");
	}
});

$(".change-page-report").on('click', function() {
	$(this).css('background-color', '#1bcad3');
	$(".change-page-member").css('background-color', 'black');
	$(this).parent().next().css("display", "block");
	$('.board-contents-title').html(`<div class="board-number">번호</div>
          <div class="board-title">제목</div>
          <div class="board-author">작성자</div>
          <div class="board-date">생성일</div>`);
	$('.change-store').removeClass('click find');
	$('.change-sns').addClass('click find');
	$('.change-page-member').removeClass('find');
	$('.search-input').attr('placeholder', '검색할 제목을 입력하세요.');
	$.ajax({
		url: '/admin/reportSnsAjaxListOk.ad',
		type: 'get',
		dataType: 'json',
		data: { page: 1 },
		success: function(result) {
			showReport(result);
			showPagination(result);
		},
		error: function(a, b, c) {
			console.log(c);
		}
	});
});

$(".change-page-member").on('click', function() {
	$(this).css('background-color', '#1bcad3');
	$(".change-page-report").css('background-color', 'black');
	$(this).parent().prev().css("display", "none");
	$('.board-contents-title').html(`<div class="member-number">번호</div>
          <div class="member-id">ID</div>
          <div class="member-author">이름</div>
          <div class="member-status">회원 상태</div>
          <div class="member-control">제재</div>`);
	$('.search-input').attr('placeholder', '검색할 ID를 입력하세요.');
	$('.change-sns').removeClass('find');
	$('.change-store').removeClass('find');
	$(this).addClass('find');
	$('.board-contents-title').html(`<div class="member-number">번호</div>
          <div class="member-id">ID</div>
          <div class="member-author">이름</div>
          <div class="member-status">회원 상태</div>
          <div class="member-control">제재</div>`);
	params.url = '/admin/memberListOk.ad';
	$.ajax({
		url: '/admin/memberListOk.ad',
		type: 'get',
		data: { page: 1 },
		dataType: 'json',
		success: function(result) {
			showMember(result);
			showPagination(result);
		}
	});
});

$(".change-sns").on('click', function() {
	$('.change-sns').addClass('click find');
	$('.change-store').removeClass('click find');
	$('.change-page-member').removeClass('find');
	params.url = '/admin/reportSnsAjaxListOk.ad';
	$.ajax({
		url: '/admin/reportSnsAjaxListOk.ad',
		type: 'get',
		data: { page: 1 },
		dataType: 'json',
		success: function(result) {
			showReport(result);
			showPagination(result);
		},
		error: function(a, b, c) {
			console.log(c);
		}
	});
});



$(".change-store").on('click', function() {
	$('.change-store').addClass('click find');
	$('.change-sns').removeClass('click find');
	$('.change-page-member').removeClass('find');
	params.url = '/admin/reportStoreListOk.ad';
	$.ajax({
		url: '/admin/reportStoreListOk.ad',
		type: 'get',
		data: { page: 1 },
		dataType: 'json',
		success: function(result) {
			showReportStore(result);
			showPagination(result);
		},
		error: function(a, b, c) {
			console.log(c);
		}
	});
});





$('.pagination').on('click', '.number-btn', function(e) {
	e.preventDefault();
	$('.number-btn').removeClass('active');
	$(e.target).addClass('active');
	if($('.change-store').hasClass('click')){
		params.success = showReportStore;
	}
	params.data = { page: $(e.target).text().trim() };
	$.ajax(params);
});

$(".pagination").on('click', '.next', function(e) {
	e.preventDefault();
	params.data = { page: Number($('.endPage').val()) + 1 };
	if($('.change-store').hasClass('click')){
		$.ajax({
			url: params.url,
			data: params.data,
			type: 'get',
			dataType: 'json',
			success: function(result) {
				showReportStore(result);
				showPagination(result);
			}
		});
	}else{
		$.ajax({
			url: params.url,
			data: params.data,
			type: 'get',
			dataType: 'json',
			success: function(result) {
				showReport(result);
				showPagination(result);
			}
		});
	}
});

$(".pagination").on('click', '.prev', function(e) {
	e.preventDefault();
	console.log($('.endPage').val());
	params.data = { page: Number($('.startPage').val()) - 1 };
	if($('.change-store').hasClass('click')){
		$.ajax({
			url: params.url,
			data: params.data,
			type: 'get',
			dataType: 'json',
			success: function(result) {
				showReportStore(result);
				showPagination(result);
			}
		});
	}else{
		$.ajax({
			url: params.url,
			data: params.data,
			type: 'get',
			dataType: 'json',
			success: function(result) {
				showReport(result);
				showPagination(result);
			}
		});
	}
});

$('.report-list').on('click', '.control-btn', function(e) {
	if ($(e.target).text() == '정지') {
		$.ajax({
			url: '/admin/memberBanOk.ad',
			type: 'get',
			data: { memberNumber: $(e.target).parent().parent().children().first().text() },
			success: function() {
				$(e.target).parent().prev().text('정지');
				$(e.target).text('복구');
			},
			error: function(a, b, c) {
				console.log(c);
			}
		});
	} else if ($(e.target).text() == '복구') {
		$.ajax({
			url: '/admin/memberRestoreOk.ad',
			type: 'get',
			data: { memberNumber: $(e.target).parent().parent().children().first().text() },
			success: function() {
				$(e.target).parent().prev().text('활동');
				$(e.target).text('정지');
			},
			error: function(a, b, c) {
				console.log(c);
			}
		});
	}
});
let findUrl = '';
$('.search-btn').on('click', function() {
	if ($('.change-page-member').hasClass('find')) {
		$.ajax({
			url: '/admin/findMemberOk.ad',
			type: 'get',
			data: { page: 1, input: $('.search-input').val().trim() },
			dataType: 'json',
			success: function(result) {
				showMember(result);
				showPagination(result);
				$('.search-input').val('');
			},
			error: function(a, b, c) {
				console.log(c);
			}
		});

	} else if ($('.change-sns').hasClass('find')) {
		$.ajax({
			url: '/admin/findSnsOk.ad',
			type: 'get',
			data: { page: 1, input: $('.search-input').val().trim() },
			dataType: 'json',
			success: function(result) {
				showReport(result);
				showPagination(result);
				$('.search-input').val('');
			},
			error: function(a, b, c) {
				console.log(c);
			}
		});

	} else if ($('.change-store').hasClass('find')) {
		$.ajax({
			url: '/admin/findStoreOk.ad',
			type: 'get',
			data: { page: 1, input: $('.search-input').val().trim() },
			dataType: 'json',
			success: function(result) {
				showReportStore(result);
				showPagination(result);
				$('.search-input').val('');
			},
			error: function(a, b, c) {
				console.log(c);
			}
		});

	}
});

/**
 * 
 */

let memberNumber = $('.memberNumber').val();
let memberNumberFrom = $('.memberNumberFrom').val();
let memberNumberTo = $('.memberNumberTo').val();
let hostMemberNumber = $('#hostMemberNumber').val();




// @@@@@@ 이미지 클릭 했을 때 모달 창 띄우기 @@@@@@@@@
$('.report-list').on('click', '.go-post-btn', function(e) {
	if($('.change-sns').hasClass('click')){
		
		 reportSnsNumber = $(e.target).prev().prev().val();
		 reportMemberId = $(e.target).prev().text();
		
	
		$(".modal-box").css("display", "flex");
	
		$(".modal-background").css("display", "inline-block");
	
		
	
		$.ajax({
			url: '/sns/snsFileReadOk.sn',
			type: 'get',
			dataType: 'json',
			data: { snsNumber: reportSnsNumber },
			success: function(result) {
				showSnsFile(result);
			},
			error: function(a, b, c) {
				console.log(c);
			}
	
		});
	
	
		currentIdx = 0;
		$.ajax({
			url: '/sns/snsReadOk.sn',
			type: 'get',
			dataType: 'json',
			data: {
				snsNumber: reportSnsNumber,
				memberNumber: memberNumber,
				memberId : reportMemberId
			},
			success: function(result) {
				showSnsLikeDate(result);
				showPostContent(result);
				showSnsHost();
				$('.host-profile-img').attr('src', `/upload/${result.list.channelFileSystemName}`);
			},
			error: function(a, b, c) {
				console.log(c);
			}
	
		});
		
		$.ajax({
			url: '/sns/snsCommentOk.snc',
			type: 'get',
			dataType: 'json',
			data: { snsNumber: reportSnsNumber },
			success: function(result) {
				showPostComment(result);
			},
			error: function(a, b, c) {
				console.log(c);
			}
	
		});
	}else{
		$(".s-post-modal").css("display", "flex");
    	$(".s-post-modal-background").css("display", "inline-block");
   		reportStoreNumber = $(e.target).prev().prev().val();
   		$.ajax({
	      url : '/store/storeUpdateViewCntOk.st',
	      type : 'get',
	      data : {storeNumber : reportStoreNumber},
	      dataType : 'json',
	      success : function(result){
	         getStoreComment();
	         getStoreFile();
	         insertDataModal(result);

	      }
	   });
	}
});
// @@@@@@@ 모달 영역 밖으로 클릭하면 모달 창 없애기 @@@@@@@

$(".modal-background").on("click", function() {
	$(".modal-box").css("display", "none");
	$(this).css("display", "none");
});

$(".s-post-modal-background").on("click", function() {
	$(".s-post-modal").css("display", "none");
	$(this).css("display", "none");
});


// ajax에서 .post-part 클릭시  snsNumber가져오는 이벤트 

let snsNumber;
let storeNumber;

function showSnsHost(){
	$('.host-name').text(reportMemberId);
}

// 모달창 좋아요, 게시글 작성일 함수
function showSnsLikeDate(result) {

	$('.modal-like-date').html('');

	if (reportSnsNumber == result.list.snsNumber) {

		if (result.likeTest === "") {
			$('.modal-like-date').append(`
			<div class="like-wrap">
	
						<img class="before-like-btn"
							src="https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-gray-fill.png"
							alt="heart" />

					
						<div class="like-cnt">${result.list.likeCnt}</div>

					</div>
					<div class="post-date">${result.list.snsDate}</div>
			`);
		}
		else {

			$('.modal-like-date').append(`
			<div class="like-wrap">
					
						<img class="before-like-btn"
							src="https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-red-fill.png"
							alt="heart" />

						<div class="like-cnt">${result.list.likeCnt}</div>

					</div>
					<div class="post-date">${result.list.snsDate}</div>
			`);

		}

	}



}


// 모달 게시글 콘텐츠 함수
function showPostContent(result) {
	$('.host-comment-content').html('');

	if (reportSnsNumber == result.list.snsNumber) {

		$('.host-comment-content').append(`
					
					
							${result.list.snsContent}
						
				`);

	}

}

// 모달 게시글 댓글 함수


function showPostComment(result) {
	$('.comment').html('');
	let text = '';
	for (let i = 0; i < result.list.length; i++) {
		if (reportSnsNumber == result.list[i].snsNumber && result.list[i].snsCommentNumber != 0) {


			text += `
				<div class="comment-wrap">
									<div class="comment-member-info-box">
										<div class="comment-member-info">
											<div class="comment-member-profile">
												 <a href="/sns/snsOk.sn?memberNumber=${result.list[i].memberNumber}" class="comment-member-img"> <img
													class="comment-profile-img"
													src="/upload/${result.list[i].channelFileSystemName}"
													alt="" />
												</a> 
											</div>
											<div class="comment-member-name-wrap">
												<a href="/sns/snsOk.sn?memberNumber=${result.list[i].memberNumber}" class="comment-member-name"> 
										
												${result.list[i].channelName}
						
												</a>
											</div>
										</div>
				
				`
			if (memberNumber == result.list[i].memberNumber) {
				text += `
					<div class="comment-option">
						<button class="comment-edit" type="button" data-number="${result.list[i].snsCommentNumber}">수정</button>
						<button class="comment-delete" type="button" data-number="${result.list[i].snsCommentNumber}">삭제</button>
					</div>
					
					<div class="comment-edit-option">
						<button class="comment-modify" type="button" data-number="${result.list[i].snsCommentNumber}">수정 완료 </button>
					</div>
					`

			}

			text += `
				</div>



					<div class="comment-content-wrap">
						<span class="comment-content"> 
						${result.list[i].snsCommentContent}
						</span>
					</div>
					<div class="comment-date">
						<span> 
						${result.list[i].snsCommentDate}
						</span>
					</div>
				</div>
				`;



		}
	}
	$('.comment').html(text);

}






function showSnsFile(result) {

	$('.slide-box').html('');
	for (let i = 0; i < result.length; i++) {
		$('.slide-box').append(`
			<li>
				<img class="modal-img" src="/upload/${result[i]}"/>
			</li>
		`);
	}

	let slides = document.querySelector(".slide-box");
	let slideImg = document.querySelectorAll(".slide-box li");
	let currentIdx = 0;
	const slideCount = slideImg.length;
	const slideWidth = 600;
	const slideMargin = 100;

	//전체 슬라이드 컨테이너 넓이 설정
	slides.style.width = (slideWidth + slideMargin) * slideCount + "px";

	// 이미지 최대 개수나 최저 개수 도달시 버튼을 없애는 js
	function checkEnd() {
		if (currentIdx <= 0) {
			$(".post-img-prev").css("display", "none");
		} else {
			$(".post-img-prev").css("display", "block");
		}

		if (currentIdx >= slideCount - 1) {
			$(".post-img-next").css("display", "none");
		} else {
			$(".post-img-next").css("display", "block");
		}
	}

	checkEnd();


	$(".post-img-next").on("click", function() {

		currentIdx++;
		$('.slide-box').children().css('display', 'none');
		$('.slide-box').children().eq(currentIdx).css('display', 'block');


		checkEnd();
	});

	$(".post-img-prev").on("click", function() {
		currentIdx--;
		$('.slide-box').children().css('display', 'none');
		$('.slide-box').children().eq(currentIdx).css('display', 'block');

		checkEnd();
	});




}

$('.report-list').on('click', '.go-member-btn', function(e) {
	$('.change-page-member').click();
	while(true){
		if($('.change-page-member').hasClass('find')){
		$.ajax({
			url: '/admin/findMemberOk.ad',
			type: 'get',
			data: { page: 1, input: $(e.target).text().trim() },
			dataType: 'json',
			success: function(result) {
				showMember(result);
				showPagination(result);
			},
			error: function(a, b, c) {
				console.log(c);
			}
		});
		break;
		}
	}
});

function getStoreComment(){
      $.ajax({
            url: '/storeComment/storeCommentListOk.stc',
            type: 'get',
            dataType: 'json',
            data: { storeNumber: reportStoreNumber },
            success: function(result) {
               showStoreComment(result);
            },
            error: function(a, b, c) {
               console.log(c);
            }

         });
};
   
   function getStoreFile(){
	$('.s-post-img').html('');
      $.ajax({
         url:'/file/storeFileOk.stf',
         type:'get',
         dataType:'json',
         data: {storeNumber : reportStoreNumber},
         success: function(result){
            let text = '';
            
            for(let i=0; i<result.length; i++){
               text += `
                  <img
                         src="/upload/${result[i].storeFileSystemName}"
                         alt=""
                       />
               `;
            }
               
            $('.s-post-img').append(text);
         }
      });
   };

function insertDataModal(result){
   $('.s-post-title').text(result.storeTitle);
   $('.s-post-date').text(result.storeDate);
   $('.s-post-categori').text(result.hashtagName);
   $('.s-view-cnt').text(result.storeViewCnt);
   $('.s-p-like-cnt').text(result.likeCount);
   $('.s-comment-cnt').text(result.commentCount);
   $('.s-post-content').text(result.storeContent);
   //$('.author-profile-img').attr('src', '')
   $('.s-profile-modal-member > a').text(result.channelName);
};

   function showStoreComment(result){
   $('.s-commentL').html('');
   let text = '';
   for (let i = 0; i < result.length; i++) {
      if (storeNumber == result[i].storeNumber && result[i].storeCommentNumber != 0) {
         
         text += `<div class="s-comment-list">
              <!-- @@@@@@@@@ 댓글 list @@@@@@@@@@ -->
              <a herf="#" class="s-comment-user-profile-shortcuts">
                <div class="s-comment-user-profile-wrap">
                  <img
                    src="https://cdn-bastani.stunning.kr/prod/users/3dbbdc56-858d-4d0e-b467-1463957476e3/avatar/ZQdoCULUEydS7bnM.image.jpg.small?q=60&t=crop&s=300x300"
                    alt=""
                  />
                </div>
              </a>
              <div class="s-text-wrap">
                <div class="s-comment-member-info">
                  <a href="#" class="s-member-id">${result[i].memberNickname}</a>
                  <div class="s-box"></div>
                  <div class="s-comment-date">${result[i].storeCommentDate}</div>
                  `

            if(memberNumber == result[i].memberNumber){
               text += `
               
               <div class="s-comment-edit-delete-btn-box">
                    <button class="s-comment-edit-btn" data-number="${result[i].storeCommentNumber}">수정</button>

                    <button class="s-comment-delete-btn"  data-number="${result[i].storeCommentNumber}">삭제</button>
                  </div>

                <div class="s-edit-btn-box">
                      <button type="submit" class="s-edit-btn" data-number="${result[i].storeCommentNumber}">
                        수정 완료
                      </button>
                  </div>`
            }
            
            text += `
               </div>
            <div class="s-height-box"></div>
                <div class="s-comment">
                  <span class="s-comment-content">
               ${result[i].storeCommentContent}
                  </span>
                 
                  
                </div>
              </div>
              <!-- @@@@@@@@@ 댓글 리스트 끝  @@@@@@@@@@ -->
            </div>`;
      }
   }
   $('.s-commentL').html(text);
}
⚠️ **GitHub.com Fallback** ⚠️