// 验证码模块封装(王华) const CaptchaModule = (function(){ let captchaText = ''; function generateCaptchaImage(text) { const canvas = document.createElement('canvas'); canvas.width = 100; canvas.height = 40; const ctx = canvas.getContext('2d'); // 背景 ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, canvas.width, canvas.height); // 绘制文字 ctx.font = '24px Arial'; ctx.textBaseline = 'middle'; for (let i = 0; i < text.length; i++) { const x = 20 + i * 18; const y = 20 + (Math.random() * 10 - 5); ctx.save(); ctx.translate(x, y); ctx.rotate((Math.random() * 0.5) - 0.25); ctx.fillStyle = `rgb(${Math.random()*150},${Math.random()*150},${Math.random()*150})`; ctx.fillText(text[i], 0, 0); ctx.restore(); } // 干扰线 for (let i = 0; i < 4; i++) { ctx.strokeStyle = `rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`; ctx.beginPath(); ctx.moveTo(Math.random()*canvas.width, Math.random()*canvas.height); ctx.lineTo(Math.random()*canvas.width, Math.random()*canvas.height); ctx.stroke(); } return canvas.toDataURL('image/png'); } function loadCaptcha() { fetch('https://qjswdx.digitalqujing.com/login/getVerCode').then(res => res.json()).then(data => { captchaText = aesMinDecrypt("ABCDEFGHIJKL_key", "ABCDEFGHIJKLM_iv", data.message.vercode); document.getElementById('captchaImg').src = generateCaptchaImage(captchaText); }); } function validateCaptcha(inputValue) { return inputValue.toUpperCase() === captchaText.toUpperCase(); } return { init: function() { loadCaptcha(); document.getElementById('captchaImg').addEventListener('click', loadCaptcha); }, validate: validateCaptcha, refresh: loadCaptcha }; })(); $(function(){ //密码不允许输入中文(王华) $.extend($.fn.validatebox.defaults.rules, { noChinese: { validator: function (value) { return !/[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF']/.test(value); }, message: '密码不允许输入中文' } }); $('#password').passwordbox({ onChange: function (newValue) { let containsChinese = /[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF']/.test(newValue);// 检测是否包含中文或反引号 if (containsChinese) { $(this).passwordbox('validate'); } } }); showLoginReason(login_AttentionInfo); // 显示验证码 $('#vcode').textbox({ label: '', labelWidth: 100, labelPosition: "after", labelAlign: "right" }); // 初始化验证码模块 CaptchaModule.init(); $('#username').textbox().next('span').find('input').focus(); }) function enterFunction(){ login(); } //验证码输入框(王华) var inputs; var timeout; var suButton; // 防抖(王华) function debounce(func, delay) { clearTimeout(timeout); timeout = setTimeout(func, delay); } // 处理信息加密(王华) function aesEncrypt(data) { const key = "ABCDEFGHIJKL_key"; const iv = "ABCDEFGHIJKLM_iv"; const result = {}; for (const prop in data) { if (data.hasOwnProperty(prop)) { result[prop] = aesMinEncrypt(key, iv, data[prop]); } } return result; } // AES 解密(王华) function aesMinDecrypt(key, iv, encrypted) { var _key = CryptoJS.enc.Utf8.parse(key), _iv = CryptoJS.enc.Utf8.parse(iv); var decrypted = CryptoJS.AES.decrypt(encrypted, _key, { iv: _iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return decrypted.toString(CryptoJS.enc.Utf8); } // AES 加密(王华) function aesMinEncrypt(key, iv, word){ var _word = CryptoJS.enc.Utf8.parse(word), _key = CryptoJS.enc.Utf8.parse(key), _iv = CryptoJS.enc.Utf8.parse(iv); var encrypted = CryptoJS.AES.encrypt(_word, _key, { iv: _iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } // 后端验证登录信息(王华) function requestLogin(url, data) { $.ajax({ type: "post", url: url, // data: { username: data.username, password: data.password }, data: data, dataType: "json", success: function (result) { if (result.success) { if (result.smsVerCodeFlag && result.phoneNumber){ $("#phoneNumber").html(result.phoneNumber); openCodeInput(data) }else { if (result.eoatoken) { // 设置名为 "EOA_TOKEN" 的 Cookie,有效期为 30 天 PCPage.setCookie("EOA_TOKEN", result.eoatoken, 30); } location.href = login_RedirectUrl; } } else { showLoginReason(result.message); CaptchaModule.refresh(); } }, error: function () { showLoginReason("登录失败,请重试!"); CaptchaModule.refresh(); } }); } // 检测输入手机验证码(王华) function checkPhoneCode(username, password) { const isFilled = inputs.toArray().every(input => $(input).val().length > 0); if (isFilled) { codeValue = inputs.toArray().map(input => $(input).val()).join(''); showLoginReason("系统正在验证,请稍后......"); $("#inputTips").html(''); // 加密验证码并请求验证 const data = aesEncrypt({ code: codeValue }); $.ajax({ type: "post", url: "https://qjswdx.digitalqujing.com/login/checkSMSCode", data: { username: username, password: password, vercode: data.code }, dataType: "json", beforeSend: function() { $("#inputTips").html('系统正在验证,请稍后......'); }, success: function(result){ if (result.success) { setCookie("EOA_TOKEN", result.eoatoken, 30); location.href=login_RedirectUrl; }else if (result.errcode === 1) { //验证码输入错 $("#inputTips").html(result.message); inputs.val(''); inputs[0].focus(); showLoginReason(result.message); }else if (result.errcode === 2) { //验证码超时 $("#inputTips").html(result.message); setTimeout(()=>{ inputs.val(''); $('.input_code').fadeOut().css('display', 'none'); },1500) showLoginReason(result.message); }else { //其他错误 inputs.val(''); $('.input_code').fadeOut().css('display', 'none'); showLoginReason(result.message); } } }); } else { showLoginReason("请输入手机验证码"); } } function showLoginReason(info) { $("#login_error").html(info); } //打开手机验证码输入(王华) function openCodeInput(loginData) { $('.input_code').fadeIn().css('display','flex'); inputs = $('.verification-code-input input'); suButton = $('#submitButton'); inputs[0].focus(); //聚焦光标顺移 inputs.on('input', function(e) { const value = $(this).val(); if (value.length === 1) { if ($(this).index() < inputs.length - 1) { debounce(() => { inputs.eq($(this).index() + 1).focus(); }, 10); } else { $(this).blur(); } } checkPhoneCode(loginData.username, loginData.password); }); //回退删除 inputs.on('keydown', function(e) { if (e.key === 'Backspace') { if ($(this).val().length === 0 && $(this).index() > 0) { inputs.eq($(this).index() - 1).focus(); } } checkPhoneCode(loginData.username, loginData.password); }); //复制粘贴 $(document).on('paste', function(e) { e.preventDefault(); const pastedData = e.originalEvent.clipboardData.getData('text'); const digits = pastedData.match(/\d/g); if (digits) { let i = 0; inputs.each(function() { if (digits[i]) { $(this).val(digits[i]); i++; } }); } checkPhoneCode(loginData.username, loginData.password); }); } function login(url) { //接收输入账号密码 let username = $("input[name='username']").val(); let password = $("input[name='password']").val(); let vcode = $("#vcode").textbox("getValue"); //验证输入 if (Tools.isEmptyString(username)) { showLoginReason("请输入登录账号!"); return false; } if (Tools.isEmptyString(password)) { showLoginReason("请输入登录密码!"); return false; } if (Tools.isEmptyString($("#vcode").textbox("getValue"))) { showLoginReason("请输入验证码!"); return false; } if (!CaptchaModule.validate($("#vcode").textbox("getValue"))) { showLoginReason("验证码不正确!"); CaptchaModule.refresh(); return false; } if(Tools.isEmptyString(url)) { url = "https://qjswdx.digitalqujing.com/login/login?"; } else { url = url; } //开始加密并请求登录 showLoginReason("系统正在验证,请稍后......"); const data = aesEncrypt({ username: username, password: password, vercode: vcode }); requestLogin(url, data) } // //随机去四个值(废弃) // var items=[1,2,3,4,5,6,7,8,9,0,'p','q','r','a','i','x','w','m','h','s','c','b','t','d','u','v','y','z','e','f','g','h','j','k','l','n','o']; // function getRandomArrayElements(arr, count) { // var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; // while (i-- > min) { // index = Math.floor((i + 1) * Math.random()); // temp = shuffled[index]; // shuffled[index] = shuffled[i]; // shuffled[i] = temp; // } // return shuffled.slice(min); // } // // 随机颜色(废弃) // function randomHexColor() { //随机生成十六进制颜色 // return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6); // } // // 随机倾斜(废弃) // function random(min, max){ // return min + Math.floor(Math.random() * (max - min + 1)); // } // // 随机字体大小(废弃) // function randomSize(min, max) { // return min + Math.floor(Math.random() * (max - min + 1)); // } // // 集成(废弃) // function VerificationCode(Div,num){ // Div.empty(); // var str=''; // $.each(getRandomArrayElements(items, num),function (i,item){ // str+=item // Div.append("" + item + "") // }) // Div.attr('value',str) // Div.click(function (){ // VerificationCode(Div,4); // }) // }