فهرست منبع

Merge branch 'develop' into eskim

eskim 5 سال پیش
والد
کامیت
db07f77295
40فایلهای تغییر یافته به همراه2308 افزوده شده و 61 حذف شده
  1. 20 0
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  2. 83 0
      src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java
  3. 24 1
      src/main/java/com/style24/front/biz/dao/TsfSocialDao.java
  4. 89 1
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  5. 159 0
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  6. 53 0
      src/main/java/com/style24/front/biz/service/TsfSocialService.java
  7. 91 7
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  8. 33 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  9. 54 0
      src/main/java/com/style24/front/biz/web/TsfSocialController.java
  10. 30 0
      src/main/java/com/style24/front/support/env/TsfConstants.java
  11. 22 0
      src/main/java/com/style24/front/support/exception/TsfNonCertificationAccountException.java
  12. 16 2
      src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java
  13. 3 0
      src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java
  14. 16 1
      src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java
  15. 28 0
      src/main/java/com/style24/persistence/domain/BrandGroup.java
  16. 37 0
      src/main/java/com/style24/persistence/domain/Cate1.java
  17. 34 0
      src/main/java/com/style24/persistence/domain/Cate2.java
  18. 35 0
      src/main/java/com/style24/persistence/domain/Cate3.java
  19. 36 0
      src/main/java/com/style24/persistence/domain/Cate4.java
  20. 2 0
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  21. 33 0
      src/main/java/com/style24/persistence/domain/Cate5.java
  22. 67 0
      src/main/java/com/style24/persistence/domain/Contents.java
  23. 42 0
      src/main/java/com/style24/persistence/domain/GnbTab.java
  24. 4 1
      src/main/java/com/style24/persistence/domain/Login.java
  25. 9 1
      src/main/java/com/style24/persistence/domain/Social.java
  26. 44 24
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  27. 369 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  28. 20 17
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  29. 74 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  30. 2 0
      src/main/resources/i18n/messages/message_ko_KR.properties
  31. 9 1
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  32. 1 1
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  33. 471 0
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb2.html
  34. 80 0
      src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html
  35. 5 1
      src/main/webapp/WEB-INF/views/web/customer/DormantCertifyFormWeb.html
  36. 80 0
      src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html
  37. 10 3
      src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html
  38. 120 0
      src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html
  39. BIN
      src/main/webapp/images/pc/thumb/hotdeal_bg.png
  40. 3 0
      src/main/webapp/ux/style24_link.js

+ 20 - 0
src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java

@@ -104,4 +104,24 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 11
 	 */
 	String  getDeleteGoodsWish(int custNo);
+
+	/**
+	 * 본인인증 처리
+	 *
+	 * @param customer - 고객번호, ci
+	 * @return int - 업데이트 카운트
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	int updateCustomerCi(Customer customer);
+
+	/**
+	 * 비밀번호 변경 날짜 업데이트
+	 *
+	 * @param customer - 고객번호
+	 * @return int - 업데이트 카운트
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	int updatePasswordDate(Customer customer);
 }

+ 83 - 0
src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java

@@ -1,6 +1,17 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Cate1;
+import com.style24.persistence.domain.Cate2;
+import com.style24.persistence.domain.Cate3;
+import com.style24.persistence.domain.Cate4;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Cate5;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
 
 /**
  * 전시 Dao
@@ -11,4 +22,76 @@ import com.style24.core.support.annotation.ShopDs;
 @ShopDs
 public interface TsfDisplayDao {
 
+	/**
+	 * GNB탭 목록
+	 * @param gnbTab - GNB탭 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<GnbTab> getGnbTabList(GnbTab gnbTab);
+
+	/**
+	 * 컨텐츠 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Contents> getContentsList(Contents contents);
+
+	/**
+	 * GNB 브랜드그룹 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<BrandGroup> getGnbBrandGroupList(Contents contents);
+
+	/**
+	 * 카테고리1 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate1> getCategory1List(Cate4Srch cate);
+
+	/**
+	 * 카테고리2 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate2> getCategory2List(Cate4Srch cate);
+
+	/**
+	 * 카테고리3 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate3> getCategory3List(Cate4Srch cate);
+
+	/**
+	 * 카테고리4 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate4> getCategory4List(Cate4Srch cate);
+
+	/**
+	 * 카테고리5 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate5> getCategory5List(Cate4Srch cate);
+
 }

+ 24 - 1
src/main/java/com/style24/front/biz/dao/TsfSocialDao.java

@@ -1,6 +1,9 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Social;
 
 /**
  * 소셜관리(핫딜) Dao
@@ -10,5 +13,25 @@ import com.style24.core.support.annotation.ShopDs;
  */
 @ShopDs
 public interface TsfSocialDao {
-
+	/**
+	 * 소셜(핫딜) 정보
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 11
+	 */
+	Social getSocialInfo(Social social);
+	
+	/**
+	 * 소셜(핫딜) 상품 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 11
+	 */
+	Collection<Social> getSocialGoodsList(Social social);
+	
+	
 }

+ 89 - 1
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -77,7 +77,7 @@ public class TsfCustomerService {
 	}
 
 	/**
-	 * 고객정보찾기 -
+	 * 고객정보찾기
 	 *
 	 * @param custNo - 고객번호
 	 * @return Customer 고객정보
@@ -93,6 +93,23 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
+	/**
+	 * 휴면고객 정보 찾기
+	 *
+	 * @param custNo - 고객번호
+	 * @return Customer 고객정보
+	 * @author jsshin
+	 * @since 2021. 03. 10
+	 */
+	public Customer getDormantCustomerFindByCustNo(Integer custNo) {
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.DORMANT.value());
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.encryptData();
+		return coreCustomerService.getCustomerInfo(customer);
+	}
+
 
 	/**
 	 * 임시비밀번호 조회
@@ -673,10 +690,81 @@ public class TsfCustomerService {
 	 */
 	public GagaMap releaseDormantCustomer(Customer customer) {
 		GagaMap result = new GagaMap();
+
+		Customer custInfo = getDormantCustomerFindByCustNo(customer.getCustNo());
+
+		if (!customer.getCi().equals(custInfo.getCi())) {
+			result.setBoolean("isRelase", false);
+			result.setString("errorType", "DIFFERENT_CI"); // 계정이 등록된 CI랑 인증한 CI가 다를떄
+			return result;
+		}
+
 		customer.setRegNo(customer.getCustNo());
 		customer.setUpdNo(customer.getCustNo());
 		boolean isRelase = coreCustomerService.saveDormantCustomerRelease(customer);
 		result.setBoolean("isRelase", isRelase);
 		return result;
 	}
+
+	/**
+	 * 본인인증 처리
+	 *
+	 * @param customer - 본인인증키
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	public GagaMap saveCertification(Customer customer) {
+		GagaMap resultMap = new GagaMap();
+		customer.setRegNo(customer.getCustNo());
+		customer.setUpdNo(customer.getCustNo());
+		boolean isSuccess = false;
+		// CI 유효성 체크
+		Customer custInfo = getCustomerFindByCi(customer.getCi());
+		if (custInfo != null) {
+			TsfSession.setAttribute("maskingCustId", custInfo.getMaskingCustId());
+			resultMap.setBoolean("isSuccess", isSuccess);
+			return resultMap;
+		}
+
+		// 1.이력 쌓고
+		coreCustomerService.createCustomerHistory(customer);
+		// 2.CI 업데이트
+		int resultCnt = customerDao.updateCustomerCi(customer);
+		if (resultCnt > 0) {
+			isSuccess = true;
+		}
+		resultMap.setBoolean("isSuccess", isSuccess);
+
+		return resultMap;
+	}
+
+	/**
+	 * 비밀번호 변경 날짜 업데이트
+	 *
+	 * @param customer - 고객번호
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	public GagaMap updatePasswordDate(Customer customer) {
+		GagaMap resultMap = new GagaMap();
+		boolean isSuccess = false;
+		customer.setRegNo(customer.getCustNo());
+		customer.setUpdNo(customer.getCustNo());
+		customer.setPwdChangeDay(60); //30일간 안보여야 하기때문에 (오늘날짜 - 60) 처리
+
+		// 1.이력 쌓고
+		coreCustomerService.createCustomerHistory(customer);
+
+		// 2.비밀번호 변경일자 업데이트
+		int resultCnt = customerDao.updatePasswordDate(customer);
+		if (resultCnt > 0) {
+			isSuccess = true;
+		}
+
+		resultMap.setBoolean("isSuccess", isSuccess);
+
+		return resultMap;
+	}
 }

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

@@ -1,9 +1,22 @@
 package com.style24.front.biz.service;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
+import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfDisplayDao;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Cate1;
+import com.style24.persistence.domain.Cate2;
+import com.style24.persistence.domain.Cate3;
+import com.style24.persistence.domain.Cate4;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Contents;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -20,4 +33,150 @@ public class TsfDisplayService {
 	@Autowired
 	private TsfDisplayDao displayDao;
 
+	/**
+	 * 컨텐츠 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 3. 11
+	 */
+	public Collection<Contents> getContentsList(Contents contents) {
+		return displayDao.getContentsList(contents);
+	}
+
+	/**
+	 * GNB 브랜드그룹 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	public Collection<BrandGroup> getGnbBrandGroupList(Contents contents) {
+		return displayDao.getGnbBrandGroupList(contents);
+	}
+
+//	/**
+//	 * GNB 탭 목록
+//	 * @param gnbTab - GNB탭 정보
+//	 * @return
+//	 * @author gagamel
+//	 * @date 2021. 3. 11
+//	 */
+//	public Collection<Contents> getGnbTapList(GnbTab gnbTab) {
+//		this.getGnbBrandGroupList(contents);
+//
+//		// GNB 탭 목록
+//		Collection<GnbTab> tapList = displayDao.getGnbTabList(gnbTab);
+//
+//		if (tapList != null && !tapList.isEmpty()) {
+//			for (GnbTab tap : tapList) {
+//				if (tap.getContentsType().equals("B")) { // 컨텐츠유형:브랜드
+//					// 캐주얼 브랜드그룹 목록
+//					contents.setCasualBrandGroupList(displayDao.getBrandGroupList(tap.getStrVar2()));
+//
+//					// 골프 브랜드그룹 목록
+//					contents.setGolfBrandGroupList(displayDao.getBrandGroupList(tap.getStrVar3()));
+//
+//					// 키즈 브랜드그룹 목록
+//					contents.setKidsBrandGroupList(displayDao.getBrandGroupList(tap.getStrVar4()));
+//				} else if (tap.getContentsType().equals("C")) { // 컨텐츠유형:카테고리
+//					contents.setCateList(this.getCategoryList(TsfConstants.CateGb.BYITEM.value(), Integer.parseInt(tap.getStrVar2())));
+////					contents.
+//				}
+//			}
+//		}
+//
+//		return tapList;
+//	}
+
+	/**
+	 * 카테고리 목록
+	 * @param cateGb - 카테고리구분
+	 * @param cate1No - 카테고리1번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	@Cacheable(value = "cate", key = "'cateList-'.concat(#cateGb).concat(#cate1No)")
+	public Collection<Cate1> getCategoryList(String cateGb, Integer cate1No) {
+		Cate4Srch cate = new Cate4Srch();
+		cate.setSiteCd(TscConstants.Site.STYLE24.value()); // 사이트코드
+		cate.setCateGb(cateGb); // 카테고리구분
+		cate.setCateType(TsfConstants.CateType.GOODS.value()); // 상품분류카테고리
+		cate.setCate1No(cate1No);
+
+		return this.getAllCategoryList(cate);
+	}
+
+	/**
+	 * 전체 카테고리 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	public Collection<Cate1> getAllCategoryList(Cate4Srch cate) {
+		Collection<Cate1> fullCateList = new ArrayList<>();
+
+		// 카테고리1 목록
+		Collection<Cate1> cate1List = displayDao.getCategory1List(cate);
+
+		if (cate1List != null && !cate1List.isEmpty()) {
+			for (Cate1 cate1 : cate1List) {
+				if (cate1.getLeafYn().equals("N")) {
+					cate.setCate1No(cate1.getCate1No());
+
+					// 카테고리2 목록
+					Collection<Cate2> cate2List = displayDao.getCategory2List(cate);
+
+					if (cate2List != null && !cate2List.isEmpty()) {
+						for (Cate2 cate2 : cate2List) {
+							if (cate2.getLeafYn().equals("N")) {
+								cate.setCate2No(cate2.getCate2No());
+
+								// 카테고리3 목록
+								Collection<Cate3> cate3List = displayDao.getCategory3List(cate);
+
+								if (cate3List != null && !cate3List.isEmpty()) {
+									for (Cate3 cate3 : cate3List) {
+										if (cate3.getLeafYn().equals("N")) {
+											cate.setCate3No(cate3.getCate3No());
+
+											// 카테고리4 목록
+											Collection<Cate4> cate4List = displayDao.getCategory4List(cate);
+
+											if (cate4List != null && !cate4List.isEmpty()) {
+												for (Cate4 cate4 : cate4List) {
+													if (cate4.getLeafYn().equals("N")) {
+														cate.setCate4No(cate4.getCate4No());
+
+														// 카테고리5 목록 담기
+														cate4.setCate5List(displayDao.getCategory5List(cate));
+													}
+												}
+
+												// 카테고리4 목록 담기
+												cate3.setCate4List(cate4List);
+											}
+										}
+									}
+
+									// 카테고리3 목록 담기
+									cate2.setCate3List(cate3List);
+								}
+							}
+						}
+
+						// 카테고리2 목록 담기
+						cate1.setCate2List(cate2List);
+					}
+				}
+
+				fullCateList.add(cate1);
+			}
+		}
+
+		return fullCateList;
+	}
+
 }

+ 53 - 0
src/main/java/com/style24/front/biz/service/TsfSocialService.java

@@ -0,0 +1,53 @@
+package com.style24.front.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.front.biz.dao.TsfSocialDao;
+import com.style24.persistence.domain.Social;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 소셜(핫딜) Service
+ *
+ * @author sowon
+ * @since 2021. 3. 11
+ */
+@Service
+@Slf4j
+public class TsfSocialService {
+	
+	@Autowired
+	private TsfSocialDao socialDao;
+	
+	/**
+	 * 소셜(핫딜) 정보
+	 *
+	 * @param
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 3. 11
+	 */
+	public Social getSocialInfo(Social social) {
+		return socialDao.getSocialInfo(social);
+	}
+	
+	/**
+	 * 소셜(핫딜) 상품 리스트
+	 *
+	 * @param
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 3. 11
+	 */
+	public Collection<Social> getSocialGoodsList(Social social) {
+		Social info = new Social();
+		info = socialDao.getSocialInfo(social);
+		social.setSocialSq(info.getSocialSq());
+		return socialDao.getSocialGoodsList(social);
+	}
+
+}

+ 91 - 7
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -24,9 +24,11 @@ import com.style24.front.support.controller.TsfBaseController;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.support.SessionStatus;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 
 
 /**
@@ -234,10 +236,18 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 02. 17
 	 */
-	@GetMapping("password/change/form")
+	@GetMapping("/password/change/form")
 	public ModelAndView passwrodChangeForm(@RequestParam(value = "pageGb")String pageGb) {
 		ModelAndView mav = new ModelAndView();
-		String custNo = TscSession.getAttribute("custNo");
+		String custNo = "";
+
+		if ("find".equals(pageGb)) { //비밀번호 찾기 사용
+			custNo = TscSession.getAttribute("custNo");
+		}
+
+		if ("temp".equals(pageGb)) { // 비밀번호 변경 캠페인, 임시비밀번호로 로그인시 사용
+			custNo = String.valueOf(TsfSession.getInfo().getCustNo());
+		}
 
 		// 고객번호 없으면 인증화면으로 돌아감
 		if (StringUtils.isBlank(custNo)) {
@@ -252,7 +262,7 @@ public class TsfCustomerController extends TsfBaseController {
 		if (custInfo != null) {
 			mav.addObject("custId", custInfo.getCustId());
 		}
-
+		mav.addObject("pageGb", pageGb);
 		mav.setViewName(super.getDeviceViewName("customer/PasswordChangeForm"));
 		return mav;
 	}
@@ -269,8 +279,14 @@ public class TsfCustomerController extends TsfBaseController {
 	@ResponseBody
 	public GagaMap resetPassword(@RequestBody Customer customer) {
 		GagaMap result = new GagaMap();
-		String custNo = TscSession.getAttribute("custNo");
 		boolean isSuccess = false;
+		String custNo = "";
+		if (TsfSession.isLogin()) {
+			custNo = String.valueOf(TsfSession.getInfo().getCustNo());
+		} else {
+			custNo = TscSession.getAttribute("custNo");
+		}
+
 		if (StringUtils.isBlank(custNo)) {
 			throw new IllegalStateException("고객 정보가 없습니다. 다시 확인 해주세요.");
 		}
@@ -687,19 +703,23 @@ public class TsfCustomerController extends TsfBaseController {
 	 */
 	@PostMapping("/dormant/release")
 	@ResponseBody
-	public GagaMap releaseDormantCustomer(@RequestBody Customer customer) {
+	public GagaMap releaseDormantCustomer(@RequestBody Customer customer, HttpSession session) {
 		String custNo = TsfSession.getAttribute("custNo");
 		if (StringUtils.isBlank(custNo) || StringUtils.isBlank(customer.getEncData())) {
-			throw new IllegalStateException("로그인 후 재인증 해주세요.");
+			throw new IllegalStateException("로그인 다시 시도해주세요.");
 		}
+		GagaMap resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+
+		customer.setCi(resultInfo.getString("sCi"));
 		customer.setCustNo(Integer.parseInt(custNo));
+		session.removeAttribute("custNo"); // 고객번호 세션 삭제
 		return customerService.releaseDormantCustomer(customer);
 	}
 
 	/**
 	 * 휴면해제 완료화면
 	 *
-	 * @return ModelAndView - 가입완료 화면
+	 * @return ModelAndView - 휴면해제 완료화면
 	 * @author jsshin
 	 * @since 2021. 03. 08
 	 */
@@ -712,6 +732,70 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 본인인증 화면
+	 *
+	 * @return ModelAndView - 가입완료 화면
+	 * @author jsshin
+	 * @since 2021. 03. 10
+	 */
+	@GetMapping("/certification/form")
+	public ModelAndView getCertificationForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName(super.getDeviceViewName("customer/CertificationForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 본인인증 처리
+	 *
+	 * @param customer - 본인인증키
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	@PostMapping("/certification/save")
+	@ResponseBody
+	public GagaMap saveCertification(@RequestBody Customer customer, HttpSession session) {
+		String custNo = TsfSession.getAttribute("custNo");
+		if (StringUtils.isBlank(custNo) || StringUtils.isBlank(customer.getEncData())) {
+			throw new IllegalStateException("로그인 다시 시도해 주세요.");
+		}
+		GagaMap resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+		customer.setCi(resultInfo.getString("sCi"));
+		customer.setCustNo(Integer.parseInt(custNo));
+		session.removeAttribute("custNo"); // 고객번호 세션 삭제
+		return customerService.saveCertification(customer);
+	}
+
+	/**
+	 * 비밀번호 변경 캠페인 화면
+	 *
+	 * @return ModelAndView - 가입완료 화면
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	@GetMapping("/password/campaign/form")
+	public ModelAndView getPasswordCampaignnForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName(super.getDeviceViewName("customer/PasswordCampaignForm"));
+
+		return mav;
+	}
+
+	@PostMapping("/password/date/update")
+	@ResponseBody
+	public GagaMap updatePasswordDate(@RequestBody Customer customer) {
+		Integer custNo = TsfSession.getInfo().getCustNo();
+		if (custNo == null) {
+			throw new IllegalStateException("로그인 다시 시도해 주세요.");
+		}
+		customer.setCustNo(custNo);
+		return customerService.updatePasswordDate(customer);
+	}
 
 
 

+ 33 - 0
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -48,4 +48,37 @@ public class TsfDisplayController extends TsfBaseController {
 		return mav;
 	}
 
+//	/**
+//	 * GNB 탭 목록
+//	 * @param contents - 컨텐츠 정보
+//	 * @return
+//	 * @throws Exception
+//	 * @author gagamel
+//	 * @since 2020. 3. 11
+//	 */
+//	@GetMapping("/gnb/tap/list")
+//	@ResponseBody
+//	public Collection<Contents> getGnbTapList(Contents contents) {
+//		contents.setContentsLoc("STAB001");
+//
+//		// GNB 브랜드그룹 목록
+//		displayService.getGnbBrandGroupList(contents);
+//
+//		return displayService.getGnbTapList(contents);
+//	}
+
+//	/**
+//	 * 전체 카테고리 목록
+//	 * @return
+//	 * @throws Exception
+//	 * @author gagamel
+//	 * @since 2020. 2. 7
+//	 */
+//	@GetMapping("/all/cate/list")
+//	@ResponseBody
+//	public Collection<Cate4Srch> getAllCategoryList() {
+//		String soldoutGoodsDisplayYn = policyService.getSoldoutGoodsDisplayYn(WfoConstants.SITE_CD);
+//		return displayService.getAllCategoryList(WfoConstants.CATE_GB.BYITEM.value(), soldoutGoodsDisplayYn);
+//	}
+
 }

+ 54 - 0
src/main/java/com/style24/front/biz/web/TsfSocialController.java

@@ -0,0 +1,54 @@
+package com.style24.front.biz.web;
+
+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.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.front.biz.service.TsfSocialService;
+import com.style24.front.support.controller.TsfBaseController;
+import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.Social;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 소셜(핫딜) Controller
+ * 
+ * @author sowon
+ * @since 2021. 3. 11
+ */
+@Controller
+@RequestMapping("/social")
+@Slf4j
+public class TsfSocialController extends TsfBaseController {
+	
+	@Autowired
+	private TsfSocialService socialService;
+	/**
+	 * 소셜(핫딜) 메인 화면
+	 * 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 11
+	 */
+	@GetMapping("/main/form")
+	public ModelAndView socialMainForm(Social social) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		
+		// 디바이스 set
+		social.setFrontGb(TsfSession.getFrontGb());
+		
+		// 소셜(핫딜) 
+		mav.addObject("socialInfo", socialService.getSocialInfo(social));
+		
+		// 소셜(핫딜)-상품목록
+		mav.addObject("socialGoods", socialService.getSocialGoodsList(social));
+	
+		mav.setViewName(super.getDeviceViewName("social/SocialMainForm"));
+		return mav;
+	}
+	
+
+}

+ 30 - 0
src/main/java/com/style24/front/support/env/TsfConstants.java

@@ -22,6 +22,36 @@ public class TsfConstants {
 	// 로그인블락실패건수
 	public static final int LOGIN_BLOCK_FAIL_CNT = 10;
 
+	// 카테고리구분
+	public enum CateGb {
+		BYITEM("G032_101"), BYBRAND("G032_102"), BYOUTLET("G032_103");
+
+		private String value;
+
+		private CateGb(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 카테고리유형
+	public enum CateType {
+		GOODS("G031_10"), CONTENTS("G031_20");
+
+		private String value;
+
+		private CateType(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
 //	// 카테고리구분
 //	public enum CATE_GB {
 //		BYITEM("101"), BYBRAND("102"), BYOUTLET("103");

+ 22 - 0
src/main/java/com/style24/front/support/exception/TsfNonCertificationAccountException.java

@@ -0,0 +1,22 @@
+package com.style24.front.support.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * 비인증 고객 로그인시 발생하는 예외
+ *
+ * @author jsshin
+ * @since 2021. 03. 10
+ */
+@SuppressWarnings("serial")
+public class TsfNonCertificationAccountException extends AuthenticationException {
+
+	public TsfNonCertificationAccountException(String msg) {
+		super(msg);
+	}
+
+	public TsfNonCertificationAccountException(String msg, Throwable t) {
+		super(msg, t);
+	}
+
+}

+ 16 - 2
src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java

@@ -3,8 +3,11 @@ package com.style24.front.support.security;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.gagaframework.web.util.GagaCookieUtil;
+import com.style24.front.support.exception.TsfNonCertificationAccountException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -49,6 +52,11 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 	@Autowired
 	private GagaPasswordEncoder passwordEncoder;
 
+	@Value("${has-ssl}")
+	private String hasSsl;
+
+	private static final int LOGIN_FAIL_COUNT = 5; // 실패누적건수
+
 	@Override
 	public Authentication authenticate(Authentication authentication) throws AuthenticationException {
 		String loginId = authentication.getName();
@@ -78,7 +86,7 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 		}
 
 		// 로그인 실패누적건수가 5회 이상이면
-		if (loginInfo.getLoginFailCnt() >= 5) {
+		if (loginInfo.getLoginFailCnt() >= LOGIN_FAIL_COUNT) {
 			throw new TsfLockedAccountException(message.getMessage("LOGN_0005"));
 		}
 
@@ -93,9 +101,15 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 			}
 		}
 
+		// 본인인증이 필요한 회원
+		if (StringUtils.isBlank(loginInfo.getCi())) {
+			TsfSession.setAttribute("custNo", String.valueOf(loginInfo.getCustNo()));
+			throw new TsfNonCertificationAccountException(message.getMessage("LOGN_0009"));
+		}
+
 		if (TscConstants.CustStat.DORMANT.value().equals(loginInfo.getCustStat())) { // 휴면회원
 
-			// 휴면해제를 위한 고객번호 세선저장
+			// 휴면해제를 위한 고객번호 세저장
 			TsfSession.setAttribute("custNo", String.valueOf(loginInfo.getCustNo()));
 			throw new TsfDormantAccountException(message.getMessage("LOGN_0006"));
 

+ 3 - 0
src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java

@@ -6,6 +6,7 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.style24.front.support.exception.TsfNonCertificationAccountException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.AuthenticationFailureHandler;
@@ -57,6 +58,8 @@ public class TsfLoginFailureHandler implements AuthenticationFailureHandler {
 			result.setString("status", "SESSION_EXPIRED");
 		} else if (exception instanceof TsfEmailDuplicationException) { // SNS용 이메일 중복 시
 			result.setString("status", "EMAIL_DUP");
+		} else if (exception instanceof TsfNonCertificationAccountException){ //본인인증 필요한 회원
+			result.setString("status","CI_EMPTY");
 		} else {
 			result.setString("status", "ETC_ERROR");
 		}

+ 16 - 1
src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java

@@ -45,8 +45,12 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 		"/customer/pwd/find/form",					// 비밀번호찾기
 		"/customer/join/complete/form",				// 회원가입완료
 		"/customer/join/type/form",					// 회원가입유형
-		"/customer/dormant/certify/complete/form"	// 휴면해제
+		"/customer/dormant/certify/complete/form",	// 휴면해제
+		"/customer/certification/form"				// 본인인증화면
 	};
+	private static final int CHANG_PWD_CAMPAIGN_DAY = 90; // 비밀번호 변경 캠페인일자
+
+	private static final String CHANG_TEMP_PWD = "Y";	//임시비밀번호여부
 
 	@Autowired
 	private TsfLoginService loginService;
@@ -112,6 +116,17 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 		// 로그인 후 장바구니 Update
 		cartService.updateCartToAfterLogin(custNo);
 
+		// 비밀번호 변경 캠페인 일자
+		if (loginDetails.getLoginInfo().getPwdChgDay() >= CHANG_PWD_CAMPAIGN_DAY) {
+			returnUrl ="/customer/password/campaign/form";
+		}
+
+		// 임시비밀번호로 로그인 한 경우
+		if (CHANG_TEMP_PWD.equals(loginDetails.getLoginInfo().getTempPasswdYn())) {
+			returnUrl ="/customer/password/change/form?pageGb=temp";
+		}
+
+
 		GagaMap result = new GagaMap();
 		result.setString("status", "OK");
 		result.setString("returnUrl", returnUrl);

+ 28 - 0
src/main/java/com/style24/persistence/domain/BrandGroup.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 컨텐츠 Domain
+ * 
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+@Builder
+public class BrandGroup extends TscBaseDomain {
+
+	private String title;			// 브랜드그룹타이틀
+	private Integer brandGroupNo;	// 브랜드그룹번호
+	private String brandGroupEnm;	// 브랜드그룹영문명
+	private String brandGroupKnm;	// 브랜드그룹한글명
+	private String brandGroupNm;	// 전시브랜드그룹명
+	private String logoFileNm;		// 로고파일명
+	private int dispOrd;			// 표시순서
+	private String rgbCd;			// RGB코드(front 브랜드메인 GNB 색상)
+
+}

+ 37 - 0
src/main/java/com/style24/persistence/domain/Cate1.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리1 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate1 extends TscBaseDomain {
+
+	private Integer cate1No;
+	private String cate1Nm;
+	private String siteCd;
+	private String cateGb;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	// 카테고리2 목록
+	private Collection<Cate2> cate2List;
+
+	// 카테고리1의 배너 목록
+	private Collection<Contents> bannerList;
+
+}

+ 34 - 0
src/main/java/com/style24/persistence/domain/Cate2.java

@@ -0,0 +1,34 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리2 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate2 extends TscBaseDomain {
+
+	private Integer cate2No;
+	private String cate2Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	private Collection<Cate3> cate3List;
+
+}

+ 35 - 0
src/main/java/com/style24/persistence/domain/Cate3.java

@@ -0,0 +1,35 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리3 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate3 extends TscBaseDomain {
+
+	private Integer cate3No;
+	private String cate3Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private Integer cate2No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	private Collection<Cate4> cate4List;
+
+}

+ 36 - 0
src/main/java/com/style24/persistence/domain/Cate4.java

@@ -0,0 +1,36 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리4 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate4 extends TscBaseDomain {
+
+	private Integer cate4No;
+	private String cate4Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private Integer cate2No;
+	private Integer cate3No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	private Collection<Cate5> cate5List;
+
+}

+ 2 - 0
src/main/java/com/style24/persistence/domain/Cate4Srch.java

@@ -35,4 +35,6 @@ public class Cate4Srch extends TscBaseDomain {
 	private String formalGb;
 	private String contentsLoc;
 
+	private Integer brandGroupNo;	// 브랜드그룹번호
+
 }

+ 33 - 0
src/main/java/com/style24/persistence/domain/Cate5.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리5 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate5 extends TscBaseDomain {
+
+	private Integer cate5No;
+	private String cate5Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private Integer cate2No;
+	private Integer cate3No;
+	private Integer cate4No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+}

+ 67 - 0
src/main/java/com/style24/persistence/domain/Contents.java

@@ -0,0 +1,67 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 컨텐츠 Domain
+ * 
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+@Builder
+public class Contents extends TscBaseDomain {
+
+	private Integer preContentsSq;	// 컨텐츠미리보기일련번호
+	private Integer contentsSq;		// 컨텐츠일련번호
+	private Integer cateNo;			// 카테고리번호
+	private String contentsLoc;		// 컨텐츠위치
+	private String contentsType;	// 컨텐츠유형
+	private String dispStdt;		// 전시시작일시
+	private String dispEddt;		// 전시종료일시
+	private int dispOrd;			// 표시순서
+	private String imgPath1;		// 이미지경로1
+	private String imgPath2;		// 이미지경로2
+	private String imgPath3;		// 이미지경로3
+	private String imgPath4;		// 이미지경로4
+	private String imgPath5;		// 이미지경로5
+	private String imgPath6;		// 이미지경로6
+	private String imgPath7;		// 이미지경로7
+	private String imgPath8;		// 이미지경로8
+	private String strVar1;			// 링크필드1
+	private String strVar2;			// 링크필드2
+	private String strVar3;			// 링크필드3
+	private String strVar4;			// 링크필드4
+	private String strVar5;			// 링크필드5
+	private String strVar6;			// 링크필드6
+	private String strVar7;			// 링크필드7
+	private String strVar8;			// 링크필드8
+	private String strTitle1;		// 제목필드1
+	private String strTitle2;		// 제목필드2
+	private String strTitle3;		// 제목필드3
+	private String strTitle4;		// 제목필드4
+	private String subText1;		// 서브텍스트1
+	private String subText2;		// 서브텍스트2
+	private String subText3;		// 서브텍스트3
+	private String subText4;		// 서브텍스트4
+	private String brandGroupNo;	// 브랜드그룹번호
+	private String brandGroupImg;	// 브랜드그룹이미지경로
+	private String mdTitle;			// MD타이틀
+
+	private String viewDt;			// 미리보기일시
+	private String preview;			// 미리보기여부
+	private int maxRow;				// 최대ROW
+
+	private Collection<BrandGroup> casualBrandGroupList;	// 캐주얼브랜드그룹목록
+	private Collection<BrandGroup> golfBrandGroupList;		// 골프브랜드그룹목록
+	private Collection<BrandGroup> kidsBrandGroupList;		// 키즈브랜드그룹목록
+
+	private Collection<Cate1> cateList;	// 카테고리목록
+
+}

+ 42 - 0
src/main/java/com/style24/persistence/domain/GnbTab.java

@@ -0,0 +1,42 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 컨텐츠 Domain
+ * 
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+@Builder
+public class GnbTab extends TscBaseDomain {
+
+	private Integer preGtabSq;		// GNB탭미리보기일련번호
+	private Integer gtabSq;			// GNB탭일련번호
+	private String gtabGb;			// GNB탭구분(C:공통GNB, B:브랜드GNB)
+	private String gtabNm;			// GNB탭명
+	private String contentsType;	// 컨텐츠유형(C:카테고리, O:아울렛, L:링크)
+	private Integer cate1No;		// 카테고리1번호
+	private Integer brandGroupNo;	// 브랜드그룹번호
+	private String linkUrl;			// 링크URL
+	private String dispStdt;		// 전시시작일시
+	private String dispEddt;		// 전시종료일시
+	private int dispOrd;			// 표시순서
+
+	private String viewDt;			// 미리보기일시
+	private String preview;			// 미리보기여부
+
+	private Collection<BrandGroup> casualBrandGroupList;	// 캐주얼브랜드그룹목록
+	private Collection<BrandGroup> golfBrandGroupList;		// 골프브랜드그룹목록
+	private Collection<BrandGroup> kidsBrandGroupList;		// 키즈브랜드그룹목록
+
+	private Collection<Cate1> cateList;	// 카테고리목록
+
+}

+ 4 - 1
src/main/java/com/style24/persistence/domain/Login.java

@@ -9,7 +9,7 @@ import lombok.Data;
 
 /**
  * 고객 Domain
- * 		@JsonSerialize 애노테이션을 지정해야 세션을 레디스에 저장할 수 있다.
+ * @JsonSerialize 애노테이션을 지정해야 세션을 레디스에 저장할 수 있다.
  * @author gagamel
  * @since 2019. 12. 4
  */
@@ -43,6 +43,9 @@ public class Login extends TscBaseDomain {
 	private String loginLdt;		// 최종로그인일시
 	private String loginFailYn;		// 로그인실패여부
 	private String custGrade;		// 고객등급
+	private String tempPasswdYn;	// 임시비밀번호여부
+	private int pwdChgDay;			// 비밀번호변경일자
+	private String ci;				// CI(본인인증여부)
 
 	// 암호화 대상 복호화 처리 =================================================
 	public String getCustNm() {

+ 9 - 1
src/main/java/com/style24/persistence/domain/Social.java

@@ -54,7 +54,15 @@ public class Social extends TscBaseDomain{
 		private float dcRate;			// 할인율
 		private float pntPrate;		// PC 포인트 적립율
 		private float pntMrate;		// MOBILE 포인트 적립율
-
+		private int listPrice;		//정상가
+		private String goodsNm;		// 상품이름
+		private String sysImgNm;	//시스템이미지
+		private String goodsTnm;	//상품타이틀
+		private int stockQtySum;	//상품 재고
+		
+		// 브랜드
+		private String brandKnm;	//브랜드이름(한글)
+		private String brandEnm;	//브랜드이름(영어)
 		
 
 		private String excelFileNm;		// 엑셀파일명

+ 44 - 24
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -445,28 +445,27 @@
 	<!-- 위시리스트 등록 -->
 	<insert id="createWishList" parameterType="WishList">
 		/* TsfCustomer.createWishList */
-		INSERT INTO TB_WISHLIST
-		(
-		            CUST_NO
-		          , GOODS_CD
-		          , AF_LINK_CD
-		          , ITHR_CD
-		          , CONTENTS_LOC
-		          , PLAN_DTL_SQ
-		          , REG_NO
-		          , REG_DT
-		         ) VALUES (
-		            #{custNo}
-		          , #{goodsCd}
-		          , #{afLinkCd}
-		          , #{ithrCd}
-		          , #{contentsLoc}
-		          , #{planDtlSq}
-		          , #{regNo}
-		          , NOW()
-		         )
+		INSERT INTO TB_WISHLIST (
+		       CUST_NO
+		     , GOODS_CD
+		     , AF_LINK_CD
+		     , ITHR_CD
+		     , CONTENTS_LOC
+		     , PLAN_DTL_SQ
+		     , REG_NO
+		     , REG_DT
+		) VALUES (
+		       #{custNo}
+		     , #{goodsCd}
+		     , #{afLinkCd}
+		     , #{ithrCd}
+		     , #{contentsLoc}
+		     , #{planDtlSq}
+		     , #{regNo}
+		     , NOW()
+		)
 		ON DUPLICATE KEY UPDATE
-		         REG_DT = NOW()
+		       REG_DT = NOW()
 	</insert>
 
 	<!-- 위시리스트 삭제 -->
@@ -480,18 +479,18 @@
 		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
 		UPPER(#{item})
 		    </foreach>
-		</when>	
+		</when>
 		<otherwise>
 		AND    GOODS_CD = #{goodsCd}
 		</otherwise>
 		</choose>
 	</delete>
-	
+
 	<!-- 위시리스트 삭제 상품 조회 -->
 	<select id="getDeleteGoodsWish" parameterType="int" resultType="String">
 		/* TsfCustomer.getDeleteGoodsWish */
 		SELECT GROUP_CONCAT(GOODS_CD) AS GOODS_CD
-		FROM ( 
+		FROM (
 		      SELECT GOODS_CD , REG_DT
 		           , RANK() OVER(ORDER BY REG_DT DESC) AS RNUM
 		      FROM TB_WISHLIST
@@ -500,4 +499,25 @@
 		WHERE RNUM > 50
 	</select>
 
+
+	<!--본인인증처리-->
+	<update id="updateCustomerCi" parameterType="Customer">
+		/* TsfCustomer.updateCustomerCi */
+		UPDATE TB_CUSTOMER
+		SET    CI = #{ci}
+		     , AUTH_DT = NOW()
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
+	<!--비밀번호 변경 날짜 업데이트-->
+	<update id="updatePasswordDate" parameterType="Customer">
+		UPDATE TB_CUSTOMER
+		SET    PASSWD_CHG_DT = DATE_ADD(NOW(), INTERVAL -#{pwdChangeDay} DAY )
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
 </mapper>

+ 369 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -14,6 +14,375 @@
 		WHERE  NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
 	</sql>
 	
+	<!-- GNB탭 목록 -->
+	<select id="getGnbTabList" parameterType="GnbTab" resultType="GnbTab">
+		/* TsfDisplay.getGnbTabList */
+		SELECT GTAB_GB                                            /*GNB탭구분*/
+		     , GTAB_NM                                            /*GNB탭명*/
+		     , CONTENTS_TYPE                                      /*컨텐츠유형*/
+		     , CATE1_NO                                           /*카테고리1번호*/
+		     , BRAND_GROUP_NO                                     /*브랜드그룹번호*/
+		     , LINK_URL                                           /*링크URL*/
+		     , DATE_FORMAT(DISP_STDT,'%Y%m%d%H%i%S') AS DISP_STDT /*전시시작일시*/
+		     , DATE_FORMAT(DISP_EDDT,'%Y%m%d%H%i%S') AS DISP_EDDT /*전시종료일시*/
+		     , DISP_ORD                                           /*표시순서*/
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		     , PRE_GTAB_SQ                           AS GTAB_SQ   /*GNB탭일련번호*/
+		FROM   TB_GNB_TAB_PREVIEW A
+		    </when>
+		    <otherwise>
+		     , GTAB_SQ                                            /*GNB탭일련번호*/
+		FROM   TB_GNB_TAB A
+		    </otherwise>
+		</choose>
+		WHERE  GTAB_GB = #{gtabGb}
+		AND    USE_YN = 'Y'
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		AND    DISP_STDT <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		AND    DISP_EDDT <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		ORDER  BY DISP_ORD, PRE_GTAB_SQ
+		    </when>
+		    <otherwise>
+		AND    DISP_STDT <![CDATA[<=]]> NOW()
+		AND    DISP_EDDT <![CDATA[>=]]> NOW()
+		ORDER  BY DISP_ORD, GTAB_SQ
+		    </otherwise>
+		</choose>
+	</select>
 	
+	<!-- 컨텐츠 목록 -->
+	<select id="getContentsList" parameterType="Contents" resultType="Contents">
+		/* TsfDisplay.getContentsList */
+		SELECT CONTENTS_SQ     /*컨텐츠일련번호*/
+		     , CATE_NO         /*카테고리번호*/
+		     , CONTENTS_LOC    /*컨텐츠위치*/
+		     , CONTENTS_TYPE   /*컨텐츠유형*/
+		     , DISP_STDT       /*전시시작일시*/
+		     , DISP_EDDT       /*전시종료일시*/
+		     , DISP_ORD        /*표시순서*/
+		     , IMG_PATH1       /*이미지경로1*/
+		     , IMG_PATH2       /*이미지경로2*/
+		     , IMG_PATH3       /*이미지경로3*/
+		     , IMG_PATH4       /*이미지경로4*/
+		     , IMG_PATH5       /*이미지경로5*/
+		     , IMG_PATH6       /*이미지경로6*/
+		     , IMG_PATH7       /*이미지경로7*/
+		     , IMG_PATH8       /*이미지경로8*/
+		     , STR_VAR1        /*링크필드1*/
+		     , STR_VAR2        /*링크필드2*/
+		     , STR_VAR3        /*링크필드3*/
+		     , STR_VAR4        /*링크필드4*/
+		     , STR_VAR5        /*링크필드5*/
+		     , STR_VAR6        /*링크필드6*/
+		     , STR_VAR7        /*링크필드7*/
+		     , STR_VAR8        /*링크필드8*/
+		     , STR_TITLE1      /*제목필드1*/
+		     , STR_TITLE2      /*제목필드2*/
+		     , STR_TITLE3      /*제목필드3*/
+		     , STR_TITLE4      /*제목필드4*/
+		     , SUB_TEXT1       /*서브텍스트1*/
+		     , SUB_TEXT2       /*서브텍스트2*/
+		     , SUB_TEXT3       /*서브텍스트3*/
+		     , SUB_TEXT4       /*서브텍스트4*/
+		     , BRAND_GROUP_NO  /*브랜드그룹번호*/
+		     , BRAND_GROUP_IMG /*브랜드그룹이미지경로*/
+		     , MD_TITLE        /*MD타이틀*/
+		FROM   (
+		        SELECT CATE_NO                                            /*카테고리번호*/
+		             , CONTENTS_LOC                                       /*컨텐츠위치*/
+		             , CONTENTS_TYPE                                      /*컨텐츠유형*/
+		             , DATE_FORMAT(DISP_STDT,'%Y%m%d%H%i%S') AS DISP_STDT /*전시시작일시*/
+		             , DATE_FORMAT(DISP_EDDT,'%Y%m%d%H%i%S') AS DISP_EDDT /*전시종료일시*/
+		             , DISP_ORD                                           /*표시순서*/
+		             , IMG_PATH1                                          /*이미지경로1*/
+		             , IMG_PATH2                                          /*이미지경로2*/
+		             , IMG_PATH3                                          /*이미지경로3*/
+		             , IMG_PATH4                                          /*이미지경로4*/
+		             , IMG_PATH5                                          /*이미지경로5*/
+		             , IMG_PATH6                                          /*이미지경로6*/
+		             , IMG_PATH7                                          /*이미지경로7*/
+		             , IMG_PATH8                                          /*이미지경로8*/
+		             , STR_VAR1                                           /*링크필드1*/
+		             , STR_VAR2                                           /*링크필드2*/
+		             , STR_VAR3                                           /*링크필드3*/
+		             , STR_VAR4                                           /*링크필드4*/
+		             , STR_VAR5                                           /*링크필드5*/
+		             , STR_VAR6                                           /*링크필드6*/
+		             , STR_VAR7                                           /*링크필드7*/
+		             , STR_VAR8                                           /*링크필드8*/
+		             , STR_TITLE1                                         /*제목필드1*/
+		             , STR_TITLE2                                         /*제목필드2*/
+		             , STR_TITLE3                                         /*제목필드3*/
+		             , STR_TITLE4                                         /*제목필드4*/
+		             , SUB_TEXT1                                          /*서브텍스트1*/
+		             , SUB_TEXT2                                          /*서브텍스트2*/
+		             , SUB_TEXT3                                          /*서브텍스트3*/
+		             , SUB_TEXT4                                          /*서브텍스트4*/
+		             , BRAND_GROUP_NO                                     /*브랜드그룹번호*/
+		             , BRAND_GROUP_IMG                                    /*브랜드그룹이미지경로*/
+		             , MD_TITLE                                           /*MD타이틀*/
+		        <choose>
+		            <when test='preview != null and preview == "Y"'>
+		             , PRE_CONTENTS_SQ                       AS CONTENTS_SQ /*컨텐츠일련번호*/
+		             -- , RANK() OVER(PARTITION BY CATE_NO, CONTENTS_LOC
+		             --               ORDER BY CATE_NO, DISP_ORD, PRE_CONTENTS_SQ) AS NUMB
+		        FROM   TB_CONTENTS_PREVIEW A
+		            </when>
+		            <otherwise>
+		             , CONTENTS_SQ
+		             -- , RANK() OVER (PARTITION BY CATE_NO, CONTENTS_LOC
+		             --               ORDER BY CATE_NO, DISP_ORD, CONTENTS_SQ) AS NUMB
+		        FROM   TB_CONTENTS A
+		            </otherwise>
+		        </choose>
+		        WHERE  CONTENTS_LOC = #{contentsLoc}
+		        AND    USE_YN = 'Y'
+		        <if test="cateNo != null and cateNo != ''">
+		        AND    CATE_NO = #{cateNo}
+		        </if>
+		        <choose>
+		            <when test='preview != null and preview == "Y"'>
+		        AND    DISP_STDT <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        AND    DISP_EDDT <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        AND    IFNULL((SELECT DISP_EDDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		                     ) <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        AND    IFNULL((SELECT DISP_STDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		                     ) <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        ORDER  BY CONTENTS_LOC, DISP_ORD, PRE_CONTENTS_SQ
+		            </when>
+		            <otherwise>
+		        AND    DISP_STDT <![CDATA[<=]]> NOW()
+		        AND    DISP_EDDT <![CDATA[>=]]> NOW()
+		        AND    IFNULL((SELECT DISP_EDDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),NOW()
+		                     ) <![CDATA[>=]]> NOW()
+		        AND    IFNULL((SELECT DISP_STDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),NOW()
+		                     ) <![CDATA[<=]]> NOW()
+		        ORDER  BY CONTENTS_LOC, DISP_ORD, CONTENTS_SQ
+		            </otherwise>
+		        </choose>
+		       )
+		<if test="maxRow != null and maxRow > 0">
+		LIMIT #{maxRow}
+		</if>
+	</select>
+	
+	<!-- GNB 브랜드그룹 목록 -->
+	<select id="getGnbBrandGroupList" parameterType="Contents" resultType="BrandGroup">
+		/* TsfDisplay.getGnbBrandGroupList */
+		SELECT B.STR_TITLE1     AS TITLE
+		     , A.BRAND_GROUP_NO
+		     , CASE WHEN A.DISP_NM_LANG = 'EN' THEN A.BRAND_GROUP_ENM
+		            ELSE A.BRAND_GROUP_KNM
+		       END              AS BRAND_GROUP_NM
+		     , A.LOGO_FILE_NM
+		     , B.DISP_ORD
+		FROM   TB_BRAND_GROUP A
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		     , TB_CONTENTS_PREVIEW B
+		    </when>
+		    <otherwise>
+		     , TB_CONTENTS B
+		    </otherwise>
+		</choose>
+		WHERE  A.BRAND_GROUP_NO = B.STR_VAR1
+		AND    A.USE_YN = 'Y'
+		AND    B.CONTENTS_LOC = 'STAB001'
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		AND    B.DISP_STDT <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		AND    B.DISP_EDDT <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		ORDER  BY B.DISP_ORD, B.PRE_CONTENTS_SQ
+		    </when>
+		    <otherwise>
+		AND    B.DISP_STDT <![CDATA[<=]]> NOW()
+		AND    B.DISP_EDDT <![CDATA[>=]]> NOW()
+		ORDER  BY B.DISP_ORD, B.CONTENTS_SQ
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- 카테고리1 목록 -->
+	<select id="getCategory1List" parameterType="Cate4Srch" resultType="Cate1">
+		/* TsfDisplay.getCategory1List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE1_NM
+		     , LEAF_YN
+		FROM   TB_CATE1 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		<if test="cate1No != null and cate1No != ''">
+		AND    CATE1_NO = #{cate1No}
+		</if>
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE1_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 카테고리2 목록 -->
+	<select id="getCategory2List" parameterType="Cate4Srch" resultType="Cate2">
+		/* TsfDisplay.getCategory2List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE2_NM
+		     , LEAF_YN
+		FROM   TB_CATE2 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE2_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 카테고리3 목록 -->
+	<select id="getCategory3List" parameterType="Cate4Srch" resultType="Cate3">
+		/* TsfDisplay.getCategory3List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE3_NM
+		     , LEAF_YN
+		FROM   TB_CATE3 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    CATE2_NO = #{cate2No} /*카테고리2번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE3_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 카테고리4 목록 -->
+	<select id="getCategory4List" parameterType="Cate4Srch" resultType="Cate4">
+		/* TsfDisplay.getCategory4List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE4_NM
+		     , LEAF_YN
+		FROM   TB_CATE4 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    CATE2_NO = #{cate2No} /*카테고리2번호*/
+		AND    CATE3_NO = #{cate3No} /*카테고리3번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE4_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 카테고리5 목록 -->
+	<select id="getCategory5List" parameterType="Cate4Srch" resultType="Cate5">
+		/* TsfDisplay.getCategory5List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE5_NM
+		     , CATE5_NM
+		     , LEAF_YN
+		FROM   TB_CATE5 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    CATE2_NO = #{cate2No} /*카테고리2번호*/
+		AND    CATE3_NO = #{cate3No} /*카테고리3번호*/
+		AND    CATE4_NO = #{cate4No} /*카테고리4번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE5_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
 
 </mapper>

+ 20 - 17
src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml

@@ -5,33 +5,36 @@
 	<!-- 로그인체크 정보 조회 -->
 	<select id="getLoginCheckInfo" parameterType="Login" resultType="Login">
 		/* TsfLogin.getLoginCheckInfo */
-		SELECT CUST_NO                                          /*고객번호*/
-		     , CUST_ID                                          /*고객ID*/
-		     , CUST_NM                                          /*고객명*/
-		     , PASSWD                                           /*비밀번호*/
-		     , CUST_GB                                          /*고객구분*/
-		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM     /*고객구분명*/
-		     , CUST_STAT                                        /*회원상태*/
-		     , CELL_PHNNO                                       /*휴대전화번호*/
-		     , EMAIL                                            /*이메일*/
-		     , #{snsType}                     AS SNS_TYPE       /*SNS유형*/
-		     , #{snsId}                       AS SNS_ID         /*SNS가입ID*/
+		SELECT CUST_NO                                                 /*고객번호*/
+		     , CUST_ID                                                 /*고객ID*/
+		     , CUST_NM                                                 /*고객명*/
+		     , PASSWD                                                  /*비밀번호*/
+		     , CUST_GB                                                 /*고객구분*/
+		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM            /*고객구분명*/
+		     , CUST_STAT                                               /*회원상태*/
+		     , CELL_PHNNO                                              /*휴대전화번호*/
+		     , EMAIL                                                   /*이메일*/
+		     , #{snsType}                     AS SNS_TYPE              /*SNS유형*/
+		     , #{snsId}                       AS SNS_ID                /*SNS가입ID*/
 		     , IFNULL((SELECT LOGIN_FAIL_CNT
 		               FROM   TB_LOGIN_FAIL
 		               WHERE  CUST_ID = #{custId}
 		               AND    IP_ADDR = #{ipAddr}
 		               AND    SITE_CD = #{siteCd}
-		              ),0)                    AS LOGIN_FAIL_CNT /*로그인실패건수*/
+		              ),0)                    AS LOGIN_FAIL_CNT         /*로그인실패건수*/
+		     , TEMP_PASSWD_YN                                           /*임시비밀번호여부*/
+		     , IFNULL(DATEDIFF(NOW(), PASSWD_CHG_DT), 0) AS PWD_CHG_DAY /*비밀번호변경일자*/
+		     , CI                                                       /*CI본인인증여부*/
 		FROM   TB_CUSTOMER A
 		WHERE  1 = 1
 		<choose>
 		    <when test="snsType != null and snsType != ''"> <!-- SNS 로그인  -->
 		AND    CUST_NO = (
-		               SELECT CUST_NO
-		               FROM TB_CUSTOMER_SNS
-		               WHERE SNS_TYPE = #{snsType}
-		               AND   SNS_ID = #{snsId}
-		               )
+		                  SELECT CUST_NO
+		                  FROM   TB_CUSTOMER_SNS
+		                  WHERE  SNS_TYPE = #{snsType}
+		                  AND    SNS_ID = #{snsId}
+		                 )
 		    </when>
 		    <when test="custNo != null and custNo != ''">
 		AND    CUST_NO = #{custNo}

+ 74 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.front.biz.dao.TsfSocialDao">
+	<select id="getSocialInfo" resultType="Social" parameterType="Social">
+		<!-- TsfSocial.getSocialInfo -->
+		SELECT A.SOCIAL_SQ
+		     , A.SOCIAL_NM
+		     , A.SOCIAL_TYPE
+		     , A.SITE_CD
+		     , A.FRONT_GB
+		     , A.SOCIAL_STDT
+		     , A.SOCIAL_EDDT
+		     , A.SOCIAL_TNM
+		     , A.USE_YN
+		     , A.APPLY_GB
+		FROM TB_SOCIAL A 
+		WHERE 1=1
+		  AND NOW() BETWEEN A.SOCIAL_STDT AND A.SOCIAL_EDDT 
+		  AND A.USE_YN = 'Y'			     		/*사용여부*/
+		  AND A.APPLY_GB = 'A'						 /*적용구분(P:대기,A:적용,F:종료)*/
+		  AND A.FRONT_GB IN ('A',#{frontGb}) 		 /*프론트 구분*/
+		<!-- ORDER BY A.REG_DT DESC LIMIT 1 -->
+	</select>
+	
+	<select id="getSocialGoodsList" resultType="Social" parameterType="Social">
+		SELECT F.* 
+			 ,  (CASE WHEN F.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = F.GOODS_CD) 
+			    ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = F.GOODS_CD) 
+			    END) AS STOCK_QTY_SUM
+			 , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
+			 , CASE IFNULL((SELECT COUNT(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ),0) 
+			            WHEN 0 THEN 'N'
+			            ELSE 'Y' END AS GOODS_IMAGE_YN
+			FROM
+			(   
+				 SELECT A.SOCIAL_SQ
+				     , A.SOCIAL_NM
+				     , A.SOCIAL_TYPE
+				     , A.SITE_CD
+				     , A.FRONT_GB
+				     , A.SOCIAL_STDT
+				     , A.SOCIAL_EDDT
+				     , A.SOCIAL_TNM
+				     , A.USE_YN
+				     , A.APPLY_GB
+				     , A.REG_DT 
+				     , B.GOODS_CD 
+				     , B.CURR_BPRICE 
+				     , B.CURR_APRICE 
+				     , B.DC_BRATE 
+				     , B.DC_ARATE 
+				     , B.DEL_YN 
+				     , B.DISP_ORD 
+				     , C.GOODS_NM 
+				     , C.GOODS_TYPE 
+				     , C.GOODS_TNM 
+				     , C.LIST_PRICE
+				     , C.MAIN_COLOR_CD 
+				     , D.BRAND_KNM 
+				     , D.BRAND_ENM 
+				FROM TB_SOCIAL A INNER JOIN tb_social_goods B ON A.SOCIAL_SQ = B.SOCIAL_SQ 
+				                 INNER JOIN TB_GOODS C ON B.GOODS_CD = C.GOODS_CD 
+				                 INNER JOIN TB_BRAND D ON C.BRAND_CD = D.BRAND_CD
+				WHERE 1=1
+				  AND NOW() BETWEEN A.SOCIAL_STDT AND A.SOCIAL_EDDT 
+				  AND A.USE_YN = 'Y'		    		 /*사용여부*/
+				  AND A.APPLY_GB = 'A'					 /*적용구분(P:대기,A:적용,F:종료)*/
+				  AND A.FRONT_GB IN ('A',#{frontGb})	 /*프론트 구분*/
+				  AND B.DEL_YN = 'N'
+				ORDER BY B.DISP_ORD 
+			)F
+			WHERE F.SOCIAL_SQ = #{socialSq}
+	</select>
+</mapper>

+ 2 - 0
src/main/resources/i18n/messages/message_ko_KR.properties

@@ -32,6 +32,8 @@ LOGN_0005=\uBE44\uBC00\uBC88\uD638\uAC00 5\uD68C \uC774\uC0C1 \uD2C0\uB824 \uACC
 LOGN_0006=\uD734\uBA74 \uD68C\uC6D0\uC785\uB2C8\uB2E4.
 LOGN_0007=\uD0C8\uD1F4 \uD68C\uC6D0\uC785\uB2C8\uB2E4.
 LOGN_0008=\uC774\uBBF8 \uAC00\uC785\uD558\uC2E0 \uC774\uBA54\uC77C\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.
+LOGN_0009=\uBCF8\uC778\uC778\uC99D\uC774 \uD544\uC694\uD55C \uD68C\uC6D0\uC785\uB2C8\uB2E4.
+
 
 ##\uC7A5\uBC14\uAD6C\uB2C8
 CART_0001=\uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uB2F4\uACBC\uC2B5\uB2C8\uB2E4.

+ 9 - 1
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -163,12 +163,20 @@
 								cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
 							}
 						});
-
 						return;
 					} else if (result.status == 'SECEDE_CUST') {
 						// 탈퇴회원
 					} else if (result.status == 'SESSION_EXPIRED') {
 						// 세션만료
+					} else if (result.status == 'CI_EMPTY') {
+						// 본인이증 필요한 회원
+						mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
+							sureBtnText: "확인",
+							sureBtnClick: function() {
+								cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
+							}
+						});
+						return;
 					}
 
 					if (!gagajf.isNull(result.message)) {

+ 1 - 1
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html

@@ -96,7 +96,7 @@
 				</ul>
 				<ul class="bundle" id="nav3">
 					<li class="active" ><a href="#">베스트</a></li>
-					<li><a href="#">핫딜</a></li>
+					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_SOCIAL_MAIN);" title="핫딜 바로가기">핫딜</a></li>
 					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);" title="기획전 바로가기">기획전</a></li>
 					<li><a href="#">총알배송</a></li>
 					<li><a href="#">아울렛</a></li>

+ 471 - 0
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb2.html

@@ -0,0 +1,471 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GnbWeb.html
+ * @desc    : GNB
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.28   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<header id="header" th:fragment="gnb">
+
+	<!-- head start -->
+	<div class="common_header">
+		<!-- 프로모션 띠 배너 등록 시 노출 -->
+		<div class="hd_top_banner" style="background-color:#fd4801;">
+			<a href="" class="t_bnr">
+				<span style="margin:0 auto;height:60px;line-height:60px;font-size: 20px;font-weight: 600;letter-spacing: -.025em; color:#fff;">APP 수신동의 하면 1만 포인트 증정!</span>
+				<!--<img src="ABC.jpg" alt="프로모션"/>-->
+			</a>
+		</div>
+		<!-- //프로모션 띠 배너 등록 시 노출 -->
+	
+		<div class="area">
+			<div class="logo">
+				<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">
+					<h1>
+						<i class="ico ico_logo"></i>
+						<em class="blind">STYLE24</em>
+					</h1>
+				</a>
+			</div>
+			<div class="util_group">
+				<span th:if="${sessionInfo == null}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_LOGIN);" title="로그인 바로가기">로그인</a></span>
+				<span th:if="${sessionInfo != null}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_LOGOUT);" title="로그아웃">로그아웃</a></span>
+				<span th:if="${sessionInfo == null}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN_TYPE);" title="회원가입 바로가기">회원가입</a></span>
+				<span><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE);" title="마이페이지 바로가기">마이페이지</a></span>
+			</div>
+		</div>
+		
+		<div class="gnb">
+			<!-- nav -->
+			<div class="nav">
+				<ul class="bundle btn_home">
+					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);" class="">홈</a></li>
+				</ul>
+			
+				<ul class="bundle">
+					<li class="has_depth">
+						<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ALL_BRAND);">브랜드</a>
+						<!-- 브랜드_depth -->
+						<div class="depth_menu brand">
+							<div class="head_category">
+								<div class="tit">
+									<p>브랜드</p>
+									<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ALL_BRAND);" class="more">전체보기</a>
+								</div>
+								<div class="menu" id="divBrandGrp">
+								</div>
+							</div>
+						</div>
+					</li>
+				</ul>
+				
+				<ul class="bundle" id="divCate">
+				</ul>
+				
+				<ul class="bundle" id="category3">
+					<li class="active" ><a href="#">베스트</a></li>
+				<li><a href="#">핫딜</a></li>
+				<li><a href="#">기획전</a></li>
+				<li><a href="#">총알배송</a></li>
+				<li class="has_depth">
+					<a href="#">아울렛</a>
+					<!-- depth_menu start -->
+					<div class="depth_menu category">
+						<div class="head_category">
+							<div class="tit">
+								<p>아울렛</p>
+								<a href="" class="more">전체보기</a>
+							</div>
+							<div class="menu">
+								<ul class="maintabs">
+									<li><a href="javascript:;">티셔츠/셔츠</a></li>
+									<li>
+										<a href="javascript:;">여성</a>
+										<!-- 2depth -->
+										<ul class="box_depth2">
+											<li>
+												<a href="/">상의</a>
+											</li>
+											<li>
+												<a href="/">하의</a>
+												<!-- 3depth -->
+												<ul class="box_depth3">
+													<li><a href="/">상의</a></li>
+													<li><a href="/">하의</a></li>
+													<li><a href="/">세트</a></li>
+													<li><a href="/">시즌스포츠의류</a></li>
+													<li>
+														<a href="/">스포츠잡화</a>
+														<!-- 4depth -->
+														<ul class="box_depth4">
+															<li><a href="/">운동화/등산화</a></li>
+															<li><a href="/">가방/모자/잡화</a></li>
+														</ul> 
+													</li>
+												</ul>                
+											</li>
+											<li>
+												<a href="/">세트</a>
+											</li>
+											<li>
+												<a href="/">시즌스포츠의류</a>
+											</li>
+											<li>
+												<a href="javascript:;">스포츠잡화</a>
+											</li>
+										</ul>    
+									</li>
+									<li>
+										<a href="">원피스/스커트</a>
+									</li>
+									<li><a href="">팬츠/레깅스</a></li>
+									<li><a href="">데님</a></li>
+									<li><a href="">자켓/점퍼/코트</a></li>
+									<li><a href="">트레이닝/스포츠</a></li>
+									<li><a href="">여성잡화</a></li>
+									<li><a href="">언더웨어</a></li>
+								</ul>   
+							</div>
+						</div>
+						<div class="head_banner">
+							<div class="tit">
+								<p>가을의 신상 만나기</p>
+							</div>
+							<div class="list">
+								<ul class="clear event_con">
+									<li>
+										<a href="">
+											<div class="ev_img"><img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션"></div>
+											<div class="txt">
+												<p class="tit">2020 FALL COLLECTION 가을에는 이 컬러 2020 FALL COLLECTION 가을에는 이 컬러</p>
+											</div>
+										</a>
+									</li>
+									<li>
+										<a href="">
+											<div class="ev_img"><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP">
+											</div>
+											<div class="txt">
+												<p class="tit">FALL NEW ARRIVAL</p>
+											</div>
+										</a>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+					<!-- //depth_menu end -->
+				</li>
+				<li><a href="#">룩북</a></li>
+				<li><a href="#">이벤트/혜택</a></li>
+				</ul>
+			</div>
+			<!-- // nav -->
+
+			<!-- search -->
+			<div class="search">
+				<div class="area">
+					<form id="searchMainForm" name="searchMainForm">
+						<fieldset>  
+							<legend>통합검색</legend>
+							<input type="text" id="search" name="search" value="" placeholder="모이몰론, 남들보다 빠르게! 신상 check" class="search_input" title="검색어 입력" maxlength="100">								
+							<div class="search_group" id="ark" style="display: none;">
+								<div id="ark_down" style="position: absolute; display: block; cursor: pointer; top: 3px; left: 366px;"></div>
+								<div id="ark_up" style="position: absolute; display: none; cursor: pointer; top: 3px; left: 366px;"></div>
+								<div class="area">
+									<p class="blind">연관검색</p>
+									<div class="search_list">
+										<div id="ark_content_list" style="width: 410px;"></div>
+										<div id="ark_category_list" class="category"></div>
+										<div id="ark_event_list" class="exhibition"></div>
+										<div id="ark_powerdeal_list"></div>
+									</div>
+									<div class="close">
+										<a href="#" class="search_close">닫기<i class="ico ico_search_close_gray"><em>닫기</em></i></a>
+									</div>
+								</div>
+							</div>
+							<!-- 검색어 입력전 -->
+							<div id="mykeyword" class="my_search_group sch_auto" style="display: none;">
+								<p class="blind">인기 검색어 &amp; 최근 검색어</p>
+								<div class="area">
+									<div class="hot_search_list" id="popkeyword">
+										<p>인기 검색어</p>
+										<ul>
+											<li>
+												<a href="#"><span>1</span>나이키</a>
+											</li>
+											<li>
+												<a href="#"><span>2</span>tamiya</a>
+											</li>
+											<li>
+												<a href="#"><span>3</span>니콘 z6</a>
+											</li>
+											<li>
+												<a href="#"><span>4</span>갤럭시 자켓</a>
+											</li>
+											<li>
+												<a href="#"><span>5</span>아동운동화</a>
+											</li>
+											<li>
+												<a href="#"><span>6</span>타미야</a>
+											</li>
+											<li>
+												<a href="#"><span>7</span>널디</a>
+											</li>
+											<li>
+												<a href="#"><span>8</span>호박목걸이</a>
+											</li>
+											<li>
+												<a href="#"><span>9</span>제시뉴욕</a>
+											</li>
+											<li>
+												<a href="#"><span>10</span>뉴에라</a>
+											</li>
+										</ul>
+									</div>
+									<div class="my_search_list" id="searchkeyword">
+										<p>최근 검색어</p>
+										<button type="button" onclick="removeMyKeyword();">최근 검색어 전체삭제<i class="ico ico_mysearch_delete"></i></button>
+									</div>
+								</div>
+								<div class="close">
+									<a href="#" class="search_close">닫기<i class="ico ico_search_close_gray"><em>닫기</em></i></a>
+								</div>
+							</div>
+							<!-- // 검색어 입력전 -->
+							<button type="button" class="close"><i class="ico ico_search_close"><em>닫기</em></i></button>
+							<button type="button" class="sch_btn" onclick="goSearch();"><i class="ico ico_search"><em>검색</em></i></button>
+						</fieldset>
+					</form>
+				</div>
+
+				<a href="#" class="btn_ico btn_cart" title="장바구니 바로가기"><i class="ico ico_bag"></i><span class="circle_count">99+</span></a>
+				
+			</div>
+			<!-- // search -->
+		</div>
+	</div>
+	<!-- head end -->
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 탭 > 브랜드 생성
+	let fnCreateBrandGroup = function(brandGrpList) {
+		let tag = '';
+		
+		if (brandGrpList.length > 0) {
+			tag += '<div class="row">\n';
+			tag += '	<p>캐주얼</p>\n';
+			tag += '	<div class="brand_list swiper-container">\n';
+			tag += '		<ul class="clear swiper-wrapper">\n';
+			
+			$.each(brandGrpList, function(idx, item) {
+				tag += '			<li class="swiper-slide">\n';
+				tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain(' + item.brandGroupNo + ');">\n';
+				tag += '					<img src="' + _uploadDefaultUrl + item.logoFileNm + '" alt=""/>\n';
+				tag += '					<span><em>' + item.brandGroupNm + '</em></span>\n';
+				tag += '				</a>\n';
+				tag += '			</li>\n';
+			});
+			
+			tag += '		</ul>\n';
+			tag += '	</div>\n';
+			tag += '</div>\n';
+		}
+		
+		return tag;
+	}
+	
+	// 탭 > 카테고리 생성
+	let fnCreateCategory = function(cateList) {
+		let tag = '';
+		
+		if (cateList.length > 0) {
+			$.each(cateList, function(idx1, cate1) {
+				tag += '<li class="has_depth">\n'; //depth_menu 있을 시 has_depth 클래스 추가
+				tag += '	<a href="javascript:void(0);" onclick="cfnGoToCategory(' + cate1.cate1Nm + ');">' + cate1.cate1Nm + '</a>\n';
+				tag += '	<div class="depth_menu category">\n';
+				tag += '		<div class="head_category">\n';
+				tag += '			<div class="tit">\n';
+				tag += '				<p>' + cate1.cate1Nm + '</p>\n';
+				tag += '				<a href="javascript:void(0);" onclick="cfnGoToCategory(' + cate1.cate1No + ');" class="more">전체보기</a>\n';
+				tag += '			</div>\n';
+				
+				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+					tag += '			<div class="menu">\n';
+					tag += '				<ul class="maintabs">\n';
+					
+					$.each(cate1.cate2List, function(idx2, cate2) {
+						tag += '					<li>\n';
+						tag += '						<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate2.cateGb + '\',\'' + cate2.cate1No + '\',\'' + cate2.cate2No + '\');">' + cate2.cate2Nm + '</a>\n';
+						
+						if (cate2.leafYn == 'N' && cate2.cate3List.length > 0) {
+							tag += '						<ul class="box_depth2">\n';
+							
+							$.each(cate2.cate3List, function(idx3, cate3) {
+								tag += '							<li>\n';
+								tag += '								<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate3.cateGb + '\',\'' + cate3.cate1No + '\',\'' + cate3.cate2No + '\',\'' + cate3.cate3No + '\');">' + cate3.cate3Nm + '</a>\n';
+								
+								if (cate3.leafYn == 'N' && cate3.cate4List.length > 0) {
+									tag += '								<ul class="box_depth3">\n';
+								
+									$.each(cate3.cate4List, function(idx4, cate4) {
+										tag += '									<li><a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate4.cateGb + '\',\'' + cate4.cate1No + '\',\'' + cate4.cate2No + '\',\'' + cate4.cate3No + '\',\'' + cate4.cate4No + '\');">' + cate4.cate4Nm + '</a></li>\n';
+									});
+									
+									tag += '								</ul>\n';
+								}
+								
+								tag += '							</li>\n';
+							});
+							
+							tag += '						</ul>\n';
+						}
+						
+						tag += '					</li>\n';
+					});
+					
+					tag += '				</ul>\n';
+					tag += '			</div>\n';
+					tag += '		</div>\n';
+					tag += '	</div>\n';
+				}
+				
+				if (cate1.bannerList.length > 0) {
+					tag += '	<div class="head_banner">\n';
+					tag += '		<div class="tit">\n';
+					tag += '			<p>가을의 신상 만나기</p>\n';
+					tag += '		</div>\n';
+					tag += '		<div class="list">\n';
+					tag += '			<ul class="clear event_con">\n';
+					tag += '				<li>\n';
+					tag += '					<a href="">\n';
+					tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션"></div>\n';
+					tag += '						<div class="txt">\n';
+					tag += '							<p class="tit">2020 FALL COLLECTION 가을에는 이 컬러 2020 FALL COLLECTION 가을에는 이 컬러</p>\n';
+					tag += '						</div>\n';
+					tag += '					</a>\n';
+					tag += '				</li>\n';
+					tag += '				<li>\n';
+					tag += '					<a href="">\n';
+					tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP"></div>\n';
+					tag += '						<div class="txt">\n';
+					tag += '							<p class="tit">FALL NEW ARRIVAL</p>\n';
+					tag += '						</div>\n';
+					tag += '					</a>\n';
+					tag += '				</li>\n';
+					tag += '			</ul>\n';
+					tag += '		</div>\n';
+					tag += '	</div>\n';
+				}
+				
+				tag += '</li>\n';
+			});
+		}
+		
+		return tag;
+	}
+	
+	// 탭 목록
+	let fnTapList = function() {
+		$.getJSON('/display/tap/list'
+			, function(result, status) {
+				if (status == 'success') {
+					$.each(result, function(idx, item) {
+						if (item.contentsType == 'B') { // 컨텐츠유형:브랜드
+							$('#divBrandGrp').html('');
+							$('#divBrandGrp').append(fnCreateBrandGroup(item.casualBrandGroupList));
+							$('#divBrandGrp').append(fnCreateBrandGroup(item.golfBrandGroupList));
+							$('#divBrandGrp').append(fnCreateBrandGroup(item.kidsBrandGroupList));
+						} else if (item.contentsType == 'C') { // 컨텐츠유형:카테고리
+							$('#divCate').html('');
+							$('#divCate').append(fnCreateCategory(item.cateList));
+						}
+					});
+				}
+			});
+	}
+	
+	$(document).ready(function() {
+		//검색창 호출
+		$(".common_search").load("sch_layer_pop.html");
+		
+		// GNB toggle
+		$(document).on('mouseenter','.common_header .gnb .nav > ul > li',function(e){
+			if(!$(this).hasClass('has_depth')){
+				$('.black_screen').hide();
+				$('.common_header .gnb .depth_menu').hide();
+			} else if($(this).hasClass('has_depth')){
+				$('.black_screen').show();
+				$(this).find('.depth_menu').show();
+				$(this).parents('ul').siblings('ul').find('li.has_depth .depth_menu').hide();
+				$(this).siblings('li.has_depth').find('.depth_menu').hide();
+			}
+		}).on('mouseleave','.common_header .gnb',function(e){
+			$('.black_screen').hide();
+			$('.common_header .gnb .depth_menu').hide();
+		});
+
+		// GNB 하위메뉴
+		$(document).on('mouseenter','.common_header .maintabs li',function(e){
+			if($(this).find('> ul').length > 0){
+				$(this).addClass('on');
+			}
+			$(this).find('> ul').show();
+			$(this).siblings('li').find('> ul').hide();
+		});
+
+		// GNB 더보기
+		$(document).on('click','.more_category .btn_more_cate',function(e){
+			$(this).parent('.more_category').toggleClass('on');
+			$(this).parent('.more_category').find('.cate_list').toggle();
+			return false;
+		});
+
+		// GNB - 슬라이드 > 브랜드_GNB
+		var brand_gnb_slide = new Swiper('#header .gnb .brand_list', {
+			observer: true,
+			observeParents: true,
+			centeredSlides: false,
+			slidesPerView: 'auto',
+			freeMode:true,
+		});
+
+		//통합검색 - 슬라이드 > 지금 고객님들이 많이 보고 있어요 
+		var realtimeItemSwiper = new Swiper('.common_search .realtime_slider .swiper-container', {
+			observer: true,
+			observeParents: true,
+			slidesPerView: 5,
+			spaceBetween: 20,
+			autoplay: {
+				delay: 2500,
+				disableOnInteraction:false,
+			},
+			navigation: {
+				nextEl: '.common_search .realtime_slider .swiper-button-next',
+				prevEl: '.common_search .realtime_slider .swiper-button-prev',
+			},
+			pagination: {
+				el: '.common_search .realtime_slider .swiper-pagination',
+				clickable: true,
+			},
+		});
+		
+		fnTapList();
+	});
+/*]]>*/
+</script>
+
+</header>
+
+</html>

+ 80 - 0
src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : DormantCertifyFormWeb.html
+ * @desc    : 휴면회원 본인인증 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.05   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content dormant"> <!-- 페이지특정 클래스 = dormant -->
+			<div class="cont_head">
+				<h4>본인인증</h4>
+			</div>
+			<div class="cont_body">
+				<form class="form_wrap form_col_c form_full" role="form">
+					<div class="form_info">
+						<span class="ico_content_dormant"></span>
+						<p class="c_primary">본인인증이 필요한 고객이므로 본인인증 해주시기 바랍니다.</p>
+					</div>
+					<div class="btn_group_block">
+						<div class="ui_row">
+							<div class="ui_col_12">
+								<button type="button" class="btn btn_default btn_block" onclick="cfnOpenCellphoneCertify();">
+									<span><i class="ico ico_phone"></i>휴대폰인증</span>
+								</button>
+							</div>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/certification/save', jsonData, fnCertificationCallback);
+		}
+	};
+
+	var fnCertificationCallback = function (result) {
+		if (result.isSuccess) { //인증 성공시 다시 로그인 페이지
+			mcxDialog.alertC("본인인증 완료 되었습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_MAIN);
+				}
+			});
+			return;
+		} else { // 이미 가입된 이력이 있는 경우 완료 페이지
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+		}
+	}
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 5 - 1
src/main/webapp/WEB-INF/views/web/customer/DormantCertifyFormWeb.html

@@ -74,7 +74,11 @@
 		if (result.isRelase) {
 			cfnGoToPage(_PAGE_CUSTOMER_DORMANT_COMPLETE);
 		} else {
-			mcxDialog.alert("휴면해제 실패하였습니다. <br> 고객센터에 문의 하시기 바랍니다.");
+			let msg = "휴면 해제 실패하였습니다. <br> 고객센터에 문의하시기 바랍니다.";
+			if (result.errorType === 'DIFFERENT_CI') {
+				msg = "등록된 본인인증 정보와 다릅니다. <br> 고객센터에 문의하시기 바랍니다.";
+			}
+			mcxDialog.alert(msg);
 			return;
 		}
 	}

+ 80 - 0
src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PasswordCampaignFormWeb.html
+ * @desc    : 비밀번호 캠페인 화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.11   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content campaign"> <!-- 페이지특정 클래스 = campaign -->
+			<div class="cont_head">
+				<h4>비밀번호 변경 캠페인</h4>
+			</div>
+			<div class="cont_body">
+				<form class="form_wrap form_col_c" role="form">
+					<div class="form_info">
+						<span class="ico_content_security"></span>
+						<p class="">고객님! <span class="c_primary">비밀번호 변경</span>으로 <br>소중한 개인정보를 지켜주세요!</p>
+						<p class="c_primary mt5">고객님은 3개월동안 비밀번호를 변경하지 않으셨습니다!</p>
+					</div>
+					<div class="form_summary t_c">
+						<p class="t_info mt10">장기간 비밀번호를 변경하지 않고 동일한 비밀번호를 사용중인 경우,
+							<br> 개인정보를 안전하게 보호하고, 개인정보 도용으로 인한 피해를 방지하기 위해
+							<br>주기적으로 비밀번호를 변경하도록 안내해드리고 있습니다.
+						</p>
+						<p class="t_info mt10">고객님의 소중한 정보 보호를 위해 적극적인 참여 부탁 드립니다.</p>
+					</div>
+					<div class="btn_group_block btn_group_md ui_row">
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_TEMP)">
+								<span>변경하기</span>
+							</button>
+						</div>
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_dark btn_block" id="btnPwdNext">
+								<span>30일간 보지않기</span>
+							</button>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	// 30일간 보지 않기
+	$('#btnPwdNext').on('click', function () {
+		let jsonData = JSON.stringify({});
+		gagajf.ajaxJsonSubmit('/customer/password/date/update', jsonData, fnPwdDateUpdateCallback);
+	});
+
+	var fnPwdDateUpdateCallback = function (result) {
+		cfnGoToPage(_PAGE_MAIN);
+	}
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 10 - 3
src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html

@@ -23,7 +23,8 @@
 	<div class="wrap">
 		<div class="content find">
 			<div class="cont_head">
-				<h4>아이디&#47;비밀번호 찾기</h4>
+				<h4 th:if="${pageGb == 'find'}">아이디&#47;비밀번호 찾기</h4>
+				<h4 th:if="${pageGb == 'temp'}">비밀번호 변경</h4>
 			</div>
 			<div class="cont_body show">
 				<form id="resetPasswordForm" name="resetPasswordForm" class="form_wrap form_col_c" role="form" method="post">
@@ -89,7 +90,8 @@
 						<div class="btn_group_block btn_group_md ui_row">
 							<div class="ui_col_12">
 								<button type="button" id="btnSavePassword" class="btn btn_dark btn_block" disabled="disabled">
-									<span>변경 후 다시 로그인</span>
+									<span th:if="${pageGb == 'find'}">변경 후 다시 로그인</span>
+									<span th:if="${pageGb == 'temp'}">변경하기</span>
 								</button>
 							</div>
 						</div>
@@ -104,6 +106,7 @@
 <script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
+	const pageGb = [[${pageGb}]];
 
 	// 비밀번호 입력
 	$('#resetPasswordForm input[name=passwd]').on('focusout keyup keydown', function () {
@@ -226,7 +229,11 @@
 		mcxDialog.alertC('비밀번호 변경이 완료 되었습니다.', {
 			sureBtnText: "확인",
 			sureBtnClick: function() {
-				cfnGoToPage(_PAGE_LOGIN);
+				if (pageGb === 'find') {
+					cfnGoToPage(_PAGE_LOGIN);
+				} else if (pageGb === 'temp') {
+					cfnGoToPage(_PAGE_MAIN);
+				}
 			}
 		});
 		} else {

+ 120 - 0
src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html

@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : SocialMainFormWeb.html
+ * @desc    : 소셜메인(핫딜메인) Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.11     sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth">핫딜</li>
+			</ul> 
+		</div>
+		<div class="wrap">
+			<div class="content dp_hotdeal"> <!-- 페이지특정 클래스 = dp_hotdeal -->
+				<div class="cont_head">
+					<div>
+                        <h3>[[${socialInfo.socialNm}]]</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                    <div class="hotdeal">
+                        <div id="countdown">
+                            <span id="h-hours"></span>
+                            <span id="h-minutes"></span>
+                            <span id="h-seconds"></span>
+                        </div>
+                    </div>  
+                    <div class="list_content">
+                        <div class="itemsGrp rowtype"> <!-- itemsGrp rank hot deal --> <!-- rowtype 추가시 가로형태로 출력 -->
+                        <th:block th:each="SocialData, SocialStat : ${socialGoods}">
+                            <div th:class="${SocialData.stockQtySum == 0 ? 'item_prod sold_out' : 'item_prod'}" > 
+                                <div class="item_state"> <!-- item_state AD soldout -->
+                                    <a href="#none" class="itemLink">
+                                        <div class="itemPic">
+                                            <div class="shape ranker"><span>특가</span></div>
+                                            <img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + SocialData.sysImgNm}">
+                                            <button type="button" class="itemLike active">관심상품 추가</button>
+                                        </div>
+                                        <p class="itemBrand" th:text="${SocialData.brandKnm}"></p>
+                                        <div class="itemName" th:text="${SocialData.goodsNm}" style="font-size: 18px;"></div>
+                                        <p class="itemPrice" >
+                                         [[${#numbers.formatInteger(SocialData.currAprice,0,'COMMA')} + 원]]
+                                            <!-- [[${SocialData.currAprice}]]원 -->
+                                            <span class="itemPrice_original" th:text="${#numbers.formatInteger(SocialData.listPrice,0,'COMMA')} + '원'"></span>
+											<span class=" itemPercent" th:text="${#numbers.formatDecimal(SocialData.dcArate,1,0)} + '%'"></span>
+                                        </p>
+                                        <p class="itemBadge">
+                                            <span class="badge13">베스트 </span>
+                                        </p>
+                                        <!-- <div class="itemcolorchip">
+                                            <span class="chip_color35" value="ABM">BEIGE</span>
+                                            <span class="chip_color54" value="BDS">BLACK</span>
+                                            <span class="chip_color40" value="YBR">WHITE</span>
+                                        </div> -->
+                                        <div class="itemComment" th:text="${SocialData.goodsTnm}"></div>
+                                    </a>
+                                </div>
+                            </div>
+                              </th:block>
+                        </div>
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>   
+
+<script th:inline="javascript">
+var socialInfo = [[${socialInfo}]];
+console.log(socialInfo);
+
+$(function(){
+       /* 핫딜 countDown */
+       function hotdealTimer() {
+           var endTime = new Date(socialInfo.socialEddt); // 남은시간 지정
+
+               endTime = (Date.parse(endTime) / 1000);
+
+               var now = new Date();
+               now = (Date.parse(now) / 1000);
+
+               var timeLeft = endTime - now;
+
+               var days = Math.floor(timeLeft / 86400); 
+               var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
+               var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
+               var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
+
+               if (hours < '10') { hours = '0' + hours; }
+               if (minutes < '10') { minutes = '0' + minutes; }
+               if (seconds < '10') { seconds = '0' + seconds; }
+
+               //$('#d-days').html(days);
+               $('#h-hours').html(hours);
+               $('#h-minutes').html(minutes);
+               $('#h-seconds').html(seconds);		
+       }
+       setInterval(function() { hotdealTimer(); }, 1000);
+       /* countDown */
+});
+</script>
+</th:block>
+
+</body>
+</html>

BIN
src/main/webapp/images/pc/thumb/hotdeal_bg.png


+ 3 - 0
src/main/webapp/ux/style24_link.js

@@ -18,6 +18,7 @@ const _PAGE_CUSTOMER_PWD_CHANGE_FIND = _frontUrl + "/customer/password/change/fo
 const _PAGE_CUSTOMER_PWD_CHANGE_TEMP = _frontUrl + "/customer/password/change/form?pageGb=temp";	// 고객 > 임시비밀번호 로그인 > 비밀번호 변경 화면
 const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";						// 고객 > 휴면회원
 const _PAGE_CUSTOMER_DORMANT_COMPLETE = _frontUrl + "/customer/dormant/certify/complete/form";		// 고객 > 휴면회원 > 완료페이지
+const _PAGE_CUSTOMER_CERTIFICATION = "/customer/certification/form"									// 고객 > 본인인증화면
 
 //== 상품상세 ==/
 const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";								// 상품 상세
@@ -62,6 +63,8 @@ const _PAGE_WISHLIST_DEL = _frontUrl + "/mypage/wish/list/delete";				// 위시
 const _PAGE_PLANNING_MAIN = _frontUrl + "/planning/main/form"; 					// 기획전 메인
 const _PAGE_PLANNING_DETAIL = _frontUrl + "/planning/detail/form";				// 기획전 상세
 
+//== 핫딜==/
+const _PAGE_SOCIAL_MAIN = _frontUrl + "/social/main/form";						// 소설(핫딜) 메인
 
 //== 이벤트 ==/
 const _PAGE_EVENT_MAIN = _frontUrl + "/planning/event/main/form"; 					// 이벤트 메인