Procházet zdrojové kódy

Merge remote-tracking branch 'origin/order' into jsh77b

jsh77b před 5 roky
rodič
revize
2bd73ad9ca
41 změnil soubory, kde provedl 1531 přidání a 1382 odebrání
  1. 30 0
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  2. 4 2
      src/main/java/com/style24/front/biz/service/TsfSocialService.java
  3. 48 3
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  4. 25 0
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  5. 58 16
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  6. 34 18
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  7. 1 0
      src/main/java/com/style24/front/biz/web/TsfSocialController.java
  8. 1 0
      src/main/java/com/style24/persistence/domain/Social.java
  9. 1 0
      src/main/java/com/style24/persistence/domain/WishList.java
  10. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  11. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  12. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  13. 4 4
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  14. 11 4
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  15. 7 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml
  16. 35 24
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  17. 82 74
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  18. 28 21
      src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html
  19. 15 13
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  20. 28 23
      src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html
  21. 6 5
      src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html
  22. 41 0
      src/main/webapp/WEB-INF/views/web/customer/PrivacyPolicyLayerFormWeb.html
  23. 44 0
      src/main/webapp/WEB-INF/views/web/customer/PrivacyTrustLayerFormWeb.html
  24. 42 0
      src/main/webapp/WEB-INF/views/web/customer/UseTermsLayerFormWeb.html
  25. 1 1
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  26. 184 90
      src/main/webapp/WEB-INF/views/web/mypage/ChangeOptionPopupFormWeb.html
  27. 0 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCouponDetailFormWeb.html
  28. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageCouponFormWeb.html
  29. 13 18
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustConfirmFormWeb.html
  30. 7 9
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html
  31. 264 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustPwdModifyFormWeb.html
  32. 9 12
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustSnsJoinInitPwdFormWeb.html
  33. 31 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html
  34. 55 9
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html
  35. 0 57
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListWeb.html
  36. 82 0
      src/main/webapp/WEB-INF/views/web/planning/PlanningCouponDetailFormWeb.html
  37. 10 8
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  38. 6 5
      src/main/webapp/biz/customer.js
  39. 19 16
      src/main/webapp/ux/pc/css/common.css
  40. 220 938
      src/main/webapp/ux/pc/css/layout.css
  41. 80 4
      src/main/webapp/ux/style24_link.js

+ 30 - 0
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -889,6 +889,36 @@ public class TsfCustomerService {
 		return coreCustomerService.saveCustomerSecede(customer);
 	}
 
+	/**
+	 * 마이페이지 - 비밀번호 변경
+	 * @param  customer - 고객번호
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 04. 01
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap changePassword(Customer customer) {
+		GagaMap resultMap = new GagaMap();
+		boolean isSuccess = false;
+		Login login = new Login();
+		login.setCustNo(customer.getCustNo());
+		Login loginCheckInfo = loginService.getLoginCheckInfo(login);
+
+		if (loginCheckInfo != null) {
+			isSuccess = passwordEncoder.matchesSha256(customer.getOrgPasswd(), loginCheckInfo.getPasswd());
+		}
+		if (!isSuccess) {
+			resultMap.setBoolean("isSuccess", isSuccess);
+			resultMap.setString("resultType", "WRONG_PWD");
+			return resultMap;
+		} else {
+			customer.setTempPasswdYn("N"); // 임시비밀번호여부
+			saveCustomerPassword(customer); // 비밀번호 수정
+		}
+		resultMap.setBoolean("isSuccess", isSuccess);
+		return resultMap;
+	}
+
 
 	/**
 	 * KCP 계좌인증 처리

+ 4 - 2
src/main/java/com/style24/front/biz/service/TsfSocialService.java

@@ -61,8 +61,10 @@ public class TsfSocialService {
 	public Social getSocialForGoods(Social social){
 		Social socialInfo = socialDao.getSocialInfo(social);
 
-		social.setSocialSq(socialInfo.getSocialSq());
-		socialInfo.setSocialGoodsList(socialDao.getSocialGoodsList(social));
+		if(socialInfo != null){
+			social.setSocialSq(socialInfo.getSocialSq());
+			socialInfo.setSocialGoodsList(socialDao.getSocialGoodsList(social));
+		}
 
 		return socialInfo;
 	}

+ 48 - 3
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -801,11 +801,11 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 03. 25
 	 */
-	@PostMapping("/consent/useinfo/layer")
-	public ModelAndView cnstentUseInfoLayer() {
+	@PostMapping("/consent/useinfo/form")
+	public ModelAndView cnstentUseInfoForm(@RequestBody Customer customer) {
 		ModelAndView mav = new ModelAndView();
 
-		mav.addObject("custNm", "신주승");
+		mav.addObject("custNm", customer.getCustNm());
 
 		mav.setViewName(super.getDeviceViewName("customer/ConsentUseInfoForm"));
 
@@ -839,4 +839,49 @@ public class TsfCustomerController extends TsfBaseController {
 
 		return resultMap;
 	}
+
+	/**
+	 * 이용약관 화면
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 04. 01
+	 */
+	@PostMapping("/use/terms/layer")
+	public ModelAndView getUseTermsLayer() {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("clause", clauseService.getClause(TscConstants.Site.STYLE24.value(), "G057_10"));
+		mav.setViewName(super.getDeviceViewName("customer/UseTermsLayerForm"));
+		return mav;
+	}
+
+	/**
+	 * 개인정보취급방침 화면
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 04. 01
+	 */
+	@PostMapping("/privacy/policy/layer")
+	public ModelAndView getPrivacyPolicyLayer() {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("clause", clauseService.getClause(TscConstants.Site.STYLE24.value(), "G057_11"));
+		mav.setViewName(super.getDeviceViewName("customer/PrivacyPolicyLayerForm"));
+		return mav;
+	}
+
+	/**
+	 * 개인정보위탁 화면
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 04. 01
+	 */
+	@PostMapping("/privacy/trust/layer")
+	public ModelAndView getMarketingLayerForm() {
+		ModelAndView mav = new ModelAndView();
+		mav.setViewName(super.getDeviceViewName("customer/PrivacyTrustLayerForm"));
+		return mav;
+	}
+
 }

+ 25 - 0
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -25,6 +25,7 @@ import com.style24.front.biz.service.TsfCouponService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.biz.service.TsfRendererService;
 import com.style24.front.biz.service.TsfReviewService;
+import com.style24.front.biz.service.TsfWishlistService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
@@ -40,6 +41,7 @@ import com.style24.persistence.domain.Measurement;
 import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.Review;
 import com.style24.persistence.domain.SizeInfo;
+import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -82,6 +84,9 @@ public class TsfGoodsController extends TsfBaseController {
 
 	@Autowired
 	private TsfRendererService rendererService;
+	
+	@Autowired
+	private TsfWishlistService wishListService;
 
 	@Value("${has-ssl}")
 	private String hasSsl;
@@ -1225,4 +1230,24 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/GoodsDetailReviewForm"));
 		return mav;
 	}
+	
+	/**
+	 * 퀵메뉴 위시리스트
+	 * @return
+	 * @author sowon
+	 * @since 2021. 4. 1
+	 */
+	@GetMapping("/wish/list")
+	@ResponseBody
+	public Collection<Goods> getWishList() {
+		Collection<Goods> wishList = new ArrayList<>();
+		WishList wish = new WishList();
+		wish.setSiteCd(TscConstants.Site.STYLE24.value());
+		wish.setFrontGb(TsfSession.getFrontGb());
+		wish.setCustGb(TsfSession.getCustGb());
+		wish.setQuickYn("Y");
+		// 위시리스트 상품목록
+		wishList = wishListService.getWishListGoodsList(wish);
+		return wishList;
+	}
 }

+ 58 - 16
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -49,6 +49,7 @@ import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.GiftCard;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 import com.style24.persistence.domain.Point;
@@ -396,6 +397,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 교환 옵션 정보 조회
 		mav.addObject("exchangeOptionInfo", orderChangeService.getExchangeOptionInfo(orderChange));
+		mav.addObject("ordDtlNo", orderChange.getOrdDtlNo());
 		mav.addObject("chgQty", orderChange.getChgQty());
 
 		mav.setViewName(super.getDeviceViewName("mypage/ChangeOptionPopupForm"));
@@ -955,7 +957,7 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("cpnDtlRefvalBrandList", coreCouponService.getCouponRefvalBrandList(cpnId));
 		// 쿠폰적용대상 - 제외상품 조회
 		mav.addObject("cpnDtlRefvalExceptGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
-		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailPop"));
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailForm"));
 		return mav;
 	}
 	
@@ -1135,9 +1137,14 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/wish/list/form")
 	public ModelAndView mypageWishListForm(WishList wishList) {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("mypage/MypageWishListForm"));
+		wishList.setSiteCd(TscConstants.Site.STYLE24.value());
+		wishList.setFrontGb(TsfSession.getFrontGb());
+		wishList.setCustGb(TsfSession.getCustGb());
+		// 위시리스트 달
+		mav.addObject("wishMonth", wishListService.getWishListMonth(wishList));
 		return mav;
 	}
-	
+
 	/**
 	 * 마이페이지 상품목록 가져오기
 	 *
@@ -1146,19 +1153,19 @@ public class TsfMypageController extends TsfBaseController {
 	 * @since 2021. 03. 29
 	 */
 	@GetMapping("/wish/list")
-	public ModelAndView mypageWishGoodsList(WishList wishList) {
-		ModelAndView mav = new ModelAndView();
-		wishList.setSiteCd(TscConstants.Site.STYLE24.value());
-		wishList.setFrontGb(TsfSession.getFrontGb());
-		wishList.setCustGb(TsfSession.getCustGb());
-		// 위시리스트 달
-		mav.addObject("wishMonth", wishListService.getWishListMonth(wishList));
+	@ResponseBody
+	public Collection<Goods> getWishList() {
+		Collection<Goods> wishList = new ArrayList<>();
+		WishList wish = new WishList();
+		wish.setSiteCd(TscConstants.Site.STYLE24.value());
+		wish.setFrontGb(TsfSession.getFrontGb());
+		wish.setCustGb(TsfSession.getCustGb());
 		// 위시리스트 상품목록
-		mav.addObject("wishGoods", wishListService.getWishListGoodsList(wishList));
-		mav.setViewName(super.getDeviceViewName("mypage/MypageWishList"));
-		return mav;
+		wishList = wishListService.getWishListGoodsList(wish);
+		return wishList;
 	}
 
+
 	/*신주승 시작*/
 
 	/**
@@ -1175,7 +1182,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		mav.addObject("custId", customer.getCustId());
 
-		mav.addObject("snsType", customer.getSnsType());
+		mav.addObject("snsType", StringUtils.defaultString(customer.getSnsType(), ""));
 
 		// 1.간편가입인데 처음 마이페지로 진입 했을떄
 		if (StringUtils.isNotBlank(customer.getSnsType()) && StringUtils.isBlank(customer.getPasswd())) {
@@ -1232,7 +1239,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		mav.addObject("bankList", rendererService.getCommonCodeList("G940", "Y"));
 
-		mav.setViewName(super.getDeviceViewName("/mypage/MypageCustModifyForm"));
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCustModifyForm"));
 		return mav;
 	}
 
@@ -1353,7 +1360,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		mav.addObject("custNm", customer.getCustNm());
 
-		mav.setViewName(super.getDeviceViewName("/mypage/MypageCustSecedeForm"));
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCustSecedeForm"));
 
 		return mav;
 	}
@@ -1411,10 +1418,45 @@ public class TsfMypageController extends TsfBaseController {
 			return mav;
 		}
 
-		mav.setViewName(super.getDeviceViewName("/mypage/MypageCustSecedeCompleteForm"));
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCustSecedeCompleteForm"));
 
 		return mav;
 	}
 
+	/**
+	 * 마이페이지 - 비밀번호 변경 팝업
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 04. 01
+	 */
+	@PostMapping("/password/modify/form")
+	public ModelAndView pwdModifyForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("custId", TsfSession.getInfo().getCustId());
+
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCustPwdModifyForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 마이페이지 - 비밀번호 변경
+	 *
+	 * @return GagaMap
+	 * @author jsshin
+	 * @since 2021. 04. 01
+	 */
+	@PostMapping("/password/change")
+	@ResponseBody
+	public GagaMap changePassword(@RequestBody Customer customer) {
+		Integer custNo = TsfSession.getInfo().getCustNo();
+		customer.setCustNo(custNo);
+		customer.setRegNo(custNo);
+		customer.setUpdNo(custNo);
+		return customerService.changePassword(customer);
+	}
+
 	/*신주승 끝*/
 }

+ 34 - 18
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -14,9 +14,11 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.front.biz.service.TsfCouponService;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
@@ -49,7 +51,12 @@ public class TsfPlanningController extends TsfBaseController {
 
 	@Autowired
 	private TscCustomerService coreCustomerService;
+	
+	@Autowired
+	private TsfCouponService couponService;
 
+	@Autowired
+	private TscCouponService coreCouponService;
 	/**
 	 * 기획전 메인 화면
 	 * @param cateNo - 카테고리번호
@@ -98,24 +105,6 @@ public class TsfPlanningController extends TsfBaseController {
 		return planningService.getPlanningMainList(plan);
 	}
 
-//	/**
-//	 * 기획전 접근확인
-//	 * 
-//	 * @return
-//	 * @author sowon
-//	 * @since 2021. 3. 22
-//	 */
-//	@PostMapping("/access")
-//	@ResponseBody
-//	public GagaMap PlanningAccessConfrim(@RequestBody Plan plan) throws Exception {
-//		GagaMap result = new GagaMap();
-//		// 접근 가능 고객 등급 확인
-//		planningService.accessCustGrade(plan);
-//		result.set("status", "200");
-//
-//		return result;
-//	}
-
 	/**
 	 * 기획전 상세화면
 	 *
@@ -222,6 +211,33 @@ public class TsfPlanningController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("planning/PlanningDetailForm"));
 		return mav;
 	}
+	
+	/**
+	 * 기획전 쿠폰 상세보기 모달
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 04. 01
+	 */
+	@GetMapping(value = "/coupon/detail")
+	public ModelAndView mypageCouponDetailPop(@RequestParam(value = "cpnId") int cpnId) {
+		ModelAndView mav = new ModelAndView();
+
+		// 쿠폰 - 기본정보
+		mav.addObject("couponDetailInfo", couponService.getCouponDetailInfo(cpnId));
+		// 쿠폰적용대상 - 공급업체 조회
+		mav.addObject("cpnDtlRefvalSupplyCompList", coreCouponService.getCouponRefvalSupplyCompList(cpnId));
+		// 쿠폰적용대상 - 적용상품 조회
+		mav.addObject("cpnDtlRefvalApplyGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_10"));
+		// 쿠폰적용대상 - 카테고리 조회
+		mav.addObject("cpnDtlRefvalCateList", coreCouponService.getCouponRefvalCategoryList(cpnId));
+		// 쿠폰적용대상 - 브랜드 조회
+		mav.addObject("cpnDtlRefvalBrandList", coreCouponService.getCouponRefvalBrandList(cpnId));
+		// 쿠폰적용대상 - 제외상품 조회
+		mav.addObject("cpnDtlRefvalExceptGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
+		mav.setViewName(super.getDeviceViewName("planning/PlanningCouponDetailForm"));
+		return mav;
+	}
 
 	/**
 	 * 기획전 쿠폰 다운로드. 고객이 상품쿠폰 다운로드 시 발급됨.

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

@@ -39,6 +39,7 @@ public class TsfSocialController extends TsfBaseController {
 		
 		// 디바이스 set
 		social.setFrontGb(TsfSession.getFrontGb());
+		social.setCustGb(TsfSession.getCustGb());
 		
 		// 소셜(핫딜) 
 		mav.addObject("socialInfo", socialService.getSocialInfo(social));

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

@@ -64,6 +64,7 @@ public class Social extends TscBaseDomain{
 		
 		// 고객
 		private Integer custNo;		//고객번호
+		private String custGb;		//고객구분
 		
 		// 브랜드
 		private String brandKnm;	//브랜드이름(한글)

+ 1 - 0
src/main/java/com/style24/persistence/domain/WishList.java

@@ -25,6 +25,7 @@ public class WishList extends TscBaseDomain {
 	private String siteCd;
 	private String frontGb;
 	private String custGb;
+	private String quickYn;
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrGoodsCd;
 

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

@@ -590,6 +590,7 @@
 		  AND A.CPN_ID = B.CPN_ID 
 		  AND B.CUST_NO = #{custNo}
 		  AND A.CPN_STAT = 'G232_11'
+		  AND NOW() BETWEEN A.AVAIL_STDT AND A.AVAIL_EDDT
 	</select>
 	
 	<select id="getCouponDetailInfo" resultType="Coupon" parameterType="Coupon">

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

@@ -269,6 +269,7 @@
 		      AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT           /*판매기간 확인*/
 		      GROUP BY G.GOODS_CD , G.SELF_GOODS_YN , G.MIN_ORD_QTY, G.MAX_ORD_QTY, O.OPT_CD1
 		) A
+		ORDER BY GOODS_CD, OPT_CD1
 	</select>
 		
 	<!-- 상품 옵션2 목록  - 자사용-->

+ 2 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -87,8 +87,8 @@
 					 , ODI.OPT_CD2
 					 , G.LIST_PRICE
 		             , G.GOODS_TYPE
-		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
-		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
+		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
 					 , OD.ORD_DTL_STAT
 					 , OD.ORD_QTY
 					 , OD.CNCL_RTN_QTY

+ 4 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml

@@ -71,8 +71,8 @@
 		             , ODI.OPT_CD2
 		             , G.LIST_PRICE
 		             , G.GOODS_TYPE
-		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
-		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
+		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
 		             , OD.ORD_DTL_STAT
 		             , OD.ORD_QTY
 		             , OD.CNCL_RTN_QTY
@@ -205,8 +205,8 @@
 		             , ODI.OPT_CD2
 		             , G.LIST_PRICE
 		             , G.GOODS_TYPE
-		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
-		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
+		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
 		             , OD.ORD_DTL_STAT
 		             , OD.ORD_QTY
 		             , OD.CNCL_RTN_QTY

+ 11 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -428,7 +428,13 @@
 	
 	<select id="templateDispOrdInfo" parameterType="Plan" resultType="Plan">
 		/* TsfPlanning.templateDispOrdInfo*/
-		SELECT TMPL_TYPE , DISP_ORD, PLAN_CONT_SQ,TITLE ,LINK_URL ,DISP_YN 
+		SELECT TMPL_TYPE 
+		     , DISP_ORD
+		     , PLAN_CONT_SQ
+		     ,TITLE 
+		     ,LINK_URL
+		     ,NOTE 
+		     ,DISP_YN 
 		FROM TB_PLAN_CONTENTS TPC 
 		WHERE 1=1 
 			AND TPC.PLAN_SQ = #{planSq}
@@ -437,7 +443,7 @@
 	</select>
 	
 	<select id="getPlanReviewInfo" parameterType="Review" resultType="Review">
-		/* TsfPlanning.templateDispOrdInfo*/
+		/* TsfPlanning.getPlanReviewInfo*/
 		SELECT F2.*
 		FROM 
 		(
@@ -588,7 +594,7 @@
 	</select>
 	
 	<select id="getPlanCouponInfo" parameterType="Coupon" resultType="Coupon">
-		/* TsfPlanning.templateDispOrdInfo*/
+		/* TsfPlanning.getPlanCouponInfo*/
 		SELECT F.*
 		<if test="planSq != null and planSq != ''">
 		      ,(CASE F.CPN_ID WHEN (SELECT CPN_ID FROM TB_CUST_COUPON C WHERE C.CPN_ID = F.CPN_ID AND CUST_NO = #{custNo})THEN '받기완료'
@@ -600,7 +606,8 @@
 				  , PC.PLAN_SQ 
 				  , PC.TMPL_TYPE 
 				  , PC.TITLE 
-				  , PC.LINK_URL 
+				  , PC.LINK_URL
+				  , PC.NOTE 
 				  , PCI.ITEM_VAL
 				  , PCI.DISP_ORD
 				  , TC.CPN_ID

+ 7 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml

@@ -22,6 +22,7 @@
 		FROM TB_WISHLIST W
 		WHERE CUST_NO = #{custNo}
 		GROUP BY DATE_FORMAT(W.REG_DT,'%Y-%m') 
+		ORDER BY REG_DT DESC
 	</select>
 	
 	<!-- 위시리스트 상품목록 (임시 = 수정예정)-->
@@ -35,7 +36,7 @@
 			    SELECT W.AF_LINK_CD 
 			          ,W.CONTENTS_LOC 
 			          ,W.CUST_NO 
-			          ,W.REG_DT 
+			          ,DATE_FORMAT(W.REG_DT,'%Y.%m') AS REG_DT 
 			          ,CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
 			                    BG.BRAND_GROUP_ENM
 			                ELSE
@@ -51,6 +52,7 @@
 			         , G.MAIN_COLOR_CD                                          /*대표색상코드*/
 			         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
 			         , G.CURR_PRICE                                             /*현재판매가*/
+			         , GS.STOCK_QTY
 			    FROM   TB_WISHlIST W
 			         , TB_GOODS G
 			         , TB_GOODS_STOCK GS
@@ -62,7 +64,6 @@
 			    AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
 			    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
 			    AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
-			    AND    GS.STOCK_QTY  >  0 /*재고있는상품*/
 			    AND    B.USE_YN = 'Y'
 			    AND    BG.USE_YN = 'Y'
 			    AND    W.CUST_NO = #{custNo}
@@ -82,6 +83,7 @@
 			SELECT 
 			       PG.BRAND_GROUP_NM
 			     , PG.GOODS_CD
+			     , PG.STOCK_QTY
 			     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
 			     , PG.GOODS_NM
 			     , PG.GOODS_TNM
@@ -98,6 +100,9 @@
 			INNER JOIN TAB_GOODS_IMG GI ON PG.GOODS_CD = GI.GOODS_CD
 			)Z
 		ORDER BY Z.REG_DT DESC
+		<if test="quickYn != null and quickYn != ''">
+			,Z.STOCK_QTY
+		</if>
 	</select>
 	
 

+ 35 - 24
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -147,11 +147,11 @@
 		}
 	});
 
-		//엔터키 로그인
+	//엔터키 로그인
 	$('#loginForm input[name=passwd]').keypress(function (event) {
 		if (event.which === 13) {
 			event.preventDefault();
-			fnValidConfirm();
+			$('#btnLogin').trigger('click');
 		}
 	});
 
@@ -166,12 +166,13 @@
 
 	// 로그인 실패 후 과정
 	var fnFailLoginProcess = function (result) {
+		// 탈퇴회원
 		if (result.status === 'SECEDE_CUST') {
-			// 탈퇴회원
-		} else if (result.status === 'SESSION_EXPIRED') {
-			// 세션만료
-		} else if (result.status === 'DORMANT_CUST') {
-			// 휴면회원
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 휴면회원
+		if (result.status === 'DORMANT_CUST') {
 			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
@@ -179,7 +180,9 @@
 				}
 			});
 			return;
-		} else if (result.status === 'CI_EMPTY') {
+		}
+		// CI(본인인증)정보 없는 회원
+		if (result.status === 'CI_EMPTY') {
 			// 본인이증 필요한 회원
 			mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
 				sureBtnText: "확인",
@@ -189,6 +192,7 @@
 			});
 			return;
 		}
+		// 비밀번호 틀린 경우
 		if (!gagajf.isNull(result.message)) {
 			grecaptcha.reset(); // 리캡챠 리셋
 			let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
@@ -196,16 +200,16 @@
 			$("#login_fail_cnt").html(loginFailCnt);
 			$("#login_remain_cnt").html(10 - loginFailCnt);
 			$(".t_err_login_fail").show();
+
+			// 비밀번호 5회 이상 틀린 경우 캡챠 노출
 			if (loginFailCnt >= 5 && loginFailCnt < 10) {
-				// 비밀번호 5회 이상 틀린 경우 캡챠 노출
 				$('#recaptcha').show();
 				rechaptchCheck = false;
+			// 비밀번호 10회 이상 틀린 경우 로그인 블락
 			} else if (loginFailCnt >= 10) {
 				$('#recaptcha').hide();
 				rechaptchCheck = true;
-				// 비밀번호 10회 이상 틀린 경우 로그인 블락
 				let blockSecs = Number(result.loginFailInfo.blockSecs);
-
 				if (blockSecs > 0) {
 					$("#blockSecs2").html(blockSecs);
 					fnSetLoginBlockTime();
@@ -248,9 +252,9 @@
 		}
 	}
 
-	// SNS 로그인 콜백함수
+	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// Ci이 조회 시 없음
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -259,14 +263,12 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
-		}
-		// Ci이 조회 시 있음
+		// 2. SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
+		// 3. SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
 			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
 				sureBtnText: "확인",
@@ -274,19 +276,28 @@
 					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
 				}
 			});
+			return;
 		}
-		if (userInfo.custStat === 'FAIL_CUST') {
-			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		if (userInfo.custStat === 'NEED_AGREE_CUST') {
+			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
-		if (userInfo.custStat === 'NEW_CUST') { // 회원가입
+		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
+		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			return;
 		}
-
-		if (userInfo.custStat === 'NEED_AGREE_CUST') { // YES24 로그인 시 동의화면 필요
-			cfnConsentUseInfo(userInfo.custNm);
+		// 7.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
 		}
-
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 82 - 74
src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html

@@ -160,19 +160,19 @@
 				</button>
 			</li>
 			<li>
-				<button type="button" id="" class="quick_btn02" data-tab="quick02">
+				<button type="button" id="quick02" class="quick_btn02" data-tab="quick02">
 					<img src="/images/pc/ico_qk_cart.png" alt="쇼핑백"/>
-					<span class="count">2</span>
+					<span class="count"></span>
 				</button>
 			</li>
 			<li>
-				<button type="button" id="" class="quick_btn03" data-tab="quick03">
+				<button type="button" id="quick03" class="quick_btn03" data-tab="quick03">
 					<img src="/images/pc/ico_qk_like.png" alt="위시리스트"/>
 					<span class="count">100</span>
 				</button>
 			</li>
 			<li>
-				<button type="button" id="" class="quick_btn04" data-tab="quick04">
+				<button type="button" id="quick04" class="quick_btn04" data-tab="quick04">
 					<img src="/images/pc/ico_qk_coupon.png" alt="쿠폰"/>
 					<span class="count">100</span>
 				</button>
@@ -443,10 +443,10 @@
 			</div>
 			<div class="wishlist quick_con quick03"> <!-- 퀵메뉴_위시리스트 -->
 				<div class="quick_head"> 
-					<h3><a href="">위시리스트</a></h3>
+					<h3><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_WISHLIST);">위시리스트</a></h3>
 				</div>
-				<div class="quick_body"> <!-- 최근 본 상품 없을 시 nodata 클래스 추가 --> <!-- 비로그인 시 need_login 클래스 추가 -->
-					<div class="product_count"><span class='c_primary'>50</span>개의 상품</div>
+				<div class="quick_body" id="quickMenuWishList"> <!-- 최근 본 상품 없을 시 nodata 클래스 추가 --> <!-- 비로그인 시 need_login 클래스 추가 -->
+					<div class="product_count"><span class='c_primary' id="quickMenuWishListCount">50</span>개의 상품</div>
 					<div class="itemsGrp">
 						<div class="item_prod">
 							<div class="item_state">
@@ -461,73 +461,7 @@
 									<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>
 								</div>
 							</div>
-						</div>
-						<div class="item_prod">
-							<div class="item_state">
-								<div class="shape"><span>곧 품절돼요!</span></div>
-								<a href="#none" class=" itemLink">
-									<div class="itemPic">
-										<img class="vLHTC pd_img" src="/images/pc/thumb/prod2.jpg" alt="이미지설명"/>
-										<button type="button" class="itemLike active">관심상품 추가</button>
-									</div>
-								</a>
-								<div class="hover_con">
-									<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>
-								</div>
-							</div>
-						</div>
-						<div class="item_prod">
-							<div class="item_state">
-								<a href="#none" class=" itemLink">
-									<div class="itemPic">
-										<img class="vLHTC pd_img" src="/images/pc/thumb/prod1.jpg" alt="이미지설명"/>
-										<button type="button" class="itemLike active">관심상품 추가</button>
-									</div>
-								</a>
-								<div class="hover_con">
-									<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>
-								</div>
-							</div>
-						</div>
-						<div class="item_prod">
-							<div class="item_state">
-								<a href="#none" class=" itemLink">
-									<div class="itemPic">
-										<img class="vLHTC pd_img" src="/images/pc/thumb/prod2.jpg" alt="이미지설명"/>
-										<button type="button" class="itemLike active">관심상품 추가</button>
-									</div>
-								</a>
-								<div class="hover_con">
-									<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>
-								</div>
-							</div>
-						</div>
-						<div class="item_prod">
-							<div class="item_state">
-								<a href="#none" class=" itemLink">
-									<div class="itemPic">
-										<img class="vLHTC pd_img" src="/images/pc/thumb/prod2.jpg" alt="이미지설명"/>
-										<button type="button" class="itemLike active">관심상품 추가</button>
-									</div>
-								</a>
-								<div class="hover_con">
-									<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>
-								</div>
-							</div>
-						</div>
-						<div class="item_prod">
-							<div class="item_state">
-								<a href="#none" class=" itemLink">
-									<div class="itemPic">
-										<img class="vLHTC pd_img" src="/images/pc/thumb/prod1.jpg" alt="이미지설명"/>
-										<button type="button" class="itemLike active">관심상품 추가</button>
-									</div>
-								</a>
-								<div class="hover_con">
-									<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>
-								</div>
-							</div>
-						</div>
+						</div>	
 						<div class="item_prod">
 							<div class="item_state">
 								<a href="#none" class=" itemLink">
@@ -985,6 +919,77 @@
 // 	});
 	}
 	
+	// 위시리스트
+	let fnGetWishList = function() {
+		if (!cfCheckLogin()) {
+			$('#quickMenuWishList').addClass('need_login');
+			$('#quickMenuWishList').html('');
+			tag='<div class="login_con">';
+			tag+='<div>';
+			tag+='		<p>로그인 후 이용 가능한 서비스입니다.</p>';
+			tag+='		<button type="button" class="btn btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN)"><span>로그인</span></button>';
+			tag+='	</div>';
+			tag+='</div>';
+			
+			$('#quickMenuWishList').html(tag);
+			return false;
+		}
+		
+		$.getJSON('/goods/wish/list'
+				, function(result, status) {
+					if (status == 'success') {
+						$('#quickMenuWishList').html('');
+						$('#quick03').find('span').html(result.length);
+						$('#quickMenuWishListCount').html(result.length);
+						
+						if (result.length > 0) {
+							let tag = '<div class="product_count"><span class="c_primary" id="quickMenuWishListCount">'+result.length+'</span>개의 상품</div>\n';
+							tag += '	<div class="itemsGrp">\n';
+							
+							$.each(result, function (idx, item) {
+								tag += '	<div class="item_prod">';	
+								tag += '		<div class="item_state">';	
+								if (item.stockQty>0 && item.stockQty<=5) {
+									tag += '			<div class="shape"><span>곧 품절돼요!</span></div>';
+								}
+								if (item.stockQty<=0) {
+									tag += '			<div class="shape"><span>품절</span></div>';
+								}
+								tag += '			<button type="button" class="itemLike active" goodsCd="'+item.goodsCd+'" onclick="fnWishDelete(this);">관심상품 추가</button>';
+								tag += '			<a href="javascript:void(0);" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\', \'\', \'\', \'\');" class=" itemLink">';	
+								tag += '				<div class="itemPic">';		
+								tag += '					<img class="vLHTC pd_img" src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '" alt="이미지설명"/>';		
+								tag += '				</div>';	
+								tag += '			</a>';	
+								tag += '			<div class="hover_con">';
+								if (item.stockQty>0) {
+									tag += '				<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>';
+								}
+								tag += '			</div>';	    
+								tag += '		</div>';	    
+								tag += '	</div>	';		
+								tag += '	<div class="no_item">';	    
+								tag += '		최근 본 상품이 없습니다.';	    
+								tag += '	</div>';	    
+								
+							});
+							
+							tag += '	</div>\n';
+							
+							$('#quickMenuWishList').html(tag);
+						} else {
+							$('#quickMenuWishList').addClass('nodata');
+						}
+					}
+			});
+	}
+	
+	// 위시리스트 해제
+	let fnWishDelete = function(obj) {
+		cfnPutWishList(obj);
+		fnGetWishList();
+	}
+	
 	// 팝업
 	let fnGetPopup = function(){
 		let data = {viewPage : [[${viewPage}]]
@@ -1097,6 +1102,9 @@
 		// 최근본상품 조회
 		fnGetRecentlyGoods();
 		
+		// 위시리스트
+		fnGetWishList();
+		
 		// 팝업조회
 		fnGetPopup();
 		

+ 28 - 21
src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html

@@ -57,61 +57,68 @@
 	});
 
 	var fnPeristalsisCallback = function (userInfo) {
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
+			$.modal.close();
 			return;
 		}
 		if (userInfo.custStat === 'DUP_EMAIL_CUST') {
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
-			return;
-		}
-		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 			$.modal.close();
+			return;
 		}
-		// Ci이 조회 시 있음
+		// 2. SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
+			$.modal.close();
 			return;
 		}
+		// 3. SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-			$.modal.close();
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+					$.modal.close();
+				}
+			});
+			return;
 		}
-		if (userInfo.custStat === 'FAIL_CUST') {
-			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+			$.modal.close();
 			return;
 		}
+		// 5. SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
 			$.modal.close();
+			return;
 		}
-
-		if (userInfo.custStat === 'SUCC_CUST') {
-			cfnGoToPage(_PAGE_MAIN);
+		// 6.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 			$.modal.close();
+			return;
 		}
+		// 7. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;
 			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
 			$.post(_frontUrl + '/login'
 				, $.param(params)
-				, function(result) {
-					fnReloadAfterLogin(result);
-				}
+				, fnReloadAfterLogin
 				, "json");
 		}
 	}
 	var fnReloadAfterLogin = function(result) {
 		if (result.status === 'OK') {
 			document.location.href = result.returnUrl;
-		} else if (result.status === 'EMAIL_DUP') {
-
-		} else if(result.status === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-		} else if(result.status === 'SECEDE_CUST') {
-
+		} else {
+			mcxDialog.alert("로그인 실패 하였습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 		}
 		$.modal.close();
 	};

+ 15 - 13
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -163,8 +163,9 @@
 					</div>
 					<div class="desc_wrap t_c mt20">
 						<p>
-							본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" target="_blank">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>,&nbsp;<a href="javascript:void(0)" target="_blank">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,<br>
-							<a href="javascript:void(0)" target="_blank">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a> 내용을 확인 하였으며,동의합니다.
+							본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>
+							,&nbsp;<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer();">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,<br>
+							<a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a> 내용을 확인 하였으며,동의합니다.
 						</p>
 					</div>
 				</form>
@@ -298,18 +299,19 @@
 		const $avlConPwd = $('#avlConPwd');
 		let password = $('#joinForm input[name=passwd]').val();
 		let confirmPassword = $('#joinForm input[name=confirmPassword]').val();
-		if (!gagajf.isNull(password) && !gagajf.isNull(confirmPassword)) {
-			if (fnValidationPwdSameConfirmPwd(password, confirmPassword)) {
-				$avlConPwd.hide();
-				$misPwd.show();
-				passwdCheck = false;
-			} else {
-				$misPwd.hide();
-				$avlConPwd.show();
-				passwdCheck = true;
-			}
-			fnPossibleJoin();
+		let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
+
+		if (sameConfirmPwd) {
+			$avlConPwd.show();
+			$misPwd.hide()
+			passwdCheck = true;
+		} else {
+			$misPwd.show();
+			$avlConPwd.hide();
+			passwdCheck = false;
 		}
+		fnPossibleJoin();
+
 	};
 
 	//	이메일 확인

+ 28 - 23
src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html

@@ -52,7 +52,6 @@
 							</li>
 							<li>
 								<a href="javascript:void(0)" onclick="cfnLoginYes24();">
-<!--									<a href="javascript:void(0)" onclick="cfnConsentUseInfo('신주승')">-->
 									<i class="ico ico_snslogin yes24"></i>
 									<span>YES24</span>
 								</a>
@@ -67,10 +66,10 @@
 
 <script th:inline="javascript">
 	/*<![CDATA[*/
-	// SNS 로그인 콜백함수
 
+	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// Ci이 조회 시 없음
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -79,51 +78,57 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
-		}
-		// Ci이 조회 시 있음
+		// 2. SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
+		// 3. SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
 		}
-		if (userInfo.custStat === 'FAIL_CUST') {
-			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		if (userInfo.custStat === 'NEED_AGREE_CUST') {
+			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
+		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			return;
 		}
-
+		// 7.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;
 			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
 			$.post(_frontUrl + '/login'
 				, $.param(params)
-				, function(result) {
-					fnReloadAfterLogin(result);
-				}
+				,fnReloadAfterLogin
 				, "json");
 		}
-
 	};
 
-
 	var fnReloadAfterLogin = function(result) {
 		if (result.status === 'OK') {
 			document.location.href = result.returnUrl;
-		} else if (result.status === 'EMAIL_DUP') {
-
-		} else if(result.status === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-		} else if(result.status === 'SECEDE_CUST') {
-
 		} else {
-			//cfnGoToPage(_PAGE_CUSTOMER_JOIN_CERTIFY_SNS);
+			mcxDialog.alert("로그인 실패 하였습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 		}
 	};
 

+ 6 - 5
src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html

@@ -186,15 +186,16 @@
 		const $btnSavePassword = $('#btnSavePassword');
 		let password = $('#resetPasswordForm input[name=passwd]').val();
 		let confirmPassword = $('#resetPasswordForm input[name=confirmPassword]').val();
+		let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
 
-		if (fnValidationPwdSameConfirmPwd(password, confirmPassword)) {
-			$avlConPwd.hide();
-			$misPwd.show();
-			$btnSavePassword.attr('disabled', true);
-		} else {
+		if (sameConfirmPwd) {
 			$misPwd.hide();
 			$avlConPwd.show();
 			$btnSavePassword.attr('disabled', false);
+		} else {
+			$avlConPwd.hide();
+			$misPwd.show();
+			$btnSavePassword.attr('disabled', true);
 		}
 
 	};

+ 41 - 0
src/main/webapp/WEB-INF/views/web/customer/PrivacyPolicyLayerFormWeb.html

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PrivacyPolicyLayerFormWeb.html
+ * @desc    : 개인정보 수집 및 이용
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.01   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="policiesPrivacyLabel">개인정보 수집 및 이용</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<div class="text_wrap" th:utext="${#strings.replace(#strings.replace(clause,'&amplt;','<'),'&ampgt;','>')}">
+			</div>
+		</div>
+		<div class="modal-footer">
+			<button type="button" id="btnClose" class="btn btn_default"><span>닫기</span></button>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	$("#btnClose").click(function() {
+		$.modal.close();
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 44 - 0
src/main/webapp/WEB-INF/views/web/customer/PrivacyTrustLayerFormWeb.html

@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PrivacyTrustLayerFormWeb.html
+ * @desc    : 개인정보 취급 위탁
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.01   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="trustPrivacyLabel">개인정보 취급 위탁</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<div class="text_wrap">
+					개인정보 취급 위탁내용이 들어갑니다.<br>
+
+				</div>
+			</div>
+		</div>
+		<div class="modal-footer">
+			<button type="button" id="btnClose" class="btn btn_default"><span>닫기</span></button>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	$("#btnClose").click(function() {
+		$.modal.close();
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 42 - 0
src/main/webapp/WEB-INF/views/web/customer/UseTermsLayerFormWeb.html

@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : UseTermsLayerFormWeb.html
+ * @desc    : STYLE24이용약관
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.01   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="policiesTermsLabel">STYLE24 이용약관</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<div class="text_wrap" th:utext="${#strings.replace(#strings.replace(clause,'&amplt;','<'),'&ampgt;','>')}">
+				</div>
+			</div>
+		</div>
+		<div class="modal-footer">
+			<button type="button" id="btnClose" class="btn btn_default"><span>닫기</span></button>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	$("#btnClose").click(function() {
+		$.modal.close();
+	});
+
+	/*]]>*/
+</script>
+</html>

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

@@ -171,7 +171,7 @@
 
 				<!-- 6. 타임딜 : 슬라이드 -->
 				<th:block th:if="${contentsLoc=='006'}">
-					<div class="content wide main_deal">
+					<div class="content wide main_deal" th:if="${mainLayoutData.socialInfo != null}">
 						<div class="cont_head">
 							<p class="displayH" th:text="${mainLayoutData.contentsTitle}">오늘만<br>이 가격에 만나요</p>
 							<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_SOCIAL_MAIN);"><span>전체보기</span></a>

+ 184 - 90
src/main/webapp/WEB-INF/views/web/mypage/ChangeOptionPopupFormWeb.html

@@ -14,129 +14,223 @@
 				</div>
 			</div>
 			<div class="modify_option_area" id="modifyOptionArea" style="display:none">
+				<th:block th:if="${exchangeOptionInfo}" th:each="oneData, status : ${exchangeOptionInfo}">
+					<th:block th:if="${chgQty > 0}" th:each="num, index  : ${#numbers.sequence(1,chgQty)}">
+						<div class="modify_box" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}" style="display:none">
+							<div class="name_blk" th:text="|${oneData.itemNm} / ${oneData.colorNm}|"></div>
+							<div class="select_blk">
+								<!-- 옵션교환 라디오 형태 -->
+								<div class="sel_radio" th:if="${oneData.selfGoodsYn == 'Y'}">
+									<input type="hidden" name="chgOptCd2" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, orgOptCd2=${oneData.optCd2}">
+									<div th:class="|form_field ${oneData.ordDtlItemSq}|">
+										<div th:if="${oneData.optCd2Arr.length > 0}" th:each="option, idx : ${oneData.optCd2Arr}">
+											<input type="radio" th:name="|${oneData.ordDtlItemSq}_${num}|" th:id="|${oneData.ordDtlItemSq}_${option}_${num}|" th:value="${option}" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}" th:disabled="${#numbers.formatInteger(oneData.currStockQtyArr[idx.index], 0)} <= 0 or ${oneData.soldoutYnArr[idx.index] == 'Y'}" onclick="fnRadioOption(this);">
+											<label th:for="|${oneData.ordDtlItemSq}_${option}_${num}|"><span th:text="${option}"></span></label>
+										</div>
+									</div>
+								</div>
+								<!-- //옵션교환 라디오 형태 -->
+								<!-- 옵션교환 셀렉트박스 형태 -->
+								<div class="sel_select" th:unless="${oneData.selfGoodsYn == 'Y'}">
+									<div class="form_field">
+										<div class="select_custom exchange_option">
+											<div class="combo">
+												<input type="hidden" name="chgOptCd2" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, orgOptCd2=${oneData.optCd2}">
+												<div class="select">옵션 선택</div>
+												<ul class="list">
+													<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+													<li class="selected" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}, optCd2=''" onclick="fnSelectOption(this);">옵션 선택</li>
+													<th:block th:each="option, idx : ${oneData.optCd2Arr}">
+														<li th:if="${oneData.optCd2Arr.length} > 0 and (${#numbers.formatInteger(oneData.currStockQtyArr[idx.index],0)} <= 0 or ${oneData.soldoutYnArr[idx.index]} == 'Y')" th:text="${option}" aria-disabled="true" data-soldout="true" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}, optCd2=''" onclick="fnSelectOption(this);"></li>
+														<li th:if="${oneData.optCd2Arr.length} > 0 and ${#numbers.formatInteger(oneData.currStockQtyArr[idx.index],0)} > 0 and ${oneData.soldoutYnArr[idx.index]} == 'N'" th:text="${option}" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}, optCd2=${option}" onclick="fnSelectOption(this);"></li>
+													</th:block>
+												</ul>
+											</div>
+										</div>
+									</div>
+								</div>
+								<!-- //옵션교환 셀렉트박스 형태 -->
+							</div>
+							<div class="allcheck_blk" th:if="${num} == 1">
+								<div class="form_field">
+									<div>
+										<input th:id="|${oneData.ordDtlItemSq}_checkAll|" name="chk_exchange_all1" type="checkbox" checked="" onclick="fnSelectOptionChange();"><label th:for="|${oneData.ordDtlItemSq}_checkAll|"><span>선택 옵션으로 전체 교환</span></label>
+									</div>
+								</div>
+							</div>
+						</div>
+					</th:block>
+				</th:block>
 			</div>
 		</form>
 	</div>
 </div>
 <div class="modal-footer">
-	<button type="button" id="" class="btn btn_dark"><span>옵션 저장</span></button>
+	<button type="button" id="" class="btn btn_dark" onclick="fnSaveOption();"><span>옵션 저장</span></button>
 </div>
 <script th:inline="javascript">
 	let exchangeOptionInfo = [[${exchangeOptionInfo}]];
 	let chgQty = [[${chgQty}]];
+	let checkedOrdDtlItemSqArr = [];
 	
 	$(document).ready( function() {
-		var exchange_option_selecter1 = new sCombo('#exchangePop .select_custom.exchange_option1');
-		var exchange_option_selecter2 = new sCombo('#exchangePop .select_custom.exchange_option2');
-	
-		//$('.form_field input:checkbox').eq(0).click();
+		// 셀렉트박스 활성화
+		$('#exchangePop .select_custom.exchange_option').each(function() {
+			new sCombo($(this));
+		});
 	});
 	
-	// 
-	var fnSelectOptionChange = function(param) {
-		let ordDtlItemSq = $(param).attr('ordDtlItemSq');
-		let ordDtlItemSqArr = [];
+	// 구성상품 선택 및 전체 적용 클릭 이벤트
+	var fnSelectOptionChange = function() {
+		checkedOrdDtlItemSqArr = [];
 		let cnt = 0;
-
+		
 		// 체크 수량 조회
 		$.each($('.select_option_area .form_field input:checkbox'), function(idx, item) {
 			if ($(item).is(':checked')) {
-				ordDtlItemSqArr.push(Number($(item).attr('ordDtlItemSq')));
+				checkedOrdDtlItemSqArr.push($(item).attr('ordDtlItemSq'));
 				cnt++;
 			}
 		});
-
+		
 		// 옵션변경영역 처리
 		if (cnt > 0) {
 			$('#modifyOptionArea').css('display', '');
 		} else {
 			$('#modifyOptionArea').css('display', 'none');
 		}
+		
+		$.each($('.modify_box'), function(idx, item) {
+			let ordDtlItemSq = $(item).attr('ordDtlItemSq');
+			let num = $(item).attr('num');
+			let id = '#' + ordDtlItemSq + '_checkAll';
+			
+			if (checkedOrdDtlItemSqArr.includes(ordDtlItemSq)) {
+				if (num == 1) {
+					$(item).css('display', '');
+				} else if ($(id).is(':checked')) {
+					$(item).css('display', 'none');
+				} else {
+					$(item).css('display', '');
+				}
+			} else {
+				$(item).css('display', 'none');
+			}
+		});
+		
+		fnChangeCss();
+	}
+	
+	// 라디오 클릭 이벤트
+	var fnRadioOption = function(param) {
+		let ordDtlItemSq = $(param).attr('ordDtlItemSq');
+		let num = $(param).attr('num');
+		let optCd2 = $(param).val();
+		let checkAllId = '#' + ordDtlItemSq + '_checkAll';
+		let radioId = '.' + ordDtlItemSq + ' input:radio';
+		
+		$(param).parent().parent().parent().find('input[name=chgOptCd2]').val(optCd2);
 
-		if (ordDtlItemSqArr.length > 0) {
-			// TODO
-			// 옵션변경영역 표기
-			$('#modifyOptionArea').css('display', '');
+		if (num == 1 && $(checkAllId).is(':checked')) {
+			$.each($(radioId), function(idx, item) {
+				if ($(item).attr('num') != 1 && optCd2 == $(item).val()) {
+					$(item).click();
+				}
+			});
+		}
+	}
+	
+	// 셀렉트박스 클릭 이벤트
+	var fnSelectOption = function(param) {
+		let ordDtlItemSq = $(param).attr('ordDtlItemSq');
+		let num = $(param).attr('num');
+		let optCd2 = $(param).attr('optCd2');
+		let checkAllId = '#' + ordDtlItemSq + '_checkAll';
 
-			let html = '';
-			$.each(exchangeOptionInfo, function(idx, item) {
-				console.log(ordDtlItemSqArr);
-				console.log(item.ordDtlItemSq);
-				if (ordDtlItemSqArr.includes(item.ordDtlItemSq)) {
-					html += '				<div class="modify_box">';
-					html += '					<div class="name_blk">' + item.itemNm + ' / ' + item.optCd1 + '</div>';
-					html += '					<div class="select_blk">';
+		$(param).parent().parent().find('input[name=chgOptCd2]').val(optCd2);
 
-					if (item.selfGoodsYn == 'Y') {
-						html += '						<div class="sel_radio">';
-						html += '							<div class="form_field">';
-						html += '								<input type="hidden" name="chgOptCd2">';
-					} else {
-						html += '						<div class="sel_select">';
-						html += '							<div class="form_field">';
-						html += '								<div class="select_custom exchange_option1">';
-						html += '									<div class="combo">';
-						html += '										<input type="hidden" name="chgOptCd2">';
-						html += '										<div class="select">옵션 선택</div>';
-						html += '										<ul class="list">';
-						html += '											<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->';
-						html += '											<li class="selected">옵션 선택</li>';
-					}
+		if (num == 1 && $(checkAllId).is(':checked')) {
+			$.each($('.exchange_option li'), function(idx, item) {
+				if ($(item).attr('num') != 1 && optCd2 == $(item).attr('optCd2')) {
+					$(item).click();
+				}
+			});
+		}
+	}
+	
+	// 옵션 저장 버튼 클릭 이벤트
+	var fnSaveOption = function() {
+		// 옵션 선택 여부 확인
+		if (checkedOrdDtlItemSqArr.length <= 0) {
+			mcxDialog.alert('교환 옵션을 선택해주세요.');
+			return false;
+		}
 
-					$.each(item.optCd2Arr, function(index, option) {
-						let optCd2 = option;
-						let currStockQty = item.currStockQtyArr[index];
-						let soldoutYn = item.soldoutYnArr[index];
-						
-						if (item.selfGoodsYn == 'Y') {
-							html += '								<div>';
-							if (currStockQty <= 0 || soldoutYn == 'Y') {
-								html += '									<input type="radio" name="chgOptCd2" id="' + item.ordDtlItemSq + '_' + optCd2 + '" value="' + optCd2 + '" ordDtlItemSq="' + item.ordDtlItemSq + '" disabled>';
-							} else if (item.optCd2 == option) {
-								html += '									<input type="radio" name="chgOptCd2" id="' + item.ordDtlItemSq + '_' + optCd2 + '" value="' + optCd2 + '" ordDtlItemSq="' + item.ordDtlItemSq + '" checked>';
-							} else {
-								html += '									<input type="radio" name="chgOptCd2" id="' + item.ordDtlItemSq + '_' + optCd2 + '" value="' + optCd2 + '" ordDtlItemSq="' + item.ordDtlItemSq + '">';
-							}
-							html += '									<label for="' + item.ordDtlItemSq + '_' + optCd2 + '"><span>' + optCd2 + '</span></label>';
-							html += '								</div>';
-						} else {
-							if (currStockQty <= 0 || soldoutYn == 'Y') {
-								html += '											<li aria-disabled="true" data-soldout="true">' + option + '</li>';
-							} else {
-								html += '											<li optCd2="' + option + '" onclick="fnSelectOption(this);">' + option + '</li>';
-							}
-						}
-					});
-					
-					if (item.selfGoodsYn != 'Y') {
-						html += '										</ul>';
-						html += '									</div>';
-						html += '								</div>';
-					}
+		// 변경 옵션 처리
+		let dataArr = [];
+		let ordDtlItemSq = 0;
+		let index = 0;
+		let chgOptCd2Arr = [];
+		let selectOptionCheck = true;
 
-					html += '							</div>';
-					html += '						</div>';
-					html += '					</div>';
-					html += '					<div class="allcheck_blk">';
-					html += '						<div class="form_field">';
-					html += '							<div>';
-					html += '								<input id="chk_exchange_all1" name="chk_exchange_all1" type="checkbox" checked=""><label for="chk_exchange_all1"><span>선택 옵션으로 전체 교환</span></label>';
-					html += '							</div>';
-					html += '						</div>';
-					html += '					</div>';
-					html += '				</div>';
+		$.each($('input[name=chgOptCd2]'), function(idx, item) {
+			let chgOrdDtlItemSq = $(item).attr('ordDtlItemSq');
+			let changeYn = checkedOrdDtlItemSqArr.includes(chgOrdDtlItemSq)
+			let chgOptCd2 = changeYn ? $(item).val() : $(item).attr('orgOptCd2');
+			if (ordDtlItemSq != Number(chgOrdDtlItemSq)) {
+				if (index > 0) {
+					let data = {};
+					data.ordDtlItemSq = ordDtlItemSq;
+					data.changeYn = changeYn ? 'Y' : 'N'
+					data.chgOptCd2Arr = chgOptCd2Arr;
+					dataArr.push(data);
 				}
 
-				$('#modifyOptionArea').html(html);
-				
-				if (item.selfGoodsYn != 'Y') {
-					var exchange_option_selecter1 = new sCombo('#exchangePop .select_custom.exchange_option1');
-				}
-			});
-		} else {
-			// TODO
-			// 옵션변경영역 초기화
-			// 옵션변경영역 히든처리
+				ordDtlItemSq = chgOrdDtlItemSq;
+				chgOptCd2Arr = [];
+			}
+
+			chgOptCd2Arr.push(chgOptCd2);
+
+			index++;
+
+			// 옵션 선택 여부 설정
+			if (changeYn && gagajf.isNull($(item).val())) {
+				selectOptionCheck = false;
+			}
+		});
+		
+		// 옵션 선택 여부 체크
+		if (!selectOptionCheck) {
+			mcxDialog.alert('교환 옵션을 선택해주세요.');
+			return false;
 		}
+		
+		let data = {};
+		data.ordDtlItemSq = ordDtlItemSq;
+		data.changeYn = checkedOrdDtlItemSqArr.includes(ordDtlItemSq) ? 'Y' : 'N'
+		data.chgOptCd2Arr = chgOptCd2Arr;
+		dataArr.push(data);
+
+		console.log(dataArr);
+	}
+	
+	// 옵션 선택 영역 CSS 수정
+	var fnChangeCss = function() {
+		let index = 0;
+		$.each($('.modify_box'), function(idx, item) {
+			if ($(item).css('display') == 'block') {
+				index++;
+				if (index == 1) {
+					$(item).css('margin-top', '0');
+					$(item).css('padding-top', '0');
+					$(item).css('border-top', 'none');
+				} else {
+					$(item).css('margin-top', '30px');
+					$(item).css('padding-top', '30px');
+					$(item).css('border-top', '1px dashed #ddd');
+				}
+			}
+		});
 	}
 </script>

+ 0 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCouponDetailPopWeb.html → src/main/webapp/WEB-INF/views/web/mypage/MypageCouponDetailFormWeb.html


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

@@ -64,7 +64,7 @@
 											<li>
 												<!-- 쿠폰사용 기한 -->
 												<div
-													th:class="${CouponData.userYn == 'coupon' ? '' : 'coupon disabled'}">
+													th:class="${CouponData.userYn == 'Y' ? 'coupon' : 'coupon disable'}">
 													<div>
 														<p class="cp_name" th:text="${CouponData.cpnNm}"></p>
 														<p class="cp_cont">

+ 13 - 18
src/main/webapp/WEB-INF/views/web/mypage/MypageCustConfirmFormWeb.html

@@ -44,29 +44,24 @@
 									<col width="*">
 								</colgroup>
 								<tbody>
-									<tr th:if="${snsType ==''}">
-										<th>아이디</th>
-										<td>
-											<div class="form_field">
-												<div class="input_wrap">
-													<input type="text" id="custId" name="custId" class="form_control" th:value="${custId}" readonly="readonly"/>
-												</div>
-											</div>
-										</td>
-									</tr>
-									<tr th:unless="${snsType ==''}">
+									<tr>
 										<th>아이디</th>
 										<td>
 											<div class="form_field">
 												<div class="input_wrap">
-													<th:block th:if="${snsType == 'NV'}">
-														<span>네이버 간편가입회원</span>
-													</th:block>
-													<th:block th:if="${snsType == 'KK'}">
-														<span>카카오 간편가입회원</span>
+													<th:block th:if="${snsType == ''}">
+														<input type="text" id="custId" name="custId" class="form_control" th:value="${custId}" readonly="readonly"/>
 													</th:block>
-													<th:block th:if="${snsType == 'YS'}">
-														<span>YES24 간편가입회원</span>
+													<th:block th:unless="${snsType == ''}">
+														<th:block th:if="${snsType == 'NV'}">
+															<span>네이버 간편가입회원</span>
+														</th:block>
+														<th:block th:if="${snsType == 'KK'}">
+															<span>카카오 간편가입회원</span>
+														</th:block>
+														<th:block th:if="${snsType == 'YS'}">
+															<span>YES24 간편가입회원</span>
+														</th:block>
 													</th:block>
 												</div>
 											</div>

+ 7 - 9
src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html

@@ -89,7 +89,7 @@
 												<span>비밀번호</span>
 											</th>
 											<td>
-												<button type="button" class="btn btn_primary_line" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_TEMP);">
+												<button type="button" class="btn btn_primary_line" onclick="cfnPasswordModify();">
 													<span>변경하기</span>
 												</button>
 											</td>
@@ -380,8 +380,6 @@
 		let marketingModifyYn = 'N';
 		let accountModifyYn = 'N';
 		let emailModifyYn = 'N';
-		let smsAgreeYn;
-		let emailAgreeYn;
 
 		if (gagajf.isNull(custModiFy.email)) {
 			mcxDialog.alertC('이메일 주소를 입력해주세요.',{
@@ -392,7 +390,7 @@
 			});
 		}
 
-		if (orgCustInfo.email != custModiFy.email) {
+		if (orgCustInfo.email !== custModiFy.email) {
 			emailModifyYn = 'Y';
 		}
 
@@ -402,11 +400,11 @@
 		custModiFy.bankCd = $('.combo .select').find('input[name=bankCd]').val();
 
 		// 은행코드가 바꼈는지
-		if (orgAccountInfo.bankCd != custModiFy.bankCd) {
+		if (orgAccountInfo.bankCd !== custModiFy.bankCd) {
 			accountModifyYn = 'Y';
 		}
 
-		if (orgAccountInfo.accountNo != custModiFy.accountNo) {
+		if (orgAccountInfo.accountNo !== custModiFy.accountNo) {
 			accountModifyYn = 'Y';
 		}
 
@@ -432,12 +430,12 @@
 		}
 
 		// SMS 수신여부
-		if (orgCustInfo.smsAgreeYn != custModiFy.smsAgreeYn) {
+		if (orgCustInfo.smsAgreeYn !== custModiFy.smsAgreeYn) {
 			marketingModifyYn = 'Y';
 		}
 
 		// 이메일 수신여부
-		if (orgCustInfo.emailAgreeYn != custModiFy.emailAgreeYn) {
+		if (orgCustInfo.emailAgreeYn !== custModiFy.emailAgreeYn) {
 			marketingModifyYn = 'Y';
 		}
 
@@ -465,7 +463,7 @@
 
 	// 은행계좌 유효성체크
 	var fnGetAccountValidation = function () {
-		let custModiFy =  $('#custModiFyForm').serializeObject();
+		let custModiFy = $('#custModiFyForm').serializeObject();
 
 		if (gagajf.isNull(custModiFy.bankCd) && !gagajf.isNull(custModiFy.accountNo)) {
 			mcxDialog.alertC('은행을 선택해주세요.',{

+ 264 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCustPwdModifyFormWeb.html

@@ -0,0 +1,264 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MypageCustPwdModifyFormWeb.html
+ * @desc    : 비밀번호 변경 팝업
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.01   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+		<h5 class="modal-title" id="pswordModifyLabel">비밀번호 변경</h5>
+	</div>
+	<div class="modal-body">
+		<div class="pop_cont">
+			<form id="pwdModifyForm" class="form_wrap form_full">
+				<input type="hidden" name="custId" th:value="${custId}"/>
+				<div class="form_field">
+					<label class="input_label">기존 비밀번호</label>
+					<div class="input_wrap">
+						<input type="password" class="form_control" id="orgPasswd" name="orgPasswd" placeholder="기존 비밀번호를 입력해주세요." minlength="8" maxlength="20" required="required" data-valid-name="기존 비밀번호" />
+					</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label">신규 비밀번호</label>
+					<div class="input_wrap">
+						<input type="password" id="passwd" name="passwd" placeholder="신규 비밀번호를 입력해주세요.(8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="신규 비밀번호"/>
+						<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+						<div class="help_block">
+							<!-- 사용불가 비밀번호일경우 -->
+							<p>
+								<span id="firstFailed" class="c_gray">
+									<i class="ico ico_check gray"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)
+								</span>
+								<span id="secondFailed" class="c_gray">
+									<i class="ico ico_check gray"></i>4개이상 연속되거나 동일한 문자/숫자 제외
+								</span>
+								<span id="thirdFailed" class="c_gray">
+									<i class="ico ico_check gray"></i>아이디 제외
+								</span>
+							</p>
+							<!-- //사용불가 비밀번호일경우 -->
+							<!-- 사용가능한 비밀번호일경우 -->
+							<p id="avlPwd" class="hide">
+								<span class="c_black2">
+									<i class="ico ico_check black"></i>사용 가능한 비밀번호입니다
+								</span>
+							</p>
+							<!-- //사용가능한 비밀번호일경우 -->
+						</div>
+						<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+					</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label">신규 비밀번호 확인</label>
+					<div class="input_wrap">
+						<input type="password" id="confirmPassword" name="confirmPassword" placeholder="신규 비밀번호를 다시 입력해주세요." class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="신규 비밀번호 확인"/>
+						<!-- case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+						<div class="help_block">
+							<!-- 비밀번호확인 틀렸을경우 -->
+							<p id="misPwd" class="hide">
+								<span class="t_err">
+									새 비밀번호가 일치하지 않습니다.
+								</span>
+							</p>
+							<!-- //비밀번호확인 틀렸을경우 -->
+							<!-- 비밀번호 일치할경우 -->
+							<p id="avlConPwd" class=" hide">
+								<span class="c_black2">
+									<i class="ico ico_check black mr5"></i>새 비밀번호가 일치합니다.
+								</span>
+							</p>
+							<!-- //비밀번호 일치할경우 -->
+						</div>
+						<!-- //case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+	<div class="modal-footer">
+		<div class="btn_group_block ui_row">
+			<div class="ui_col_6">
+				<button type="button" id="btnClose" class="btn btn_default btn_block"><span>취소</span></button>
+			</div>
+			<div class="ui_col_6">
+				<button type="button" id="btnSavePassword" class="btn btn_dark btn_block"><span>변경</span></button>
+			</div>
+		</div>
+	</div>
+</div>
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	let checkPwd;
+	let checkConfirmPwd;
+
+	$("#btnClose").on('click', function() {
+		$.modal.close();
+	});
+
+	// 신규 비밀번호 입력
+	$('#pwdModifyForm input[name=passwd]').on('focusout keyup keydown', function () {
+		fnCheckPassword();
+	});
+
+	// 신규 비밀번호 확인 입력
+	$('#pwdModifyForm input[name=confirmPassword]').on('focusout keyup keydown', function () {
+		fnCheckConfirmPassword();
+	});
+
+	// 비밀번호 확인
+	var fnCheckPassword = function () {
+		const $firstFailed = $('#firstFailed');
+		const $secondFailed = $('#secondFailed');
+		const $thirdFailed = $('#thirdFailed');
+		const $avlPwd = $('#avlPwd');
+		const red = 'c_red2';
+		const gray = 'c_gray';
+		let custId = $('#pwdModifyForm input[name=custId]').val();
+		let password = $('#pwdModifyForm input[name=passwd]').val();
+		let confirmPassword = $('#pwdModifyForm input[name=confirmPassword]').val();
+		let pwdCheck = true;
+
+		// 영문, 숫자, 특수문자 2종 이상 혼용 || 길이
+		if (fnValidtaionPwdMixedWord(password) || fnValidationPwdLength(password)) {
+			pwdCheck = false;
+			$firstFailed.removeClass(gray);
+			$firstFailed.addClass(red);
+		} else {
+			$firstFailed.removeClass(red);
+			$firstFailed.addClass(gray);
+		}
+
+		// 동일한 문자/숫자 4자이상 || 연속된 문자가 4자이상
+		if (fnValidationPwdSameWord(password) || fnValidtaionPwdCntnsWord(password)) {
+			pwdCheck = false;
+			$secondFailed.removeClass(gray);
+			$secondFailed.addClass(red);
+		} else {
+			$secondFailed.removeClass(red);
+			$secondFailed.addClass(gray);
+		}
+
+		// 아이디 포함
+		if (fnValidationPwdSameId(password, custId)) {
+			pwdCheck = false;
+			$thirdFailed.removeClass(gray);
+			$thirdFailed.addClass(red);
+		} else {
+			$thirdFailed.removeClass(red);
+			$thirdFailed.addClass(gray);
+		}
+
+		if (pwdCheck) {
+			$firstFailed.hide();
+			$secondFailed.hide();
+			$thirdFailed.hide();
+			$avlPwd.show();
+			checkPwd = true;
+		} else {
+			$firstFailed.show();
+			$secondFailed.show();
+			$thirdFailed.show();
+			$avlPwd.hide();
+			checkPwd = false;
+		}
+
+		if (!gagajf.isNull(confirmPassword)) {
+			fnCheckConfirmPassword();
+		}
+
+	};
+
+	// 비밀번호체크
+	var fnCheckConfirmPassword = function () {
+		const $misPwd = $('#misPwd');
+		const $avlConPwd = $('#avlConPwd');
+		const $btnSavePassword = $('#btnSavePassword');
+		let password = $('#pwdModifyForm input[name=passwd]').val();
+		let confirmPassword = $('#pwdModifyForm input[name=confirmPassword]').val();
+
+		let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
+
+		if (sameConfirmPwd) {
+			$avlConPwd.show();
+			$misPwd.hide();
+			checkConfirmPwd = true;
+			//$btnSavePassword.attr('disabled', false);
+		} else {
+			$misPwd.show();
+			$avlConPwd.hide();
+			checkConfirmPwd = false;
+			//$btnSavePassword.attr('disabled', true);
+		}
+
+	};
+
+	// 패스워드 저장
+	$('#btnSavePassword').on('click', function () {
+		let pwdModifyForm = $('#pwdModifyForm').serializeObject();
+
+		if (gagajf.isNull(pwdModifyForm.orgPasswd)) {
+			mcxDialog.alert('기존 비밀번호 입력해주세요.');
+			return;
+		}
+
+		if (gagajf.isNull(pwdModifyForm.passwd)) {
+			mcxDialog.alert('신규 비밀번호를 입력해주세요.');
+			return;
+		}
+
+		if (gagajf.isNull(pwdModifyForm.confirmPassword)) {
+			mcxDialog.alert('신규 비밀번호 확인을 입력해주세요.');
+			return;
+		}
+
+		if (!checkPwd) {
+			mcxDialog.alert('유효하지 않은 신규 비밀번호 입니다.');
+			return;
+		}
+
+		if (!checkConfirmPwd) {
+			mcxDialog.alert('유효하지 않은 신규 비밀번호 입니다.');
+			return;
+		}
+
+		if (pwdModifyForm.passwd !== pwdModifyForm.confirmPassword) {
+			mcxDialog.alert('신규 비밀번호가 일치하지 않습니다. 다시 확인해주세요.');
+			return;
+		}
+
+		fnCheckPassword();
+		fnCheckConfirmPassword();
+		let jsonData = JSON.stringify(pwdModifyForm);
+		gagajf.ajaxJsonSubmit('/mypage/password/change', jsonData, fnChangePasswordCallback);
+	});
+
+	var fnChangePasswordCallback = function (result) {
+		if (result.isSuccess) {
+			mcxDialog.alertC("비밀번호가 변경되었습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$.modal.close();
+				}
+			});
+		} else {
+			if (result.resultType === 'WRONG_PWD') {
+				mcxDialog.alert('기존 비밀번호가 일치하지 않습니다. 다시 확인해주세요.');
+			}
+		}
+	};
+
+	/*]]>*/
+</script>
+</html>

+ 9 - 12
src/main/webapp/WEB-INF/views/web/mypage/MypageCustSnsJoinInitPwdFormWeb.html

@@ -202,19 +202,16 @@
 		const $btnSavePassword = $('#btnSavePassword');
 		let password = $('#resetPasswordForm input[name=passwd]').val();
 		let confirmPassword = $('#resetPasswordForm input[name=confirmPassword]').val();
-		if (!gagajf.isNull(password) && !gagajf.isNull(confirmPassword)) {
-			if (fnValidationPwdSameConfirmPwd(password, confirmPassword)) {
-				$avlConPwd.hide();
-				$misPwd.show();
-				$btnSavePassword.attr('disabled', true);
-			} else {
-				$misPwd.hide();
-				$avlConPwd.show();
-				$btnSavePassword.attr('disabled', false);
-			}
+		let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
+		if (sameConfirmPwd) {
+			$misPwd.hide();
+			$avlConPwd.show();
+			$btnSavePassword.attr('disabled', false);
+		} else {
+			$avlConPwd.hide();
+			$misPwd.show();
+			$btnSavePassword.attr('disabled', true);
 		}
-
-
 	};
 
 	// 패스워드 저장

+ 31 - 3
src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html

@@ -293,15 +293,41 @@
 		
 		// 마이페이지 location 설정
 		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '교환 신청');
+		
+		// 셀렉트박스 활성화
+		$('.select_custom').each(function() {
+			new sCombo($(this));
+		});
 	});
 
 	// 교환 옵션 변경 팝업
 	var fnChangeOption = function(param) {
 		// TODO
 		// 옵션변경 처리
+		let ordNo = $(param).attr('ordNo');
+		let ordDtlNo = $(param).attr('ordDtlNo');
+
+		// 옵션변경 수량 체크
+		let chgQtyArr = [];
+		let chgOrdDtlNoArr = [];
+
+		$.each($('input[name=chgQty]'), function(idx, item) {
+			chgQtyArr.push($(item).val());
+			chgOrdDtlNoArr.push($(item).attr('ordDtlNo'));
+		});
+
+		let index = chgOrdDtlNoArr.indexOf(ordDtlNo);
+		let chgQty = chgQtyArr[index];
+		
+		if (chgQty == null || chgQty <= 0) {
+			mcxDialog.alert('교환 옵션 변경 수량을 선택해주세요.');
+			return false;
+		}
+
 		var jsonObj = {};
-		jsonObj.ordNo = $(param).attr('ordNo');
-		jsonObj.ordDtlNo = $(param).attr('ordDtlNo');
+		jsonObj.ordNo = ordNo;
+		jsonObj.ordDtlNo = ordDtlNo;
+		jsonObj.chgQty = chgQty;
 
 		$.ajax({
 			type		: "POST",
@@ -332,7 +358,9 @@
 	
 	// 교환 수량 변경 이벤트
 	var fnChangeExchangeQty = function(param) {
-		
+		if (param != null) {
+			$(param).parent().parent().find('input[name=chgQty]').val($(param).attr('qty'));
+		}
 	}
 </script>
 

+ 55 - 9
src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html

@@ -54,6 +54,8 @@
 
 
 <script th:inline="javascript">
+let month = [[${wishMonth}]];
+
 // 마이페이지 위시리스트 해제
 var wishlistDelete = function(obj) {
 	mcxDialog.confirm("위시리스트를 해제하시겠습니까?", {
@@ -68,16 +70,60 @@ var wishlistDelete = function(obj) {
 
 // 마이페이지 위시리스트 
 var ajaxWishList = function () {
-	 $.ajax({
-			type		: "GET",
-			url 		: '/mypage/wish/list',
-			dataType 	: 'html',
-			success 	: function(result) {
-				if (result != null) {
-					$("#wishList").html(result);
-				}
+	 $.getJSON('/mypage/wish/list', function(result, status) {
+		if (status == 'success') {
+			$('#wishList').html('');
+			html = '';
+			for (var i = 0; i < month.length; i++) {
+				html+='<div class="monthly_wish_wrap">';
+				html+='	<div class="date">';
+				html+='		<span>'+month[i].regDt+'</span>';
+				html+='	</div>';
+				html+='	<div class="itemsGrp">';
+				
+				$.each(result, function (idx, item) {
+					if (item.regDt == month[i].regDt) {
+						html+='		<div class="item_prod">';
+						html+='			<div class="item_state">';
+						html+='				<button type="button" class="itemLike active" goodsCd="'+item.goodsCd+'" onclick="wishlistDelete(this)">관심상품 추가</button>';
+						html+='				<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail('+item.goodsCd+')">';
+						html+='					<div class="itemPic">';
+						html+='						<img alt="" class=" vLHTC pd_img" src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '">';
+						html+='					</div>';
+						html+='					<p class=" itemBrand">'+item.brandGroupNm+'</p>';
+						html+='					<div class=" itemName">'+item.goodsNm+'</div>';
+						html+='					<p class="itemPrice">'+item.currPrice.addComma();
+						if (item.currPrice != item.listPrice) {
+							html+='						<span class="itemPrice_original">'+item.listPrice.addComma()+'</span>';
+						}
+						if (item.dcRate>0) {
+							html+='						<span class=" itemPercent">'+item.dcRate+'%</span>';
+						}
+						
+						html+='					</p>';
+						html+='					<div class="itemcolorchip">';
+						html+='						<span class="chip_color35" value="ABM">BEIGE</span>';
+						html+='						<span class="chip_color54" value="BDS">BLACK</span>';
+						html+='						<span class="chip_color40" value="YBR">WHITE</span>';
+						html+='					</div>';
+						html+='					 <p class="itemBadge">';
+						html+='						<span class="badge13">베스트 </span>';
+						html+='					</p>';
+						if (item.goodsTnm != null && item.goodsTnm != '') {
+							html+='					<div class="itemComment">'+item.goodsTnm+'</div>';
+						}
+						html+='				</a>';
+						html+='			</div>';
+						html+='		</div>';
+					}
+					
+				});
+				html+='	</div>';
+				html+='</div>';
+				$('#wishList').html(html);
 			}
-		});		
+		}
+	});
 }
 
 $(document).ready(function() {

+ 0 - 57
src/main/webapp/WEB-INF/views/web/mypage/MypageWishListWeb.html

@@ -1,57 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org"
-	style="overflow-x: hidden !important;"
->
-<!--
- *******************************************************************************
- * @source  : CouponDetailPopWeb.html
- * @desc    : 쿠폰적용대상 리스트 Page
- *============================================================================
- * PastelMall
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2021.03.17   sowon     최초 작성
- *******************************************************************************
- -->
-<!-- 월별 관심상품 -->
-<th:block th:if="${wishMonth != null}" th:each="WishMonth, wishStat : ${wishMonth}">
-<div class="monthly_wish_wrap" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}">
-	<div class="date">
-		<span th:text="${WishMonth.regDt}"></span>
-	</div>
-	<div class="itemsGrp">
-	   <th:block th:each="WishGoods, wishStat : ${wishGoods}">
-		<div class="item_prod">
-			<div class="item_state">
-				<button type="button" class="itemLike active" th:attr="goodsCd=${WishGoods.goodsCd}, ithrCd='', contentsLoc='', planDtlSq=''" onclick="wishlistDelete(this)">관심상품 추가</button>
-				<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${WishGoods.goodsCd}]])">
-					<div class="itemPic">
-						<img alt="" class=" vLHTC pd_img" th:src="${goodsView + '/' +WishGoods.sysImgNm}">
-					</div>
-					<p class=" itemBrand" th:text="${WishGoods.brandGroupNm}"></p>
-					<div class=" itemName" th:text="${WishGoods.goodsNm}"></div>
-					<p class="itemPrice">[[${#numbers.formatInteger(WishGoods.currPrice,3,'POINT') + '원'}]]
-						<span class="itemPrice_original"  th:if="${WishGoods.currPrice != WishGoods.listPrice}" th:text="${#numbers.formatInteger(WishGoods.listPrice,3,'POINT') + '원'}"></span>
-						<span class=" itemPercent" th:if="${WishGoods.dcRate > 0}" th:text="|${#numbers.formatDecimal(WishGoods.dcRate,0,0)}%|"></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>
-					 <p class="itemBadge">
-						<span class="badge13">베스트 </span>
-					</p>
-					<div class="itemComment" th:text="${WishGoods.goodsTnm}"></div>
-				</a>
-			</div>
-		</div>
-		</th:block>	
-	</div>
-</div>
-</th:block>
-<!-- //월별 관심상품 -->
-				

+ 82 - 0
src/main/webapp/WEB-INF/views/web/planning/PlanningCouponDetailFormWeb.html

@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PlanningCouponDetailFormWeb.html
+ * @desc	: 기획전 쿠폰 사용안내 모달
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR	  DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.01   sowon		최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-body">
+			<div class="modal-header">
+				<h5 class="modal-title" id="couponInfoLabel" th:text="${couponDetailInfo.cpnNm}"></h5>
+			</div>
+			<div class="modal-body">
+				<div class="pop_cont">
+					<dl>
+						<div>
+							<dt>사용조건</dt>
+							<dd th:if="${couponDetailInfo.buyLimitAmt < 1}">
+								<span>제한없음</span>
+							</dd>
+							<dd th:unless="${couponDetailInfo.buyLimitAmt < 1}"> 
+								<span th:text="${#numbers.formatInteger(couponDetailInfo.buyLimitAmt,0,'COMMA')}"></span>원 이상 구매 시 최대 <span th:text="${#numbers.formatInteger(couponDetailInfo.maxDcAmt,0,'COMMA')}"></span>원 할인
+							</dd>
+						</div>
+						<div>
+							<dt>발급수량</dt>
+							<dd th:if="${couponDetailInfo.custPubLimitQty < 1}">
+								<span>제한없음</span>
+							</dd>
+							<dd th:unless="${couponDetailInfo.custPubLimitQty < 1}">
+								1인 최대<span th:text="${#numbers.formatInteger(couponDetailInfo.custPubLimitQty,0,'COMMA')}"></span>매
+							</dd>
+						</div>
+						<div>
+							<dt>유효기간</dt>
+							<dd>
+								<span th:text="${couponDetailInfo.availStdt}"></span>&nbsp;~&nbsp;<span  th:text="${couponDetailInfo.availEddt}"></span>
+							</dd>
+						</div>
+						<div>
+							<dt>브랜드</dt>
+							<th:block th:each="BrandData, BrandStat : ${cpnDtlRefvalBrandList}">
+                				<dd th:text="${BrandData.brandEnm == ''? '제한없음' :BrandData.brandEnm}"></dd>
+               				</th:block>
+						</div>
+						<div>
+							<dt>카테고리</dt>
+							<th:block th:each="CateData, CateStat : ${cpnDtlRefvalCateList}">
+                				<dd th:text="${CateData.cateNm} + ' '"></dd>
+               				</th:block>
+						</div>
+						<div>
+							<dt>젹용상품</dt>
+							<th:block th:each="GoodsData, GoodsStat : ${cpnDtlRefvalApplyGoodsList}">
+                				<dd th:text="${GoodsData.goodsNm} + ' '"></dd>
+               				</th:block>
+						</div>
+						<div>
+							<dt>제외상품</dt>
+							<th:block th:each="ExceptData, ExceptStat : ${cpnDtlRefvalExceptGoodsList}">
+                				<dd th:text="${ExceptData.goodsNm} + ' '"></dd>
+               				</th:block>
+						</div>
+					</dl>
+				</div>
+			</div>
+		</div>
+		<div class="modal-footer">
+			<p>본 쿠폰은 특정 상품&#47;행사에 적용되는 쿠폰이며,적용가능여부는 상품별 상이할 수 있습니다.</p>
+			<p>본 이벤트는 당사 사정에 따라 사전고지 없이 변경 또는 조기종료 될 수 있습니다.</p>
+		</div>
+	</div>
+</div>

+ 10 - 8
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -186,8 +186,9 @@
             </div>
             <!-- //다른 기획전 보기 -->
         </div>
-    </div>   
-<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true"></div>
+<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true">
+
+</div>
 <script th:inline="javascript">
 let review = [[${reviewInfo}]];
 let coupon = [[${couponInfo}]];
@@ -301,7 +302,7 @@ if(goods1 != null || goods1 != ''){
 			html += '<div class="cont_head">';
 			html += '	<div>';
 			html += '        <h4>';
-			if (template[i].linkUrl != null || template[i].linkUrl != '') { /* 링크 변경 예정 */
+			if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
 				html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'</a>';
 			}else{
 				html += '        <a href="javascript:void(0)">'+template[i].title+'</a>';
@@ -366,7 +367,7 @@ if(goods2 != null || goods2 != ''){
 			html += '<div class="cont_head">';
 			html += '	<div>';
 			html += '        <h4>';
-				if (template[i].linkUrl != null || template[i].linkUrl != ' ' ||typeof template[i].linkUrl != 'undefined') { /* 링크 변경 예정 */
+				if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
 					html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'</a>';
 				}else{
 					html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
@@ -434,7 +435,7 @@ if(goods4 != null || goods4 != ''){
 			html += '<div class="cont_head">';
 			html += '<div>';
 			html += '        <h4>';
-			if (template[i].linkUrl != null || template[i].linkUrl != ' ' ||typeof template[i].linkUrl != 'undefined') { /* 링크 변경 예정 */
+			if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
 				html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'</a>';
 			}else{
 				html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
@@ -550,11 +551,12 @@ if(coupon != null || coupon != ''){
 	html += '			<p>유의사항</p>';
 	html += '		</div>';
 	html += '		<div class="announce_list">';
-	html += '			<ul>';
+	html += coupon[0].note;
+/* 	html += '			<ul>';
 	html += '				<li>쿠폰 발급 기간 :'+ plan.dispStdt +'~'+ plan.dispEddt +'</li>';
 	html += '				<li>본 쿠폰은 해당 기획전 상품에만 적용 가능합니다.</li>';
 	html += '				<li>본 쿠폰은 해당 기획전 다운로드 버튼을 통해 발급받으실 수 있습니다.</li>';
-	html += '			</ul>';
+	html += '			</ul>'; */
 	html += '		</div>';
 	html += '	</div>';
 	html += '</div>';
@@ -567,7 +569,7 @@ if(coupon != null || coupon != ''){
 var useInfoCoupon = function (id) {
 	 $.ajax( {
 		type		: "GET",
-		url 		: '/mypage/coupon/detailPop?cpnId='+ id,
+		url 		: '/planning/coupon/detail?cpnId='+ id,
 		dataType 	: 'html',
 		success 	: function(result) {
 			if (result != null) {

+ 6 - 5
src/main/webapp/biz/customer.js

@@ -172,12 +172,13 @@ var fnValidationPwdSameId = function (password, custId) {
  * @since 2021. 02. 17
  */
 var fnValidationPwdSameConfirmPwd = function (password, confirmPassword) {
-	let result;
+	let result = false;
 
-	if (password != confirmPassword) {
-		result = true;
-	} else {
-		result = false;
+	if (!gagajf.isNull(password) && !gagajf.isNull(confirmPassword)) {
+		if (password === confirmPassword) {
+			result = true;
+		}
 	}
+
 	return result;
 };

+ 19 - 16
src/main/webapp/ux/pc/css/common.css

@@ -750,25 +750,28 @@ content: "〉";font-size: 12px;padding-left: 8px;
 .itemsGrp::after{content: "";display: table;clear: both;}
 
 /* row type */
-.itemsGrp.rowtype .item_prod {width: 49.43%; margin-bottom: 1.12%; height: 420px; border:1px solid #ddd; overflow: hidden;}
-.itemsGrp.rowtype .item_prod:nth-child(2n) {margin-right: 0;}
-.itemsGrp.rowtype .item_prod .itemBadge, .itemsGrp.rowtype .item_prod .itemcolorchip {display: none;}
-.itemsGrp.rowtype .item_prod .item_state {display: table; padding-left: 330px; padding-right: 50px; padding-bottom: 0; height: 420px; width: 100%;}
-.itemsGrp.rowtype .item_prod .itemLink {display: table-cell; position: static; vertical-align: middle;}
-.itemsGrp.rowtype .item_prod .itemLike {z-index: 99;}
+.itemsGrp.rowtype .item_prod {width:calc((100% - 20px)/2); margin-top:20px; margin-right:20px; height:420px; border:1px solid #ddd; overflow:hidden;}
+.itemsGrp.rowtype .item_prod:nth-child(2n) {margin-right:0;}
+.itemsGrp.rowtype .item_prod .itemBadge,
+.itemsGrp.rowtype .item_prod .itemcolorchip {display: none;}
+.itemsGrp.rowtype .item_prod .item_state {display:table; width:100%; padding:0;}
+.itemsGrp.rowtype .item_prod .itemLink {display:table-cell; position: relative;vertical-align: middle;width: 100%;height: 420px;padding-left: 330px;padding-right: 50px;}
+.itemsGrp.rowtype .item_prod .itemLike {left:240px; z-index:99;}
 .itemsGrp.rowtype .item_prod .itemPic {position: absolute; top: 0; left: 0; margin-bottom: 0; padding-top: 0; width: 280px; height: 420px;}
 .itemsGrp.rowtype .item_prod .itemPic .shape {z-index: 89;}
 .itemsGrp.rowtype .item_prod .itemPic::after {background: #f5f5f5; opacity:1; z-index: 87;}
 .itemsGrp.rowtype .item_prod .itemPic .pd_img {z-index: 88;}
-.itemsGrp.rowtype .item_state.soldout .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size: 20px; color:#fff; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 89; text-align: center;}
-.itemsGrp.rowtype .item_prod .itemBrand {margin:0px 6px 65px; font-size: 16px; font-weight: 300;}
-.itemsGrp.rowtype .item_prod .itemComment {position: absolute; left: 340px; top: 150px; font-size: 16px; font-weight: 300; margin:0;}
-.itemsGrp.rowtype .item_prod .itemName {margin:0px 6px 40px; font-size: 30px; font-weight: 200; line-height: 1.2; max-height:70px; height: 70px;}
-.itemsGrp.rowtype .item_prod .itemPrice {font-size: 30px; line-height: 1; font-weight: 500;}
+.itemsGrp.rowtype .item_state.soldout .itemPic:before {content:'SOLD OUT'; position:absolute; top:50%; left:50%; color:#fff; font-size:28px; font-weight:500; background:rgba(0,0,0,.7); width:100%; height:100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 89; text-align:center;}
+.itemsGrp.rowtype .item_prod .itemBrand {margin:0px; font-size: 16px; font-weight: 300;}
+.itemsGrp.rowtype .item_prod .itemComment {position:relative; top:-80px; font-size: 16px; font-weight: 300; margin:0;}
+.itemsGrp.rowtype .item_prod .itemName {margin:10px 0px 60px; font-size:24px; font-weight: 200; line-height:34px; max-width:100%; max-height:68px; height:auto;}
+.itemsGrp.rowtype .item_prod .itemPrice {font-size: 30px; line-height: 1; font-weight:500; margin-left:0; margin-right:0;}
 .itemsGrp.rowtype .item_prod .itemPrice_original {font-size: 20px; font-weight: 200;}
-.itemsGrp.rowtype .item_prod .itemPercent {font-size: 42px; line-height: 0.8;}
-
-
+.itemsGrp.rowtype .item_prod .itemPercent {font-size: 42px; font-weight:300; line-height: 0.8;}
+.itemsGrp.rowtype .item_prod .shopBagBtn {margin-top:30px;}
+.itemsGrp.rowtype .item_prod .shopBagBtn .btn {width:178px; height:52px; border-color:#a7a7a7; color:#222; font-weight:300;}
+.itemsGrp.rowtype .item_prod .shopBagBtn .btn span {position:relative; padding-left:25px; line-height:1;}
+.itemsGrp.rowtype .item_prod .shopBagBtn .btn span::before {content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); width:15px; height:18px; background: url('/images/pc/ico_shopbag.png') no-repeat 50% 50%;}
 
 .item_prod {width: 20%;display: inline-block;font-size: 0px;vertical-align: top;color: rgb(31, 31, 31);position: relative;letter-spacing: -0.2px;}
 .item_state {position: relative; padding: 0px 10px 60px; box-sizing: border-box;}
@@ -949,7 +952,7 @@ select,
 }
 
 /*input */
-.help_block {display: block;margin-top: 5px;margin-bottom: 0px;width: 100%;text-indent: 10px;position: relative;}
+.help_block {display: block; position:relative; margin-top:5px; margin-bottom:0px; width:100%; text-indent:10px; font-size:14px;}
 .help_block p[class*="t_"] span {display:inline-block;}
 
 /* 체크박스 */
@@ -1249,7 +1252,7 @@ input[type="file"] {
 .quick_menu_group .area > div:first-child span:first-child a{margin-left:0}
 .quick_menu_group .area > div:first-child span:first-child a:after{display:none}
 .quick_menu_group .area > div:first-child span a:after{position:absolute;top:13px;left:0;width:1px;height:13px;background:#959596;content:''}
-.quick_menu_group .inr a{margin-left:16px;color:#eeeeee;}*/
+.quick_menu_group .inr a{margin-left:16px;color:#eeeeee;}
 
 
 

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 220 - 938
src/main/webapp/ux/pc/css/layout.css


+ 80 - 4
src/main/webapp/ux/style24_link.js

@@ -10,6 +10,7 @@ const _PAGE_ALL_BRAND = _frontUrl + "/display/all/brand/form";			// 전체 브
 const _PAGE_CATE_MAIN = _frontUrl + "/display/category/main/form";		// 카테고리메인
 const _PAGE_ITEMKIND_MAIN = _frontUrl + "/display/itemkind/main/form";	// 품목메인
 const _PAGE_BRAND_MAIN = _frontUrl + "/display/brand/main/form";		// 브랜드메인
+const _PAGE_CATE_GOODS_LIST = _frontUrl + "/display/category/goods/list/form";	// 카테고리 상품목록
 
 //== 고객 ==/
 const _PAGE_CUSTOMER_JOIN_TYPE = _frontUrl + "/customer/join/type/form";							// 고객 > 회원가입 유형
@@ -27,7 +28,10 @@ const _PAGE_CUSTOMER_SECEDE_COMPLETE = _frontUrl + "/customer/secede/complete/fo
 const _PAGE_CUSTOMER_CERTIFICATION = _frontUrl + "/customer/certification/form"						// 고객 > 본인인증화면
 const _PAGE_USE_TERMS = _frontUrl + "/customer/use/terms/form";										// Footer > 이용약관
 const _PAGE_PRIVACY_POLICY = _frontUrl + "/customer/privacy/policy/form";							// Footer > 개인정보취급방침
-const _PAGE_CUSTOMER_CONSENT_USERINFO = _frontUrl + "/customer/consent/useinfo/layer";				// 정보 이용동의 : Yes24 로그인
+const _PAGE_CUSTOMER_CONSENT_USERINFO = _frontUrl + "/customer/consent/useinfo/form";				// 정보 이용동의 : Yes24 로그인
+const _PAGE_USE_TERMS_LAYER = _frontUrl + "/customer/use/terms/layer";								// 회원가입 > 이용약관
+const _PAGE_PRIVACY_POLICY_LAYER = _frontUrl + "/customer/privacy/policy/layer";					// 회원가입 > 개인정보취급방침
+const _PAGE_PRIVACY_TRUST_LAYER = _frontUrl + "/customer/privacy/trust/layer";						// 회원가입 > 개인정보취급위탁
 
 //== 상품상세 ==/
 const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";								// 상품 상세
@@ -65,6 +69,7 @@ const _PAGE_MYPAGE_DELIVERY_ADDR = _frontUrl + "/mypage/delivery/addr/form";	//
 const _PAGE_MYPAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";				// 마이페이지 > 위시리스트
 const _PAGE_MYPAGE_CUSTOMER = _frontUrl + "/mypage/customer/confirm/form";		// 마이페이지 > 내정보 관리 > 회원정보 확인
 const _PAGE_MYPAGE_CUSTOMER_MODIFY = _frontUrl + "/mypage/customer/modify/form";// 마이페이지 > 내정보 관리 > 회원정보 수정
+const _PAGE_PASSWORD_MODIFY = _frontUrl + "/mypage/password/modify/form";		// 마이페이지 > 비밀번호 변경
 const _PAGE_MYPAGE_SECEDE = _frontUrl + "/mypage/customer/secede/form";			// 마이페이지 > 회원탈퇴
 const _PAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";					// 마이페이지 > 위시리스트
 const _PAGE_WISHLIST_PUT = _frontUrl + "/mypage/wish/list/put";					// 위시리스트 담기
@@ -691,7 +696,7 @@ function cfGoodsReview(goodsCd) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 딜구성상품상세 full 팝업
+ * @desc   : Yes24 정보이용동의 화면
  * @param  : custNm - 고객명
  * <pre>
  *		cfnConsentUseInfo(custNm);
@@ -699,14 +704,85 @@ function cfGoodsReview(goodsCd) {
  */
 function cfnConsentUseInfo(custNm) {
 	let str = '<div class="modal fade mbAgree_pop" id="layer_consent_useinfo" tabIndex="-1" role="dialog" aria-labelledby="mbAgreeLabel" aria-hidden="true"></div>';
-
+	let params = {}
+	params.custNm = custNm;
 	if ($('#layer_consent_useinfo').length == 0) {
 		$('body').append(str);
 	}
 
-	cfOpenLayer(_PAGE_CUSTOMER_CONSENT_USERINFO, 'layer_consent_useinfo');
+	cfOpenLayer(_PAGE_CUSTOMER_CONSENT_USERINFO, 'layer_consent_useinfo',params);
+}
+
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 패스워드 변경 팝업
+ * <pre>
+ *		cfnPasswordModify();
+ * </pre>
+ */
+function cfnPasswordModify() {
+	let str = '<div class="modal fade pswordModify_pop" id="pswordModifyPop" tabindex="-1" role="dialog" aria-labelledby="pswordModifyLabel" aria-hidden="true"></div>';
+
+	if ($('#pswordModifyPop').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenLayer(_PAGE_PASSWORD_MODIFY, 'pswordModifyPop');
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 이용약관 레이어
+ * <pre>
+ *		cfnUseTermsLayer();
+ * </pre>
+ */
+function cfnUseTermsLayer() {
+	let str = '<div class="modal fade policiesTerms_pop" id="policiesTermsPop" tabindex="-1" role="dialog" aria-labelledby="policiesTermsLabel" aria-hidden="true"></div>';
+	if ($('#policiesTermsPop').length == 0) {
+		$('body').append(str);
+	}
+	cfOpenLayer(_PAGE_USE_TERMS_LAYER, 'policiesTermsPop');
 }
 
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 개인정보취급방침 레이어
+ * <pre>
+ *		cfnPrivacyPolicyLayer();
+ * </pre>
+ */
+function cfnPrivacyPolicyLayer() {
+	let str = '<div class="modal fade policiesPrivacy_pop" id="policiesPrivacyPop" tabindex="-1" role="dialog" aria-labelledby="policiesPrivacyLabel" aria-hidden="true"></div>';
+	if ($('#policiesPrivacyPop').length == 0) {
+		$('body').append(str);
+	}
+	cfOpenLayer(_PAGE_PRIVACY_POLICY_LAYER, 'policiesPrivacyPop');
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 개인정보취급위탁 레이어
+ * <pre>
+ *		cfnPrivacyConsignmentLayer();
+ * </pre>
+ */
+function cfnPrivacyTrustLayer() {
+	let str = '<div class="modal fade trustPrivacy_pop" id="trustPrivacyPop" tabindex="-1" role="dialog" aria-labelledby="trustPrivacyLabel" aria-hidden="true"></div>';
+	if ($('#trustPrivacy_pop').length == 0) {
+		$('body').append(str);
+	}
+	cfOpenLayer(_PAGE_PRIVACY_TRUST_LAYER, 'trustPrivacyPop');
+}
+
+
+
+
 /**
  * @type   : function
  * @access : public

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů