JoinFormWeb.html 16 KB

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