기능소개(관리자 페이지) - lee-geon-hee/pandang GitHub Wiki
- 각 관리 탭 이동은 페이지 로딩이 없는 AJAX 사용
- Json 으로 데이터를 보내주기 위해 Gson과 JsonObject를 사용
- 검색 기능 구현을 위해 DB Like 사용
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();
}
}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);
}
}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>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"><</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">></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);
}