// 验证码模块封装(王华)
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);
// })
// }