Browse Source

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.front into develop

card007 5 years ago
parent
commit
31f11c8722

+ 37 - 0
src/main/java/com/style24/front/support/config/TsfWebMvcConfig.java

@@ -1,14 +1,18 @@
 package com.style24.front.support.config;
 
 import java.nio.charset.Charset;
+import java.util.Iterator;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver;
 import org.springframework.mobile.device.DeviceResolverHandlerInterceptor;
 import org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor;
@@ -18,7 +22,9 @@ import org.springframework.web.multipart.support.MultipartFilter;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.core.support.filter.TscXssServletFilter;
+import com.style24.core.support.text.TscHtmlCharacterEscapes;
 import com.style24.front.support.interceptor.TsfAflinkInterceptor;
 import com.style24.front.support.interceptor.TsfDefaultInterceptor;
 import com.style24.front.support.interceptor.TsfGoodsViewInterceptor;
@@ -193,6 +199,37 @@ public class TsfWebMvcConfig implements WebMvcConfigurer {
 		return bean;
 	}
 
+	/**
+	 * MappingJackson2HttpMessageConverter가 여러 개일 경우 내가 추가한 것이 선택되지 않을 수 있음
+	 * 그러므로 application/json으로 선택되는 converter를 덮어 써야 함
+	 */
+	@SuppressWarnings("rawtypes")
+	@Override
+	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+		// Replace MessageConverter from default WebMvcConfigurer
+		Iterator<HttpMessageConverter<?>> converterIterator = converters.iterator();
+		while (converterIterator.hasNext()) {
+			// Do not add new one, must replace
+			HttpMessageConverter converter = converterIterator.next();
+			if (converter.getSupportedMediaTypes().contains(MediaType.APPLICATION_JSON)) {
+				converterIterator.remove();
+			}
+		}
+		converters.add(jsonEscapeConverter());
+	}
+
+	/**
+	 * XSS(Cross Site Script) Prevention
+	 * 		@ResponseBody로 전달되는 JSON에 대한 처리
+	 * @return
+	 */
+	@Bean
+	public MappingJackson2HttpMessageConverter jsonEscapeConverter() {
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.getFactory().setCharacterEscapes(new TscHtmlCharacterEscapes());
+		return new MappingJackson2HttpMessageConverter(objectMapper);
+	}
+
 	/**
 	 * API 호출을 위한 RestTemplate 설정
 	 * @return

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

@@ -171,8 +171,8 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 		result.setString("returnUrl", returnUrl);
 		result.setString("custNo", loginDetails.getUsername()); // 로그인 후 APP푸시SDK 연동을 위해
 		if (loginDetails.isLogin()) {
-			result.setString("appAgreeDt", loginDetails.getLoginInfo().getAppAgreeDt());
-			result.setString("mkAgreeDt", loginDetails.getLoginInfo().getMkAgreeDt());
+			result.setString("appAgreeYn", loginDetails.getLoginInfo().getAppAgreeYn());
+			result.setString("mkAgreeYn", loginDetails.getLoginInfo().getMkAgreeYn());
 		}
 		GagaStringUtil.write(response, result);
 	}

+ 61 - 4
src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

@@ -107,6 +107,12 @@
 /*<![CDATA[*/
 	let ckLoginId = "ckLoginId";
 	let rechaptchCheck = true;
+	let custAppAgreeYn;
+	let custMkAgreeYn;
+	let phoneAppAgreeYn;
+	let phoneMkAgreeYn;
+	let custNo;
+	let returnUrl;
 
 	// 로그인
 	$('#btnLogin').on('click', function() {
@@ -171,7 +177,11 @@
 	var fnReloadAfterLogin = function(result) {
 		if (result.status === 'OK') {
 			if (_isApp === 'true') {
-				document.location.href = "idsend://?id=" + result.custNo + "^link=" + result.returnUrl;
+				custAppAgreeYn = result.appAgreeYn;
+				custMkAgreeYn = result.mkAgreeYn;
+				custNo = result.custNo;
+				returnUrl = result.returnUrl;
+				fnIsPushEnable(); // 정보성 PUSH, 마케팅 PUSH 수신여부 확인
 			} else {
 				document.location.href = result.returnUrl;
 			}
@@ -331,14 +341,61 @@
 		}
 	};
 
-	// 앱푸시동의 데이터 처리
-	var fnAppPushAgreeUpdate = function (appAgreeYn) {
+	// 앱에서 호출되는 함수(앱푸시)
+	var settingsSwitchPush = function(onOff) {
+		if (onOff === 'ON') {
+			phoneAppAgreeYn = 'Y';
+		} else if (onOff === 'OFF'){
+			phoneAppAgreeYn = 'N';
+		}
+		fnIsAdEnable();
+	}
+
+	// 앱에서 호출되는 함수(마케팅동의)
+	var settingsSwitchAdvertise = function (onOff) {
+		if (onOff === 'ON') {
+			phoneMkAgreeYn = 'Y';
+		} else if (onOff === 'OFF'){
+			phoneMkAgreeYn = 'N';
+		}
+
+		// 기기에 등록된 정보성 PUSH, 마케팅 PUSH 수신여부와
+		// 고객DB 수신여부 비교 후 다르면 기기에 등록된 데이터로 업데이트
+		if (phoneAppAgreeYn !== custAppAgreeYn || phoneMkAgreeYn !== custMkAgreeYn ) {
+			fnUpdatePush(phoneAppAgreeYn, phoneMkAgreeYn);
+		}
+		document.location.href = "idsend://?id=" + custNo + "^link=" + returnUrl;
+	}
+
+	// 정보성 PUSH ON, OFF 여부 확인
+	// 호출시 앱에서 settingsSwitchPush 호출 해서 ON, OFF 값을 param 값으로 준다.
+	var fnIsPushEnable = function () {
+		if (_osType === 'A') {
+			window.style24.isPushEnable();
+		} else if (_osType === 'I') {
+			window.webkit.messageHandlers.isPushEnable.postMessage({'dummy':'dummy'});
+		}
+	}
+
+	// 마케팅 PUSH ON, OFF 여부확인
+	// 호출시 앱에서 settingsSwitchAdvertise 호출 해서 ON, OFF 값을 param 값으로 준다.
+	var fnIsAdEnable = function () {
+		if (_osType === 'A') {
+			window.style24.isAdEnable();
+		} else if (_osType === 'I') {
+			window.webkit.messageHandlers.isAdEnable.postMessage({'dummy':'dummy'});
+		}
+	}
+
+	var fnUpdatePush = function (appAgreeYn, mkAgreeYn) {
 		let params = {}
 		params.appAgreeYn = appAgreeYn;
+		params.mkAgreeYn = mkAgreeYn;
 		let jsonData = JSON.stringify(params);
-		gagajf.ajaxJsonSubmit('/app/appagree/update', jsonData);
+		gagajf.ajaxJsonSubmit('/app/push/update', jsonData);
 	}
 
+
 	$(document).ready(function() {
 
 		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));

+ 61 - 7
src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html

@@ -23,6 +23,12 @@
 <script th:inline="javascript">
 /*<![CDATA[*/
 	const resultMap = [[${resultMap}]];
+	let custAppAgreeYn;
+	let custMkAgreeYn;
+	let phoneAppAgreeYn;
+	let phoneMkAgreeYn;
+	let custNo;
+	let returnUrl;
 
 	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
@@ -100,10 +106,11 @@
 	var fnReloadAfterLogin = function(result) {
 		if (result.status === 'OK') {
 			if (_isApp === 'true') {
-				if (gagajf.isNull(result.appAgreeDt)) {
-					fnAppPushAgreeUpdate('Y');
-				}
-				document.location.href = "idsend://?id=" + result.custNo + "^link=" + result.returnUrl;
+				custAppAgreeYn = result.appAgreeYn;
+				custMkAgreeYn = result.mkAgreeYn;
+				custNo = result.custNo;
+				returnUrl = result.returnUrl;
+				fnIsPushEnable(); // 정보성 PUSH, 마케팅 PUSH 수신여부 확인
 			} else {
 				document.location.href = result.returnUrl;
 			}
@@ -143,12 +150,59 @@
 
 		return; // 정상적으로 로그인 되지 않았으므로 return
 	}
-		// 앱푸시동의 데이터 처리
-	var fnAppPushAgreeUpdate = function (appAgreeYn) {
+
+	// 앱에서 호출되는 함수(앱푸시)
+	var settingsSwitchPush = function(onOff) {
+		if (onOff === 'ON') {
+			phoneAppAgreeYn = 'Y';
+		} else if (onOff === 'OFF'){
+			phoneAppAgreeYn = 'N';
+		}
+		fnIsAdEnable();
+	}
+
+	// 앱에서 호출되는 함수(마케팅동의)
+	var settingsSwitchAdvertise = function (onOff) {
+		if (onOff === 'ON') {
+			phoneMkAgreeYn = 'Y';
+		} else if (onOff === 'OFF'){
+			phoneMkAgreeYn = 'N';
+		}
+
+		// 기기에 등록된 정보성 PUSH, 마케팅 PUSH 수신여부와
+		// 고객DB 수신여부 비교 후 다르면 기기에 등록된 데이터로 업데이트
+		if (phoneAppAgreeYn !== custAppAgreeYn || phoneMkAgreeYn !== custMkAgreeYn ) {
+			fnUpdatePush(phoneAppAgreeYn, phoneMkAgreeYn);
+		}
+		document.location.href = "idsend://?id=" + custNo + "^link=" + returnUrl;
+	}
+
+	// 정보성 PUSH ON, OFF 여부 확인
+	// 호출시 앱에서 settingsSwitchPush 호출 해서 ON, OFF 값을 param 값으로 준다.
+	var fnIsPushEnable = function () {
+		if (_osType === 'A') {
+			window.style24.isPushEnable();
+		} else if (_osType === 'I') {
+			window.webkit.messageHandlers.isPushEnable.postMessage({'dummy':'dummy'});
+		}
+	}
+
+	// 마케팅 PUSH ON, OFF 여부확인
+	// 호출시 앱에서 settingsSwitchAdvertise 호출 해서 ON, OFF 값을 param 값으로 준다.
+	var fnIsAdEnable = function () {
+		if (_osType === 'A') {
+			window.style24.isAdEnable();
+		} else if (_osType === 'I') {
+			window.webkit.messageHandlers.isAdEnable.postMessage({'dummy':'dummy'});
+		}
+	}
+
+	var fnUpdatePush = function (appAgreeYn, mkAgreeYn) {
 		let params = {}
 		params.appAgreeYn = appAgreeYn;
+		params.mkAgreeYn = mkAgreeYn;
 		let jsonData = JSON.stringify(params);
-		gagajf.ajaxJsonSubmit('/app/appagree/update', jsonData);
+		gagajf.ajaxJsonSubmit('/app/push/update', jsonData);
 	}
 
 	$(document).ready(function() {

+ 7 - 7
src/main/webapp/WEB-INF/views/mob/app/SettingFormMob.html

@@ -105,7 +105,7 @@
 	$(document).ready(function(){
 		$('#htopTitle').text('설정');
 
-		// 앱으로 푸시 상태값 조회. 앱에서 settingsSwtichPush, settingsSwtichAdvertise 함수를 호출함.
+		// 앱으로 푸시 상태값 조회
 		if (_isApp === 'true') {
 			fnIsEnable();
 		}
@@ -114,16 +114,16 @@
 
 	var fnIsEnable = function () {
 		if (_osType === 'A') {
-			window.style24.isPushEnable(); // 정보성(푸시수신 API) settingsSwtichPush
-			window.style24.isAdEnable();   // 마케팅성(광고푸시 API) settingsSwtichAdvertise
+			window.style24.isPushEnable(); // 정보성(푸시수신 API) settingsSwitchPush
+			window.style24.isAdEnable();   // 마케팅성(광고푸시 API) settingsSwitchAdvertise
 		} else if (_osType === 'I') {
-			window.webkit.messageHandlers.isPushEnable.postMessage({'dummy':'dummy'}); // 정보성(푸시수신 API) settingsSwtichPush
-			window.webkit.messageHandlers.isAdEnable.postMessage({'dummy':'dummy'}); // 마케팅성(광고푸시 API) settingsSwtichAdvertise
+			window.webkit.messageHandlers.isPushEnable.postMessage({'dummy':'dummy'}); // 정보성(푸시수신 API) settingsSwitchPush
+			window.webkit.messageHandlers.isAdEnable.postMessage({'dummy':'dummy'}); // 마케팅성(광고푸시 API) settingsSwitchAdvertise
 		}
 	}
 
 	// 앱에서 호출되는 함수(앱푸시)
-	var settingsSwtichPush = function(onOff) {
+	var settingsSwitchPush = function(onOff) {
 		if (onOff === 'ON') {
 			$('#btnPushSetting').prop('checked', true);
 		} else if (onOff === 'OFF') {
@@ -142,7 +142,7 @@
 	}
 
 	// 앱에서 호출되는 함수(마케팅동의)
-	var settingsSwtichAdvertise = function (onOff) {
+	var settingsSwitchAdvertise = function (onOff) {
 		if (onOff === 'ON') {
 			$('#btnMkSetting').prop('checked', true);
 		} else if (onOff === 'OFF') {

+ 50 - 15
src/main/webapp/WEB-INF/views/mob/common/fragments/FooterMob.html

@@ -311,7 +311,7 @@
 					let popupYn = "N";
 					let popupSq = "";
 					let tag = '';
-					tag += '<div id="popupMainNotice" class="popup_main_notice half active">\n';  <!-- half 팝업일 경우 : half 클래스 포함 -->
+					tag += '<div id="popupMainNotice" class="popup_main_notice '+pClass+' active">\n';  <!-- half 팝업일 경우 : half 클래스 포함 -->
 					tag += '	<div class="popup_content">\n';
 					if ("H" == result.popupGb){
 						
@@ -367,20 +367,55 @@
 						}	
 					}
 					
-					/* SLIDE - 메인 공지 팝업 */
-					var popup_main_notice_slide = new Swiper ('.popup_main_notice .swiper-container', {
-						loop: true,
-						spaceBetween: 0,
-						speed:200,
-						autoplay: {
-							delay: 4000,
-							disableOnInteraction: false,
-						},
-						pagination: {
-							el: '.popup_main_notice .swiper-pagination',
-							type: 'fraction',
-						},
-					});			
+					/* SLIDE - 메인 공지 팝업 210521_ 수정 : 슬라이드 1개일때 롤링 제거. */
+					var popNoticeCont = $('.popup_main_notice .swiper-slide');
+					var popNoticeLength = popNoticeCont.length;
+					if (popNoticeLength < 2) {
+						var popup_main_notice_slide = new Swiper ('.popup_main_notice .swiper-container', {
+							loop: false,
+							watchOverflow: true, //loop와 함께 사용 불가.
+							slidesPerView:'auto',
+							spaceBetween: 0,
+							speed:1000,
+							autoplay: {
+								delay: 3000,
+								disableOnInteraction: false,
+							},
+							navigation: {
+								nextEl: '.popup_main_notice .swiper-button-next',
+								prevEl: '.popup_main_notice .swiper-button-prev',
+							},
+							pagination: {
+								el: '.popup_main_notice .swiper-pagination',
+								type: 'fraction',
+							},
+						});	
+					} else {
+						var popup_main_notice_slide = new Swiper ('.popup_main_notice .swiper-container', {
+							loop: true,
+							slidesPerView:'auto',
+							spaceBetween: 0,
+							speed:1000,
+							autoplay: {
+								delay: 3000,
+								disableOnInteraction: false,
+							},
+							navigation: {
+								nextEl: '.popup_main_notice .swiper-button-next',
+								prevEl: '.popup_main_notice .swiper-button-prev',
+							},
+							pagination: {
+								el: '.popup_main_notice .swiper-pagination',
+								type: 'fraction',
+							},
+						});	
+					}			
+
+					if($(".popup_main_notice").hasClass("active")){
+						$("body").css({"overflow":"hidden"});
+					}else{
+						$("body").css({"overflow":"visible"});
+					};
 					
 				}
 			}

+ 61 - 7
src/main/webapp/WEB-INF/views/mob/customer/ConsentUseInfoFormMob.html

@@ -53,6 +53,13 @@
 </div>
 <script th:inline="javascript">
 	/*<![CDATA[*/
+	let custAppAgreeYn;
+	let custMkAgreeYn;
+	let phoneAppAgreeYn;
+	let phoneMkAgreeYn;
+	let custNo;
+	let returnUrl;
+
 	$('#btnAgree').on('click', function () {
 		let jsonData = JSON.stringify({});
 		gagajf.ajaxJsonSubmit('/customer/peristalsis/yes24', jsonData, fnPeristalsisCallback)
@@ -126,10 +133,11 @@
 	var fnReloadAfterLogin = function(result) {
 		if (result.status === 'OK') {
 			if (_isApp === 'true') {
-				if (gagajf.isNull(result.appAgreeDt)) {
-					fnAppPushAgreeUpdate('Y');
-				}
-				document.location.href = "idsend://?id=" + result.custNo + "^link=" + result.returnUrl;
+				custAppAgreeYn = result.appAgreeYn;
+				custMkAgreeYn = result.mkAgreeYn;
+				custNo = result.custNo;
+				returnUrl = result.returnUrl;
+				fnIsPushEnable(); // 정보성 PUSH, 마케팅 PUSH 수신여부 확인
 			} else {
 				document.location.href = result.returnUrl;
 			}
@@ -144,12 +152,58 @@
 		$.modal.close();
 	});
 
-		// 앱푸시동의 데이터 처리
-	var fnAppPushAgreeUpdate = function (appAgreeYn) {
+	// 앱에서 호출되는 함수(앱푸시)
+	var settingsSwitchPush = function(onOff) {
+		if (onOff === 'ON') {
+			phoneAppAgreeYn = 'Y';
+		} else if (onOff === 'OFF'){
+			phoneAppAgreeYn = 'N';
+		}
+		fnIsAdEnable();
+	}
+
+	// 앱에서 호출되는 함수(마케팅동의)
+	var settingsSwitchAdvertise = function (onOff) {
+		if (onOff === 'ON') {
+			phoneMkAgreeYn = 'Y';
+		} else if (onOff === 'OFF'){
+			phoneMkAgreeYn = 'N';
+		}
+
+		// 기기에 등록된 정보성 PUSH, 마케팅 PUSH 수신여부와
+		// 고객DB 수신여부 비교 후 다르면 기기에 등록된 데이터로 업데이트
+		if (phoneAppAgreeYn !== custAppAgreeYn || phoneMkAgreeYn !== custMkAgreeYn ) {
+			fnUpdatePush(phoneAppAgreeYn, phoneMkAgreeYn);
+		}
+		document.location.href = "idsend://?id=" + custNo + "^link=" + returnUrl;
+	}
+
+	// 정보성 PUSH ON, OFF 여부 확인
+	// 호출시 앱에서 settingsSwitchPush 호출 해서 ON, OFF 값을 param 값으로 준다.
+	var fnIsPushEnable = function () {
+		if (_osType === 'A') {
+			window.style24.isPushEnable();
+		} else if (_osType === 'I') {
+			window.webkit.messageHandlers.isPushEnable.postMessage({'dummy':'dummy'});
+		}
+	}
+
+	// 마케팅 PUSH ON, OFF 여부확인
+	// 호출시 앱에서 settingsSwitchAdvertise 호출 해서 ON, OFF 값을 param 값으로 준다.
+	var fnIsAdEnable = function () {
+		if (_osType === 'A') {
+			window.style24.isAdEnable();
+		} else if (_osType === 'I') {
+			window.webkit.messageHandlers.isAdEnable.postMessage({'dummy':'dummy'});
+		}
+	}
+
+	var fnUpdatePush = function (appAgreeYn, mkAgreeYn) {
 		let params = {}
 		params.appAgreeYn = appAgreeYn;
+		params.mkAgreeYn = mkAgreeYn;
 		let jsonData = JSON.stringify(params);
-		gagajf.ajaxJsonSubmit('/app/appagree/update', jsonData);
+		gagajf.ajaxJsonSubmit('/app/push/update', jsonData);
 	}
 
 

+ 4 - 4
src/main/webapp/WEB-INF/views/mob/customer/JoinCompleteFormMob.html

@@ -101,7 +101,7 @@
 	});
 
 	// 앱에서 호출되는 함수(앱푸시)
-	var settingsSwtichPush = function(onOff) {
+	var settingsSwitchPush = function(onOff) {
 		if (onOff === 'ON') {
 			fnIsAdEnable();
 		} else if (onOff === 'OFF') { //정보성 PUSH가 OFF 이면 마케팅 PUSH도 OFF여야 한다.
@@ -111,7 +111,7 @@
 	}
 
 	// 앱에서 호출되는 함수(마케팅동의)
-	var settingsSwtichAdvertise = function (onOff) {
+	var settingsSwitchAdvertise = function (onOff) {
 		let appAgreeYn = 'Y';
 		let mkAgreeYn = 'N';
 		if (onOff === 'ON') {
@@ -125,7 +125,7 @@
 	}
 
 	// 정보성 PUSH ON, OFF 여부 확인
-	// 호출시 앱에서 settingsSwtichPush 호출 해서 ON, OFF 값을 param 값으로 준다.
+	// 호출시 앱에서 settingsSwitchPush 호출 해서 ON, OFF 값을 param 값으로 준다.
 	var fnIsPushEnable = function () {
 		if (_osType === 'A') {
 			window.style24.isPushEnable();
@@ -135,7 +135,7 @@
 	}
 
 	// 마케팅 PUSH ON, OFF 여부확인
-	// 호출시 앱에서 settingsSwtichAdvertise 호출 해서 ON, OFF 값을 param 값으로 준다.
+	// 호출시 앱에서 settingsSwitchAdvertise 호출 해서 ON, OFF 값을 param 값으로 준다.
 	var fnIsAdEnable = function () {
 		if (_osType === 'A') {
 			window.style24.isAdEnable();

+ 14 - 4
src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html

@@ -1159,6 +1159,7 @@
 		var riviewSwiper = new Swiper('.pd .riview_box .area_slider .swiper-container', {
 			slidesPerView: 1,
 			spaceBetween: 8,
+			speed: 1000,
 			loop: true,
 			pagination: {
 				el: '.swiper-pagination',
@@ -1169,6 +1170,7 @@
 		//슬라이드 - 제품사진
 		var thumbswiper = new Swiper('.pd .thumb_box .area_slider .swiper-container', {
 			slidesPerView:1,
+			speed: 1000,
 			pagination: {
 				el: '.swiper-pagination',
 				type: 'fraction',
@@ -1178,18 +1180,21 @@
 		 var togetherItemSwiper = new Swiper('.pd .pd_together .area_slider .swiper-container', {
 			 slidesPerView: 3,
 			 spaceBetween: 8,
+			 speed: 1000,
 		 });  
 
 		 //슬라이드 - 이 상품과 함께 본 상품 
 		 var otherItemSwiper = new Swiper('.pd .pd_clickother .area_slider .swiper-container', {
 			 slidesPerView: 2,
 			 spaceBetween: 8,
+			 speed: 1000,
 		 });			
 
 		 //슬라이드 - STYLE24의 스타일링 추천
 		var rcmdPicimgSwiper = new Swiper('.pd .pd_recommend .area_slider.pic_img .swiper-container', {
 			slidesPerView: 1,
 			spaceBetween: 0,
+			speed: 1000,
 			pagination: {
 				el: '.swiper-pagination',
 				type: 'fraction',
@@ -1200,6 +1205,7 @@
 			observeParents: true,
 			slidesPerView: 3,
 			spaceBetween: 8,
+			speed: 1000,
 		});
 
 		$(".pic_list > div").hide();
@@ -1214,18 +1220,21 @@
 		 var rcmdItemSwiper = new Swiper('.pd .pd_samebrand .area_slider .swiper-container', {
 			 slidesPerView: 3,
 			 spaceBetween: 8,
+			 speed: 1000,
 		 }); 
 
 		 //슬라이드 - 이 상품과 비슷한 상품 
 		 var relateItemSwiper = new Swiper('.pd .pd_relate .area_slider .swiper-container', {
 			 slidesPerView: 3,
 			 spaceBetween: 8,
+			 speed: 1000,
 		 });	 
 			
 			//슬라이드 - 베스트리뷰팝업 
 		 var bestreviewdetailSwiper = new Swiper('.pd_bestreviewdetail_pop .area_slider .swiper-container', {
-				observer: true,
-				observeParents: true,
+			observer: true,
+			observeParents: true,
+			speed: 1000,
 			 slidesPerView: 1,
 			 pagination: {
 					el: '.swiper-pagination',
@@ -1235,8 +1244,9 @@
 			
 			//슬라이드 - 포토,영상리뷰팝업 
 		 var photoreviewdetailSwiper = new Swiper('.pd_photoreviewdetail_pop .area_slider .swiper-container', {
-				observer: true,
-				observeParents: true,
+			observer: true,
+			observeParents: true,
+			speed: 1000,
 			 slidesPerView: 1,
 			 pagination: {
 					el: '.swiper-pagination',

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

@@ -2589,6 +2589,7 @@
 		var togetherItemSwiper = new Swiper('.pd .pd_together .area_slider .swiper-container', {
 			slidesPerView: 3,
 			spaceBetween: 8,
+			speed: 1000,
 		}); 
 		
 		//슬라이드 - 베스트리뷰
@@ -2597,6 +2598,7 @@
 			observeParents: true,
 			slidesPerView: 1,
 			spaceBetween: 8,
+			speed: 1000,
 			//loop: true,
 			pagination: {
 				el: '.swiper-pagination',
@@ -2607,6 +2609,7 @@
 		//슬라이드 - 제품사진
 		var thumbswiper = new Swiper('.pd .thumb_box .area_slider .swiper-container', {
 			slidesPerView:1,
+			speed: 1000,
 			pagination: {
 				el: '.swiper-pagination',
 				type: 'fraction',
@@ -2618,6 +2621,7 @@
 		var rcmdPicimgSwiper = new Swiper('.pd .pd_recommend .area_slider.pic_img .swiper-container', {
 			slidesPerView: 1,
 			spaceBetween: 0,
+			speed: 1000,
 			pagination: {
 				el: '.swiper-pagination',
 				type: 'fraction',
@@ -2628,6 +2632,7 @@
 			observeParents: true,
 			slidesPerView: 3,
 			spaceBetween: 8,
+			speed: 1000,
 		});
 
 		$(".pic_list > div").hide();
@@ -2643,6 +2648,7 @@
 			observer: true,
 			observeParents: true,
 			slidesPerView: 1,
+			speed: 1000,
 			pagination: {
 				el: '.swiper-pagination',
 				type: 'fraction',
@@ -2654,6 +2660,7 @@
 			observer: true,
 			observeParents: true,
 			slidesPerView: 1,
+			speed: 1000,
 			pagination: {
 				el: '.swiper-pagination',
 				type: 'fraction',
@@ -2987,8 +2994,37 @@
 			
 		};
 	}
-   
 	
+	// 210407_스크롤감지 헤더 그림자
+    $('.pd_delivery_pop').scroll(function(){
+        $(".pd_delivery_pop .modal-header").css("box-shadow", "rgb(0 0 0 / 20%) 0px 0px 5px");
+        $(".pd_delivery_pop .modal-header").css("border-bottom", "0px none");
+        if($(".pd_delivery_pop").scrollTop() === 0){
+            $(".pd_delivery_pop .modal-header").css("box-shadow", "none");
+            $(".pd_delivery_pop .modal-header").css("border-bottom", "1px solid #eee");
+        }
+    });
+    $('.pd_review_pop').scroll(function(){
+        $(".pd_review_pop .modal-header").css("box-shadow", "rgb(0 0 0 / 20%) 0px 0px 5px");
+        $(".pd_review_pop .modal-header").css("border-bottom", "0px none");
+        if($(".pd_review_pop").scrollTop() === 0){
+            $(".pd_review_pop .modal-header").css("box-shadow", "none");
+            $(".pd_review_pop .modal-header").css("border-bottom", "1px solid #eee");
+        }
+    });
+    $('.pd_qnalist_pop').scroll(function(){
+        $(".pd_qnalist_pop .modal-header").css("box-shadow", "rgb(0 0 0 / 20%) 0px 0px 5px");
+        $(".pd_qnalist_pop .modal-header").css("border-bottom", "0px none");
+        if($(".pd_qnalist_pop").scrollTop() === 0){
+            $(".pd_qnalist_pop .modal-header").css("box-shadow", "none");
+            $(".pd_qnalist_pop .modal-header").css("border-bottom", "1px solid #eee");
+        }
+    });
+   
+    window.onscroll = function() {
+		document.getElementsByClassName('.modal.pd_pop.pd_review_pop .pd_review .area_rv_empty .btn_group_flex').style.top =
+		window.pageYOffset + 'px';
+	};
 /*]]>*/
 </script>
 

+ 102 - 0
src/main/webapp/monitoring.jsp

@@ -0,0 +1,102 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ page import="java.util.Enumeration" %>
+<%@ page session="true" %>
+<%
+	String url = javax.servlet.http.HttpUtils.getRequestURL(request).toString();
+
+	String scheme = request.getHeader("X-Forwarded-Proto");
+	if (scheme == null || scheme.length() == 0 || "unknown".equalsIgnoreCase(scheme)) {
+		scheme = request.getHeader("x-forwarded-proto");
+	}
+	if (scheme == null || scheme.length() == 0 || "unknown".equalsIgnoreCase(scheme)) {
+		scheme = request.getScheme();
+	}
+	String[] schemes = scheme.split(",");
+	scheme = schemes[0];
+
+	String ip = request.getHeader("X-Forwarded-For");
+	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+		ip = request.getHeader("Proxy-Client-IP");
+	}
+	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+		ip = request.getHeader("WL-Proxy-Client-IP");
+	}
+	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+		ip = request.getHeader("HTTP_CLIENT_IP");
+	}
+	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+		ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+	}
+	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+		ip = request.getRemoteAddr();
+	}
+	String[] ips = ip.split(",");
+	ip = ips[0];
+%>
+<html lang="ko">
+<head>
+	<title> WEB</title>
+</head>
+
+<body>
+	<h1>STYLE24 WEB!! (<%=url %>) </h1>
+
+	<a href="monitoring.jsp">MONITORING</a>
+	<a href="/">INDEX</a>
+
+	<p>request.getProtocol() : <%=request.getProtocol() %></p>
+	<p>StringUtil.getRemoteAddr(request) : <%=scheme %></p>
+	<p>request.getRemoteAddr() : <%=request.getRemoteAddr() %></p>
+
+	<p>StringUtil.getScheme(request) : <%=scheme %></p>
+	<p>request.getScheme() : <%=request.getScheme() %></p>
+
+	<p>request.getHeader("REFERER") : <%=request.getHeader("REFERER") %></p>
+
+	<p>request.getServerName() : <%=request.getServerName() %></p>
+	<p>request.getServerPort() : <%=request.getServerPort() %></p>
+	<p>request.getLocalName() : <%=request.getLocalName() %></p>
+	<p>request.getLocalPort() : <%=request.getLocalPort() %></p>
+	<p>java.library.path : <%=System.getProperty("java.library.path") %></p>
+
+	<hr>
+	<h3>session</h3>
+	<p>ID : <%=session.getId()%></p>
+	<%
+		Enumeration sessions = session.getAttributeNames();
+		while(sessions.hasMoreElements()){
+			String attributeName = sessions.nextElement().toString();
+			String attributeValue = session.getAttribute(attributeName).toString();
+	%>
+	<p><%=attributeName%> : <%=attributeValue%></p>
+	<%
+		}
+	%>
+
+	<hr>
+	<h3>request.getHeaders</h3>
+	<%
+		Enumeration headers = request.getHeaderNames();
+		while(headers.hasMoreElements()){
+			String headerName = headers.nextElement().toString();
+			String headerValue = request.getHeader(headerName);
+	%>
+	<p><%=headerName%> : <%=headerValue%></p>
+	<%
+		}
+	%>
+
+	<hr>
+	<h3>request.getAttribute</h3>
+	<%
+		Enumeration attributes = request.getAttributeNames();
+		while(attributes.hasMoreElements()){
+			String attributeName = attributes.nextElement().toString();
+			String attributeValue = request.getAttribute(attributeName).toString();
+	%>
+	<p><%=attributeName%> : <%=attributeValue%></p>
+	<%
+		}
+	%>
+</body>
+</html>