기능소개(창작물 구매 페이지) - lee-geon-hee/pandang GitHub Wiki

📃 산당 페이지

📌 창작물 보기

  • 카테고리별 창작물 보기 탭(Ajax)
  • 정렬방식 탭(Ajax)
  • 페이지 처리
  • 게시글 클릭 시 게시글 내용 포함한 모달창
  • 검색 기능(Ajax)

💻 코드

Controller

StoreFrontController.java
public class StoreFrontController 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 "/store/storeOk.st":
			new StoreOkController().execute(req, resp);
			break;
		case "/store/storeAjaxOk.st":
			new StoreAjaxOkController().execute(req, resp);
			break;
		case "/store/storeAjaxLikeOk.st":
			new StoreAjaxLikeOkController().execute(req, resp);
			break;
		case "/store/storeAjaxDateOk.st":
			new StoreAjaxDateOkController().execute(req, resp);
			break;
		case "/store/storeAjaxFreeOk.st":
			new StoreAjaxFreeOkController().execute(req, resp);
			break;
		case "/store/storeSearch.st":
			new StoreSearchController().execute(req, resp);
			break;
		case "/store/storeSearchAjax.st":
			new StoreSearchAjaxController().execute(req, resp);
			break;
		case "/store/storeModalOk.st":
			new StoreModalOkController().execute(req, resp);
			break;
		}
	}
}
StoreAjaxDateOkController.java
public class StoreAjaxDateOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		StoreDTO storeDTO = new StoreDTO();
		int rowCount = 12;
		int total = storeDAO.getTotal(Integer.parseInt(req.getParameter("hashtagNumber")));
		String temp = req.getParameter("currentPage");
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		Map<String, Integer> pageMap = new HashMap<>();
		pageMap.put("rowCount", rowCount);
		pageMap.put("startRow", startRow);
		pageMap.put("hashtagNumber", Integer.parseInt(req.getParameter("hashtagNumber")));
		
		System.out.println("total : " + total);
		System.out.println("page : " + temp);
		System.out.println(pageMap);
		
		List<StoreVO> stores = storeDAO.selectAllByDate(pageMap);
		
		Gson gson = new Gson();
	      JsonArray storeList = new JsonArray();
	      
	      stores.stream()
	      .map(gson::toJson)
	      .map(JsonParser::parseString)
	      .forEach(storeList::add);
	      
	      
	      JsonObject result = new JsonObject();
	      result.add("list", JsonParser.parseString(storeList.toString()));
	      result.addProperty("page", page);
	      result.addProperty("realEndPage", realEndPage);
	      
	      resp.setContentType("application/json; charset=utf-8");
	      PrintWriter out = resp.getWriter();
	      out.print(result.toString());
	      out.close();
		
	}

}
StoreAjaxFreeOkController.java
public class StoreAjaxFreeOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		StoreDTO storeDTO = new StoreDTO();
		int rowCount = 12;
		int total = storeDAO.getTotal(Integer.parseInt(req.getParameter("hashtagNumber")));
		String temp = req.getParameter("currentPage");
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		Map<String, Integer> pageMap = new HashMap<>();
		pageMap.put("rowCount", rowCount);
		pageMap.put("startRow", startRow);
		pageMap.put("hashtagNumber", Integer.parseInt(req.getParameter("hashtagNumber")));
		
		System.out.println("total : " + total);
		System.out.println("page : " + temp);
		System.out.println(pageMap);
		
		List<StoreVO> stores = storeDAO.selectAllByFree(pageMap);
		
		Gson gson = new Gson();
	      JsonArray storeList = new JsonArray();
	      
	      stores.stream()
	      .map(gson::toJson)
	      .map(JsonParser::parseString)
	      .forEach(storeList::add);
	      
	      
	      JsonObject result = new JsonObject();
	      result.add("list", JsonParser.parseString(storeList.toString()));
	      result.addProperty("page", page);
	      result.addProperty("realEndPage", realEndPage);
	      
	      resp.setContentType("application/json; charset=utf-8");
	      PrintWriter out = resp.getWriter();
	      out.print(result.toString());
	      out.close();
		
	}

}
StoreAjaxLikeOkController.java
public class StoreAjaxLikeOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		StoreDTO storeDTO = new StoreDTO();
		int rowCount = 12;
		int total = storeDAO.getTotal(Integer.parseInt(req.getParameter("hashtagNumber")));
		String temp = req.getParameter("currentPage");
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		Map<String, Integer> pageMap = new HashMap<>();
		pageMap.put("rowCount", rowCount);
		pageMap.put("startRow", startRow);
		pageMap.put("hashtagNumber", Integer.parseInt(req.getParameter("hashtagNumber")));
		
		System.out.println("total : " + total);
		System.out.println("page : " + temp);
		System.out.println(pageMap);
		
		List<StoreVO> stores = storeDAO.selectAllByLike(pageMap);
		
		Gson gson = new Gson();
	      JsonArray storeList = new JsonArray();
	      
	      stores.stream()
	      .map(gson::toJson)
	      .map(JsonParser::parseString)
	      .forEach(storeList::add);
	      
	      
	      JsonObject result = new JsonObject();
	      result.add("list", JsonParser.parseString(storeList.toString()));
	      result.addProperty("page", page);
	      result.addProperty("realEndPage", realEndPage);
	      
	      resp.setContentType("application/json; charset=utf-8");
	      PrintWriter out = resp.getWriter();
	      out.print(result.toString());
	      out.close();
		
	}

}
StoreAjaxOkController.java
public class StoreAjaxOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		StoreDTO storeDTO = new StoreDTO();
		int rowCount = 12;
		int total = storeDAO.getTotal(Integer.parseInt(req.getParameter("hashtagNumber")));
		String temp = req.getParameter("currentPage");
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		Map<String, Integer> pageMap = new HashMap<>();
		pageMap.put("rowCount", rowCount);
		pageMap.put("startRow", startRow);
		pageMap.put("hashtagNumber", Integer.parseInt(req.getParameter("hashtagNumber")));
		
		System.out.println("total : " + total);
		System.out.println("page : " + temp);
		System.out.println(pageMap);
		
		List<StoreVO> stores = storeDAO.selectAll(pageMap);
		
		Gson gson = new Gson();
	      JsonArray storeList = new JsonArray();
	      
	      stores.stream()
	      .map(gson::toJson)
	      .map(JsonParser::parseString)
	      .forEach(storeList::add);
	      
	      
	      JsonObject result = new JsonObject();
	      result.add("list", JsonParser.parseString(storeList.toString()));
	      result.addProperty("page", page);
	      result.addProperty("realEndPage", realEndPage);
	      
	      resp.setContentType("application/json; charset=utf-8");
	      PrintWriter out = resp.getWriter();
	      out.print(result.toString());
	      out.close();
		
	}

}
StoreModalOkController.java
public class StoreModalOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();

		int storeNumber = Integer.parseInt(req.getParameter("storeNumber"));
		StoreUpdateVO storeUpdateVO = new StoreUpdateVO();
		Gson gson = new Gson();
		
		storeDAO.updateViewCnt(storeNumber);
		
		storeUpdateVO = storeDAO.selectModal(storeNumber);
	
		resp.setContentType("application/json; charset=utf-8");
		
		PrintWriter out = resp.getWriter();
		JsonElement json = JsonParser.parseString(gson.toJson(storeUpdateVO));
		out.print(json.toString());

	}

}
StoreOkController.java
public class StoreOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		StoreDTO storeDTO = new StoreDTO();
		int rowCount = 12;
		int total = storeDAO.getTotal(1);
		String sessionProfileImg = "";
		String temp = req.getParameter("page");
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		Map<String, Integer> pageMap = new HashMap();
		pageMap.put("rowCount", rowCount);
		pageMap.put("startRow", startRow);
		pageMap.put("hashtagNumber", 1);
		
		HttpSession session = req.getSession();
		SnsDAO snsDAO = new SnsDAO();
		if(session.getAttribute("memberNumber")!=null) {
			sessionProfileImg = snsDAO.sessionProfileImg((Integer)session.getAttribute("memberNumber"));
		}
			
		req.setAttribute("sessionProfileImg", sessionProfileImg);
		
		List<StoreVO> stores = storeDAO.selectAll(pageMap);
		
		req.setAttribute("storeList", stores);
		req.setAttribute("realEndPage", realEndPage);

		
		
		req.getRequestDispatcher("/app/store/store.jsp").forward(req, resp);
	}
}
StoreSearchAjaxController.java
public class StoreSearchAjaxController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		int rowCount = 12;
		int total =storeDAO.searchGetTotal(req.getParameter("searchInput"));
		String temp = req.getParameter("page");
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		Map<String, Object> map = new HashMap();
		map.put("rowCount", rowCount);
		map.put("startRow", startRow);
		map.put("searchInput", req.getParameter("searchInput"));
		
		List<StoreVO> stores = storeDAO.search(map);
		Gson gson = new Gson();
		
		JsonArray storeList = new JsonArray();
	      
	      stores.stream()
	      .map(gson::toJson)
	      .map(JsonParser::parseString)
	      .forEach(storeList::add);
	      
	      
	      JsonObject result = new JsonObject();
	      result.add("list", JsonParser.parseString(storeList.toString()));
	      result.addProperty("realEndPage", realEndPage);
	      System.out.println(result.toString());
	      resp.setContentType("application/json; charset=utf-8");
	      PrintWriter out = resp.getWriter();
	      out.print(result.toString());
	      out.close();				
		
	}

}
StoreSearchController.java
public class StoreSearchController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreDAO storeDAO = new StoreDAO();
		int rowCount = 12;
		int total =storeDAO.searchGetTotal(req.getParameter("searchInput"));
		String temp = req.getParameter("page");
		int realEndPage = (int)Math.ceil(total / (double)rowCount);
		int page = temp == null ? 1 : Integer.valueOf(temp);
		int startRow = (page-1)*rowCount;
		Map<String, Object> map = new HashMap();
		map.put("rowCount", rowCount);
		map.put("startRow", startRow);
		map.put("searchInput", req.getParameter("searchInput"));
		
		List<StoreVO> stores = storeDAO.search(map);
		System.out.println(stores.toString());
		req.setAttribute("storeModal", stores);
		req.setAttribute("realEndPage", realEndPage);

		
		req.getRequestDispatcher("/app/store/store.jsp").forward(req, resp);
	}

}
StoreFileFrontController.java
public class StoreFileFrontController 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());
		System.out.println(target);
		
		switch(target) {
		case "/file/download.stf":
			new StoreDownloadController().execute(req, resp);
			break;
		case "/file/storeFileOk.stf":
			new StoreFileOkController().execute(req, resp);
			break;
		}		
	}
}
StoreFileOkController.java
public class StoreFileOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StoreFileDAO storeFileDAO = new StoreFileDAO();
		StoreFileDTO storeFileDTO = new StoreFileDTO();
		int storeNumber = Integer.parseInt(req.getParameter("storeNumber"));
		List<StoreFileDTO> files = storeFileDAO.selectList(storeNumber);
		Gson gson = new Gson();
		
		
		resp.setContentType("application/json; charset=utf-8");
		
		PrintWriter out = resp.getWriter();
		JsonElement json = JsonParser.parseString(gson.toJson(files));
		out.print(json.toString());
		
	}
}

DAO

StoreDAO.java
public class StoreDAO {
	public SqlSession sqlSession;

	public StoreDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

	public List<StoreVO> selectAll(Map<String, Integer> pageMap) {
		return sqlSession.selectList("store.selectAll", pageMap);
	}
	
	public List<StoreVO> selectAllByFree(Map<String, Integer> pageMap) {
		return sqlSession.selectList("store.selectAllByFree", pageMap);
	}
	
	public List<StoreVO> selectAllByLike(Map<String, Integer> pageMap) {
		return sqlSession.selectList("store.selectAllByLike", pageMap);
	}
	
	public List<StoreVO> selectAllByDate(Map<String, Integer> pageMap) {
		return sqlSession.selectList("store.selectAllByDate", pageMap);
	}
	
	public int getTotal(int hashtagNumber) {
		return sqlSession.selectOne("store.getTotal", hashtagNumber);
	}

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>
StoreFileMapper.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="storeFile">

	<insert id="insert" parameterType="StoreFileDTO">
		insert into
		tbl_store_file(store_file_system_name, store_file_original_name,
		store_number)
		values(#{storeFileSystemName}, #{storeFileOriginalName},
		#{storeNumber})
	</insert>

	<select id="select" parameterType="_int"
		resultType="StoreFileDTO">
		select store_file_system_name, store_file_original_name,
		store_number
		from tbl_store_file
		where store_number = #{storeNumber}
	</select>
	
	<select id="selectList" parameterType="_int" resultType="StoreFileDTO">
		select store_file_system_name, store_file_original_name, store_number
		from tbl_store_file
		where store_number = #{storeNumber}
	</select>
	
	<delete id="delete" parameterType="_int">
		delete from tbl_store_file
		where store_number = #{storeNumber}
	</delete>

	<insert id="join" parameterType="MemberDTO">
		insert into tbl_member
		(member_id, member_password, member_name, member_age, member_gender,
		member_email, member_address)
		values(#{memberId}, #{memberPassword},
		#{memberName}, #{memberAge}, #{memberGender}, #{memberEmail},
		#{memberAddress})
	</insert>

	<insert id="storeWrite" parameterType="StoreFileDTO">
		insert into tbl_store_file
		(store_file_system_name, store_file_original_name, store_number)
		values(#{storeFileSystemName}, #{storeFileOriginalName},
		#{storeNumber})
	</insert>

</mapper>

JavaScript

store.js
function searchParam(key) {
  return new URLSearchParams(location.search).get(key);
};

function isEmpty(str){
      
      if(typeof str == "undefined" || str == null || str == "")
         return true;
      else
         return false ;
   }

// @@@@@@@@@@ 선택된 카테고리만 css 부여하는 js @@@@@@@@@@@@
$(".categori").on("click", function () {
  $(this).css("background-color", "rgb(50, 50, 50)");
  $(this).css("color", "white");

  $(".categori").not(this).css("background-color", "white");
  $(".categori").not(this).css("color", "black");
});

// @@@@@좋아요 버튼 누를시에 색상 변경 흰색->빨간색 빨간색->흰색@@@@@@@@@@
$('.post-container').on("click",".like-btn", function () {  
  if ($(this).hasClass("active")) {
    // 이미 클릭한 경우
    $(this).removeClass("active");
    $(this).css("background-image", "");
    $(this)
      .parent()
      .parent()
      .siblings()
      .find(".before-like-btn")
      .attr(
        "src",
        "https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-gray-fill.png"
      );
  } else {
    // 처음 클릭하는 경우
    $(this).addClass("active");
    $(this).css(
      "background-image",
      "url(https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-red-fill.png)"
    );
    $(this)
      .parent()
      .parent()
      .siblings()
      .find(".before-like-btn")
      .attr(
        "src",
        "https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-red-fill.png"
      );
  }
});

// @@@@@@@ 팔로우 팔로잉 버튼 @@@@@@@@@@@@

$(".post-container").on("click", '.follow-btn', function () {
  if ($(this).children(".follow").css("display") != "none") {
    $(this).children(".follow").css("display", "none");
    $(this).children(".following").css("display", "inline-block");
  } else {
    $(this).children(".follow").css("display", "inline-block");
    $(this).children(".following").css("display", "none");
  }
});

// @@@@@@ 헤더 카테고리 선택시 색상 변경 @@@@@@@
$(".header-list").on("click", function () {
  $(this).css("color", "rgb(42, 197, 198)");

  $(".header-list").not(this).css("color", "#5b696f");
});

// @@@@@@ 판당픽 / 추천순 / 최신순 / 무료  클릭시 색상 변경@@@@@@@
$(".choice-list").on("click", function () {
  $(this).css("color", "rgb(42, 197, 198)");

  $(".choice-list").not(this).css("color", "#5b696f");
});

// @@@@@ 모달 프로필 이미지 백그라운드 @@@@@
$("#modal-img-box").on({
  mouseover: function () {
    $(".modal-img-background").css("display", "block");
  },
  mouseout: function () {
    $(".modal-img-background").css("display", "none");
  },
});


// @@@@@@ 댓글 수정 버튼 누를 시 @@@@@@@@@@
$(".comment-edit-btn").on("click", function () {
  $(this)
    .parent()
    .parent()
    .parent()
    .parent(".comment-list")
    .css("height", "300px");

  $(".comment-edit-box").css("display", "block");
  $(".edit-btn-box").css("display", "flex");

  // 작성 돼 있던 댓글 숨기기
  $(this)
    .parent()
    .parent()
    .siblings(".comment")
    .children(".comment-content")
    .css("display", "none");
});

// @@@@@@@ 모달 신고하기 버튼 누를 시 @@@@@@@@
$(".modal-report-btn").on("click", function () {
  $(".report-path").css("display", "block");

  // 재클릭시 안보이게하기
  if ($(this).data("clicked")) {
    $(".report-path").css("display", "none");
  }
});

// @@@@@@@ 신고하기 버튼 클릭시 색 @@@@@@
$(".report-btn-color").on({
  mouseover: function () {
    $(this).css("color", "rgb(255, 0, 0)");
  },
  mouseout: function () {
    if ($(this).data("clicked") !== true) {
      $(this).css("color", "rgb(0, 0, 0)");
    }
  },
  click: function () {
    if ($(this).data("clicked") !== true) {
      $(this).css("color", "rgb(255, 0, 0)").data("clicked", true);
    } else {
      $(this).css("color", "rgb(0, 0, 0)").data("clicked", false);
    }
  },
});



//처음 페이지 설정

function showStore(result) {
   $('.post-container').html('');
         for(let i=0; i<result.list.length; i++){   
            if(isEmpty(result.list[i].storeFileSystemName)){
               
               $('.post-container').append(`<div class="post-box-container">    
				<input type="hidden" class="memberNumber" value="${sessionScope.memberNumber}" />
                  <div class="post-img-container">
                    <div class="post-img-box-wrap">
                      <img
                        class="post-front-img"
                        src="/assets/img/default.png"
                        alt=""
                      />
                      <div class="post-img-back" data-num="${result.list[i].storeNumber}"></div>
                      <button type="button" class="like-btn">좋아요</button>
                      <div class="modal-background"></div>
                      <div class="modal-test"></div>
                    </div>
                  </div>
                   <div class="post-title-box">${result.list[i].storeTitle}</div>
                  <div class="writer-container">
                    <div class="channel-profile-box">
                      <a href="#" class="profile-img-box">
                        <img
                          class="profile-img"
                          src="/upload/${result.list[i].channelFileSystemName }"
                          alt=""
                        />
                      </a>
                    </div>
                    <div class="writer-box">
                      <a href="" class="writer-name">${result.list[i].memberNickname}</a>
                    </div>
                    <font>·</font>
                    <div class="follow-btn-box">
                      <button type="button" class="follow-btn">
                        <span class="follow">팔로우</span>
                        <!-- 팔로우 버튼 누를 시 팔로잉 으로 떠야함 일단은 display none처리 했음 -->
                        <img
                          class="following"
                          src="https://cdn.loud.kr/LOUD_IMG/main/ico-check-follow.png"
                          alt=""
                        />
                        <span class="following">팔로잉</span>
                      </button>
                    </div>
                    <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"
                      />
                      <!-- 게시글에 좋아요 누를 시 하트 색이 하트로 변경됨 일단은 display none처리 했음 -->
                      <img
                        class="after-like-btn"
                        src="https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-red-fill.png"
                        alt="heart"
                      />
                      <!-- 임시 좋아요 수 -->
                      <div class="like-cnt">${result.list[i].storeLikeCnt}</div>
                    </div>         
                  </div>               
                </div>`)
               $('.post-img-box-wrap').css('border', '1px solid rgb(200,200,200)')
            }else{
               $('.post-img-box-wrap').css('border', 'none');
               $('.post-container').append(`<div class="post-box-container">    
                  <div class="post-img-container">
                    <div class="post-img-box-wrap">
                      <img
                        class="post-img"
                        src="/upload/${result.list[i].storeFileSystemName}"
                        alt=""
                      />
                      <div class="post-img-back" data-num="${result.list[i].storeNumber}"></div>
                      <button type="button" class="like-btn">좋아요</button>
                      <div class="modal-background"></div>
                      <div class="modal-test"></div>
                    </div>
                  </div>
                   <div class="post-title-box">${result.list[i].storeTitle}</div>
                  <div class="writer-container">
                    <div class="channel-profile-box">
                      <a href="#" class="profile-img-box">
                        <img
                          class="profile-img"
                          src="/upload/${result.list[i].channelFileSystemName }"
                          alt=""
                        />
                      </a>
                    </div>
                    <div class="writer-box">
                      <a href="" class="writer-name">${result.list[i].channelName}</a>
                    </div>
                    <font>·</font>
                    <div class="follow-btn-box">
                      <button type="button" class="follow-btn">
                        <span class="follow">팔로우</span>
                        <!-- 팔로우 버튼 누를 시 팔로잉 으로 떠야함 일단은 display none처리 했음 -->
                        <img
                          class="following"
                          src="https://cdn.loud.kr/LOUD_IMG/main/ico-check-follow.png"
                          alt=""
                        />
                        <span class="following">팔로잉</span>
                      </button>
                    </div>
                    <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"
                      />
                      <!-- 게시글에 좋아요 누를 시 하트 색이 하트로 변경됨 일단은 display none처리 했음 -->
                      <img
                        class="after-like-btn"
                        src="https://cdn.loud.kr/prod/LOUD_IMG/designer/new/heart-red-fill.png"
                        alt="heart"
                      />
                      <!-- 임시 좋아요 수 -->
                      <div class="like-cnt">${result.list[i].storeLikeCnt}</div>
                    </div>         
                  </div>               
                </div>`)
            }
   }
};

let currentPage = 1;
let tempRealEnd = $('.realEndPage').value;
let maxPage = tempRealEnd;
var url = '/store/storeAjaxOk.st';
var data = {hashtagNumber: 1, currentPage: currentPage};

function categori() {
  $.ajax({
    url: url,
    type: 'get',
    data: data,
    dataType: 'json',
    success: function(result) {
      showStore(result);
      maxPage = result.realEndPage;
    }
  });
}

$('.design').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  url = '/store/storeAjaxOk.st';
  data.hashtagNumber = 1;
  categori();
});

$('.stationery-toys').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  data.hashtagNumber = 2;
  categori();
});

$('.accessories').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  url = '/store/storeAjaxOk.st';
  data.hashtagNumber = 3;
  categori();
});

$('.fashion').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  url = '/store/storeAjaxOk.st'; 
  data.hashtagNumber = 4; 
  categori();
});

$('.beauty').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  url = '/store/storeAjaxOk.st'; 
  data.hashtagNumber = 5;
  categori();
});

$('.pet').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  url = '/store/storeAjaxOk.st';
  data.hashtagNumber = 6;
  categori();
});

$('.living').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
   data.currentPage=1;
  url = '/store/storeAjaxOk.st';
  data.hashtagNumber = 7;
  categori();
});

$('.food').on('click', function() {
  $(this).parent().children().removeClass('click');
  $(this).addClass('click');
  $('.pandang-pick').click();
  currentPage = 1;
  data.currentPage=1;
  url = '/store/storeAjaxOk.st';
  data.hashtagNumber = 8;
  categori();
});


/*==========================================*/


/*판당 pick*/
$('.pandang-pick').on('click', function() {
  if (!$(this).hasClass('click')) {
    $(this).parent().children().removeClass('click');
    $(this).addClass('click');
    url = '/store/storeAjaxOk.st';
    currentPage = 1;
   data.currentPage=1;
    categori();
  }
});

$('.recommand').on('click', function() {
  if (!$(this).hasClass('click')) {
    $(this).parent().children().removeClass('click');
    $(this).addClass('click');
    url = '/store/storeAjaxLikeOk.st';
    currentPage = 1;
   data.currentPage=1;
    categori();
  }
});

/*최신순*/
$('.new').on('click', function() {
  if (!$(this).hasClass('click')) {
    $(this).parent().children().removeClass('click');
    $(this).addClass('click');
    url = '/store/storeAjaxDateOk.st';
    currentPage = 1;
   data.currentPage=1;
    categori();
  }
});

$('.free').on('click', function() {
  if (!$(this).hasClass('click')) {
    $(this).parent().children().removeClass('click');
    $(this).addClass('click');
    url = '/store/storeAjaxFreeOk.st';
    currentPage = 1;
   data.currentPage=1;
    categori();
  }
});

/*====================================================*/




$('.next').on('click', function() {
  if (currentPage < maxPage) {
    currentPage++;
   data.currentPage++;
   if(new URLSearchParams(location.search).has('searchInput')){
      $.ajax({
         url : '/store/storeSearchAjax.st',
         type : 'get',
         data : {searchInput : searchParam('searchInput'), page : currentPage},
         dataType : 'json',
         success : showStore
      });
   }else{
       categori();
   }
  }
  if (currentPage == maxPage) {
    $(this).prop('disabled', true);
  }
  if (currentPage > 1) {
    $('.prev').prop('disabled', false);
  }

});

$('.prev').on('click', function(){
  if (currentPage > 1) {
    currentPage--;
   data.currentPage--;
   if(new URLSearchParams(location.search).has('searchInput')){
      $.ajax({
         url : '/store/storeSearchAjax.st',
         type : 'get',
         data : {searchInput : searchParam('searchInput'), page : currentPage},
         dataType : 'json',
         success : showStore
      });
      }else{
          categori();
      }
  }
  if (currentPage == 1) {
    $(this).prop('disabled', true);
  }
  if (currentPage < maxPage) {
    $('.next').prop('disabled', false);
  }
});

let storeNumber = 0;
let memberNumber = $('.memberNumber').val();

// @@@@@@ 이미지 클릭 했을 때 모달 창 띄우기 @@@@@@@@@

$('.post-container').on('click', '.post-img-back', function(e){
	
	console.log(memberNumber);
   $(".post-modal").css("display", "flex");
    $(this).closest('.post-img-box-wrap').find(".modal-background").css("display", "inline-block");

   storeNumber = $(e.target).data('num');
	console.log(storeNumber);
   /*$.ajax({
      url : '/store/storeModalOk.st',
      type : 'get',
      data : {storeNumber : storeNumber},
      dataType : 'json',
      success : function(result){
        insertDataModal(result);
         getStoreComment();
			
         getStoreFile();
<<<<<<< HEAD
    	$('html, body').scrollTop(0);
    }
  });
=======
       $('html, body').scrollTop(0);
    }
  });*/
	$.ajax({
		url: "/sns/snsStoreReadOk.sn",
		type: 'get',
		dataType: 'json',
		data: { storeNumber: storeNumber },
		success: function(result) {
			showStorePost(result);
			showStoreContent(result);
			showLike(result);
			$.ajax({
		url: '/sns/snsStoreCommentOk.snc',
		type: 'get',
		dataType: 'json',
		data: { storeNumber: storeNumber },
		success: function(result) {
			showStoreComment(result);
			console.log('~~~~~~~~~');
		},
		error: function(a, b, c) {
			console.log(c);
		}

		});
			
		}
	});
	
	$.ajax({
		url: '/sns/snsStoreFileReadOk.sn',
		type: 'get',
		dataType: 'json',
		data: { storeNumber : storeNumber },
		success: function(result) {
			showStoreFile(result);
		},
		error: function(a, b, c) {
			console.log(c);
		}

		});
		
		
		
		
});
 
   /*밖에다가 댓글과 게시물이미지 ajax를 만들것*/
   
   function getStoreComment(){
      /*$.ajax({
            url: '/storeComment/storeCommentListOk.stc',
            type: 'get',
            dataType: 'json',
            data: { storeNumber: storeNumber },
            success: function(result) {
               showStoreComment(result);
            },
            error: function(a, b, c) {
               console.log(c);
            }

         });*/

		$.ajax({
		url: '/sns/snsStoreCommentOk.snc',
		type: 'get',
		dataType: 'json',
		data: { storeNumber: storeNumber },
		success: function(result) {
			showStoreComment(result);
		},
		error: function(a, b, c) {
			console.log(c);
		}

		});
   }
   
   function getStoreFile(){
      $.ajax({
         url:'/file/storeFileOk.stf',
         type:'get',
         dataType:'json',
         data: {storeNumber : storeNumber},
         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 showStorePost(result){
	$('.s-post-header-box').html('');
	
		if (storeNumber == result.list.storeNumber) {
			$('.s-post-header-box').append(`
				<div class="s-post-header">
              <div class="s-post-title">
					${result.list.storeTitle}
				</div>
				 <div class="post-price-area">
                  <div class="post-price">${result.list.storePrice}</div><span>원</span>
                  </div>
              <div class="s-post-date-categori-box">
                <div class="s-post-date">
					${result.list.storeDate}
				</div>
                <div>l</div>
                <div class="s-post-categori">${result.list.hashtagName}</div>
              </div>
            </div>
            <div class="s-post-information">
              <div class="s-post-view-cnt">
                <span class="material-symbols-outlined"> visibility </span>
                <div class="s-view-cnt">${result.list.storeViewCnt}</div>
              </div>
              <div class="s-post-like-cnt">
                <span class="material-symbols-outlined"> favorite </span>
                <div class="s-p-like-cnt">${result.list.likeCnt}</div>
              </div>
              <div class="s-post-comment-cnt">
                <span class="material-symbols-outlined"> chat_bubble </span>
                <div class="s-comment-cnt">${result.list.storeCommentCnt}</div>
              </div>
            </div>
			
			
			`);
		
		}
	
}



   
   function showStoreComment(result){

	$('.s-commentL').html('');
	let text = '';
	for (let i = 0; i < result.list.length; i++) {
		if (storeNumber == result.list[i].storeNumber && result.list[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="/upload/${result.list[i].channelFileSystemName}"
                    alt=""
                  />
                </div>
              </a>
              <div class="s-text-wrap">
                <div class="s-comment-member-info">
                  <a href="/sns/snsOk.sn?memberNumber=${result.list[i].memberNumber}" class="s-member-id">${result.list[i].channelName}</a>
                  <div class="s-box"></div>
                  <div class="s-comment-date">${result.list[i].storeCommentDate}</div>
                  `

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

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

					 <div class="s-edit-btn-box">
                      <button type="submit" class="s-edit-btn" data-number="${result.list[i].storeCommentNumber}">
                        수정 완료
                      </button>
                  </div>`
				}
				
				text += `
					</div>
				<div class="s-height-box"></div>
                <div class="s-comment">
                  <span class="s-comment-content">
					${result.list[i].storeCommentContent}
                  </span>
                 
                  
                </div>
              </div>
              <!-- @@@@@@@@@ 댓글 리스트 끝  @@@@@@@@@@ -->
            </div>`;

		}
	}
	$('.s-commentL').html(text);


}


/* store 모달 댓글 작성 */
$('.s-comment-submit-btn').on('click', function() {
	
	$.ajax({

		url: "/sns/snsStoreCommentInsertOk.snc",
		type: "get",
		data: {
			storeNumber: storeNumber,
			memberNumber: memberNumber,
			storeCommentContent: $('.s-comment-input-area').val()
		},
		success: function() {
			$('.s-comment-input-area').val('');
			$.ajax({
				url: '/sns/snsStoreCommentOk.snc',
				type: 'get',
				dataType: 'json',
				data: { storeNumber: storeNumber },
				success: function(result) {
					showStoreComment(result);
					console.log('success');
				},
				error: function(a, b, c) {
					console.log(c);
				}

			});
		},
		error: function(a, b, c) {
			console.log(c);
		}

	});

});

// store 댓글 삭제
$('.s-comment-container').on('click', '.s-comment-delete-btn', function() {

	let storeCommentNumber = $(this).data('number');

	$.ajax({
		url: "/sns/snsStoreCommentDeleteOk.snc",
		type: 'get',
		data: { storeCommentNumber: storeCommentNumber },
		success: function() {
			// 댓글 갱신
			$.ajax({
				url: '/sns/snsStoreCommentOk.snc',
				type: 'get',
				dataType: 'json',
				data: { storeNumber: storeNumber },
				success: function(result) {
					showStoreComment(result);
				},
				error: function(a, b, c) {
					console.log(c);
				}

			});

		}
	});
});


// store 댓글 수정

$('.s-comment-container').on('click', '.s-comment-edit-btn', function() {


	let $parent = $(this).closest('.s-comment-list');

	 let $children = $parent.find('.s-comment-edit-delete-btn-box, .s-edit-btn-box');

	$children.eq(0).hide();
	$children.eq(1).show();

	let $content = $(this).closest('.s-comment-list').find('.s-comment-content');

	$content.replaceWith(`<textarea class='modify-content' id="s-comment-modify"> </textarea>`);

});


$('.s-comment-container').on('click', '.s-edit-btn', function() {
	let storeCommentNumber = $(this).data('number');

	$.ajax({
		url: '/sns/snsStoreCommentUpdateOk.snc',
		type: 'get',
		data: {
			storeCommentNumber: storeCommentNumber,
			storeCommentContent: $('.modify-content').val()
		},
		success: function() {
			$.ajax({
				url: '/sns/snsStoreCommentOk.snc',
				type: 'get',
				dataType: 'json',
				data: { storeNumber: storeNumber },
				success: function(result) {
					showStoreComment(result);
				}

			});
		}
	});
});



/*=================================================*/

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



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

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

$('.report-btn').on('click', function(){   
   
   $.ajax({
      url: '/store/storeReportOk.st',
      type: 'get',
      data: {
         reportNumber: storeNumber,
         reportTitle: $('#reportTitle').val(),
         reportContent: $('#report-content').val()   
      },
   success: function(response) {
         alert("신고가 성공적으로 접수되었습니당.");
         window.location.href = "/store/storeOk.st";
      },
      error: function() {
         alert("오류가 발생했습니당. 다시 시도해주세요.");
      }
   });
   
});

$('.modal-basket-btn').on('click', function(){   
   console.log($('.storeNumber').val());
   $.ajax({
      url: '/store/storeBasket.st',
      type: 'get',
      data: {      
         storeNumber: $('.storeNumber').val()      
      },
   success: function(result) {
         alert("물품을 장바구니에 추가하였습니당.");
         window.location.href = "/store/storeOk.st";
      },
      error: function() {
         alert("오류가 발생했습니당. 다시 시도해주세요.");
      }
   });
   
});

$('.modal-delete-btn').on('click', function() {
   
   $(".modal-box").css("display", "none");
   
   $.ajax({
      url: '/store/storeDeleteOk.st',
      type: 'get',
      data: { storeNumber: storeNumber 
      },
         success: function(result) {
         alert("게시물을 성공적으로 삭제하였습니당.");
         window.location.href = "/store/storeOk.st";
      },
      error: function() {
         alert("오류가 발생했습니당. 다시 시도해주세요.");
      }
   });
   
});

$('.modal-like-btn').on('click', function() {
   
  if ($('.like-btn-color').data("clicked") !== true) {
    $('.like-btn-color').css("color", "rgb(255, 0, 0)").data("clicked", true);
    $('.p-like-cnt').text(Number($('.p-like-cnt').text())+1);
    $.ajax({
      url: '/store/storeLikeOk.st',
      data: {
        storeNumber: $('.storeNumber').val(),
      },
      success: function() {
   
      }
    });
  }
  else {
    $('.like-btn-color').css("color", "rgb(0, 0, 0)").data("clicked", false);
    $('.p-like-cnt').text(Number($('.p-like-cnt').text())-1);
    $.ajax({
      url: '/store/storeLikeDelete.st',
      data: {
        storeNumber: $('.storeNumber').val(),
      },
      success: function() {
      }
    });
  }
});


$(".modal-follow-btn").on("click", '.add', function() {
   $('.modal-follow-btn').html('');
   $('.modal-follow-btn').append(`<span class="material-symbols-outlined done"> done </span>`);
   
      $(this).css("display", "none");
      $('.done').css("display", "block");
      
      $.ajax({
      url: '/store/storeFollowOk.st',
      type: 'get',
      data: {       
               memberNumberTo : $('.memberNumber').val()
             },
      success: function() {
      },
      error: function(a, b, c) {
         console.log(c);
      }

      });
      
   
});

$('.modal-follow-btn').on('click', '.done',function(){
   $('.modal-follow-btn').append(`<span class="material-symbols-outlined add"> add </span>`);
   
   $(this).css("display", "none");
   $('.add').css("display", "block");
   
   $.ajax({
      url: '/store/storeFollowDeleteOk.st',
      type: 'get',
      data: {    
            memberNumberTo : $('.memberNumber').val()
             },
      success: function() {
      },
      error: function(a, b, c) {
         console.log(c);
      }

      });
});


function showStoreFile(result){
	$('.post-img').html('');
	for (let i = 0; i < result.length; i++) {
		$('.s-post-img').append(`
			<li>
				<img src="/upload/${result[i]}"/>
			</li>
		`);
	}
}

function showLike(result){
	$('.modal-like-btn').html('');
	if (storeNumber == result.list.storeNumber) {
		if(result.likeTest === ""){
			$('.modal-like-btn').append(`
			<span class="material-symbols-outlined beforeLike">favorite</span> 
			`);
		} else {
			$('.modal-like-btn').append(`
			<span class="material-symbols-outlined liked">favorite</span>
			`);
			}
		}


	}
	
	function showStoreContent(result) {
	$('.post-content').html('');
	
		if (storeNumber == result.list.storeNumber) {

			$('.post-content').append(`
					
					<sapn>
							${result.list.storeContent}
						
					</span>
				`);
			
		}
	}
⚠️ **GitHub.com Fallback** ⚠️