Преглед на файлове

모바일 로그인 추가

jsshin преди 5 години
родител
ревизия
494eed0a51
променени са 1 файла, в които са добавени 309 реда и са изтрити 0 реда
  1. 309 0
      src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

+ 309 - 0
src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

@@ -0,0 +1,309 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : SigninFormMob.html
+ * @desc    : 로그인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.10   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<div class="close">
+			<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+		</div>
+
+		<!-- ★ 컨텐츠 시작 -->
+		<section class="content mb_login">
+
+			<div class="inner">
+				<h2 class="title">로그인</h2>
+			</div>
+			<div class="inner">
+				<form class="form_wrap form_full" name="loginForm" id="loginForm" th:action="@{/login}" method="post">
+					<div class="form_head"><h3 class="title sr-only">로그인</h3></div>
+					<div class="form_field mt0">
+						<input type="text" name="loginId" placeholder="아이디" class="form_control"minlength="4" maxlength="12" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디"/>
+					</div>
+					<div class="form_field">
+						<input type="password" name="passwd" placeholder="비밀번호 8자~20자 입력" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/>
+					</div>
+					<div class="login_check mt10">
+						<div class="left">
+							<div class="form_field">
+								<input id="chkSaveId" type="checkbox"><label for="chkSaveId"><span>아이디 저장</span></label>
+							</div>
+						</div>
+						<div class="right">
+							<ul>
+								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a></li>
+								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a></li>
+							</ul>
+						</div>
+					</div>
+					<div class="help_block">
+						<!-- 보안문자 입력시 -->
+						<div>
+							<div class="captcha" style="display: none;"> <!-- 캡차영역 -->
+								<ul>
+									<li class="lap"> <!-- 캡차이미지 -->
+										<div class="captcha_box"> <!-- 캡차이미지 -->
+											<img src="" id="imgCaptcha"/>
+										</div>
+										<div class="captcha_btn_dual">
+											<button type="button" id="play_audio" onclick="fnReloadCaptchaImage();">새로고침</button>
+											<button type="button" id="swap_captcha">음성듣기</button>
+										</div>
+									</li>
+									<li class="captcha_area">
+										<label for="captcha" id="label_captcha_area" class="sr-only">보안문자 입력</label>
+										<input type="text" id="captcha" name="captcha" placeholder="위 보안문자 이미지에 보이는 문자 입력" title="문자입력"/>
+									</li>
+								</ul>
+							</div>
+							<p class="t_err mt10 t_err_login_fail" style="display: none;">
+								<span id="err_msg">보안문자 입력을 다시 시도해 주세요.</span><br>
+								(10회 이상 실패하면 180초 동안 로그인이 불가능 합니다.)<br>
+								<span id="login_fail_cnt">4</span>회 실패 / 잔여 : <span id="login_remain_cnt">6</span>회<span id="blockSecs1" style="display: none;"> / <span id="blockSecs2">180</span>초 남음
+							</p>
+						</div>
+						<!-- //보안문자 입력시 -->
+					</div>
+					<div class="ui_row mt20">
+						<button type="button" class="btn btnL btn_dark" id="btnLogin">로그인</button>
+					</div>
+				</form>
+				<div class="t_c sns_wrap">
+					<h3 class="sr-only">간편로그인</h3>
+					<ul class="login_utill">
+						<li class="lu_kakao">
+							<a href="javascript:void(0)">
+								<div class="ico"></div>카카오로<br>시작하기
+							</a>
+						</li>
+						<li class="lu_naver">
+							<a href="javascript:void(0)">
+								<div class="ico"></div>네이버로<br>시작하기
+							</a>
+						</li>
+						<li class="lu_yes24">
+							<a href="javascript:void(0)">
+								<div class="ico"></div>YES24로<br>시작하기
+							</a>
+						</li>
+					</ul>
+				</div>
+				<div class="t_c mt30"><botton class="btn_nonMb">비회원 주문조회</botton>
+				</div>
+
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+
+	</main>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let ckLoginId = "ckLoginId";
+
+	// 로그인블락시간(초) 설정
+	let fnSetLoginBlockTime = function() {
+		let blockSecs = Number($("#blockSecs2").html()) - 1;
+		$("#blockSecs2").html(blockSecs);
+		if (blockSecs == 0) {
+			clearTimeout(fnSetLoginBlockTime);
+			$('#btnLogin').attr('disabled',false);
+		} else {
+			setTimeout(fnSetLoginBlockTime, 1000);
+		}
+	}
+	
+	// 로그인
+	$('#btnLogin').on('click', function() {
+		if (!gagajf.validation($('#loginForm'))) {
+			return;
+		}
+
+		let params = new Object();
+		params.loginId = $('#loginForm input[name=loginId]').val();
+		params.passwd = $('#loginForm input[name=passwd]').val();
+		
+		$.post($('#loginForm').prop('action')
+			, $.param(params)
+			, function(result) {
+				if (result.status != 'OK') {
+
+					if (result.status == 'PWD_5WRONG') {
+						// Do nothing
+					} else if (result.status == 'DORMANT_CUST') {
+						// 휴면회원
+						mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+							sureBtnText: "확인",
+							sureBtnClick: function() {
+								cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+							}
+						});
+
+						return;
+					} else if (result.status == 'SECEDE_CUST') {
+						// 탈퇴회원
+					} else if (result.status == 'SESSION_EXPIRED') {
+						// 세션만료
+					}
+
+					if (!gagajf.isNull(result.message)) {
+						let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
+						
+						$("#err_msg").html(result.message);
+						$("#login_fail_cnt").html(loginFailCnt);
+						$("#login_remain_cnt").html(10 - loginFailCnt);
+						$(".t_err_login_fail").show();
+						
+						if (loginFailCnt >= 5 && loginFailCnt < 10) {
+							// 비밀번호 5회 이상 틀린 경우 캡챠 노출
+							$('.captcha').show();
+						} else if (loginFailCnt >= 10) {
+							$('.captcha').hide();
+							
+							// 비밀번호 10회 이상 틀린 경우 로그인 블락
+							let blockSecs = Number(result.loginFailInfo.blockSecs);
+							if (blockSecs > 0) {
+								$("#blockSecs2").html(blockSecs);
+								fnSetLoginBlockTime();
+								$("#blockSecs1").show();
+								$('#btnLogin').attr('disabled',true);
+							}
+						}
+					}
+
+					return; // 정상적으로 로그인 되지 않았으므로 return
+				}
+				
+				document.location.href = result.returnUrl;
+				
+// 				if (gagajf.isNull(result.returnUrl)) {
+// 					cfnGoToPage(_PAGE_MAIN);
+// 				} else {
+// 					if (result.returnUrl.indexOf(_PAGE_DIRECT_BUY) > -1) {
+// 						// 바로주문
+// 						jfOrderByMember();
+// 					} else if (result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN) > -1 ||
+// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_ID_FIND) > -1 ||
+// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_PW_FIND) > -1 ||
+// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN_COMPLETE) > -1) {
+// 						cfnGoToPage(_PAGE_MAIN);
+// 					} else {
+// 						document.location.href = result.returnUrl;
+// 					}
+// 				}
+			}
+			, 'json');
+	});
+	
+	// Save ID
+	$('#chkSaveId').on('click', function() {
+		if ($(this).is(":checked")) {
+			if (!gagajf.isNull($('#loginForm input[name=loginId]').val())) {
+				gagajf.setCookie(ckLoginId, $('#loginForm input[name=loginId]').val(), 1);
+			}
+		} else {
+			if (!gagajf.isNull(gagajf.getCookie(ckLoginId)) && (gagajf.getCookie(ckLoginId) === $('#loginForm input[name=loginId]').val())) {
+				gagajf.setCookie(ckLoginId, $('#loginForm input[name=loginId]').val(), -1);
+			}
+		}
+	});
+	
+	// 캡챠 이미지 로딩
+	let fnReloadCaptchaImage = function() {
+		$('#imgCaptcha').attr('src', '/common/captcha.do?dummy=' + new Date());
+	}
+
+	// SNS 로그인 콜백함수
+	var fnSnsSigninCallback = function(userInfo) {
+		// Ci이 조회 시 없음
+		if (userInfo.custStat === 'DUP_PHONE_CUST') {
+			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DUP_EMAIL_CUST') {
+			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// Ci이 조회 시 있음
+		if (userInfo.custStat === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DORMANT_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+		}
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		if (userInfo.custStat === 'NEW_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+		}
+
+
+		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);
+				}
+				, "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);
+		}
+	};
+
+
+
+	$(document).ready(function() {
+		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));
+		if (gagajf.isNull($('#loginForm input[name=loginId]').val())) {
+			$('#loginForm input[name=loginId]').focus();
+			$('#chkSaveId').prop('checked', false);
+		} else {
+			$('#loginForm input[name=passwd]').focus();
+			$('#chkSaveId').prop('checked', true);
+		}
+	});
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>