| @@ -1,278 +1,4 @@ | |||||
| <style> | |||||
| .__phone-verify-code { | |||||
| max-width: 519px; | |||||
| } | |||||
| .__phone-verify-code ._label-c { | |||||
| display: flex; | |||||
| justify-content: fixed-start; | |||||
| align-items: center; | |||||
| width: 100px; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code ._label-c ._label { | |||||
| font-size: 13px; | |||||
| font-weight: 700; | |||||
| color: rgba(0,0,0,.87); | |||||
| } | |||||
| .__phone-verify-code ._label-c.required ._label:after { | |||||
| margin: -0.2em 0 0 0.2em; | |||||
| content: '*'; | |||||
| color: #db2828; | |||||
| display: inline-block; | |||||
| vertical-align: top; | |||||
| } | |||||
| .__phone-verify-code .phone-c { | |||||
| display: flex; | |||||
| margin: 0 0 1em; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-area-c { | |||||
| height: 38px; | |||||
| width: 80px; | |||||
| margin-right: 10px; | |||||
| border-radius: 2px; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| box-sizing: border-box; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-area-c select { | |||||
| outline: none; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-num-c { | |||||
| height: 38px; | |||||
| flex: 1; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| box-sizing: border-box; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-num-c input { | |||||
| height: 100%; | |||||
| width: 100% !important; | |||||
| padding: 9.5px 14px; | |||||
| box-sizing: border-box; | |||||
| outline: none; | |||||
| } | |||||
| .__phone-verify-code .phone-c .modify-phone-number { | |||||
| position: absolute; | |||||
| left: 100%; | |||||
| width: 200px; | |||||
| height: 100%; | |||||
| margin-left: 10px; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code .phone-c .modify-phone-number a { | |||||
| font-weight: 400; | |||||
| font-size: 14px; | |||||
| color: rgba(0, 102, 255, 1); | |||||
| } | |||||
| .__phone-verify-code .slide-bar-wrap { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| margin: 0 0 1em; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c { | |||||
| flex: 1; | |||||
| display: flex; | |||||
| height: 38px; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg { | |||||
| height: 34px; | |||||
| flex: 1; | |||||
| background-color: rgb(245, 245, 246); | |||||
| border: 1px solid rgb(225, 227, 230); | |||||
| border-radius: 2px; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-txt { | |||||
| position: absolute; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| display: flex; | |||||
| user-select: none; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| color: #cdcacb; | |||||
| font-size: 14px; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-bar { | |||||
| position: absolute; | |||||
| width: 38px; | |||||
| height: 34px; | |||||
| background-color: #d1e9fe; | |||||
| border: 1px solid #1991fa; | |||||
| border-radius: 2px; | |||||
| box-sizing: border-box; | |||||
| top: -1px; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-bar.sucess { | |||||
| background-color: #d2f4ef; | |||||
| border: 1px solid #52ccba; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-bar.error { | |||||
| border-color: #f57a7a; | |||||
| background-color: #fce1e1; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger { | |||||
| position: absolute; | |||||
| width: 38px; | |||||
| height: 34px; | |||||
| background-color: #1991fa; | |||||
| border-radius: 2px; | |||||
| cursor: pointer; | |||||
| top: -1px; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger .icon { | |||||
| font-size: 16px; | |||||
| color: white; | |||||
| margin: 0; | |||||
| height: 16px; | |||||
| width: 16px; | |||||
| margin-top: -5px; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger.sucess { | |||||
| background-color: #52ccba; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger.error { | |||||
| background-color: #f57a7a; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-image-big { | |||||
| position: absolute; | |||||
| width: 391px; | |||||
| height: 196px; | |||||
| top: 36px; | |||||
| left: 0; | |||||
| border-radius: 2px; | |||||
| z-index: 100; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-image-small { | |||||
| position: absolute; | |||||
| left: 0; | |||||
| width: 51px; | |||||
| height: 51px; | |||||
| box-shadow: 0 0 4px rgb(35 173 255); | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .verify-code-c { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| margin: 0 0 1em; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-num-c { | |||||
| flex: 1; | |||||
| height: 38px; | |||||
| box-sizing: border-box; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| display: flex; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-num-c input { | |||||
| height: 100%; | |||||
| width: 100% !important; | |||||
| padding: 9.5px 14px; | |||||
| box-sizing: border-box; | |||||
| outline: none; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-send { | |||||
| display: flex; | |||||
| width: 120px; | |||||
| height: 38px; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-send .verify-code-send-btn { | |||||
| height: 100%; | |||||
| width: 100%; | |||||
| margin-left: 10px; | |||||
| border: 1px solid #398dee; | |||||
| background-color: #398dee; | |||||
| color: white; | |||||
| border-radius: 2px; | |||||
| box-sizing: border-box; | |||||
| cursor: pointer; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-send .verify-code-send-btn.__disabled { | |||||
| border: 1px solid #ddd; | |||||
| background-color: #ddd; | |||||
| cursor: not-allowed; | |||||
| } | |||||
| .__phone-verify-code .new-pass-word-wrap { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| margin: 0 0 1em; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code .new-pass-word-wrap .new-pass-word-c { | |||||
| flex: 1; | |||||
| height: 38px; | |||||
| box-sizing: border-box; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| display: flex; | |||||
| } | |||||
| .__phone-verify-code .new-pass-word-wrap .new-pass-word-c input { | |||||
| height: 100%; | |||||
| width: 100% !important; | |||||
| padding: 9.5px 14px; | |||||
| box-sizing: border-box; | |||||
| outline: none; | |||||
| } | |||||
| </style> | |||||
| <link rel="stylesheet" href="{{StaticUrlPrefix}}/css/_phoneverify.css?v={{MD5 AppVer}}" /> | |||||
| <div class="__phone-verify-code"> | <div class="__phone-verify-code"> | ||||
| <div class="phone-c"> | <div class="phone-c"> | ||||
| <div class="phone-label _label-c required"> | <div class="phone-label _label-c required"> | ||||
| @@ -334,264 +60,16 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <script src="{{StaticUrlPrefix}}/js/phoneverify.js?v={{MD5 AppVer}}" type="text/javascript"></script> | |||||
| <script> | <script> | ||||
| (function() { | |||||
| window.addEventListener('load', function () { | |||||
| function PhoneVerifyCode(dom) { | |||||
| if (!dom) return; | |||||
| this.countDownNumber = 120; | |||||
| this.init(dom); | |||||
| } | |||||
| PhoneVerifyCode.prototype.init = function (dom) { | |||||
| if (!dom) return; | |||||
| this.dom = $(dom); | |||||
| this.isMoving = false; | |||||
| this.verifySucess = false; | |||||
| this.canSendCode = false; | |||||
| this.countDownEnd = false; | |||||
| this.imgID = ''; | |||||
| this.eventInit(); | |||||
| this.refreshImages(); | |||||
| var wrap = this.dom.closest('div.use-type'); | |||||
| var readonly = wrap.attr('readonly'); | |||||
| if (readonly) { | |||||
| this.dom.find('.phone-area-c select').attr('disabled', true); | |||||
| this.dom.find('.phone-num-c input').attr('disabled', true); | |||||
| this.dom.find('.slide-bar-wrap').hide(); | |||||
| this.dom.find('.verify-code-c').hide(); | |||||
| this.dom.find('.modify-phone-number').show(); | |||||
| } | |||||
| var oldPhoneNum = wrap.attr('ophonenumber'); | |||||
| if (oldPhoneNum) { | |||||
| this.dom.find('input.phoneNumber').val(oldPhoneNum); | |||||
| } | |||||
| var showlabel = wrap.attr('showlabel'); | |||||
| if (showlabel) { | |||||
| this.dom.find('._label-c ').show(); | |||||
| } else { | |||||
| this.dom.find('._label-c ').hide(); | |||||
| } | |||||
| var showNewpwd = wrap.attr('shownewpwd'); | |||||
| if (showNewpwd) { | |||||
| this.dom.find('.new-pass-word-wrap').show(); | |||||
| } else { | |||||
| this.dom.find('.new-pass-word-wrap').remove(); | |||||
| } | |||||
| var autofocus = wrap.attr('autofocus'); | |||||
| if (autofocus) { | |||||
| this.dom.find('input.phoneNumber').focus(); | |||||
| } | |||||
| var verifyCodeNoRequired = wrap.attr('verifycodenorequired'); | |||||
| if (verifyCodeNoRequired) { | |||||
| this.dom.find('input.verifyCode').removeAttr('required'); | |||||
| } | |||||
| }; | |||||
| PhoneVerifyCode.prototype.eventInit = function () { | |||||
| if (!this.dom) return; | |||||
| var self = this; | |||||
| var clientX = 0, oLeft = 0, imgHideTimer = null; | |||||
| this.dom.find('.slide-bar-bg').on('mouseenter', function (e) { | |||||
| if (self.verifySucess) return; | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| self.dom.find('.slide-image-big').slideDown(); | |||||
| }); | |||||
| this.dom.find('.slide-bar-bg').on('mouseleave', function (e) { | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| imgHideTimer = setTimeout(function () { | |||||
| self.dom.find('.slide-image-big').slideUp(); | |||||
| }, 200); | |||||
| }); | |||||
| this.dom.find('.slide-image-big').on('mouseenter', function (e) { | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| }); | |||||
| this.dom.find('.slide-image-big').on('mouseleave', function (e) { | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| imgHideTimer = setTimeout(function () { | |||||
| self.dom.find('.slide-image-big').slideUp(); | |||||
| }, 200); | |||||
| }); | |||||
| function mouseMove(e) { | |||||
| var _clientX = e.clientX; | |||||
| var offset = _clientX - clientX; | |||||
| var triggerEl = self.dom.find('.slide-trigger'); | |||||
| var triggerWidth = triggerEl.width(); | |||||
| var parentWidth = triggerEl.parent().width(); | |||||
| var maxLeft = parentWidth - triggerWidth; | |||||
| var left = oLeft + offset; | |||||
| if (oLeft + offset < 0) left = 0; | |||||
| if (oLeft + offset > maxLeft) left = maxLeft; | |||||
| triggerEl.css('left', left + 'px'); | |||||
| self.dom.find('.slide-bar').css('width', left + triggerWidth); | |||||
| var imageBigWidth = self.dom.find('.slide-image-big').width(); | |||||
| var imageSmallWidth = self.dom.find('.slide-image-small').width(); | |||||
| self.dom.find('.slide-image-small').css('left', left / maxLeft * (imageBigWidth - imageSmallWidth) + 'px'); | |||||
| self.isMoving = true; | |||||
| self.dom.find('.slide-txt').hide(); | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| } | |||||
| function mouseUp(e) { | |||||
| $(document).off('mousemove', mouseMove); | |||||
| $(document).off('mouseup', mouseUp); | |||||
| self.isMoving = false; | |||||
| $.ajax({ | |||||
| url: '/verifySlideImage', | |||||
| type: 'post', | |||||
| dataType: 'json', | |||||
| data: { | |||||
| slide_id: self.imgID, | |||||
| x: parseInt(self.dom.find('.slide-image-small').position().left) | |||||
| }, | |||||
| success: function(res) { | |||||
| if (res && res.Code === 0) { | |||||
| self.verifySucess = true; | |||||
| self.canSendCode = true; | |||||
| self.dom.find('.slide-bar').addClass('sucess'); | |||||
| self.dom.find('.slide-trigger').addClass('sucess'); | |||||
| self.dom.find('.slide-trigger .icon').hide(); | |||||
| self.dom.find('.slide-trigger .icon.check').show(); | |||||
| self.dom.find('.slide-image-big').slideUp(); | |||||
| self.dom.find('.verify-code-send-btn').removeClass('__disabled'); | |||||
| } else { | |||||
| self.dom.find('.slide-bar').addClass('error'); | |||||
| self.dom.find('.slide-trigger').addClass('error'); | |||||
| self.dom.find('.slide-trigger .icon').hide(); | |||||
| self.dom.find('.slide-trigger .icon.close').show(); | |||||
| setTimeout(function () { | |||||
| self.refreshImages(); | |||||
| }, 300); | |||||
| } | |||||
| }, | |||||
| error: function(err) { | |||||
| self.dom.find('.slide-bar').addClass('error'); | |||||
| self.dom.find('.slide-trigger').addClass('error'); | |||||
| setTimeout(function () { | |||||
| self.refreshImages(); | |||||
| }, 300); | |||||
| } | |||||
| }); | |||||
| } | |||||
| this.dom.find('.slide-trigger').on('mousedown', function (e) { | |||||
| if (self.verifySucess) return; | |||||
| clientX = e.clientX; | |||||
| oLeft = $(this).position().left; | |||||
| $(document).on('mousemove', mouseMove); | |||||
| $(document).on('mouseup', mouseUp); | |||||
| }); | |||||
| this.dom.find('.verify-code-send-btn').on('click', function () { | |||||
| if (!self.canSendCode) return; | |||||
| if (self.countDownEnd) { | |||||
| self.refreshImages(); | |||||
| return; | |||||
| } | |||||
| var phoneArea = self.dom.find('.phone-area-c select').val(); | |||||
| var phoneNumber = self.dom.find('.phone-num-c input').val(); | |||||
| if (!/^1[3578]\d{9}$/.test(phoneNumber)) { | |||||
| self.dom.find('.phone-num-c').addClass('error'); | |||||
| return; | |||||
| } else { | |||||
| self.dom.find('.phone-num-c').removeClass('error'); | |||||
| var useType = self.dom.closest('div.use-type').attr('usetype') || 0; | |||||
| $.ajax({ | |||||
| url: '/sendVerifyCode', | |||||
| type: 'post', | |||||
| dataType: 'json', | |||||
| data: { | |||||
| phone_number: phoneNumber, | |||||
| mode: useType, // 0注册,1登录 ,2修改手机号,3找回密码 | |||||
| slide_id: self.imgID, | |||||
| }, | |||||
| success: function(res) { | |||||
| if (res && res.Code === 0) { | |||||
| self.countDown(); | |||||
| } else { | |||||
| if ($('.ui.negative.message').length) { | |||||
| $('.ui.negative.message').eq(0).show().find('p').text(res.Message); | |||||
| } else { | |||||
| $('body').toast({ | |||||
| message: res.Message, | |||||
| showProgress: 'bottom', | |||||
| showIcon:'warning circle', | |||||
| class: 'warning', | |||||
| position: 'top right', | |||||
| }); | |||||
| } | |||||
| self.refreshImages(); | |||||
| } | |||||
| }, | |||||
| error: function(err) { | |||||
| console.log(err); | |||||
| } | |||||
| }); | |||||
| } | |||||
| }); | |||||
| this.dom.find('.modify-phone-number a').on('click', function() { | |||||
| self.dom.find('.phone-area-c select').attr('disabled', false); | |||||
| self.dom.find('.phone-num-c input').attr('disabled', false); | |||||
| self.dom.find('.slide-bar-wrap').css('display', 'flex'); | |||||
| self.dom.find('.verify-code-c').css('display', 'flex'); | |||||
| self.dom.find('.modify-phone-number').hide(); | |||||
| }); | |||||
| }; | |||||
| PhoneVerifyCode.prototype.refreshImages = function () { | |||||
| this.isMoving = false; | |||||
| this.verifySucess = false; | |||||
| this.canSendCode = false; | |||||
| this.countDownEnd = false; | |||||
| this.imgID = ''; | |||||
| this.dom.find('.slide-bar').removeClass('sucess error').css('width', '30px'); | |||||
| this.dom.find('.slide-trigger').removeClass('sucess error').css('left', '0px'); | |||||
| this.dom.find('.slide-trigger .icon').hide(); | |||||
| this.dom.find('.slide-trigger .icon.arrow').show(); | |||||
| this.dom.find('.slide-txt').show(); | |||||
| this.dom.find('.slide-image-small').css('left', '0'); | |||||
| this.dom.find('.verify-code-send-btn').addClass('__disabled'); | |||||
| var self = this; | |||||
| $.ajax({ | |||||
| url: '/slideImage', | |||||
| type: 'get', | |||||
| success: function(res) { | |||||
| if (res && res.Code === 0) { | |||||
| self.imgID = res.Message; | |||||
| self.dom.find('.slide-image-big').css('background', `url("/slideimage/${res.Message}.png")`); | |||||
| self.dom.find('.slide-image-small').css('background', `url("/slideimage/${res.Message}screenshot.png")`); | |||||
| } | |||||
| }, | |||||
| error: function(err) { | |||||
| console.log(err); | |||||
| } | |||||
| }); | |||||
| }; | |||||
| PhoneVerifyCode.prototype.countDown = function () { | |||||
| var self = this; | |||||
| var sendBtnEl = this.dom.find('.verify-code-send-btn'); | |||||
| var count = this.countDownNumber; | |||||
| sendBtnEl.addClass('__disabled').text(count + {{.i18n.Tr "phone.second_resend"}}); | |||||
| this.canSendCode = false; | |||||
| this.countDownEnd = false; | |||||
| var timer = setInterval(function () { | |||||
| count--; | |||||
| sendBtnEl.addClass('__disabled').text(count + {{.i18n.Tr "phone.second_resend"}}); | |||||
| if (count <= 0) { | |||||
| sendBtnEl.removeClass('__disabled').text({{.i18n.Tr "phone.get_verification_code"}}); | |||||
| clearInterval(timer); | |||||
| self.canSendCode = true; | |||||
| self.countDownEnd = true; | |||||
| self.refreshImages(); | |||||
| } | |||||
| }, 1000); | |||||
| }; | |||||
| const phoneVerifyCode = new PhoneVerifyCode($('.__phone-verify-code')); | |||||
| (function(){ | |||||
| window.addEventListener('load', function () { | |||||
| var phoneVerifyCode = new PhoneVerifyCode($('.__phone-verify-code'), { | |||||
| Lang: { | |||||
| second_resend: {{.i18n.Tr "phone.second_resend"}}, | |||||
| get_verification_code: {{.i18n.Tr "phone.get_verification_code"}}, | |||||
| }, | |||||
| }); | }); | ||||
| })(); | |||||
| }); | |||||
| })(); | |||||
| </script> | </script> | ||||
| @@ -0,0 +1,256 @@ | |||||
| ; (function () { | |||||
| function PhoneVerifyCode(dom, options) { | |||||
| if (!dom) return; | |||||
| this.countDownNumber = 120; | |||||
| this.options = options; | |||||
| this.init(dom); | |||||
| } | |||||
| PhoneVerifyCode.prototype.init = function (dom) { | |||||
| if (!dom) return; | |||||
| this.dom = $(dom); | |||||
| this.isMoving = false; | |||||
| this.verifySucess = false; | |||||
| this.canSendCode = false; | |||||
| this.countDownEnd = false; | |||||
| this.imgID = ''; | |||||
| this.eventInit(); | |||||
| this.refreshImages(); | |||||
| var wrap = this.dom.closest('div.use-type'); | |||||
| var readonly = wrap.attr('readonly'); | |||||
| if (readonly) { | |||||
| this.dom.find('.phone-area-c select').attr('disabled', true); | |||||
| this.dom.find('.phone-num-c input').attr('disabled', true); | |||||
| this.dom.find('.slide-bar-wrap').hide(); | |||||
| this.dom.find('.verify-code-c').hide(); | |||||
| this.dom.find('.modify-phone-number').show(); | |||||
| } | |||||
| var oldPhoneNum = wrap.attr('ophonenumber'); | |||||
| if (oldPhoneNum) { | |||||
| this.dom.find('input.phoneNumber').val(oldPhoneNum); | |||||
| } | |||||
| var showlabel = wrap.attr('showlabel'); | |||||
| if (showlabel) { | |||||
| this.dom.find('._label-c ').show(); | |||||
| } else { | |||||
| this.dom.find('._label-c ').hide(); | |||||
| } | |||||
| var showNewpwd = wrap.attr('shownewpwd'); | |||||
| if (showNewpwd) { | |||||
| this.dom.find('.new-pass-word-wrap').show(); | |||||
| } else { | |||||
| this.dom.find('.new-pass-word-wrap').remove(); | |||||
| } | |||||
| var autofocus = wrap.attr('autofocus'); | |||||
| if (autofocus) { | |||||
| this.dom.find('input.phoneNumber').focus(); | |||||
| } | |||||
| var verifyCodeNoRequired = wrap.attr('verifycodenorequired'); | |||||
| if (verifyCodeNoRequired) { | |||||
| this.dom.find('input.verifyCode').removeAttr('required'); | |||||
| } | |||||
| }; | |||||
| PhoneVerifyCode.prototype.eventInit = function () { | |||||
| if (!this.dom) return; | |||||
| var self = this; | |||||
| var clientX = 0, oLeft = 0, imgHideTimer = null; | |||||
| this.dom.find('.slide-bar-bg').on('mouseenter', function (e) { | |||||
| if (self.verifySucess) return; | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| self.dom.find('.slide-image-big').slideDown(); | |||||
| }); | |||||
| this.dom.find('.slide-bar-bg').on('mouseleave', function (e) { | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| imgHideTimer = setTimeout(function () { | |||||
| self.dom.find('.slide-image-big').slideUp(); | |||||
| }, 200); | |||||
| }); | |||||
| this.dom.find('.slide-image-big').on('mouseenter', function (e) { | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| }); | |||||
| this.dom.find('.slide-image-big').on('mouseleave', function (e) { | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| imgHideTimer = setTimeout(function () { | |||||
| self.dom.find('.slide-image-big').slideUp(); | |||||
| }, 200); | |||||
| }); | |||||
| function mouseMove(e) { | |||||
| var _clientX = e.clientX; | |||||
| var offset = _clientX - clientX; | |||||
| var triggerEl = self.dom.find('.slide-trigger'); | |||||
| var triggerWidth = triggerEl.width(); | |||||
| var parentWidth = triggerEl.parent().width(); | |||||
| var maxLeft = parentWidth - triggerWidth; | |||||
| var left = oLeft + offset; | |||||
| if (oLeft + offset < 0) left = 0; | |||||
| if (oLeft + offset > maxLeft) left = maxLeft; | |||||
| triggerEl.css('left', left + 'px'); | |||||
| self.dom.find('.slide-bar').css('width', left + triggerWidth); | |||||
| var imageBigWidth = self.dom.find('.slide-image-big').width(); | |||||
| var imageSmallWidth = self.dom.find('.slide-image-small').width(); | |||||
| self.dom.find('.slide-image-small').css('left', left / maxLeft * (imageBigWidth - imageSmallWidth) + 'px'); | |||||
| self.isMoving = true; | |||||
| self.dom.find('.slide-txt').hide(); | |||||
| imgHideTimer && clearTimeout(imgHideTimer); | |||||
| } | |||||
| function mouseUp(e) { | |||||
| $(document).off('mousemove', mouseMove); | |||||
| $(document).off('mouseup', mouseUp); | |||||
| self.isMoving = false; | |||||
| $.ajax({ | |||||
| url: '/verifySlideImage', | |||||
| type: 'post', | |||||
| dataType: 'json', | |||||
| data: { | |||||
| slide_id: self.imgID, | |||||
| x: parseInt(self.dom.find('.slide-image-small').position().left) | |||||
| }, | |||||
| success: function (res) { | |||||
| if (res && res.Code === 0) { | |||||
| self.verifySucess = true; | |||||
| self.canSendCode = true; | |||||
| self.dom.find('.slide-bar').addClass('sucess'); | |||||
| self.dom.find('.slide-trigger').addClass('sucess'); | |||||
| self.dom.find('.slide-trigger .icon').hide(); | |||||
| self.dom.find('.slide-trigger .icon.check').show(); | |||||
| self.dom.find('.slide-image-big').slideUp(); | |||||
| self.dom.find('.verify-code-send-btn').removeClass('__disabled'); | |||||
| } else { | |||||
| self.dom.find('.slide-bar').addClass('error'); | |||||
| self.dom.find('.slide-trigger').addClass('error'); | |||||
| self.dom.find('.slide-trigger .icon').hide(); | |||||
| self.dom.find('.slide-trigger .icon.close').show(); | |||||
| setTimeout(function () { | |||||
| self.refreshImages(); | |||||
| }, 300); | |||||
| } | |||||
| }, | |||||
| error: function (err) { | |||||
| self.dom.find('.slide-bar').addClass('error'); | |||||
| self.dom.find('.slide-trigger').addClass('error'); | |||||
| setTimeout(function () { | |||||
| self.refreshImages(); | |||||
| }, 300); | |||||
| } | |||||
| }); | |||||
| } | |||||
| this.dom.find('.slide-trigger').on('mousedown', function (e) { | |||||
| if (self.verifySucess) return; | |||||
| clientX = e.clientX; | |||||
| oLeft = $(this).position().left; | |||||
| $(document).on('mousemove', mouseMove); | |||||
| $(document).on('mouseup', mouseUp); | |||||
| }); | |||||
| this.dom.find('.verify-code-send-btn').on('click', function () { | |||||
| if (!self.canSendCode) return; | |||||
| if (self.countDownEnd) { | |||||
| self.refreshImages(); | |||||
| return; | |||||
| } | |||||
| var phoneNumber = self.dom.find('.phone-num-c input').val(); | |||||
| if (!/^1[3578]\d{9}$/.test(phoneNumber)) { | |||||
| self.dom.find('.phone-num-c').addClass('error'); | |||||
| return; | |||||
| } else { | |||||
| self.dom.find('.phone-num-c').removeClass('error'); | |||||
| var useType = self.dom.closest('div.use-type').attr('usetype') || 0; | |||||
| $.ajax({ | |||||
| url: '/sendVerifyCode', | |||||
| type: 'post', | |||||
| dataType: 'json', | |||||
| data: { | |||||
| phone_number: phoneNumber, | |||||
| mode: useType, // 0注册,1登录 ,2修改手机号,3找回密码 | |||||
| slide_id: self.imgID, | |||||
| }, | |||||
| success: function (res) { | |||||
| if (res && res.Code === 0) { | |||||
| self.countDown(); | |||||
| } else { | |||||
| if ($('.ui.negative.message').length) { | |||||
| $('.ui.negative.message').eq(0).show().find('p').text(res.Message); | |||||
| } else { | |||||
| $('body').toast({ | |||||
| message: res.Message, | |||||
| showProgress: 'bottom', | |||||
| showIcon: 'warning circle', | |||||
| class: 'warning', | |||||
| position: 'top right', | |||||
| }); | |||||
| } | |||||
| self.refreshImages(); | |||||
| } | |||||
| }, | |||||
| error: function (err) { | |||||
| console.log(err); | |||||
| } | |||||
| }); | |||||
| } | |||||
| }); | |||||
| this.dom.find('.modify-phone-number a').on('click', function () { | |||||
| self.dom.find('.phone-area-c select').attr('disabled', false); | |||||
| self.dom.find('.phone-num-c input').attr('disabled', false); | |||||
| self.dom.find('.slide-bar-wrap').css('display', 'flex'); | |||||
| self.dom.find('.verify-code-c').css('display', 'flex'); | |||||
| self.dom.find('.modify-phone-number').hide(); | |||||
| }); | |||||
| }; | |||||
| PhoneVerifyCode.prototype.refreshImages = function () { | |||||
| this.isMoving = false; | |||||
| this.verifySucess = false; | |||||
| this.canSendCode = false; | |||||
| this.countDownEnd = false; | |||||
| this.imgID = ''; | |||||
| this.dom.find('.slide-bar').removeClass('sucess error').css('width', '30px'); | |||||
| this.dom.find('.slide-trigger').removeClass('sucess error').css('left', '0px'); | |||||
| this.dom.find('.slide-trigger .icon').hide(); | |||||
| this.dom.find('.slide-trigger .icon.arrow').show(); | |||||
| this.dom.find('.slide-txt').show(); | |||||
| this.dom.find('.slide-image-small').css('left', '0'); | |||||
| this.dom.find('.verify-code-send-btn').addClass('__disabled'); | |||||
| var self = this; | |||||
| $.ajax({ | |||||
| url: '/slideImage', | |||||
| type: 'get', | |||||
| success: function (res) { | |||||
| if (res && res.Code === 0) { | |||||
| self.imgID = res.Message; | |||||
| self.dom.find('.slide-image-big').css('background', `url("/slideimage/${res.Message}.png")`); | |||||
| self.dom.find('.slide-image-small').css('background', `url("/slideimage/${res.Message}screenshot.png")`); | |||||
| } | |||||
| }, | |||||
| error: function (err) { | |||||
| console.log(err); | |||||
| } | |||||
| }); | |||||
| }; | |||||
| PhoneVerifyCode.prototype.countDown = function () { | |||||
| var self = this; | |||||
| var sendBtnEl = this.dom.find('.verify-code-send-btn'); | |||||
| var count = this.countDownNumber; | |||||
| sendBtnEl.addClass('__disabled').text(count + (self.options && self.options.Lang && self.options.Lang.second_resend ? self.options.Lang.second_resend : 'S后重发')); | |||||
| this.canSendCode = false; | |||||
| this.countDownEnd = false; | |||||
| var timer = setInterval(function () { | |||||
| count--; | |||||
| sendBtnEl.addClass('__disabled').text(count + (self.options && self.options.Lang && self.options.Lang.second_resend ? self.options.Lang.second_resend : 'S后重发')); | |||||
| if (count <= 0) { | |||||
| sendBtnEl.removeClass('__disabled').text(+ (self.options && self.options.Lang && self.options.Lang.get_verification_code ? self.options.Lang.get_verification_code : '获取验证码')); | |||||
| clearInterval(timer); | |||||
| self.canSendCode = true; | |||||
| self.countDownEnd = true; | |||||
| self.refreshImages(); | |||||
| } | |||||
| }, 1000); | |||||
| }; | |||||
| window.PhoneVerifyCode = PhoneVerifyCode; | |||||
| })(); | |||||
| @@ -0,0 +1,274 @@ | |||||
| .__phone-verify-code { | |||||
| max-width: 519px; | |||||
| } | |||||
| .__phone-verify-code ._label-c { | |||||
| display: flex; | |||||
| justify-content: fixed-start; | |||||
| align-items: center; | |||||
| width: 100px; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code ._label-c ._label { | |||||
| font-size: 13px; | |||||
| font-weight: 700; | |||||
| color: rgba(0, 0, 0, .87); | |||||
| } | |||||
| .__phone-verify-code ._label-c.required ._label:after { | |||||
| margin: -0.2em 0 0 0.2em; | |||||
| content: '*'; | |||||
| color: #db2828; | |||||
| display: inline-block; | |||||
| vertical-align: top; | |||||
| } | |||||
| .__phone-verify-code .phone-c { | |||||
| display: flex; | |||||
| margin: 0 0 1em; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-area-c { | |||||
| height: 38px; | |||||
| width: 80px; | |||||
| margin-right: 10px; | |||||
| border-radius: 2px; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| box-sizing: border-box; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-area-c select { | |||||
| outline: none; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-num-c { | |||||
| height: 38px; | |||||
| flex: 1; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| box-sizing: border-box; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .phone-c .phone-num-c input { | |||||
| height: 100%; | |||||
| width: 100% !important; | |||||
| padding: 9.5px 14px; | |||||
| box-sizing: border-box; | |||||
| outline: none; | |||||
| } | |||||
| .__phone-verify-code .phone-c .modify-phone-number { | |||||
| position: absolute; | |||||
| left: 100%; | |||||
| width: 200px; | |||||
| height: 100%; | |||||
| margin-left: 10px; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code .phone-c .modify-phone-number a { | |||||
| font-weight: 400; | |||||
| font-size: 14px; | |||||
| color: rgba(0, 102, 255, 1); | |||||
| } | |||||
| .__phone-verify-code .slide-bar-wrap { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| margin: 0 0 1em; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c { | |||||
| flex: 1; | |||||
| display: flex; | |||||
| height: 38px; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg { | |||||
| height: 34px; | |||||
| flex: 1; | |||||
| background-color: rgb(245, 245, 246); | |||||
| border: 1px solid rgb(225, 227, 230); | |||||
| border-radius: 2px; | |||||
| position: relative; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-txt { | |||||
| position: absolute; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| display: flex; | |||||
| user-select: none; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| color: #cdcacb; | |||||
| font-size: 14px; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-bar { | |||||
| position: absolute; | |||||
| width: 38px; | |||||
| height: 34px; | |||||
| background-color: #d1e9fe; | |||||
| border: 1px solid #1991fa; | |||||
| border-radius: 2px; | |||||
| box-sizing: border-box; | |||||
| top: -1px; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-bar.sucess { | |||||
| background-color: #d2f4ef; | |||||
| border: 1px solid #52ccba; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-bar.error { | |||||
| border-color: #f57a7a; | |||||
| background-color: #fce1e1; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger { | |||||
| position: absolute; | |||||
| width: 38px; | |||||
| height: 34px; | |||||
| background-color: #1991fa; | |||||
| border-radius: 2px; | |||||
| cursor: pointer; | |||||
| top: -1px; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| user-select: none; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger .icon { | |||||
| font-size: 16px; | |||||
| color: white; | |||||
| margin: 0; | |||||
| height: 16px; | |||||
| width: 16px; | |||||
| margin-top: -5px; | |||||
| user-select: none; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger.sucess { | |||||
| background-color: #52ccba; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-bar-bg .slide-trigger.error { | |||||
| background-color: #f57a7a; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-image-big { | |||||
| position: absolute; | |||||
| width: 391px; | |||||
| height: 196px; | |||||
| top: 36px; | |||||
| left: 0; | |||||
| border-radius: 2px; | |||||
| z-index: 100; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .slide-image-small { | |||||
| position: absolute; | |||||
| left: 0; | |||||
| width: 51px; | |||||
| height: 51px; | |||||
| box-shadow: 0 0 4px rgb(35 173 255); | |||||
| } | |||||
| .__phone-verify-code .slide-bar-c .verify-code-c { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| margin: 0 0 1em; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-num-c { | |||||
| flex: 1; | |||||
| height: 38px; | |||||
| box-sizing: border-box; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| display: flex; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-num-c input { | |||||
| height: 100%; | |||||
| width: 100% !important; | |||||
| padding: 9.5px 14px; | |||||
| box-sizing: border-box; | |||||
| outline: none; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-send { | |||||
| display: flex; | |||||
| width: 120px; | |||||
| height: 38px; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-send .verify-code-send-btn { | |||||
| height: 100%; | |||||
| width: 100%; | |||||
| margin-left: 10px; | |||||
| border: 1px solid #398dee; | |||||
| background-color: #398dee; | |||||
| color: white; | |||||
| border-radius: 2px; | |||||
| box-sizing: border-box; | |||||
| cursor: pointer; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| .__phone-verify-code .verify-code-c .verify-code-send .verify-code-send-btn.__disabled { | |||||
| border: 1px solid #ddd; | |||||
| background-color: #ddd; | |||||
| cursor: not-allowed; | |||||
| } | |||||
| .__phone-verify-code .new-pass-word-wrap { | |||||
| display: flex; | |||||
| height: 38px; | |||||
| margin: 0 0 1em; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| display: none; | |||||
| } | |||||
| .__phone-verify-code .new-pass-word-wrap .new-pass-word-c { | |||||
| flex: 1; | |||||
| height: 38px; | |||||
| box-sizing: border-box; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| display: flex; | |||||
| } | |||||
| .__phone-verify-code .new-pass-word-wrap .new-pass-word-c input { | |||||
| height: 100%; | |||||
| width: 100% !important; | |||||
| padding: 9.5px 14px; | |||||
| box-sizing: border-box; | |||||
| outline: none; | |||||
| } | |||||
| @@ -20,6 +20,15 @@ for (const path of glob('web_src/less/themes/*.less')) { | |||||
| themes[parse(path).name] = [path]; | themes[parse(path).name] = [path]; | ||||
| } | } | ||||
| const standalone = {}; | |||||
| const stadalonePaths = [ | |||||
| ...glob('web_src/js/standalone/*.js'), | |||||
| ...glob('web_src/less/standalone/*.less'), | |||||
| ]; | |||||
| for (const path of stadalonePaths) { | |||||
| standalone[parse(path).name] = [path]; | |||||
| } | |||||
| const isProduction = process.env.NODE_ENV !== 'development'; | const isProduction = process.env.NODE_ENV !== 'development'; | ||||
| module.exports = { | module.exports = { | ||||
| @@ -29,13 +38,11 @@ module.exports = { | |||||
| resolve(__dirname, 'web_src/js/index.js'), | resolve(__dirname, 'web_src/js/index.js'), | ||||
| resolve(__dirname, 'web_src/less/index.less'), | resolve(__dirname, 'web_src/less/index.less'), | ||||
| ], | ], | ||||
| swagger: [ | |||||
| resolve(__dirname, 'web_src/js/standalone/swagger.js'), | |||||
| ], | |||||
| jquery: [ | jquery: [ | ||||
| resolve(__dirname, 'web_src/js/jquery.js'), | resolve(__dirname, 'web_src/js/jquery.js'), | ||||
| ], | ], | ||||
| icons: glob('node_modules/@primer/octicons/build/svg/**/*.svg'), | icons: glob('node_modules/@primer/octicons/build/svg/**/*.svg'), | ||||
| ...standalone, | |||||
| ...themes, | ...themes, | ||||
| }, | }, | ||||
| devtool: false, | devtool: false, | ||||
| @@ -20,6 +20,15 @@ for (const path of glob('web_src/less/themes/*.less')) { | |||||
| themes[parse(path).name] = [path]; | themes[parse(path).name] = [path]; | ||||
| } | } | ||||
| const standalone = {}; | |||||
| const stadalonePaths = [ | |||||
| ...glob('web_src/js/standalone/*.js'), | |||||
| ...glob('web_src/less/standalone/*.less'), | |||||
| ]; | |||||
| for (const path of stadalonePaths) { | |||||
| standalone[parse(path).name] = [path]; | |||||
| } | |||||
| const isProduction = process.env.NODE_ENV !== 'development'; | const isProduction = process.env.NODE_ENV !== 'development'; | ||||
| module.exports = { | module.exports = { | ||||
| @@ -29,13 +38,11 @@ module.exports = { | |||||
| resolve(__dirname, 'web_src/js/index.js'), | resolve(__dirname, 'web_src/js/index.js'), | ||||
| resolve(__dirname, 'web_src/less/index.less'), | resolve(__dirname, 'web_src/less/index.less'), | ||||
| ], | ], | ||||
| swagger: [ | |||||
| resolve(__dirname, 'web_src/js/standalone/swagger.js'), | |||||
| ], | |||||
| jquery: [ | jquery: [ | ||||
| resolve(__dirname, 'web_src/js/jquery.js'), | resolve(__dirname, 'web_src/js/jquery.js'), | ||||
| ], | ], | ||||
| icons: glob('node_modules/@primer/octicons/build/svg/**/*.svg'), | icons: glob('node_modules/@primer/octicons/build/svg/**/*.svg'), | ||||
| ...standalone, | |||||
| ...themes, | ...themes, | ||||
| }, | }, | ||||
| devtool: false, | devtool: false, | ||||