JoinFormWeb.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org"
  4. xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  5. layout:decorator="web/common/layout/DefaultLayoutWeb">
  6. <!--
  7. *******************************************************************************
  8. * @source : JoinFormWeb.html
  9. * @desc : 회원정보 입력 Page
  10. *============================================================================
  11. * STYLE24
  12. * Copyright(C) 2021 TSIT, All rights reserved.
  13. *============================================================================
  14. * VER DATE AUTHOR DESCRIPTION
  15. * === =========== ========== =============================================
  16. * 1.0 2021.02.05 jsshin 최초 작성
  17. *******************************************************************************
  18. -->
  19. <body>
  20. <th:block layout:fragment="content">
  21. <style>
  22. .hide{display:none}
  23. </style>
  24. <div id="container" class="container mb">
  25. <div class="wrap">
  26. <div class="content join2"> <!-- 페이지특정 클래스 = join1 -->
  27. <div class="cont_head">
  28. <h4>회원정보 입력</h4>
  29. </div>
  30. <div class="cont_body">
  31. <!-- form start -->
  32. <form id="joinForm" name="joinForm" class="form_wrap form_col_c form_full" role="form">
  33. <!-- 아이디 사용가능시 -->
  34. <div class="form_field">
  35. <label class="input_label sr-only">아이디</label>
  36. <div class="input_wrap form_full">
  37. <input type="text" id="custId" name="custId" placeholder="아이디(4~12자)" class="form_control" required="required" data-valid-name="아이디" minlength="4" maxlength="12" autocomplete="no"/>
  38. <span class="usable" style="display:block;"></span>
  39. </div>
  40. <div id="dupCustIdDiv" class="help_block hide">
  41. <p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
  42. </div>
  43. <div id="errCustIdDiv" class="help_block hide">
  44. <p class="t_err">아이디는 영어와 숫자 조합만 가능합니다.</p>
  45. </div>
  46. </div>
  47. <!-- //아이디 사용가능시 -->
  48. <!-- 오류시 부모 div에서 제어 -->
  49. <div class="form_field">
  50. <label class="input_label sr-only">비밀번호</label>
  51. <div class="input_wrap form_full">
  52. <input type="password" id="passwd" name="passwd" placeholder="비밀번호 (8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호" autocomplete="new-password"/><!-- 잘못기입된 경우 class "err" 추가 -->
  53. <!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
  54. <div class="help_block">
  55. <!-- 사용불가 비밀번호일경우 -->
  56. <p class="mt10">
  57. <span id="firstFailed" class="c_gray">
  58. <i class="ico ico_check gray mr5"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br>
  59. </span>
  60. <span id="secondFailed" class="c_gray">
  61. <i class="ico ico_check gray mr5"></i>4개이상 연속되거나 동일한 문자/숫자 제외<br>
  62. </span>
  63. <span id="thirdFailed" class="c_gray">
  64. <i class="ico ico_check gray mr5"></i>아이디 제외
  65. </span>
  66. </p>
  67. <!-- //사용불가 비밀번호일경우 -->
  68. <!-- 사용가능한 비밀번호일경우 -->
  69. <p id="avlPwd" class="mt10 hide">
  70. <span class="c_black2">
  71. <i class="ico ico_check black mr5"></i>사용 가능한 비밀번호입니다
  72. </span>
  73. </p>
  74. <!-- //사용가능한 비밀번호일경우 -->
  75. </div>
  76. <!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
  77. </div>
  78. </div>
  79. <!-- //오류시 부모 div에서 제어 -->
  80. <div class="form_field">
  81. <label class="input_label sr-only">비밀번호 확인</label>
  82. <div class="input_wrap form_full">
  83. <input type="password" id="confirmPassword" name="confirmPassword" placeholder="비밀번호 확인" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호" autocomplete="new-password"/><!-- 잘못기입된 경우 class "err" 추가 -->
  84. <!-- case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
  85. <div class="help_block">
  86. <!-- 비밀번호확인 틀렸을경우 -->
  87. <p id="misPwd" class="t_err hide">
  88. 비밀번호가 일치하지 않습니다.
  89. </p>
  90. <!-- //비밀번호확인 틀렸을경우 -->
  91. <!-- 비밀번호 일치할경우 -->
  92. <p id="avlConPwd" class="mt10 hide">
  93. <span class="c_black2"><i class="ico ico_check black mr5"></i>비밀번호가 일치합니다.</span>
  94. </p>
  95. <!-- //비밀번호 일치할경우 -->
  96. </div>
  97. <!-- //case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
  98. </div>
  99. </div>
  100. <div class="form_field">
  101. <label class="input_label sr-only">이메일</label>
  102. <div class="input_wrap form_full">
  103. <input type="text" id="email" name="email" placeholder="이메일" class="form_control" required="required" data-valid-name="이메일" maxlength="30" autocomplete="no" autocapitalize="no"/><!-- 잘못기입된 경우 class "err" 추가 -->
  104. <!-- case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
  105. <div class="help_block">
  106. <!-- 이메일 형식이 바르지않을경우 -->
  107. <p id="failEmail" class="t_err hide">
  108. 이메일 형식이 올바르지 않습니다.
  109. </p>
  110. <!-- //이메일 형식이 바르지않을경우 -->
  111. <!-- 이미 가입되어있는 이메일인경우 -->
  112. <p id="dupEmail" class="t_err hide">
  113. 이미 가입된 이메일 주소입니다. 다른 이메일 주소를 입력하여 주세요.
  114. </p>
  115. <div id="dupEmailDiv" class="mt20 hide">
  116. <button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
  117. <span>로그인</span>
  118. </button>
  119. <button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
  120. <span>아이디 찾기</span>
  121. </button>
  122. </div>
  123. <!-- //이미 가입되어있는 이메일인경우 -->
  124. </div>
  125. <!-- //case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
  126. </div>
  127. </div>
  128. <div class="form_field">
  129. <label class="input_label sr-only">휴대폰번호</label>
  130. <div class="ui_row">
  131. <div class="ui_col_9">
  132. <div class="input_wrap">
  133. <input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
  134. </div>
  135. </div>
  136. <div class="ui_col_3">
  137. <button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_block">
  138. <span>본인인증</span>
  139. </button>
  140. </div>
  141. </div>
  142. <!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
  143. <div class="help_block">
  144. <!-- 휴대폰번호 형식이 맞지 않을경우 -->
  145. <p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
  146. <!-- //휴대폰번호 형식이 맞지 않을경우 -->
  147. <!-- 이미 가입되어있는 핸드폰번호일경우 -->
  148. <p id="dupPhnno" class="t_err hide">I***D로 가입한 이력이 있습니다.</p>
  149. <div id="dupPhnnoDiv" class="mt20 hide">
  150. <button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
  151. <span>로그인</span>
  152. </button>
  153. <button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
  154. <span>아이디 찾기</span>
  155. </button>
  156. </div>
  157. <!-- //이미 가입되어있는 핸드폰번호일경우 -->
  158. </div>
  159. <!-- //case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
  160. </div>
  161. <div class="mt40">
  162. <button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
  163. <span>동의하고 가입하기</span>
  164. </button>
  165. </div>
  166. <div class="desc_wrap t_c mt20">
  167. <p>
  168. 본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>
  169. ,&nbsp;<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer();">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,<br>
  170. <a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a> 내용을 확인 하였으며,동의합니다.
  171. </p>
  172. </div>
  173. </form>
  174. <!-- form End -->
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. <script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
  180. <script th:inline="javascript">
  181. /*<![CDATA[*/
  182. let custIdCheck = false;
  183. let passwdCheck = false;
  184. let emailCheck = false;
  185. let authCheck = false;
  186. // 아이디 확인
  187. $('#custId').on('blur', function () {
  188. let custId = $(this).val();
  189. let $errCustIdDiv = $('#errCustIdDiv');
  190. const $custId = $('#custId');
  191. if(!gagajf.isNull(custId)) {
  192. if (custId.length > 3) {
  193. if (!fnCheckCustId(custId)) {
  194. $custId.addClass('err');
  195. $custId.removeClass('usable');
  196. $errCustIdDiv.show();
  197. return;
  198. } else {
  199. $custId.removeClass('err');
  200. $custId.addClass('usable');
  201. $errCustIdDiv.hide();
  202. let custInfo = {};
  203. custInfo.custId = custId;
  204. let jsonData = JSON.stringify(custInfo);
  205. gagajf.ajaxJsonSubmit('/customer/join/id/check', jsonData, fnIdConfirmCallBack);
  206. }
  207. }
  208. } else {
  209. custIdCheck = false
  210. $errCustIdDiv.show();
  211. $custId.addClass('err');
  212. $custId.removeClass('usable');
  213. }
  214. });
  215. // 아이디 결과
  216. var fnIdConfirmCallBack = function (result) {
  217. const $dupCustIdDiv = $('#dupCustIdDiv');
  218. const $custId = $('#custId');
  219. const $usable = $('span > .usable');
  220. if (result.isFind) { // 중복된 아이디가 존재
  221. $custId.addClass('err');
  222. $custId.removeClass('usable');
  223. $dupCustIdDiv.show();
  224. $usable.hide();
  225. custIdCheck = false;
  226. } else {
  227. $custId.removeClass('err');
  228. $custId.addClass('usable');
  229. $dupCustIdDiv.hide();
  230. $usable.show();
  231. custIdCheck = true;
  232. }
  233. fnPossibleJoin();
  234. };
  235. // 비밀번호 입력
  236. $('#joinForm input[name=passwd]').on('focusout keyup keydown', function () {
  237. fnCheckPassword();
  238. });
  239. // 비밀번호 확인 입력
  240. $('#joinForm input[name=confirmPassword]').on('focusout keyup keydown', function () {
  241. fnCheckConfirmPassword();
  242. });
  243. // 비밀번호 확인
  244. var fnCheckPassword = function () {
  245. const $firstFailed = $('#firstFailed');
  246. const $secondFailed = $('#secondFailed');
  247. const $thirdFailed = $('#thirdFailed');
  248. const $avlPwd = $('#avlPwd');
  249. const red = 'c_red2';
  250. const gray = 'c_gray';
  251. let custId = $('#joinForm input[name=custId]').val();
  252. let password = $('#joinForm input[name=passwd]').val();
  253. let confirmPassword = $('#joinForm input[name=confirmPassword]').val();
  254. let pwdCheck = true;
  255. // 영문, 숫자, 특수문자 2종 이상 혼용 || 길이
  256. if (fnValidtaionPwdMixedWord(password) || fnValidationPwdLength(password)) {
  257. pwdCheck = false;
  258. $firstFailed.removeClass(gray);
  259. $firstFailed.addClass(red);
  260. } else {
  261. $firstFailed.removeClass(red);
  262. $firstFailed.addClass(gray);
  263. }
  264. // 동일한 문자/숫자 4자이상 || 연속된 문자가 4자이상
  265. if (fnValidationPwdSameWord(password) || fnValidtaionPwdCntnsWord(password)) {
  266. pwdCheck = false;
  267. $secondFailed.removeClass(gray);
  268. $secondFailed.addClass(red);
  269. } else {
  270. $secondFailed.removeClass(red);
  271. $secondFailed.addClass(gray);
  272. }
  273. // 아이디 포함
  274. if (!gagajf.isNull(custId)) {
  275. if (fnValidationPwdSameId(password, custId)) {
  276. pwdCheck = false;
  277. $thirdFailed.removeClass(gray);
  278. $thirdFailed.addClass(red);
  279. } else {
  280. $thirdFailed.removeClass(red);
  281. $thirdFailed.addClass(gray);
  282. }
  283. }
  284. if (pwdCheck) {
  285. $firstFailed.hide();
  286. $secondFailed.hide();
  287. $thirdFailed.hide();
  288. $avlPwd.show();
  289. } else {
  290. $firstFailed.show();
  291. $secondFailed.show();
  292. $thirdFailed.show();
  293. $avlPwd.hide();
  294. }
  295. if (!gagajf.isNull(confirmPassword)) {
  296. fnCheckConfirmPassword();
  297. }
  298. };
  299. // 비밀번호 확인
  300. var fnCheckConfirmPassword = function () {
  301. const $misPwd = $('#misPwd');
  302. const $avlConPwd = $('#avlConPwd');
  303. let password = $('#joinForm input[name=passwd]').val();
  304. let confirmPassword = $('#joinForm input[name=confirmPassword]').val();
  305. let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
  306. if (sameConfirmPwd) {
  307. $avlConPwd.show();
  308. $misPwd.hide()
  309. passwdCheck = true;
  310. } else {
  311. $misPwd.show();
  312. $avlConPwd.hide();
  313. passwdCheck = false;
  314. }
  315. fnPossibleJoin();
  316. };
  317. // 이메일 확인
  318. $('#email').on('blur', function () {
  319. const $failEmail = $('#failEmail');
  320. let email = $(this).val();
  321. let validation;
  322. if(!gagajf.isNull(email)) {
  323. if (!fnCheckValidationEmail(email)) {
  324. $failEmail.show();
  325. emailCheck = false;
  326. validation = false;
  327. } else {
  328. validation = true;
  329. $failEmail.hide();
  330. }
  331. if (validation) {
  332. let custInfo = {};
  333. custInfo.email = email;
  334. let jsonData = JSON.stringify(custInfo);
  335. gagajf.ajaxJsonSubmit('/customer/email/check', jsonData, fnEmailConfirmCallBack);
  336. }
  337. }
  338. });
  339. // 이메일 확인 결과
  340. var fnEmailConfirmCallBack = function (result) {
  341. const $dupEmail = $('#dupEmail');
  342. const $dupEmailDiv = $('#dupEmailDiv');
  343. if (result.isFind) { // 중복된 아이디가 존재
  344. $dupEmail.show();
  345. $dupEmailDiv.show();
  346. emailCheck = false;
  347. } else {
  348. $dupEmail.hide();
  349. $dupEmailDiv.hide();
  350. emailCheck = true;
  351. }
  352. fnPossibleJoin();
  353. };
  354. //휴대폰 인증
  355. $('#btnCellPhoneCertify').on('click', function () {
  356. cfnOpenCellphoneCertify();
  357. });
  358. // 나이스 본인인증 후 콜백
  359. var fnNiceCallBack = function(encData) {
  360. if (!gagajf.isNull(encData)) {
  361. let custInfo = {};
  362. custInfo.encData = encData;
  363. let jsonData = JSON.stringify(custInfo);
  364. gagajf.ajaxJsonSubmit('/customer/authentication/check', jsonData, fnInfoConfirmCallBack);
  365. }
  366. };
  367. // 본인인증 후 결과
  368. var fnInfoConfirmCallBack = function (result) {
  369. const $cellPhnno = $('#cellPhnno');
  370. const $dupPhnno = $('#dupPhnno');
  371. const $dupPhnnoDiv = $('#dupPhnnoDiv');
  372. const $btnCellPhoneCertify = $('#btnCellPhoneCertify');
  373. $cellPhnno.val(result.cellPhnno);
  374. if (result.isFind) { // 가입된 고객 정보가 있으면
  375. let msg = '';
  376. if (result.custStat === 'G104_30') {
  377. msg = "탈퇴한 회원입니다. 탈퇴 후 60일 동안 재가입이 불가능합니다.";
  378. } else {
  379. msg = result.maskingCustId+"로 가입된 이력이 있습니다.";
  380. }
  381. $dupPhnno.html(msg);
  382. $dupPhnno.show();
  383. $dupPhnnoDiv.show();
  384. authCheck = false;
  385. } else {
  386. $dupPhnno.hide();
  387. $dupPhnnoDiv.hide();
  388. authCheck = true;
  389. }
  390. $btnCellPhoneCertify.find('span').text('인증완료');
  391. $btnCellPhoneCertify.attr('disabled', true);
  392. fnPossibleJoin();
  393. };
  394. // 저장
  395. $('#btnJoin').on('click', function () {
  396. mcxDialog.confirm("회원가입을 하시겠습니까?", {
  397. cancelBtnText: "취소",
  398. sureBtnText: "확인",
  399. sureBtnClick: function() {
  400. $('#btnJoin').attr('disabled', true);
  401. let jsonData = JSON.stringify($('#joinForm').serializeObject());
  402. gagajf.ajaxJsonSubmit('/customer/join/save', jsonData, fnJoinSaveCallback);
  403. }
  404. });
  405. });
  406. var fnJoinSaveCallback = function (result) {
  407. cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
  408. };
  409. // 가입 가능한지 확인
  410. var fnPossibleJoin = function () {
  411. const $btnJoin = $('#btnJoin');
  412. if (custIdCheck && passwdCheck && emailCheck && authCheck ) {
  413. $btnJoin.attr('disabled', false);
  414. } else {
  415. $btnJoin.attr('disabled', true);
  416. }
  417. };
  418. /*]]>*/
  419. </script>
  420. </th:block>
  421. </body>
  422. </html>