Просмотр исходного кода

Merge remote-tracking branch 'origin/develop' into xodud1202

xodud lee 5 лет назад
Родитель
Сommit
66b8f7964b
56 измененных файлов с 1441 добавлено и 169 удалено
  1. 25 7
      pom.xml
  2. 34 7
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  3. 1 0
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  4. 9 0
      src/main/java/com/style24/front/biz/dao/TsfReviewDao.java
  5. 72 23
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  6. 23 0
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  7. 1 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  8. 11 1
      src/main/java/com/style24/front/biz/service/TsfReviewService.java
  9. 41 14
      src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java
  10. 39 26
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  11. 18 8
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  12. 10 4
      src/main/java/com/style24/front/support/config/TsfRedisSessionConfig.java
  13. 15 3
      src/main/java/com/style24/persistence/domain/searchengine/SearchEngine.java
  14. 48 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  15. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml
  16. 200 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  17. 13 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  18. 7 1
      src/main/resources/config/application-locd.yml
  19. 22 0
      src/main/resources/config/application-run.yml
  20. 13 1
      src/main/resources/config/application-style.yml
  21. BIN
      src/main/webapp/WEB-INF/lib/AutoSearch.jar
  22. BIN
      src/main/webapp/WEB-INF/lib/diquest.jar
  23. BIN
      src/main/webapp/WEB-INF/lib/json_simple-1.1.jar
  24. BIN
      src/main/webapp/WEB-INF/lib/m4_client.jar
  25. BIN
      src/main/webapp/WEB-INF/lib/m4_common.jar
  26. BIN
      src/main/webapp/WEB-INF/lib/m4_util.jar
  27. 2 2
      src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html
  28. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/NoticeFormMob.html
  29. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html
  30. 375 0
      src/main/webapp/WEB-INF/views/mob/display/BestMainFormMob.html
  31. 42 2
      src/main/webapp/WEB-INF/views/mob/display/BrandMainFormMob.html
  32. 171 0
      src/main/webapp/WEB-INF/views/mob/display/CategoryMainFormMob.html
  33. 170 0
      src/main/webapp/WEB-INF/views/mob/display/OutletMainFormMob.html
  34. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html
  35. 2 2
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html
  36. 1 1
      src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html
  37. 2 2
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  38. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html
  39. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html
  40. 4 4
      src/main/webapp/WEB-INF/views/web/display/BestMainFormWeb.html
  41. 2 2
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  42. 1 1
      src/main/webapp/WEB-INF/views/web/display/OutletMainFormWeb.html
  43. 1 1
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  44. 2 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html
  45. 1 4
      src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html
  46. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html
  47. 4 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewDetailFormWeb.html
  48. 1 1
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  49. 1 13
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  50. 0 1
      src/main/webapp/WEB-INF/views/web/planning/PlanningEventPollFormWeb.html
  51. 5 3
      src/main/webapp/WEB-INF/views/web/planning/PlanningShotGuideFormWeb.html
  52. 3 3
      src/main/webapp/biz/mypage.js
  53. 8 1
      src/main/webapp/ux/mo/css/style24_m.css
  54. 5 5
      src/main/webapp/ux/mo/js/common_m.js
  55. 8 5
      src/main/webapp/ux/pc/css/layout.css
  56. 21 0
      src/main/webapp/ux/plugins/gaga/gaga.common.js

+ 25 - 7
pom.xml

@@ -64,6 +64,7 @@
 			<artifactId>libphonenumber</artifactId>
 			<version>8.12.16</version>
 		</dependency>
+		
 		<!-- /// WEB-INF lib -->
 		<dependency>
 			<groupId>com.gagaframework</groupId>
@@ -100,7 +101,9 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar</systemPath>
 		</dependency>
-		<!--NICE-->
+		<!-- \\\ WEB-INF lib -->
+		
+		<!-- /// NICE -->
 		<dependency>
 			<groupId>com.NiceID</groupId>
 			<artifactId>NiceID</artifactId>
@@ -115,7 +118,9 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/IPIN2Client.jar</systemPath>
 		</dependency>
-		<!--KCP-->
+		<!-- \\\ NICE -->
+		
+		<!-- /// KCP -->
 		<dependency>
 			<groupId>com.kcp</groupId>
 			<artifactId>kcp</artifactId>
@@ -137,7 +142,9 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/CtCli-1.0.6.jar</systemPath>
 		</dependency>
-		<!-- 상품권 인증  -->
+		<!-- \\\ KCP -->
+		
+		<!-- /// 상품권 인증 -->
 		<dependency>
 			<groupId>org.apache.cxf</groupId>
 			<artifactId>cxf-rt-frontend-jaxws</artifactId>
@@ -148,7 +155,9 @@
 			<artifactId>cxf-rt-transports-http</artifactId>
 			<version>2.7.11</version>
 		</dependency>
-		<!--USAFE 보증보험-->
+		<!-- \\\ 상품권 인증 -->
+		
+		<!-- /// USAFE 보증보험 -->
 		<dependency>
 			<groupId>com.usafe.guarantee</groupId>
 			<artifactId>usafe-guarantee</artifactId>
@@ -163,9 +172,18 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/usafe.jar</systemPath>
 		</dependency>
-
-		<!--//NICE 본인인증-->
-		<!-- \\\ WEB-INF lib -->
+		<!-- \\\ USAFE 보증보험 -->
+		
+		<!-- /// 검색엔진(DIQUEST) -->
+<!-- 		<dependency> -->
+<!-- 			<groupId>com.diquest</groupId> -->
+<!-- 			<artifactId>diquest</artifactId> -->
+<!-- 			<version>0.1</version> -->
+<!-- 			<scope>system</scope> -->
+<!-- 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/diquest.jar</systemPath> -->
+<!-- 		</dependency> -->
+		<!-- \\\ 검색엔진(DIQUEST) -->
+		
 	</dependencies>
 	
 	<build>

+ 34 - 7
src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java

@@ -1,15 +1,15 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
+import org.springframework.stereotype.Repository;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.WishList;
 
-import java.util.Collection;
-
-import org.springframework.stereotype.Repository;
-
 /**
  * 고객(회원) Dao
  * 
@@ -82,7 +82,7 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 02
 	 */
 	String getCustomerMaxCustId(Customer customer);
-	
+
 	/**
 	 * 위시리스트 등록
 	 *
@@ -101,7 +101,7 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 08
 	 */
 	void deleteWishList(WishList wishList);
-	
+
 	/**
 	 * 위시리스트 삭제 상품 조회
 	 *
@@ -109,7 +109,7 @@ public interface TsfCustomerDao {
 	 * @author eskim
 	 * @since 2021. 03. 11
 	 */
-	String  getDeleteGoodsWish(int custNo);
+	String getDeleteGoodsWish(int custNo);
 
 	/**
 	 * 본인인증 처리
@@ -169,5 +169,32 @@ public interface TsfCustomerDao {
 	 */
 	CustGrade getExpectedCustGrde(CustGrade custGrade);
 
+	/**
+	 * 고객 생년월일 저장
+	 *
+	 * @param customer - 고객번호, 생년월일
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since 2021. 05. 10
+	 */
+	int saveBatchBirth(Customer customer);
+
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @return 처리건수
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	int updateSmsReceptionRefuse(Integer custNo);
+
+	/**
+	 * 메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @return 처리건수
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	int updateEmailReceptionRefuse(Integer custNo);
 
 }

+ 1 - 0
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -401,4 +401,5 @@ public interface TsfGoodsDao {
 	 */
 	Collection<SearchEngine> getSearchGoodsList(SearchEngine params);
 
+	int getContentsCategoryGoodsCount(Cate4Srch cate4Srch);
 }

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfReviewDao.java

@@ -225,6 +225,15 @@ public interface TsfReviewDao {
 	 */
 	void createReviewPointHst(Point point);
 	
+	/**
+	 * 마이페이지 CONFIRM_YN 업데이트
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 5. 10
+	 */
+	void updateMypageReviewConfimYn(Review review);
+	
 
 
 	

+ 72 - 23
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -7,8 +7,6 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-
-import com.style24.persistence.domain.CustGrade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -17,8 +15,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
@@ -29,6 +25,7 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.CustDeliveryAddr;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Login;
@@ -36,6 +33,9 @@ import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.security.GagaPasswordEncoder;
+
 /**
  * 고객(회원) Service
  *
@@ -76,7 +76,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 08
 	 */
 	public Customer getCustomerFindId(Customer customer) {
-		TsfSession.setAttribute("maskingYn","Y");
+		TsfSession.setAttribute("maskingYn", "Y");
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData(); // 데이터 암호하
 		return customerDao.getCusomterActiveAndDormant(customer);
@@ -116,7 +116,6 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
-
 	/**
 	 * 임시비밀번호 조회
 	 * @param length - 비밀번호 자릿수
@@ -221,7 +220,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCi(String ci) {
-		TscSession.setAttribute("maskingYn","Y");
+		TscSession.setAttribute("maskingYn", "Y");
 		Customer customer = new Customer();
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -238,7 +237,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCellPhnno(String cellPhnno) {
-		TscSession.setAttribute("maskingYn","Y");
+		TscSession.setAttribute("maskingYn", "Y");
 		Customer customer = new Customer();
 		customer.setCellPhnno(cellPhnno);
 		customer.setHypenCellPhone(); // 010-0000-0000
@@ -267,6 +266,7 @@ public class TsfCustomerService {
 		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
 
 		int custCnt = customerDao.createCustomer(customer);
+		customerDao.saveBatchBirth(customer);
 
 		if (custCnt > 0) {
 			saveJoinPostProcessing(customer);
@@ -285,11 +285,11 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public boolean saveJoinCustomerSns (Customer customer) {
+	public boolean saveJoinCustomerSns(Customer customer) {
 		boolean isJoin = true;
 		String snsId = customer.getSnsType().equals(TscConstants.SnsType.YES24.value()) ? customer.getMemNo() : customer.getSnsId();
 		customer.setEncodedPasswd(" ");
-		customer.setCustId(customer.getSnsType()+"_"+snsId);
+		customer.setCustId(customer.getSnsType() + "_" + snsId);
 		customer.encryptData();
 
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -299,9 +299,9 @@ public class TsfCustomerService {
 		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
 		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
 
-
 		int custCnt = customerDao.createCustomer(customer);
 		customerDao.createCustomerSns(customer);
+		customerDao.saveBatchBirth(customer);
 
 		if (custCnt > 0) {
 			saveJoinPostProcessing(customer);
@@ -332,7 +332,6 @@ public class TsfCustomerService {
 		couponService.saveJoinCoupon(coupon);
 	}
 
-
 	/**
 	 * Sns 정보에대한 상태 처리
 	 *
@@ -341,7 +340,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public GagaMap customerSnsProcessing (CustSnsInfo custSnsInfo) {
+	public GagaMap customerSnsProcessing(CustSnsInfo custSnsInfo) {
 		GagaMap resultMap = new GagaMap();
 		Customer custInfo;
 
@@ -390,7 +389,7 @@ public class TsfCustomerService {
 				return resultMap;
 			}
 
-			boolean isFindByPhone = getCustomerFindByCellPhnnoCount(custSnsInfo.getCellPhnno().replace("-",""));
+			boolean isFindByPhone = getCustomerFindByCellPhnnoCount(custSnsInfo.getCellPhnno().replace("-", ""));
 			if (isFindByPhone) {
 				resultMap.setString("custStat", "DUP_PHONE_CUST"); // 휴대폰 중복
 				return resultMap;
@@ -445,7 +444,7 @@ public class TsfCustomerService {
 		loginService.createLoginHistory(loginInfo.getCustNo());
 
 		// 세션 생성
-		this.createSession(request,  loginDetails);
+		this.createSession(request, loginDetails);
 	}
 
 	/**
@@ -462,7 +461,6 @@ public class TsfCustomerService {
 		session.setAttribute("session", loginDetails);
 	}
 
-
 	/**
 	 * 일반고객 정보 유효성
 	 *
@@ -471,7 +469,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 02. 18
 	 */
-	public GagaMap generalCustomerValidation (Customer customer) {
+	public GagaMap generalCustomerValidation(Customer customer) {
 		GagaMap resultMap = new GagaMap();
 		String maskingCustId;
 
@@ -527,7 +525,6 @@ public class TsfCustomerService {
 		return customerDao.getCusomterSnsFind(custSnsInfo);
 	}
 
-
 	/**
 	 * 가입된 아이디 가져오기
 	 * @param custId - 고객아이디
@@ -623,7 +620,7 @@ public class TsfCustomerService {
 			wishInfo.setRegNo(TsfSession.getInfo().getCustNo());
 			customerDao.createWishList(wishInfo);
 		}
-		
+
 		// 위시상품목록 50개만 남게 처리
 		String goodsCd = customerDao.getDeleteGoodsWish(TsfSession.getInfo().getCustNo());
 		WishList delWishInfo = new WishList();
@@ -632,7 +629,7 @@ public class TsfCustomerService {
 			delWishInfo.setArrGoodsCd(goodsCd.split("\\,"));
 			customerDao.deleteWishList(delWishInfo);
 		}
-		
+
 	}
 
 	/**
@@ -707,6 +704,8 @@ public class TsfCustomerService {
 		coreCustomerService.createCustomerHistory(customer);
 		// 2.CI 업데이트
 		int resultCnt = customerDao.updateCustomerCi(customer);
+		customerDao.saveBatchBirth(customer);
+
 		if (resultCnt > 0) {
 			isSuccess = true;
 		}
@@ -784,8 +783,9 @@ public class TsfCustomerService {
 		// 1. 이력쌓고
 		coreCustomerService.createCustomerHistory(customer);
 
-		// 2. 이름, 휴대전화 번호 저장
+		// 2. 이름, 휴대전화 번호, 생년월일 저장
 		int updateCnt = customerDao.updateCustomerAuth(customer);
+		customerDao.saveBatchBirth(customer);
 
 		boolean isSuccess = updateCnt > 0; // 변경 성공시 true
 
@@ -794,7 +794,6 @@ public class TsfCustomerService {
 		return result;
 	}
 
-
 	/**
 	 * 고객계좌 정보
 	 *
@@ -807,7 +806,6 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerAccuontInfo(custNo);
 	}
 
-
 	/**
 	 * 고객정보 수정
 	 *
@@ -994,4 +992,55 @@ public class TsfCustomerService {
 	public Collection<CustGrade> getCustGradePolicy(CustGrade custGrade) {
 		return customerDao.getCustGradePolicy(custGrade);
 	}
+
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void updateSmsReceptionRefuse(Integer custNo) {
+		// 수신거부 처리
+		int result = customerDao.updateSmsReceptionRefuse(custNo);
+
+		if (result > 0) {
+			Customer customer = new Customer();
+			customer.setCustNo(custNo);
+			customer.setSmsAgreeYn("N");
+			customer.setRegNo(custNo);
+
+			// 마케팅수신동의이력 생성
+			coreCustomerService.createCustomerMarketHst(customer);
+
+			// 고객이력 생성
+			coreCustomerService.createCustomerHistory(customer);
+		}
+	}
+
+	/**
+	 * 메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void updateEmailReceptionRefuse(Integer custNo) {
+		// 수신거부 처리
+		int result = customerDao.updateEmailReceptionRefuse(custNo);
+
+		if (result > 0) {
+			Customer customer = new Customer();
+			customer.setCustNo(custNo);
+			customer.setEmailAgreeYn("N");
+			customer.setRegNo(custNo);
+
+			// 마케팅수신동의이력 생성
+			coreCustomerService.createCustomerMarketHst(customer);
+
+			// 고객이력 생성
+			coreCustomerService.createCustomerHistory(customer);
+		}
+	}
+
 }

+ 23 - 0
src/main/java/com/style24/front/biz/service/TsfDisplayService.java

@@ -462,6 +462,8 @@ public class TsfDisplayService {
 		cate4Srch.setSiteCd(TscConstants.Site.STYLE24.value());
 		cate4Srch.setCateGb("G032_101");
 
+		log.info("getBestItemCategoryGoodsList cate4Srch:::::::::{}",cate4Srch);
+
 		Collection<Goods> goodsList = goodsDao.getContentsCategoryGoodsList(cate4Srch);
 
 		if (goodsList.size() < 100) {
@@ -651,4 +653,25 @@ public class TsfDisplayService {
 		return cate1List;
 	}
 
+	public int getContentsCategoryGoodsCount(Contents contents) {
+		Cate4Srch cate4Srch = new Cate4Srch();
+		// 로그인 유무 확인 (로그인이 되어 있지 않으면 regNo 를 0으로 장바구니에 저장한다.)
+		Login login = new Login();
+		if (TsfSession.isLogin()) {
+			login = TsfSession.getInfo();
+		} else {
+			login.setCustNo(0);
+		}
+
+		cate4Srch.setCustNo(login.getCustNo());
+		cate4Srch.setPageGb(contents.getPageGb());
+		cate4Srch.setContentsLoc(contents.getContentsLoc());
+		cate4Srch.setMaxRow(100);
+		cate4Srch.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
+		cate4Srch.setCate1No(contents.getCateNo());
+		cate4Srch.setSiteCd(TscConstants.Site.STYLE24.value());
+		cate4Srch.setCateGb("G032_101");
+		return goodsDao.getContentsCategoryGoodsCount(cate4Srch);
+	}
+
 }

+ 1 - 2
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -138,8 +138,7 @@ public class TsfOrderService {
 
 			// 전체 구매확정 가능 여부 설정
 			if ("Y".equals(allDecideYn)
-				&& !TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value().equals(tmpOrder.getOrdDtlStat())
-				&& ordReqChgQty > 0) {
+				&& (!TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value().equals(tmpOrder.getOrdDtlStat()) || ordReqChgQty > 0)) {
 				allDecideYn = "N";
 			}
 

+ 11 - 1
src/main/java/com/style24/front/biz/service/TsfReviewService.java

@@ -172,6 +172,7 @@ public class TsfReviewService {
 	public void saveMypageReview(Review review) {
 		review.setDispYn("Y");
 		review.setDelYn("N");
+		review.setConfirmYn("Y");
 		review.setRegNo(TsfSession.getInfo().getCustNo());
 		review.setUpdNo(TsfSession.getInfo().getCustNo());
 		if (review.getKufKeyArr() == null && review.getOrgFileNmArr() == null) {
@@ -181,10 +182,12 @@ public class TsfReviewService {
 		}else {
 			review.setPntGiveStat("G043_10");
 		}
+		
 		reviewDao.saveMypageReview(review);
 		
 		//이미지등록
 		if(review.getOrgFileNmArr() != null) {
+			review.setConfirmYn("Y");
 			ReviewAttach fileReview = new ReviewAttach();
 			fileReview.setRegNo(TsfSession.getInfo().getCustNo());
 			fileReview.setUpdNo(TsfSession.getInfo().getCustNo());
@@ -220,6 +223,7 @@ public class TsfReviewService {
 		}
 		
 		if(review.getKufKeyArr() != null) {
+			review.setConfirmYn("N");
 			ReviewAttach fileReview = new ReviewAttach();
 			fileReview.setRegNo(TsfSession.getInfo().getCustNo());
 			fileReview.setUpdNo(TsfSession.getInfo().getCustNo());
@@ -255,6 +259,7 @@ public class TsfReviewService {
 				point.setReviewSq(review.getReviewSq());
 				reviewDao.createReviewPointHst(point);
 			}else if(review.getKufKeyArr() == null && review.getOrgFileNmArr() != null) {
+				
 				// 상품평 + 사진
 				point.setCustNo(TsfSession.getInfo().getCustNo());
 				point.setGvPntAmt(photoReviewPnt);
@@ -264,9 +269,14 @@ public class TsfReviewService {
 				point.setReviewSq(review.getReviewSq());
 				reviewDao.createReviewPointHst(point);
 			}
-			
 		}
+		
+		if (review.getConfirmYn()=="Y") {
+			reviewDao.updateMypageReviewConfimYn(review);
+		}
+		
 	}
+		
 	
 	/**
 	 * 마이페이지 리뷰 업데이트

+ 41 - 14
src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java

@@ -1,9 +1,12 @@
 package com.style24.front.biz.thirdparty;
 
+import javax.annotation.PostConstruct;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
-import org.springframework.web.client.RestTemplate;
+
+import com.style24.persistence.domain.searchengine.SearchEngine;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -20,21 +23,45 @@ public class SearchEngineDiquest {
 	@Autowired
 	private Environment env;
 
-	@Autowired
-	private RestTemplate restTemplate;
+	private String ipAddr;	// 검색엔진 IP
+	private String port;	// 검색엔진 포트
+
+	@PostConstruct
+	public void init() {
+		ipAddr = env.getProperty("search.engine.diquest.ip");
+		port = env.getProperty("search.engine.diquest.port");
 
-	private String ipAddr;
-	private String port;
+		log.debug("\n\n---- NHN Diquest initialization started ----");
+		log.debug("ipAddr: [{}]", ipAddr);
+		log.debug("port: [{}]", port);
+		log.debug("\n--- NHN Diquest initialization completed ----\n");
+	}
 
-//	@PostConstruct
-//	public void init() {
-//		ipAddr = env.getProperty("search.engine.diquest.ip");
-//		port = env.getProperty("search.engine.diquest.port");
+	/**
+	 * 인기검색어 조회
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	public SearchEngine getTrendKeywordList() {
+		SearchEngine result = new SearchEngine();
+
+//		// 인기검색어
+//		Map<String, Object> map = new HashMap<String, Object>();
+//		map.put("adminIp", ipAddr);
+//		map.put("adminPort", port);
+//
+//		try {
+//			JSONObject jsonObj = AutoSearch.trendKeyword(map);
+//			log.info("jsonObj.toJSONString(): {}", jsonObj.toJSONString());
 //
-//		log.debug("\n\n---- NHN Diquest initialization started ----");
-//		log.debug("ipAddr: [{}]", ipAddr);
-//		log.debug("port: [{}]", port);
-//		log.debug("\n--- NHN Diquest initialization completed ----\n");
-//	}
+//			Gson gson = new Gson();
+//			result = gson.fromJson(jsonObj.toJSONString(), SearchEngine.class);
+//		} catch (IRException e) {
+//			e.printStackTrace();
+//		}
+
+		return result;
+	}
 
 }

+ 39 - 26
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -3,12 +3,11 @@ package com.style24.front.biz.web;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-import com.style24.front.biz.thirdparty.Yes24Login;
-import com.style24.persistence.domain.CustSnsInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,13 +21,16 @@ import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.service.TsfKakaoService;
 import com.style24.front.biz.thirdparty.NiceCertify;
+import com.style24.front.biz.thirdparty.Yes24Login;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
 
 /**
  * 고객(회원) Controller
@@ -67,8 +69,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/id/find/form")
-	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -137,8 +138,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/password/find/form")
-	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod) {
 
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("sEncData", sEncData);
@@ -338,9 +338,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/join/form")
-	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod
-			, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -362,8 +360,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/cellphone/form")
-	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-										, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
@@ -386,8 +383,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/ipin/form")
-	public ModelAndView getCertifyNiceIpin(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-										 , @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getCertifyNiceIpin(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyIpin();
 
@@ -411,10 +407,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@RequestMapping("/nice/certify/callback")
-	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData
-			, @RequestParam(value = "enc_data", required = false) String encData
-			, @RequestParam(value = "param_r1", required = false) String redirectUrl
-			, @RequestParam(value = "param_r2", required = false) String custParams) {
+	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData, @RequestParam(value = "enc_data", required = false) String encData, @RequestParam(value = "param_r1", required = false) String redirectUrl, @RequestParam(value = "param_r2", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";
@@ -667,9 +660,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 08
 	 */
 	@RequestMapping("/dormant/certify/form")
-	public ModelAndView getDormantCeirtyForm(@RequestParam(value = "sEncData", required = false) String sEncData
-										 	, @RequestParam(value = "authMethod", required = false) String authMethod
-											, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getDormantCeirtyForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -706,7 +697,7 @@ public class TsfCustomerController extends TsfBaseController {
 		}
 
 		GagaMap resultInfo;
-		if (TscConstants.AuthMethod.MOBILE.value().equals(customer.getAuthMethod())){
+		if (TscConstants.AuthMethod.MOBILE.value().equals(customer.getAuthMethod())) {
 			resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
 			customer.setCi(resultInfo.getString("sCi"));
 		} else {
@@ -743,9 +734,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 10
 	 */
 	@RequestMapping("/certification/form")
-	public ModelAndView getCertificationForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod
-			, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getCertificationForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -761,7 +750,6 @@ public class TsfCustomerController extends TsfBaseController {
 		mav.addObject("sEncData", sEncData);
 		mav.addObject("authMethod", authMethod);
 
-
 		mav.setViewName(super.getDeviceViewName("customer/CertificationForm"));
 		return mav;
 	}
@@ -887,7 +875,7 @@ public class TsfCustomerController extends TsfBaseController {
 	@PostMapping("/peristalsis/yes24")
 	@ResponseBody
 	public GagaMap peristalsisYes24(HttpSession session, HttpServletRequest request) {
-		CustSnsInfo custSnsInfo = (CustSnsInfo) session.getAttribute("custSnsInfo");
+		CustSnsInfo custSnsInfo = (CustSnsInfo)session.getAttribute("custSnsInfo");
 		session.removeAttribute("custSnsInfo"); // YES24 세션 지움
 
 		// 1. SNS처리
@@ -964,5 +952,30 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2020. 5. 11
+	 */
+	@GetMapping("/sms/refuse/{custNo}")
+	@ResponseBody
+	public GagaResponse updateSmsReceptionRefuse(@PathVariable Integer custNo) {
+		customerService.updateSmsReceptionRefuse(custNo);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
+	/**
+	 * 이메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2020. 5. 11
+	 */
+	@GetMapping("/email/refuse/{custNo}")
+	@ResponseBody
+	public GagaResponse updateEmailReceptionRefuse(@PathVariable Integer custNo) {
+		customerService.updateSmsReceptionRefuse(custNo);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
 
 }

+ 18 - 8
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -27,6 +27,7 @@ import com.style24.front.biz.service.TsfDisplayService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.biz.service.TsfSocialService;
+import com.style24.front.biz.thirdparty.SearchEngineDiquest;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.TscPageRequest;
@@ -81,6 +82,9 @@ public class TsfDisplayController extends TsfBaseController {
 	@Autowired
 	private TsfSocialService socialService;
 
+	@Autowired
+	private SearchEngineDiquest diquest;
+
 	/**
 	 * 몰 메인
 	 * @return
@@ -747,20 +751,14 @@ public class TsfDisplayController extends TsfBaseController {
 
 		contents.setContentsLoc("SCM003");
 		contents.setPageGb("BEST");
-		MainLayout mainLayout = new MainLayout();
-		mainLayout.setGoodsList(displayService.getBestItemCategoryGoodsList(contents));
-		int totalCnt = mainLayout.getGoodsList().size();
-		if (totalCnt > 100) {
-			totalCnt = 100;
-		}
+
+		int totalCnt = displayService.getContentsCategoryGoodsCount(contents);
 		pageable.setTotalCount(totalCnt);
 		contents.setPageable(pageable);
 
 		result.set("paging", contents);
 		result.set("totalCnt", totalCnt);
 		result.set("endRow", pageable.getEndRow());
-		contents.setContentsLoc("SCM003");
-		contents.setPageGb("BEST");
 		result.set("dataList", displayService.getBestItemCategoryGoodsList(contents));
 		return result;
 	}
@@ -911,4 +909,16 @@ public class TsfDisplayController extends TsfBaseController {
 		return result;
 	}
 
+	/**
+	 * 인기검색어 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	@GetMapping("/search/trend/keyword/list")
+	@ResponseBody
+	public SearchEngine getSearchTrendKeywordList() {
+		return diquest.getTrendKeywordList();
+	}
+
 }

+ 10 - 4
src/main/java/com/style24/front/support/config/TsfRedisSessionConfig.java

@@ -1,8 +1,10 @@
 package com.style24.front.support.config;
 
 import org.springframework.beans.factory.BeanClassLoaderAware;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.security.jackson2.SecurityJackson2Modules;
@@ -34,6 +36,9 @@ public class TsfRedisSessionConfig extends AbstractHttpSessionApplicationInitial
 
 	private ClassLoader classLoader;
 
+	@Autowired
+	private Environment env;
+
 	@Override
 	public void setBeanClassLoader(ClassLoader classLoader) {
 		this.classLoader = classLoader;
@@ -86,12 +91,13 @@ public class TsfRedisSessionConfig extends AbstractHttpSessionApplicationInitial
 		DefaultCookieSerializer serializer = new DefaultCookieSerializer();
 		serializer.setCookiePath("/");
 		serializer.setUseBase64Encoding(false);
-//		serializer.setSameSite("NONE");
+		String active = env.getProperty("spring.profiles.active");
 		// TODO : SSL 적용 후 주석 풀고 테스트 해야함 2021-04-13
 		// SSL인증서 적용 시 주석 제거
-//		serializer.setUseSecureCookie(true);
-//		serializer.setSameSite("NONE");
-
+		if ("run".equals(active)) {
+			serializer.setUseSecureCookie(true);
+			serializer.setSameSite("NONE");
+		}
 		return serializer;
 	}
 

+ 15 - 3
src/main/java/com/style24/persistence/domain/searchengine/SearchEngine.java

@@ -1,6 +1,7 @@
 package com.style24.persistence.domain.searchengine;
 
 import java.io.Serializable;
+import java.util.Collection;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscPageRequest;
@@ -17,6 +18,9 @@ import lombok.Data;
 @Data
 public class SearchEngine implements Serializable {
 
+	// 인기검색어 목록
+	Collection<Trend> trendList;
+
 	// 파라미터
 	private String siteCd;			// 사이트코드
 	private String cateGb;			// 카테고리구분
@@ -28,7 +32,7 @@ public class SearchEngine implements Serializable {
 	private Integer cate3No;		// 카테고리3번호
 	private Integer cate4No;		// 카테고리4번호
 	private Integer cate5No;		// 카테고리5번호
-	private String keyword;			// 검색어
+	private String keyword;			// 키워드
 	private Integer brandGroupNo;	// 브랜드그룹번호
 	private String formalGb;		// 정상이월구분
 	private String defaultCateYn;	// 기본카테고리사용여부
@@ -73,8 +77,16 @@ public class SearchEngine implements Serializable {
 	private String benefits;		// 혜택들(,로 연결된 문자열. 혜택구분:혜택명, ...)
 	private String likeIt;			// 좋아요(위시리스트에담긴상품)
 
-	private String adminIp;			// 검색엔진IP
-	private String adminPort;		// 검색엔진포트
+//	private String adminIp;			// 검색엔진IP
+//	private String adminPort;		// 검색엔진포트
 	private String returnCode;		// 검색오류코드(양수: 정상, 음수: 오류)
 
+	@Data
+	public class Trend {
+		// 인기검색어
+		private String keyword;	// 키워드
+		private int prevRank;	// 이전랭킹
+		private int ranking;	// 랭킹
+	}
+
 }

+ 48 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -631,4 +631,52 @@
 		OR    B.SUM_REAL_ORD_AMT >= #{minBuyAmt}
 	</select>
 
+	<!--배치 생년월일 -->
+	<insert id="saveBatchBirth" parameterType="Customer">
+		/*TsfCustomer.saveBatchBirth*/
+		INSERT INTO TB_BATCH_BIRTH (
+		       CUST_NO
+		     , BIRTH_YMD
+		     , REG_DT
+		     , REG_NO
+		     , UPD_DT
+		     , UPD_NO
+		) VALUES (
+		       #{custNo}
+		     , #{birthYmd}
+		     , NOW()
+		     , #{custNo}
+		     , NOW()
+		     , #{custNo}
+		)
+		ON DUPLICATE KEY UPDATE
+		       BIRTH_YMD = #{birthYmd}
+		    ,  UPD_DT = NOW()
+		    ,  UPD_NO = #{updNo}
+	</insert>
+	
+	<!-- SMS수신거부 처리 -->
+	<update id="updateSmsReceptionRefuse" parameterType="Integer">
+		/* TsfCustomer.updateSmsReceptionRefuse */
+		UPDATE TB_CUSTOMER
+		SET    SMS_AGREE_YN = 'N'
+		     , SMS_AGREE_DT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+		AND    SMS_AGREE_YN = 'Y' /*현재수신동의인경우*/
+	</update>
+	
+	<!-- 메일수신거부 처리 -->
+	<update id="updateEmailReceptionRefuse" parameterType="Integer">
+		/* TsfCustomer.updateEmailReceptionRefuse */
+		UPDATE TB_CUSTOMER
+		SET    EMAIL_AGREE_YN = 'N'
+		     , EMAIL_AGREE_DT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+		AND    EMAIL_AGREE_YN = 'Y' /*현재수신동의인경우*/
+	</update>
+
 </mapper>

+ 1 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml

@@ -47,6 +47,7 @@
 													ON B.GOODS_CD = D.GOODS_CD 
 		WHERE 1=1
 		 AND A.CUST_NO = #{custNo}
+		 AND A.GFCD_AMT != 0
 		 <choose>
 		 	<when test="monthLength > 1">
 		 		AND DATE_FORMAT(A.REG_DT,'%Y%m') = #{searchDt}

+ 200 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -548,7 +548,8 @@
 		           , A.LINK_URL 
 		           , A.NOTE 
 		           , B.CARD_PRMT_CDT_SQ 
-		           , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위 
+		           --  , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위
+		           , B.MIN_PAY_AMT 
 		           , B.MAX_DC_AMT
 		           , B.MAX_NO_ITRT 
 		           , B.MIN_NO_ITRT 
@@ -1344,9 +1345,16 @@
 	                        AND    C4.SITE_CD = #{siteCd}
 	                        AND    C4.CATE_GB = #{cateGb}
 	                        AND    C4.CATE_TYPE = 'G031_20' /*컨텐츠카테고리*/
-	                        <if test="pageGb == null or pageGb != 'BEST'">
-		                    AND    C4.CATE1_NO = #{cate1No}
-		                    </if>
+		                    <choose>
+		                        <when test="pageGb != null and pageGb == 'BEST'">
+		                            <if test="cate1No != null and cate1No != ''">
+		                            AND    C4.CATE1_NO = #{cate1No}
+		                            </if>
+		                        </when>
+		                        <otherwise>
+		                        AND    C4.CATE1_NO = #{cate1No}
+		                        </otherwise>
+		                    </choose>
 		                    AND    C4.CONTENTS_LOC = #{contentsLoc}
 		              </otherwise>
 		           </choose>
@@ -1362,7 +1370,14 @@
 		           ) G
 		    WHERE  1=1
 		<if test="pageable != null and pageable.endRow != null and pageable.endRow > 0">
-			AND  G.NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+		    <choose>
+		        <when test="pageGb == 'BEST' and pageable.endRow >= 100">
+		    AND  G.NUMB BETWEEN #{pageable.startRow} AND 100
+		        </when>
+		        <otherwise>
+		    AND  G.NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+		        </otherwise>
+		    </choose>
 		</if>
 		<if test="maxRow != null and maxRow !=''">
 			AND  G.NUMB <![CDATA[<=]]> #{maxRow}
@@ -1460,6 +1475,186 @@
 		                             AND W.CUST_NO = #{custNo}
 		</if>
 	</select>
+
+	<!-- 컨텐츠카테고리상품 건수 -->
+	<select id="getContentsCategoryGoodsCount"  parameterType="Cate4Srch" resultType="int">
+		/* TsfGoods.getContentsCategoryGoodsCount */
+		WITH TAB_GOODS AS (
+		           SELECT G.BRAND_GROUP_NM     /*브랜드그룹명*/
+		           , G.GOODS_CD           /*상품코드*/
+		           , G.GOODS_NM           /*상품명*/
+		           , G.GOODS_GB           /*상품구분*/
+		           , G.FOREIGN_BUY_YN     /*해외구매대행여부*/
+		           , G.PARALLEL_IMPORT_YN /*병행수입여부*/
+		           , G.ORDER_MADE_YN      /*주문제작여부*/
+		           , G.GOODS_TNM          /*상품타이틀명*/
+		           , G.MAIN_COLOR_CD      /*대표색상코드*/
+		           , G.LIST_PRICE         /*정상가(최초판매가)*/
+		           , G.CURR_PRICE         /*현재판매가*/
+		           , G.REG_DT             /*등록일시*/
+		           , G.NUMB
+		           FROM   (
+		                    SELECT CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
+		                    BG.BRAND_GROUP_ENM
+		                    ELSE
+		                    BG.BRAND_GROUP_KNM
+		                    END                                    AS BRAND_GROUP_NM /*브랜드그룹명*/
+		                    , G.GOODS_CD                                               /*상품코드*/
+		                    , G.GOODS_NM                                               /*상품명*/
+		                    , G.GOODS_GB                                               /*상품구분*/
+		                    , G.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+		                    , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+		                    , G.ORDER_MADE_YN                                          /*주문제작여부*/
+		                    , G.GOODS_TNM                                              /*상품타이틀명*/
+		                    , G.MAIN_COLOR_CD                                          /*대표색상코드*/
+		                    , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+		                    , G.CURR_PRICE                                             /*현재판매가*/
+		                    , G.REG_DT                                                 /*등록일시*/
+		             <choose>
+		             	<when test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
+		             		, ROW_NUMBER() OVER(ORDER BY GS.SELL_WEEK_QTY DESC
+		             		, G.GOODS_CD) AS NUMB
+		             	</when>
+		             	<when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007' or contentsLoc == 'SMM012'"> <!-- md추천 -->
+		             		, ROW_NUMBER() OVER(ORDER BY CTG.DISP_ORD
+		             		, G.REG_DT DESC
+		             		, G.GOODS_CD) AS NUMB
+		             	</when>
+		             	<when test="contentsLoc == 'SCM002' or (contentsLoc == 'SCM003' and pageGb == null)"> <!-- md추천 -->
+		             		, ROW_NUMBER() OVER(ORDER BY CG.DISP_ORD ,G.UPD_DT DESC, G.CURR_PRICE DESC, G.GOODS_CD ASC) AS NUMB
+		             	</when>
+		             	<when test="contentsLoc == 'SCM003' and pageGb != null and pageGb == 'BEST'">
+		             		, ROW_NUMBER() OVER(ORDER BY C4.CATE1_NO, CG.DISP_ORD ,G.UPD_DT DESC, G.CURR_PRICE DESC, G.GOODS_CD ASC) AS NUMB
+		             	</when>
+		             	<otherwise>
+		             		, ROW_NUMBER() OVER(ORDER BY CG.DISP_ORD
+		             		, G.REG_DT DESC
+		             		, G.GOODS_CD) AS NUMB
+		             	</otherwise>
+		             </choose>
+		<choose>
+		        	<when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007' or contentsLoc == 'SMM012'"> <!-- md추천 -->
+		        		FROM	TB_CONTENTS CT
+		        		, TMP_CONTENTS_GOODS CTG
+		        		, TB_GOODS G
+		        		, TB_GOODS_STOCK S
+		        		, TB_BRAND B
+		        		, TB_BRAND_GROUP BG
+		        		WHERE	CT.CONTENTS_LOC = CTG.CONTENTS_LOC
+		        		AND 	CT.DISP_ORD = CTG.CONTENTS_SQ
+		        		AND		CTG.GOODS_CD = G.GOODS_CD
+		        		AND		CTG.GOODS_CD = S.GOODS_CD
+		        		AND		G.BRAND_CD = B.BRAND_CD
+		        		AND     B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		        		AND		CT.CONTENTS_LOC = #{contentsLoc}
+		        		AND 	CTG.CONTENTS_SQ = #{dispOrd}
+		        		AND		NOW() BETWEEN CT.DISP_STDT AND CT.DISP_EDDT
+		        	</when>
+		        	<otherwise>
+		        		FROM   TB_CATE_4SRCH C4
+		        		, TB_CATE_GOODS CG
+		        		, TB_GOODS G
+		        		, TB_GOODS_STOCK S
+		        		, TB_BRAND B
+		        		, TB_BRAND_GROUP BG
+		        		<if test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
+		        			, TB_GOODS_SUMMARY GS
+		        		</if>
+		        		WHERE  C4.LEAF_CATE_NO = CG.CATE_NO
+		        		<choose>
+		        			<when test="brandGroupNo != null and brandGroupNo != ''">
+		        				AND    CG.BRAND_GROUP_NO = #{brandGroupNo}</when>
+		        			<otherwise>
+		        				AND    CG.BRAND_GROUP_NO = 0 /*브랜드메인에서 접근한 것이 아니면*/
+		        			</otherwise>
+		        		</choose>
+		        		AND    CG.GOODS_CD = G.GOODS_CD
+		        		AND    CG.GOODS_CD = S.GOODS_CD
+		        		AND    G.BRAND_CD = B.BRAND_CD
+		        		AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		        		<if test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
+		        			AND    CG.GOODS_CD = GS.GOODS_CD
+		        		</if>
+		        		AND    C4.SITE_CD = #{siteCd}
+		        		AND    C4.CATE_GB = #{cateGb}
+		        		AND    C4.CATE_TYPE = 'G031_20' /*컨텐츠카테고리*/
+		        		<choose>
+		        			<when test="pageGb != null and pageGb == 'BEST'">
+		        				<if test="cate1No != null and cate1No != ''">
+		        					AND    C4.CATE1_NO = #{cate1No}
+		        				</if>
+		        			</when>
+		        			<otherwise>
+		        				AND    C4.CATE1_NO = #{cate1No}
+		        			</otherwise>
+		        		</choose>
+		        		AND    C4.CONTENTS_LOC = #{contentsLoc}
+		        	</otherwise>
+		        </choose>
+		        AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		        AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+		        AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT   /*판매기간*/
+		        AND    S.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
+		        AND    B.USE_YN = 'Y'
+		        AND    BG.USE_YN = 'Y'
+		        <if test="pageGb != null and pageGb == 'BEST'">
+		        	ORDER BY C4.CATE1_NO
+		        </if>
+		        ) G
+		    WHERE  1=1
+		    <if test="pageable != null and pageable.endRow != null and pageable.endRow > 0">
+		    	AND  G.NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+		    </if>
+		    <if test="maxRow != null and maxRow !=''">
+		    	AND  G.NUMB <![CDATA[<=]]> #{maxRow}
+		    </if>
+		    )
+		    , TAB_GOODS_IMG AS (
+		         /* 상품의 이미지 */
+		         SELECT GOODS_CD
+		               ,MAX(SYS_IMG_NM) AS SYS_IMG_NM
+		               ,MAX(SYS_IMG_NM2) AS SYS_IMG_NM2
+		         FROM (
+		                SELECT G.GOODS_CD
+		                , CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END   AS SYS_IMG_NM
+		                , CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END AS SYS_IMG_NM2
+		                FROM   TAB_GOODS G
+		                , TB_GOODS_IMG GI
+		                WHERE  G.GOODS_CD = GI.GOODS_CD
+		                AND    G.MAIN_COLOR_CD = GI.COLOR_CD
+		         ) Z
+		         GROUP BY GOODS_CD
+		    )
+		, TAB_GOODS_VIDEO AS (
+		        /* 상품의 동영상 목록 */
+		        SELECT GOODS_CD
+		        , MAX(CASE WHEN RNUM = 1 THEN VIDEO_GB END)  AS VIDEO_GB_M
+		        , MAX(CASE WHEN RNUM = 1 THEN KMC_KEY END) AS VIDEO_VAL_M
+		        , MAX(CASE WHEN RNUM = 2 THEN VIDEO_GB END)  AS VIDEO_GB_S
+		        , MAX(CASE WHEN RNUM = 2 THEN KMC_KEY END) AS VIDEO_VAL_S
+		        FROM   (
+		             SELECT G.GOODS_CD
+		             , VD.VIDEO_GB
+		             , VD.KMC_KEY
+		             , VD.REG_DT
+		             , RANK() OVER(PARTITION BY G.GOODS_CD ORDER BY VD.REG_DT) AS RNUM
+		             FROM   TAB_GOODS G
+		             , TB_GOODS_VIDEO VD
+		             WHERE  G.GOODS_CD = VD.GOODS_CD
+		             AND    VD.DISP_YN = 'Y'
+		             AND    VD.KMC_KEY IS NOT NULL
+		        ) Z
+		    GROUP  BY GOODS_CD
+		)
+		SELECT COUNT(1) AS CNT
+		FROM TAB_GOODS G
+		LEFT OUTER JOIN TAB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		LEFT OUTER JOIN TAB_GOODS_VIDEO GV ON G.GOODS_CD = GV.GOODS_CD
+		<if test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+			LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
+			AND W.CUST_NO = #{custNo}
+		</if>
+	</select>
 	
 	<!-- 컨텐츠카테고리 신규상품 목록 -->
 	<select id="getContentsCategoryNewGoodsList"  parameterType="Cate4Srch" resultType="Goods">

+ 13 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -171,7 +171,7 @@
 		                        )
 		                    )
 		        </if>
-		        ) AS PREV_REVIEW_SQ
+		        ) AS NEXT_REVIEW_SQ       -- DESC순 
 		     , (SELECT MIN(RN.REVIEW_SQ) 
 		        FROM TB_REVIEW RN
 		        WHERE RN.REVIEW_SQ > #{reviewSq}
@@ -191,7 +191,7 @@
 		                        )
 		                    )
 		        </if>
-		        ) AS NEXT_REVIEW_SQ
+		        ) AS PREV_REVIEW_SQ       -- DESC순
 		     , RANK() OVER(ORDER BY R.REVIEW_SQ DESC) AS RNUM
 		FROM TB_REVIEW R 
 		INNER JOIN TB_GOODS G ON R.GOODS_CD = G.GOODS_CD
@@ -840,6 +840,14 @@
 		AND   GOODS_CD   = #{goodsCd}
 	</update>
 	
+	<update id="updateMypageReviewConfimYn" parameterType="Review">
+		/* TsfReivew.updateMypageReviewConfimYn */
+		UPDATE TB_REVIEW
+		SET CONFIRM_YN = 'N'
+		   ,CONFIRM_DT = NOW()
+		WHERE REVIEW_SQ  = #{reviewSq}
+	</update>
+	
 	
 	
 	
@@ -884,6 +892,7 @@
 				AND O.PAY_DT >  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S')
 				AND O.CUST_NO = #{custNo}
 				AND O.DISP_YN = 'Y'
+				AND R.CONFIRM_YN = 'Y'
  				AND O.SITE_CD = #{siteCd}
 			GROUP BY O.ORD_NO 
 			      ,O.ORD_NM 
@@ -1112,6 +1121,7 @@
 		   AND O.PAY_DT >  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL  #{reviewExpireDay} DAY), '%Y%M%D%H%I%S') 
 		   AND O.CUST_NO =  #{custNo}
 		   AND O.DISP_YN = 'Y'
+		   AND R.CONFIRM_YN = 'Y'
 		   AND O.SITE_CD =  #{siteCd}
 		   	) Z
 		 GROUP BY Z.ORD_NO, Z.ORD_DT, Z.DELV_EDDT, Z.ORD_DTL_NO, Z.ORD_EXCH_GB
@@ -1176,7 +1186,7 @@
 		 AND RA.DEL_YN = 'N'
 		 AND (RA.FILE_GB  = 'I'
 		      OR
-		      RA.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'  AND  RA.KMC_KEY IS NOT NULL
+		      RA.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'  AND  NULLIF(RA.KMC_KEY,'') IS NOT NULL
 		     )
 	</select>
 	

+ 7 - 1
src/main/resources/config/application-locd.yml

@@ -93,4 +93,10 @@ naverPay:
 erp:
    api:
        stock.url: http://erp.hansaemk.com:96/api/hsdr/Shop/GoodsInfo
-       goods.url: http://erp.hansaemk.com:96/api/hsdr/Shop
+       goods.url: http://erp.hansaemk.com:96/api/hsdr/Shop
+
+# 검색엔진(NHN다이퀘스트)
+search:
+    engine:
+        diquest.ip: 133.186.171.33
+        diquest.port: 44555

+ 22 - 0
src/main/resources/config/application-run.yml

@@ -51,6 +51,16 @@ upload:
         max.size: 10
         allow.extension: jpg|gif|jpeg|png
         view: //image.istyle24.com/Upload
+    excel:
+        target.path: /files/data/style24/excel
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //image.istyle24.com/Upload/excel
+    sample:
+        target.path: /files/data/style24/sample
+        max.size: 10
+        allow.extension: txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //image.style24.com/Upload/sample
 
 download.path: /files/data/style24
 
@@ -103,3 +113,15 @@ naverPay:
     common.certification.key: s_3799db3bf4af-
     certification.key: 2BC5E173-2840-4B48-BC7D-FF770005DD76
     order.api.url: https://api.pay.naver.com/o/customer/api/order/v20/register
+
+# ERP (한세드림)
+erp:
+   api:
+       stock.url: http://erp.hansaemk.com:96/api/hsdr/Shop/GoodsInfo
+       goods.url: http://erp.hansaemk.com:96/api/hsdr/Shop
+
+# 검색엔진(NHN다이퀘스트)
+search:
+    engine:
+        diquest.ip: 133.186.171.33
+        diquest.port: 44555

+ 13 - 1
src/main/resources/config/application-style.yml

@@ -21,7 +21,7 @@ logging:
 domain:
     admin: //bos.style24.com
     front: //www.style24.com
-    image: //image.istyle24.com
+    image: //image.istyle24.com/Upload
     uximage: //www.style24.com
 
 
@@ -88,3 +88,15 @@ naverPay:
     common.certification.key: s_3799db3bf4af-
     certification.key: 2BC5E173-2840-4B48-BC7D-FF770005DD76
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
+
+# ERP (한세드림)
+erp:
+   api:
+       stock.url: http://erp.hansaemk.com:96/api/hsdr/Shop/GoodsInfo
+       goods.url: http://erp.hansaemk.com:96/api/hsdr/Shop
+
+# 검색엔진(NHN다이퀘스트)
+search:
+    engine:
+        diquest.ip: 133.186.171.33
+        diquest.port: 44555

BIN
src/main/webapp/WEB-INF/lib/AutoSearch.jar


BIN
src/main/webapp/WEB-INF/lib/diquest.jar


BIN
src/main/webapp/WEB-INF/lib/json_simple-1.1.jar


BIN
src/main/webapp/WEB-INF/lib/m4_client.jar


BIN
src/main/webapp/WEB-INF/lib/m4_common.jar


BIN
src/main/webapp/WEB-INF/lib/m4_util.jar


+ 2 - 2
src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html

@@ -101,7 +101,7 @@
 				tag += '						<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '"">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '						<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
 				tag += '					</div>\n';
-				tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+				tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -110,7 +110,7 @@
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/callcenter/NoticeFormMob.html

@@ -95,7 +95,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_answer">\n';
-				tag += '			<div class="answer_body">' + item.noticeContent + '</div>\n';
+				tag += '			<div class="answer_body">' + item.noticeContent.escapeHtml() + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html

@@ -321,7 +321,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div><p>' + item.questContent + '</p></div>\n';
+				tag += '			<div><p>' + item.questContent.escapeHtml() + '</p></div>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '		<p class="img_group">\n';

+ 375 - 0
src/main/webapp/WEB-INF/views/mob/display/BestMainFormMob.html

@@ -0,0 +1,375 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : BestMainFormMob.html
+ * @desc    : 베스트메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.10   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main role="" id="" class="container dp">
+
+		<section class="content dp_best">
+			<div class="inner wide">
+				<div class="category_nav">
+					<ul id="cateListArea">
+						<li><button type="button" class="active" id="li0" onclick="fnBestListSearch(this,'');">전체</button></li>
+						<th:block th:each="item, stat : ${bestCateList}">
+							<li class="" th:id="${'li'+item.cateNo}"><button type="button" th:onclick="fnBestListSearch(this,[[${item.cateNo}]]);" th:text="${item.cateNm}">여성</button></li>
+						</th:block>
+					</ul>
+				</div>
+			</div>
+			<div class="inner bg_gray">
+				<div class="view_item">
+					<div class="count_wrap">
+						<div>
+							<p>지금 많이 <span>보고 있어요</span></p>
+						</div>
+						<div>
+							<ul class="dp_util">
+								<li><a href="#none" class="refresh">17:30 기준</a></li>
+							</ul>
+						</div>
+					</div>
+					<div class="swiper-container item_list">
+						<div class="swiper-wrapper">
+							<div class="swiper-slide">
+								<div class="item_prod">
+									<div class="item_state">
+										<a href="#none" class="itemLink">
+											<div class="itemPic">
+												<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/mo/thumb/prod3.jpg">
+											</div>
+											<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+											<div class="viewComment">508명 보는중</div>
+										</a>
+									</div>
+								</div>
+							</div>
+							<div class="swiper-slide">
+								<div class="item_prod">
+									<div class="item_state">
+										<a href="#none" class="itemLink">
+											<div class="itemPic">
+												<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/mo/thumb/prod3.jpg">
+											</div>
+											<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+											<div class="viewComment">320명 보는중</div>
+										</a>
+									</div>
+								</div>
+							</div>
+							<div class="swiper-slide">
+								<div class="item_prod">
+									<div class="item_state">
+										<a href="#none" class="itemLink">
+											<div class="itemPic">
+												<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/mo/thumb/prod3.jpg">
+											</div>
+											<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+											<div class="viewComment">1500명 보는중</div>
+										</a>
+									</div>
+								</div>
+							</div>
+							<div class="swiper-slide">
+								<div class="item_prod">
+									<div class="item_state">
+										<a href="#none" class="itemLink">
+											<div class="itemPic">
+												<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/mo/thumb/prod3.jpg">
+											</div>
+											<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+											<div class="viewComment">508명 보는중</div>
+										</a>
+									</div>
+								</div>
+							</div>
+							<div class="swiper-slide">
+								<div class="item_prod">
+									<div class="item_state">
+										<a href="#none" class="itemLink">
+											<div class="itemPic">
+												<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/mo/thumb/prod3.jpg">
+											</div>
+											<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+											<div class="viewComment">508명 보는중</div>
+										</a>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+
+			<div class="inner">
+				<div class="best_item">
+					<h2 class="dp_subtitle">베스트 TOP 100</h2>
+					<div class="item_list">
+						<div class="count_wrap">
+							<ul class="dp_util">
+								<li>
+									<div class="open_categori sex">
+										<a id="filter">구매 성별 전체
+											<!--<option value="hide">구매 성별 전체</option>
+                                            <option value="Test_SELECT_OPTION_1" rel="icon-temperature">구매 성별 전체1</option>
+                                            <option value="Test_SELECT_OPTION_2">구매 성별 전체2</option>
+                                            <option value="Test_SELECT_OPTION_3">구매 성별 전체3</option>-->
+										</a>
+									</div>
+								</li>
+								<li>
+									<div class="open_categori age">
+										<a id="filter">구매 연령 전체
+											<!--<option value="hide">구매 연령전체</option>
+                                            <option value="Test_SELECT_OPTION_1" rel="icon-temperature">구매 연령전체1</option>
+                                            <option value="Test_SELECT_OPTION_2">구매 연령전체2</option>
+                                            <option value="Test_SELECT_OPTION_3">구매 연령전체3</option>-->
+										</a>
+									</div>
+								</li>
+							</ul>
+						</div>
+
+						<div id="infiniteContainer">
+							<div id="listBoxOuter" class="itemsGrp">
+								<ul class="productlist quarter" >
+								</ul>
+							</div>
+						</div>
+
+						<div class="list_content">
+							<div class="itemsGrp" id="listBox">
+							</div>
+						</div>
+
+
+						<div class="list_last" id="divLastPage" style="display: none;">마지막페이지 입니다.</div>
+					</div>
+				</div>
+			</div>
+		</section>
+
+		<!-- 카테고리 -->
+		<div class="category_box">
+			<div class="lap">
+				<div class="category_close">카테고리닫기</div>
+				<div class="category_list">
+					<!-- 카테고리 선택 -->
+					<div class="selcet_list">
+						<ul>
+							<li class="active"><a href="javascript:void(0)">구매성별 전체</a></li>
+							<li><a href="javascript:void(0)">구매성별1</a></li>
+							<li><a href="javascript:void(0)">구매성별2</a></li>
+							<li><a href="javascript:void(0)">구매성별3</a></li>
+							<li><a href="javascript:void(0)">구매성별4</a></li>
+						</ul>
+					</div>
+					<!-- //카테고리 선택 -->
+				</div>
+			</div>
+		</div>
+		<!-- //카테고리 -->
+
+		<!-- 210415_최신상품순 리스트 팝업 추가 -->
+		<div id="odDatePop1" class="popup_box odDatePop">
+			<div class="lap">
+				<div class="popup_close">카테고리닫기</div>
+				<div class="popup_head sr-only">
+					<h2 class="">기간 선택 팝업</h2>
+				</div>
+				<div class="popup_con">
+					<div class="button_list clear">
+						<button type="button" class="on"><span>구매성별 전체</span></button>
+						<button type="button"><span>구매성별1</span></button>
+						<button type="button"><span>구매성별2</span></button>
+						<button type="button"><span>구매성별3</span></button>
+						<button type="button"><span>구매성별4</span></button>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div id="odDatePop2" class="popup_box odDatePop">
+			<div class="lap">
+				<div class="popup_close">카테고리닫기</div>
+				<div class="popup_head sr-only">
+					<h2 class="">기간 선택 팝업</h2>
+				</div>
+				<div class="popup_con">
+					<div class="button_list clear">
+						<button type="button" class="on"><span>구매연령 전체</span></button>
+						<button type="button"><span>구매연령1</span></button>
+						<button type="button"><span>구매연령2</span></button>
+						<button type="button"><span>구매연령3</span></button>
+						<button type="button"><span>구매연령4</span></button>
+					</div>
+				</div>
+			</div>
+		</div>
+	</main>
+
+	<form id="bestGoodsForm" name="bestGoodsForm">
+		<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+		<input type="hidden" name="pageSize" value ="30"/>
+		<input type="hidden" name="cateNo" value=""/>
+		<input type="hidden" name="sortGb"/>
+	</form>
+
+	<script src="/ux/plugins/gaga/gaga.infinite.scrollSession.js"></script>
+	<script src="/ux/plugins/jquery/jquery.history.min.js"></script>
+	<script th:src="@{'/biz/goods.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/goods.js"></script>
+
+
+	<script th:inline="javascript">
+		/*<![CDATA[*/
+		var bestCateList = [[${bestCateList}]];
+		$(document).ready(function(){
+			$(document).on('click','.sub_category .more_btn',function(){
+				$(this).toggleClass('on');
+				$('.sub_category .cate_wrap').toggleClass('on');
+				if($(this).hasClass('on')){
+					$(this).find('span').text('접기');
+				}else{
+					$(this).find('span').text('더보기');
+				}
+			});
+
+			//카테고리
+			function category(){
+				var categoryOpen=$(".open_categori .select_dress");
+				var categoryClose=$(".category_box .category_close");
+				var categoryPop=$(".category_box");
+
+				categoryOpen.on("click",function(){
+					categoryPop.show();
+					categoryPop.addClass("active");
+					$("body").css({"overflow":"hidden"});
+				});
+
+				categoryClose.on("click",function(){
+					categoryPop.hide();
+					$("body").css({"overflow":"visible"});
+				});
+			}
+			category();
+
+			var dp_viewitem_slide = new Swiper('.view_item .swiper-container', {
+				slidesPerView: 'auto',
+				slidesPerView: 3,
+				spaceBetween: 8,
+				centerMode: true,
+			});
+
+			// 210415_팝업관련 추가
+			//기간 선택 팝업
+			$(document).on("click", ".open_categori.sex", function(){
+				$('#odDatePop1').show().addClass("active");
+				$("body").css({"overflow":"hidden"});
+			});
+			$(document).on("click", ".open_categori.age", function(){
+				$('#odDatePop2').show().addClass("active");
+				$("body").css({"overflow":"hidden"});
+			});
+			//팝업_닫기
+			$('.popup_close').on("click",function(){
+				$('.popup_box').hide().removeClass('active');
+				$("body").css({"overflow":"visible"});
+			});
+
+			//210510_수정 : 토스트 팝업 버튼 on 클래스 제어.
+			$(document).on('click','.popup_box .button_list button',function(){
+				$(this).siblings('.button_list button').removeClass('on');
+				$(this).addClass('on');
+			})
+
+			//210510_추가 : 토스트 팝업 button 클릭 시 팝업 닫기.
+			$(document).on('click','.popup_box.odDatePop .button_list button',function(){
+				$(this).parents('.popup_box.odDatePop').hide().removeClass('active');
+				$("body").css({"overflow":"visible"});
+			})
+
+			$(document).on('click','.popup_box.odDatePop .button_list button',function(){
+				$(this).parents('.popup_box.odDatePop').hide().removeClass('active');
+				$("body").css({"overflow":"visible"});
+			})
+		});
+
+		var fnBestListSearch = function (obj, cateNo){
+			// if(gagajf.isNull(cateNo)){
+			// 	cateNo = 0;
+			// }
+
+			$.each($("#cateListArea").find('li'), function() {
+				$(this).removeClass();
+			});
+			$("#li"+cateNo).addClass('active');
+			$("#bestGoodsForm input[name=cateNo]").val(cateNo);
+			fnCategoryGoodsInfiniteScrollInit();
+			gagaInfiniteScroll.getHistory();
+		}
+
+		// 상품 검색
+		var fnGetInfiniteScrollDataList = function (pageNum){
+			$("#bestGoodsForm input[name=pageNo]").val(pageNum+1);
+			gagajf.ajaxFormSubmit("/display/best/main/goods/list", document.bestGoodsForm,  gagaInfiniteScroll.jsonToHtml);
+		}
+
+		var fnDrawInfiniteScrollData = function (result){
+			let totalCnt = result.totalCnt;
+			gagaInfiniteScroll.pageStatus.totalCount = result.totalCnt;
+			var ithrCd = '';
+			var contentLoc = '';
+
+			if (result.dataList != null && result.dataList.length > 0) {
+				var goodsUrl = [[${@environment.getProperty('upload.goods.view')}]];;
+				let lastPage = result.paging.pageable.pageNo;
+				let endRow = result.endRow - result.paging.pageable.pageSize;
+				var htm = fnCreateGoodsList(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow);
+				gagaInfiniteScroll.draw(htm);
+			}else{
+				if($("#bestGoodsForm input[name=pageNo]").val()==1){
+					$('#listBox').html('<li class="none">상품정보가 존재하지 않습니다.</li>');
+				}
+				$("#divLastPage").show();
+				gagaInfiniteScroll.draw('not');
+			}
+		}
+
+		// 사파리 - event.persisted || 크롬 - window.performance.navigation.type 이 1이면 새로고침, 2면 페이지 이동을 통한 캐쉬페이징
+		$(window).on("pageshow", function(event) {
+			if ( (event.originalEvent && event.originalEvent.persisted) || (window.performance && window.performance.navigation.type == 2)) {
+				var historyData = sessionStorage.getItem(document.location.href);
+				if(historyData!=null){
+					historyData = JSON.parse(historyData);
+				}else{
+					historyData = {};
+				}
+				fnBestListSearch();
+			}else{
+				fnCategoryGoodsInfiniteScrollInit();
+
+				fnBestListSearch();
+			}
+		});
+
+		/*]]>*/
+	</script>
+
+</th:block>
+
+</body>
+</html>

+ 42 - 2
src/main/webapp/WEB-INF/views/mob/display/BrandMainFormMob.html

@@ -118,7 +118,7 @@
 					</div>
 				</th:block>
 
-				<th:block th:if="${contentsLoc=='006'}">
+				<th:block th:if="${contentsLoc=='006' || contentsLoc=='014'||contentsLoc=='015'||contentsLoc=='016'}">
 					<!-- 배너 슬라이드 -->
 					<div class="inner wide" th:if="${brandMainLayoutData.ContentsList!=null}">
 						<div class="swiper-container br_second_slide">
@@ -395,11 +395,51 @@
 		</th:block>
 	</section>
 </main>
+	<!-- 픽커모달 -->
+	<div class="modal fade" id="reco_pop" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+
+		<a href="#close-modal" rel="modal:close" class="close-modal ">Close</a>
+	</div>
+	<!-- //픽커모달 -->
 	<script th:inline="javascript">
+		var goodsImgUrl = [[${@environment.getProperty('upload.goods.view')}]];
+
 		// 픽커모달
+		var fnGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7){
+			$("#reco_pop .modal-dialog").remove();
+			var tag = '';
+
+			tag += '<div class="modal-dialog" role="document">\n';
+			tag += '	<div class="modal-content">\n';
+			tag += '		<div class="modal-header">\n';
+			tag += '			<h5 class="modal-title"><span class="sr_only">제품정보</span></h5>\n';
+			tag += '		</div>\n';
+			tag += '		<div class="modal-body">\n';
+			tag += '			<div class="itemsGrp rowtype">\n';
+			tag += '				<div class="item_prod">\n';
+			tag += '					<div class="item_state">\n';
+			tag += '						<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\''+obj7+'\',\'\',\'\')">\n';
+			tag += '							<div class="itemPic">\n';
+			tag += '								<img class="vLHTC pd_img" src="'+goodsImgUrl+'/'+obj1+'?RS=260" alt="">\n';
+			tag += '							</div>\n';
+			tag += '							<p class="itemBrand">'+obj2+'</p>\n';
+			tag += '							<div class="itemName">'+obj3+'</div>\n';
+			tag += '							<p class="itemPrice">'+obj5.addComma()+'</p>\n';
+			tag += '						</a>\n';
+			tag += '					</div>\n';
+			tag += '				</div>\n';
+			tag += '			</div>\n';
+			tag += '		</div>\n';
+			tag += '	</div>\n';
+			tag += '</div>\n';
+
+			$("#reco_pop").append(tag);
+			$('#reco_pop').modal("show");
+		}
+
 		$(document).ready(function () {
 			$(document).on('click','.item_picker',function(e){
-				$("#reco_pop").modal("show");
+				//$("#reco_pop").modal("show");
 				$("body").addClass("recoPop");
 				return false;
 			});

+ 171 - 0
src/main/webapp/WEB-INF/views/mob/display/CategoryMainFormMob.html

@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : CategoryMainFormMob.html
+ * @desc    : 카테고리메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.10   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main role="" id="" class="container dp">
+		<section class="content dp_submain">
+			<th:block th:if="${cateMainLayoutList}" th:each="mainLayoutData, mainStat : ${cateMainLayoutList}" th:with="contentsLoc=${#strings.replace(mainLayoutData.contentsLoc,'SCM','')},contentsTitle=${mainLayoutData.contentsTitle}">
+				<th:block th:if="${contentsLoc=='001'}">
+					<div class="inner wide" th:if="${planningList != null and !planningList.empty}">
+						<div class="submain_visual">
+							<div class="swiper-container">
+								<div class="swiper-wrapper">
+									<div class="swiper-slide" th:each="item, status : ${planningList}">
+										<div class="img">
+											<img th:src="${@environment.getProperty('domain.image') + '/' + item.imgPath1}" alt="">
+										</div>
+										<div class="txtWrap">
+											<p th:text="${item.strTitle1}">겨울정기 가격제안전<br>겨울정기 가격</p>
+											<p class="txt_xs" th:text="${item.subText1}">나만의 겨울 스타일 찾기</p>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-pagination"></div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='004'}">
+					<div class="inner bg_gray">
+						<div class="sub_category">
+							<div class="cate_wrap">
+							</div>
+							<!-- 카테고리 3줄 이상일 경우 노출 -->
+							<div class="more_btn">
+								<button type="button" class="btn"><span>더보기</span></button>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='002'}">
+					<div class="inner wide" th:if="${newGoodsList != null}">
+						<div class="new_item">
+							<h2 class="dp_subtitle" th:text="${contentsTitle}">신상품</h2>
+							<div class="swiper-container item_list">
+								<div class="swiper-wrapper">
+									<div class="swiper-slide" th:each="item, status : ${newGoodsList}">
+										<div class="item_prod" th:if="${status.count<21}">
+											<div class="item_state">
+												<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM001');">
+													<div class="itemPic">
+														<img alt="BLACK-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" >
+														<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SCM001', planDtlSq=''">관심상품 추가</button>
+													</div>
+													<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
+													<div class="itemName" th:text="${item.goodsFullNm}">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+													<p class="itemPrice" th:text="${#numbers.formatInteger(item.currPrice,3,'POINT')}">80,100</p>
+													<div class="itemComment" th:if="${not #strings.isEmpty(item.goodsTnm)}" th:text="${item.goodsTnm}">#주문 폭주 상품</div>
+												</a>
+											</div>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='003'}">
+					<div class="inner" th:if="${bestGoodsList != null}">
+						<div class="best_item">
+							<h2 class="dp_subtitle" th:text="${contentsTitle}">베스트 상품</h2>
+							<div class="item_list">
+								<div class="itemsGrp">
+									<div class=" item_prod" th:each="item, status : ${bestGoodsList}">
+										<div class="item_state">
+											<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM002');">
+												<div class="shape" th:classappend="${status.count==1}?'ranker'"><span th:text="${status.index+1}"></span></div>
+												<div class=" itemPic">
+													<img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" >
+													<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SCM002', planDtlSq=''">관심상품 추가</button>
+												</div>
+												<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
+												<div class=" itemName" th:text="${item.goodsFullNm}">여성 체인 프린트 큐롯 스커트 프린트 큐롯 스커트</div>
+												<p class="itemPrice_original" th:if="${item.currPrice != item.listPrice}" th:text="${#numbers.formatInteger(item.listPrice,3,'POINT')}">89,000</p>
+												<p class="itemPrice">[[${#numbers.formatInteger(item.currPrice,1,'COMMA')}]]
+													<span class=" itemPercent" th:if="${item.currPrice != item.listPrice}" th:text="${(item.listPrice == 0 ? 0 : #numbers.formatDecimal((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+												</p>
+												<div class="itemComment" th:if="${not #strings.isEmpty(item.goodsTnm)}" th:text="${item.goodsTnm}">#주문 폭주 상품</div>
+											</a>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+		</th:block>
+		</section>
+	</main>
+
+	<script th:inline="javascript">
+		$(document).ready(function () {
+			fnSetCategory1Depts();
+
+			var swiper = new Swiper('.submain_visual .swiper-container', {
+				observer: true,
+				observeParents: true,
+				pagination: {
+					el: '.submain_visual .swiper-pagination',
+					type: 'fraction',
+				},
+			});
+
+			$(document).on('click','.sub_category .more_btn',function(){
+				$(this).toggleClass('on');
+				$('.sub_category .cate_wrap').toggleClass('on');
+				if($(this).hasClass('on')){
+					$(this).find('span').text('접기');
+				}else{
+					$(this).find('span').text('더보기');
+				}
+			});
+
+			var dp_newitem_slide = new Swiper('.new_item .swiper-container', {
+				slidesPerView: 'auto',
+				spaceBetween: 8,
+				centerMode: true,
+			});
+		});
+
+		// 카테고리1Depts 설정
+		var fnSetCategory1Depts = function() {
+			let allCate = [[${allCateList}]];
+			$.each(allCate, function(idx1, cate1) {
+				if ([[${params.cate1No}]] == cate1.cate1No) {
+					let tag = '<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate1.cateGb + '\', ' + cate1.cate1No + ');">전체</a>\n';
+					if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+						$.each(cate1.cate2List, function(idx2, cate2) {
+							tag += '<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
+						});
+					}
+					$('.cate_wrap').html(tag);
+				}
+			});
+		}
+	</script>
+
+</th:block>
+
+</body>
+</html>

+ 170 - 0
src/main/webapp/WEB-INF/views/mob/display/OutletMainFormMob.html

@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : OutletMainFormMob.html
+ * @desc    : 아울렛메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.10   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main role="" id="" class="container dp">
+		<section class="content dp_outlets">
+			<th:block th:if="${outletMainLayoutList}" th:each="mainLayoutData, mainStat : ${outletMainLayoutList}" th:with="contentsLoc=${#strings.replace(mainLayoutData.contentsLoc,'SOM','')},contentsTitle=${mainLayoutData.contentsTitle}">
+				<th:block th:if="${contentsLoc=='001'}">
+					<div class="inner wide" th:if="${planningList != null and !planningList.empty}">
+						<div class="outlets_visual">
+							<div class="swiper-container">
+								<div class="swiper-wrapper">
+									<div class="swiper-slide" th:each="item, status : ${planningList}">
+										<div class="img">
+											<img th:src="${@environment.getProperty('domain.image') + item.imgPath1}" alt="">
+										</div>
+										<div class="txtWrap">
+											<p th:text="${item.strTitle1}">오랫동안 기다려온<br>겨울세일 시작</p>
+											<p class="txt_xs" th:text="${item.subText1}">재고있을 때 미리 득템</p>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-pagination"></div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='004'}">
+					<div class="inner wide bg_gray">
+						<div class="dp_cate_list">
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='002'}">
+					<div class="inner wide" th:if="${mdPickGoodsList != null}">
+						<div class="md_item">
+							<h2 class="dp_subtitle" th:text="${contentsTitle}">MD가 추천하는 아울렛 아이템</h2>
+							<div class="swiper-container item_list">
+								<div class="swiper-wrapper">
+									<div class="swiper-slide" th:each="item, status : ${mdPickGoodsList}">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SOM002', planDtlSq=''">관심상품 추가</button>
+												<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SOM002');">
+													<div class="itemPic">
+														<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" alt="">
+													</div>
+													<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
+													<div class="itemName" th:text="${item.goodsFullNm}">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+													<p class="itemPrice">
+														<span class="itemPrice_original" th:if="${item.currPrice != item.listPrice}" th:text="${#numbers.formatInteger(item.listPrice,3,'COMMA')}">89,000</span>
+														[[${#numbers.formatInteger(item.currPrice,0,'COMMA')}]]
+														<span class="itemPercent" th:if="${item.currPrice != item.listPrice}" th:text="${(item.listPrice == 0 ? 0 : #numbers.formatDecimal((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+													</p>
+													<div class="itemComment" th:text="${item.goodsTnm}">#주문 폭주 상품</div>
+												</a>
+											</div>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='003'}">
+					<div class="inner" th:if="${bestGoodsList != null}">
+						<div class="best_item">
+							<h2 class="dp_subtitle" th:text="${contentsTitle}">베스트 상품</h2>
+							<div class="item_list">
+								<div class="itemsGrp">
+									<div class="item_prod" th:each="item, status : ${bestGoodsList}">
+										<div class="item_state">
+											<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SOM003', planDtlSq=''">관심상품 추가</button>
+											<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SOM003');">
+												<div class="shape" th:classappend="${status.count==1}?'ranker'"><span th:text="${status.index+1}">1</span></div>
+												<div class="itemPic">
+													<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" alt="">
+												</div>
+												<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
+												<div class="itemName" th:text="${item.goodsFullNm}">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+												<p class="itemPrice">
+													<span class="itemPrice_original" th:if="${item.currPrice != item.listPrice}" th:text="${#numbers.formatInteger(item.listPrice,3,'COMMA')}">89,000</span>
+													[[${#numbers.formatInteger(item.currPrice,0,'COMMA')}]]
+													<span class="itemPercent" th:if="${item.currPrice != item.listPrice}" th:text="${(item.listPrice == 0 ? 0 : #numbers.formatDecimal((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+												</p>
+												<div class="itemComment" th:text="${item.goodsTnm}">#주문 폭주 상품</div>
+											</a>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+			</th:block>
+		</section>
+	</main>
+
+	<script th:inline="javascript">
+		$(document).ready(function(){
+			fnSetCategory1Depts();
+
+			$(document).on('click','.sub_category .more_btn',function(){
+				$(this).toggleClass('on');
+				$('.sub_category .cate_wrap').toggleClass('on');
+				if($(this).hasClass('on')){
+					$(this).find('span').text('접기');
+				}else{
+					$(this).find('span').text('더보기');
+				}
+			});
+
+			var swiper = new Swiper('.outlets_visual .swiper-container', {
+				observer: true,
+				observeParents: true,
+				pagination: {
+					el: '.outlets_visual .swiper-pagination',
+					type: 'fraction',
+				},
+				autoplay : {
+					delay : 5000,   // 시간 설정
+				},
+			});
+
+			var dp_mditem_slide = new Swiper('.md_item .swiper-container', {
+				slidesPerView: 2,
+				spaceBetween: 8,
+				centerMode: true,
+			});
+		});
+
+		// 카테고리1Depts 설정
+		var fnSetCategory1Depts = function() {
+			let allCate = [[${allCateList}]];
+			let cateGb = 'G032_101';
+			let formalGb = 'G009_20';
+			let tag = '';
+			tag += '<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cateGb + '\',\'\',\'\',\'\',\'\',\'\',\'' + formalGb + '\');">전체</a>\n';
+			$.each(allCate, function(allCateIdx, allCateItem) {
+				tag += '<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + allCateItem.cateGb + '\',' + allCateItem.cate1No + ',\'\',\'\',\'\',\'\',\'' + formalGb + '\');">' + allCateItem.cate1Nm + '</a>\n';
+			});
+			$('.dp_cate_list').html(tag);
+		}
+	</script>
+
+</th:block>
+
+</body>
+</html>

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html

@@ -41,7 +41,7 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${cardInfo.minPayAmt + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA')  + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
 											</th:block>
 											<th:block th:if="${not #strings.isEmpty(cardInfo.linkUrl)}"><a th:href="${cardInfo.linkUrl}" target="_blank" class="link" >자세히보기</a></th:block>
 										</div>

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html

@@ -102,7 +102,7 @@
 			}
 			tag += '						</span>\n';
 			tag += '					</div>\n';
-			tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+			tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
 			tag += '					<span class="id">'+ item.maskingCustId+'</span><span class="data">' + item.questDt + '</span>\n';
 			tag += '				</div>\n';
 			tag += '			</div>\n';
@@ -111,7 +111,7 @@
 			tag += '	<div class="fold_cont">\n';
 			tag += '		<div class="fold_detail">\n'; //문의 내용
 			tag += '			<div>\n';
-			tag += '				<p>' + item.questContent.replaceAll("\n", "</br>") + '</p>\n';
+			tag += '				<p>' + item.questContent.replaceAll("\n", "</br>").escapeHtml() + '</p>\n';
 			tag += '			</div>\n';
 			tag += '		</div>\n';
 			

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -65,7 +65,7 @@
 	<!-- //고객정보 -->
 	
 	<!-- 사은품정보 -->
-	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="freegiftInfo" id="freegiftInfo">
+	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="freegiftInfo">
 		<tr style="height:30px;">
 			<th>freegiftValArr</th>
 			<th>freegiftUsePointArr</th>

+ 2 - 2
src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html

@@ -120,7 +120,7 @@
 				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '				<div class="fold_tit">\n';
 				tag += '					<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
-				tag += '					<span>' + item.questContent + '</span>\n';
+				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -129,7 +129,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				
 				if (item.ansStat == 'G060_20') { // 답변완료일 때

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html

@@ -120,7 +120,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div>' + item.noticeContent + '</div>\n';
+				tag += '			<div>' + item.noticeContent.escapeHtml() + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html

@@ -192,7 +192,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '				<p class="img_group">\n';

+ 4 - 4
src/main/webapp/WEB-INF/views/web/display/BestMainFormWeb.html

@@ -37,7 +37,7 @@
 					<div class="taps">
 						<div>
 							<ul id="cateListArea">
-								<li class="active" id="li0"><a href="javascript:void(0);" onclick="fnBestListSearch(this,0);">전체</a></li>
+								<li class="active" id="li0"><a href="javascript:void(0);" onclick="fnBestListSearch(this,'');">전체</a></li>
 								<th:block th:each="item, stat : ${bestCateList}">
 									<li class="" th:id="${'li'+item.cateNo}"><a href="javascript:void(0);" th:onclick="fnBestListSearch(this,[[${item.cateNo}]]);" th:text="${item.cateNm}"></a></li>
 								</th:block>
@@ -296,9 +296,9 @@
 	});
 
 	var fnBestListSearch = function (obj, cateNo){
-		if(gagajf.isNull(cateNo)){
-			cateNo = 0;
-		}
+		// if(gagajf.isNull(cateNo)){
+		// 	cateNo = 0;
+		// }
 
 		$.each($("#cateListArea").find('li'), function() {
 			$(this).removeClass();

+ 2 - 2
src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html

@@ -127,7 +127,7 @@
 
 				<!-- 가로 긴 배너 슬라이드 -->
 				<!-- 브랜드 배너 -->
-				<th:block th:if="${contentsLoc=='006'}">
+				<th:block th:if="${contentsLoc=='006' || contentsLoc=='014'||contentsLoc=='015'||contentsLoc=='016'}">
 					<div class="content wide main_1stage">
 						<div class="cont_head dpnone">
 							<p class="t_c">배너 슬라이드</p>
@@ -454,7 +454,7 @@ var brandMainLayoutList = [[${brandMainLayoutList}]];
 var goodsImgUrl = [[${@environment.getProperty('upload.goods.view')}]];
 var fnGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7){
 	$("#brLookbookPopup .modal-dialog").remove();
-	tag = '';
+	var tag = '';
 
 	tag += '	<div class="modal-dialog" role="document">\n';
 	tag += '		<div class="modal-content">\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/web/display/OutletMainFormWeb.html

@@ -133,7 +133,7 @@
 								<div class="item_state">
 									<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SOM003', planDtlSq=''">관심상품 추가</button>
 									<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SOM003');">
-										<div class="rank" th:classappend="${status.count==1}?'ranker'"><span th:text="${status.index+1}">1</span></div>
+										<div class="shape" th:classappend="${status.count==1}?'ranker'"><span th:text="${status.index+1}">1</span></div>
 										<div class="itemPic">
 											<img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}">
 										</div>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html

@@ -43,7 +43,7 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${cardInfo.minPayAmt + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA') + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
 											</th:block>
 											
 										</div>

+ 2 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html

@@ -102,7 +102,7 @@
 				tag += '			<div>\n';
 				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '				<div class="fold_tit">\n';
-				tag += '					<span>' + item.questContent + '</span>\n';
+				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
 				if (item.selfGb == 1){
 				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
 				}
@@ -120,7 +120,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent.replaceAll("\n", "</br>") + '</p>\n';
+				tag += '				<p>' + item.questContent.replaceAll("\n", "</br>").escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				

+ 1 - 4
src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html

@@ -132,7 +132,7 @@
 		for (var i = 0; i < date.length; i++) {
 			$("#searchDt").append(	"<li onclick='fnChangeDate(this.value)' value='"+ date[i].year + "" + date[i].month + "'>" + date[i].year	+ "년" +  "  " + date[i].month + "월 </li>")
 		}
-		$(".select").append("<li class='selected' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년"  +  "  " + date[0].month + "월 </li>"); // 현재년도 선택 */ 
+		$(".select").append("<li onclick='fnChangeDate(this.value)' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년"  +  "  " + date[0].month + "월 </li>"); // 현재년도 선택 */ 
 	}
 	appendYear($("#searchDt"));
 
@@ -261,14 +261,11 @@
 		
 		// 마이페이지 location 설정
 		fnSetMypageLocation('STYLE24 포인트', '_PAGE_MYPAGE_POINT');
-		
-		
 
 		// 셀렉트박스 활성화
 		$('.select_custom').each(function(index) {
 			var selecter01 = new sCombo($(this));
 		});
-
 		// 셀렉트박스 데이터 설정
 		fnChangeDate();
 

+ 1 - 1
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html

@@ -481,7 +481,7 @@ var reviewCreate = function () {
 	}
 	
 	
-	mcxDialog.confirm('리뷰를 등록하시겠습니까"?', {
+	mcxDialog.confirm('리뷰를 등록하시겠습니까?', {
         cancelBtnText: "취소",
         sureBtnText: "확인",
         sureBtnClick: function(){

+ 4 - 3
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewDetailFormWeb.html

@@ -68,9 +68,10 @@
 						if (reviewAttach.fileGb == "M") fileGbClass = "mov";
 				tag +='		<span class="thumb" class="'+fileGbClass+'">\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가-->
 						if (reviewAttach.fileGb == "M") {
-				tag +='			<video poster="http://cdn.011st.com/11dims/resize/1999x1999/quality/75/11src/review/10201202/3121412332/2e66698576d64c5c9977a6fe6606008d.jpg" muted="muted" preload="metadata" controls="controls">\n';
-				tag +='				<source src="'+_kollusMediaUrl+'/'+reviewAttach.kmcKey + 'player_version=html5" type="video/mp4">\n';
-				tag +='			</video>\n';
+			    tag +='<iframe width="100%" height="100%" src="'+_kollusMediaUrl+'/'+reviewAttach.kmcKey + '/player_version=html5" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>';
+				//tag +='			<video poster="'+_kollusMediaUrl+'/'+reviewAttach.kmcKey + '/player_version=html5" muted="muted" preload="metadata" controls="controls">\n';
+				//tag +='				<source src="'+_kollusMediaUrl+'/'+reviewAttach.kmcKey + '/player_version=html5" type="video/mp4">\n';
+				//tag +='			</video>\n';
 						}else{
 				tag +='			<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';	
 						}

+ 1 - 1
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -65,7 +65,7 @@
 	<!-- //주문자정보 -->
 	
 	<!-- 사은품정보 -->
-	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="freegiftInfo" id="freegiftInfo">
+	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="freegiftInfo">
 		<tr style="height:30px;">
 			<th>freegiftValArr</th>
 			<th>freegiftUsePointArr</th>

+ 1 - 13
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -826,7 +826,7 @@ var fnSearchCallback = function (result) {
 				 }
 				
 				 html += '			</div>';
-				 html += '			<p>'+escapeHtml(item.entryVal1)+'</p>';
+				 html += '			<p>'+item.entryVal1.escapeHtml()+'</p>';
 				 if (item.entryCustNo == result.custNo) {
 					 html += '			<button class="btn btn_default btn_del" value="'+item.planEntrySq+'" onclick="fnDelReply(this.value)"><span>삭제</span></button>';
 				 }
@@ -851,18 +851,6 @@ var fnSearchCallback = function (result) {
 	gagaPaging.createPagination(result.paging.pageable);
 }
 
-function escapeHtml(str) {
-	var map = {
-		'&': '&amp;',
-		'<': '&lt;',
-		'>': '&gt;',
-		'"': '&quot;',
-		"'": '&#039;'
-	};
-	return str.replace(/[&<>"']/g, function(m) { return map[m]; });
-}
-
-
 // 댓글 삭제
 var fnDelReply = function(obj) {
 	

+ 0 - 1
src/main/webapp/WEB-INF/views/web/planning/PlanningEventPollFormWeb.html

@@ -335,7 +335,6 @@ $(document).ready( function() {
 		var content = $(this).val();
 		$('#ans_cnt').html("(<em class='c_primary'>"+content.length+"</em>/1000자)");  
 		if (content.length > 1000){
-			alert("최대 1000자까지 입력 가능합니다.");
 			$(this).val(content.substring(0, 1000));
 			$('#ans_cnt').html("(<em class='c_primary'>1000</em>/1000자)");
 		}

+ 5 - 3
src/main/webapp/WEB-INF/views/web/planning/PlanningShotGuideFormWeb.html

@@ -35,7 +35,8 @@
 				</div>
 				<div class="cont_body">
 				    <div class="bulletship">
-						<div class="bulletship_head" th:utext="${#strings.replace(#strings.replace(shotHtmlTop.fsrcPc,'&amplt;','<'),'&ampgt;','>')}">
+						<!-- <div class="bulletship_head" th:utext="${#strings.replace(#strings.replace(shotHtmlTop.fsrcPc,'&amplt;','<'),'&ampgt;','>')}"> -->
+						<div class="bulletship_head">
                             <img src="/images/pc/thumb/bullet_bg1.png" alt="10시까지 주문하면 당일도착">
                         </div>
                         <div class="bulletship_body" id="shotHtml">
@@ -55,8 +56,9 @@
                         </div>
                         <div class="bulletship_foot"><br>
                         </div>
-                        <div class="bulletship_foot" th:utext="${#strings.replace(#strings.replace(shotHtmlBtm.fsrcPc,'&amplt;','<'),'&ampgt;','>')}">
-                           <!--  <img src="/images/pc/thumb/bullet_bg2.png" alt="주문/도착, 배송일, 대상상품"> -->
+                        <!-- <div class="bulletship_foot" th:utext="${#strings.replace(#strings.replace(shotHtmlBtm.fsrcPc,'&amplt;','<'),'&ampgt;','>')}"> -->
+                        <div class="bulletship_foot">
+                            <img src="/images/pc/thumb/bullet_bg2.png" alt="주문/도착, 배송일, 대상상품">
                         </div>
                     </div> 
                 </div>

+ 3 - 3
src/main/webapp/biz/mypage.js

@@ -315,16 +315,16 @@ var fnReceipt = function(param) {
 		receiptWin += '?cmd=card_bill';
 		receiptWin += '&tno=' + paymentInfo.pgTid;
 		receiptWin += '&order_no=' + ordNo;
-		receiptWin += '&trade_mony=' + orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt;
+		receiptWin += '&trade_mony=' + (orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt);
 		
 		// 팝업 크기 설정
 		option = 'width=455, height=815';
 	} else if (param == 'cash') {
 		// URL 설정
 		receiptWin += '?cmd=cash_bill';
-		receiptWin += '&cash_no=' + paymentInfo.cashAuthNo;
+		receiptWin += '&cash_no=' + paymentInfo.cashTradeNo;
 		receiptWin += '&order_id=' + ordNo;
-		receiptWin += '&trade_mony=' + orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt;
+		receiptWin += '&trade_mony=' + (orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt);
 		
 		// 팝업 크기 설정
 		option = 'width=370, height=625';

+ 8 - 1
src/main/webapp/ux/mo/css/style24_m.css

@@ -2584,4 +2584,11 @@ main.container .od_extra .inner:last-child {padding-bottom: 0;}
 .modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table {table-layout: fixed;}
 .modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table tr th {font-size: 1.3rem;}
 .modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table tr td {font-size: 1.2rem;}
-.modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table tr th, .modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table tr td {border-left: 0; word-break: break-all;}
+.modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table tr th, .modal.reclaim_pop .modal-body .pop_cont .goods_tbl .tblWrap table tr td {border-left: 0; word-break: break-all;}
+
+/* main_띠배너 */
+.bnrtype_banner {background: #fd4801; position: relative;}
+.bnrtype_banner a {display: block; padding:1.3rem 2rem; padding-right:4rem;}
+.bnrtype_banner a > div {color:#fff; font-size:1.3rem; font-weight:300;}
+.bnrtype_banner a > div span {font-weight: 500;}
+.bnrtype_banner .bnrtype_close {position: absolute; top: 50%; right: 0; width: 4rem; height: 4.4rem; transform:translateY(-50%); background: url(/images/mo/btn_main_pop_arrow.png) no-repeat center/1.3rem; z-index: 10;}

+ 5 - 5
src/main/webapp/ux/mo/js/common_m.js

@@ -928,11 +928,11 @@ $( document ).ready( function() {
             return false;
         });	
 
-        //210409_토스트 팝업 버튼 클릭시 닫기
-        $(document).on('click','.popup_box .button_list button',function(){
-            $(this).parents('.popup_box').hide().removeClass('active');
-            $("body").css({"overflow":"visible"});
-        })
+        //210510_삭제
+        // $(document).on('click','.popup_box .button_list button',function(){
+        //     $(this).parents('.popup_box').hide().removeClass('active');
+        //     $("body").css({"overflow":"visible"});
+        // })
 
         
 

+ 8 - 5
src/main/webapp/ux/pc/css/layout.css

@@ -919,7 +919,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .tbl.type1 table th {padding:10px 0px 10px 40px; font-weight:500;}
 .tbl.type1 table td {padding:10px 40px 10px 0px;}
 .tbl.type1 table tr td:first-child {padding-left:40px}
-.tbl.type1 table tr td:last-child {padding-right:40px}
+.tbl.type1 table tr td:last-child {padding-right:40px;}
 
 /* 테이블 type2 - 수직형 행,열별 구분선 있음 */
 .tbl.type2 {padding:0; border-top:1px solid #000;} 
@@ -991,7 +991,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .tbl td .single_line ul li:first-child::before {display:none;}
 .tbl td .single_line ul li > span {margin-right:0}
 .tbl td .block_line {position:relative;}
-.tbl td .block_line ul li {margin-top:5px; height:1.625em; /*line-height:1;*/}
+.tbl td .block_line ul li {margin-top:5px; height:100%; /*line-height:1;*/}
 .tbl td .block_line ul li:first-child {margin-top:0}
 .tbl td .block_line ul li > span {vertical-align:top;}
 .tbl td .block_line ul li .tag {margin-left:6px; margin-top:2px; vertical-align:top;}
@@ -1937,7 +1937,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.cmt_wrap .cmt_group .cmt_list li .cmt_cont .btn {width:72px; height:34px; background:none; border-color:#a1a1a1; padding:0px; margin-top:20px; font-size:14px; color:#222; font-weight:200;}
 	.cmt_wrap .cmt_group .cmt_list li .cmt_cont .btn.btn_del span {position:relative; padding-left:20px;}
 	.cmt_wrap .cmt_group .cmt_list li .cmt_cont .btn.btn_del span::before {content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); margin-top:-1px; width:13px; height:16px; background:url('/images/pc/ico_trash.png') no-repeat 0% 50%; opacity:0.85;}
-	.cmt_wrap .cmt_group .nodata {margin-top:120px}
+	.cmt_wrap .cmt_group .nodata {margin-top:120px;}
 	.cmt_wrap .pageNav > li > a,
 	.cmt_wrap .pageNav > li > span {background-color:transparent;}
 	.cmt_wrap .paging_wrap {margin-top: 50px; margin-bottom: 0; box-sizing:content-box;}
@@ -1945,8 +1945,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	/* dp_기획전상세 : 중간 배너 */	
 	.dp .dp_mid_banner {padding-top:60px; padding-bottom:60px;}	
 	.dp .dp_mid_banner .mid_banner {position:relative;}
-	.dp .dp_mid_banner .mid_banner .swiper-button-prev {left:70px}
-	.dp .dp_mid_banner .mid_banner .swiper-button-next {right:70px}
+	.dp .dp_mid_banner img {width:100%; height:auto;}
+	.dp .dp_mid_banner .mid_banner .swiper-button-prev {left:70px;}
+	.dp .dp_mid_banner .mid_banner .swiper-button-next {right:70px;}
 	.dp .dp_mid_banner .mid_banner .swiper-pagination {position:relative; width:100%; margin-top:40px;}
 
 	/* dp_기획전상세 : 대표상품 노출 */	
@@ -4046,6 +4047,8 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.myOrderView .tbl table td .input_wrap {width:100%;}
 	.myOrderView .tbl table td .input_wrap textarea {width:100%; height:82px; padding:14px 15px; font-size:14px; color:#222;}
 	.myOrderView .tbl table td .input_wrap .txt_cnt {margin-top:10px;}
+	.myOrderView .tbl table td .block_line ul li:nth-of-type(3) > span {vertical-align:top; display:inline-block; max-width:calc(100% - 135px); width:auto;}
+	.myOrderView .tbl.type1 table tr:nth-of-type(3) td:last-child > span {display:inline-block; width:auto; max-width:calc(100% - 135px); vertical-align:top;}
 	.myOrderView .tbl.type6 {position: relative;}
 	.myOrderView .tbl.type6 table + p {position: absolute;top: auto;bottom: -25px;left: 0;right: auto;}
 	.myOrderView .retrieve_method .form_field > div {margin-right:30px}

+ 21 - 0
src/main/webapp/ux/plugins/gaga/gaga.common.js

@@ -377,3 +377,24 @@ String.prototype.addComma = function(decimalPosition) {
 String.prototype.removeComma = function() {
 	return this.replace(/,/gi,"");
 }
+
+/**
+ * @type   : prototype_function
+ * @access : public
+ * @desc   : 자바스크립트의 내장 객체인 String 객체에 &,<,>,",' 브라우져 출력용 변환한다.
+ * <pre>
+ *     "<문자열>".escapeHtml();
+ * </pre>
+ * @return : 콤마(,)가 제거된 스트링
+ * @author : gagamel
+ */
+String.prototype.escapeHtml = function() {
+	var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;',
+		"'": '&#039;'
+	};
+	return this.replace(/[&<>"']/g, function(m) { return map[m]; });
+}