tools-for-js
Version:
基于babel构建的JavaScript前端工具库
334 lines (321 loc) • 10.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getStrLength = exports.fromCode = exports.encrypt = exports.decrypt = exports.checkPwdStrength = exports.checkCrypt = exports.checkCode = void 0;
exports.replacePath = replacePath;
exports.splitString = splitString;
exports.splitToFileName = splitToFileName;
exports.toCode = void 0;
var _random = require("./random");
var _common = require("./common");
var _utf8_encode = function _utf8_encode(string) {
string = string ? string.toString() : '';
string = string.replace(/\r\n/g, '\n');
var utf_text = '';
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utf_text += String.fromCharCode(c);
} else if (c > 127 && c < 2048) {
utf_text += String.fromCharCode(c >> 6 | 192);
utf_text += String.fromCharCode(c & 63 | 128);
} else {
utf_text += String.fromCharCode(c >> 12 | 224);
utf_text += String.fromCharCode(c >> 6 & 63 | 128);
utf_text += String.fromCharCode(c & 63 | 128);
}
}
return utf_text;
};
var _utf8_decode = function _utf8_decode(utf_text) {
utf_text = utf_text ? utf_text.toString() : '';
var string = '';
var i = 0;
var c1 = 0;
var c2 = 0;
while (i < utf_text.length) {
c1 = utf_text.charCodeAt(i);
if (c1 < 128) {
string += String.fromCharCode(c1);
i++;
} else if (c1 > 191 && c1 < 224) {
c2 = utf_text.charCodeAt(i + 1);
string += String.fromCharCode((c1 & 31) << 6 | c2 & 63);
i += 2;
} else {
c2 = utf_text.charCodeAt(i + 1);
var c3 = utf_text.charCodeAt(i + 2);
string += String.fromCharCode((c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
i += 3;
}
}
return string;
};
/*******
* @description: 字符加密
* @author: 琴时
* @param {*} input
* @param {String} key [盐值]
* @param {Number} expires [有效期/毫秒|不传则永久有效]
* @return {String} [''|null|undefined==>'']
*/
var encrypt = exports.encrypt = function encrypt(input, key, expires) {
if ((0, _common.IsType)('Object', input) || (0, _common.IsType)('Array', input) || (0, _common.IsType)('Number', input)) {
input = JSON.stringify(input);
} else if (!input) return '';
// 取65位字符
var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var output = '';
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = _utf8_encode(input);
key = key || '';
if (expires) {
var et = Date.now() + Number(expires);
input = "".concat(et, ":").concat(key, ":").concat(input);
} else {
input = "".concat((0, _random.randomCode)(6), ":").concat(key, ":").concat(input);
}
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = (chr1 & 3) << 4 | chr2 >> 4;
enc3 = (chr2 & 15) << 2 | chr3 >> 6;
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
}
return output;
};
/*******
* @description: 字符解密
* @author: 琴时
* @param {String} input
* @param {String} key [盐值]
* @return {String}
*/
var decrypt = exports.decrypt = function decrypt(input, key) {
// 取65位字符
var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var output = '';
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input ? input.toString() : '';
input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
while (i < input.length) {
enc1 = _keyStr.indexOf(input.charAt(i++));
enc2 = _keyStr.indexOf(input.charAt(i++));
enc3 = _keyStr.indexOf(input.charAt(i++));
enc4 = _keyStr.indexOf(input.charAt(i++));
chr1 = enc1 << 2 | enc2 >> 4;
chr2 = (enc2 & 15) << 4 | enc3 >> 2;
chr3 = (enc3 & 3) << 6 | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = _utf8_decode(output);
key = key || ''; // 盐值
var symbol = ":".concat(key, ":"); // 盐字段切割符号
output = output.split(symbol);
if (output.length === 1) return '';
if (output[0] > 6 && /^\d+$/.test(output[0])) {
var nt = Date.now();
if (nt > output[0]) return '';
}
return output[1] || '';
};
/*******
* @description: 校验加密字符
* @author: 琴时
* @param {*} input [明文]
* @param {String} crypt [密文]
* @param {*} key [盐值]
* @return {Boolean}
*/
var checkCrypt = exports.checkCrypt = function checkCrypt(input, crypt, key) {
if ((0, _common.IsType)('Object', input) || (0, _common.IsType)('Array', input) || (0, _common.IsType)('Number', input)) {
input = JSON.stringify(input);
}
return input === decrypt(crypt, key);
};
/*******
* @description: GBK字符集实际长度计算
* @author: 琴时
* @param {String} str
* @return {Number}
*/
var getStrLength = exports.getStrLength = function getStrLength(str) {
str = str.toString();
var realLength = 0;
var len = str.length;
var charCode = -1;
for (var i = 0; i < len; i++) {
charCode = str.charCodeAt(i);
if (charCode >= 0 && charCode <= 128) {
realLength += 1;
} else {
// 如果是中文则长度加2
realLength += 2;
}
}
return realLength;
};
/*******
* @description: 密码强度校验
* @author: 琴时
* @param {String} value
* @return {Number} [0:小于6位不合格,1:弱,2: 中,3:强]
*/
var checkPwdStrength = exports.checkPwdStrength = function checkPwdStrength(value) {
if (value === undefined || value === null) {
return 0;
}
var strongRegex = new RegExp('^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$', 'g');
var mediumRegex = new RegExp('^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$', 'g');
var enoughRegex = new RegExp('(?=.{6,}).*', 'g');
var strong = 1;
if (enoughRegex.test(value) == false) {
//密码小于六位的时候
strong = 0;
} else if (strongRegex.test(value)) {
//密码为八位及以上并且字母数字特殊字符三项都包括,强度最强
strong = 3;
} else if (mediumRegex.test(value)) {
//密码为七位及以上并且字母、数字、特殊字符三项中有两项,强度是中等
strong = 2;
}
return strong;
};
/*******
* @description: 按指定长度分段字符串
* @author: 琴时
* @param {String} str
* @param {Number} num
* @return {Array}
*/
function splitString(str, num) {
var reg = /^[0-9]*[1-9][0-9]*$/;
if (str == null || str == undefined || !reg.test(num)) return [];
var array = [];
var len = str.length;
for (var i = 0; i < len / num; i++) {
if ((i + 1) * num > len) {
array.push(str.substring(i * num, len));
} else {
array.push(str.substring(i * num, (i + 1) * num));
}
}
return array;
}
/*******
* @description: 将路径中的反斜杠字符 \ 替换为斜杠 /
* @author: 琴时
* @param {*} path
* @return {*}
*/
function replacePath(path) {
return path.replace(/\\/g, '/');
}
/*******
* @description: 切割/获取文件名
* @author: 琴时
* @param {*} path
* @return {*}
*/
function splitToFileName(path) {
path = replacePath(path || '');
var lastIndex = path.lastIndexOf('/');
if (lastIndex === -1) return path;
return path.substring(lastIndex + 1);
}
/*******
* @description: Unicode加密方式
* @author: 琴时
* @param {String|Number} params
* @return {String}
*/
var toCode = exports.toCode = function toCode(params) {
params = params ? params.toString() : ''; //避免参数不是字符串
/* 定义密钥 */
var num = '0123456789';
var lower = 'abcdefghijklmnopqrstuvwxyz';
var capital = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var character = num + lower + capital; //构建秘钥数组
var len = character.length; //秘钥长度
/**
* 定义临时变量
* unicodeValue:最终加密值
*/
var unicodeValue = '';
/* 遍历待加密字符串 */
for (var i = 0; i < params.length; i++) {
var b = params.charCodeAt(i); //逐个提取每个字符,并获取Unicode编码值
var b1 = b % len; //第一轮求余数
b = (b - b1) / len; //求最大倍数
var b2 = b % len; //第二轮求余数
b = (b - b2) / len; //求最大倍数
var b3 = b % len; //第三轮求余数
unicodeValue += character[b3] + character[b2] + character[b1]; //根据余数值映射到密钥中对应下标位置的字符
}
return unicodeValue; //返回这些映射的字符(加密后)
};
/*******
* @description:Unicode解密方式
* @author: 琴时
* @param {String} params
* @return {String}
*/
var fromCode = exports.fromCode = function fromCode(params) {
params = params ? params.toString() : ''; //避免参数不是字符串
/* 定义密钥 */
var num = '0123456789';
var lower = 'abcdefghijklmnopqrstuvwxyz';
var capital = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var character = num + lower + capital; //构建秘钥数组
var len = character.length; //秘钥长度
var result = '';
var b = 0;
//计算加密字符串包含的字符数,创建一个x位的数组
var x = Math.ceil(params.length / 3);
var arr = new Array(x);
for (var i = 0; i < arr.length; i++) {
//以数组的长度循环次数,遍历加密字符串
var b1 = character.indexOf(params.charAt(b)); //截取周期内第d个字符串,计算在密钥中的索引值
b++;
var b2 = character.indexOf(params.charAt(b)); //截取周期内第d个字符串,计算在密钥中的索引值
b++;
var b3 = character.indexOf(params.charAt(b)); //截取周期内第d个字符串,计算在密钥中的索引值
b++;
arr[i] = b1 * len * len + b2 * len + b3; //利用索引值,反推被加密字符的Unicode编码值
}
// 将数组转换成字符串连接起来
// let str1 = arr.join(',')
//用fromCharCode()算出字符串
// result = eval('String.fromCharCode(' + str1 + ')')
result = String.fromCharCode.apply(String, arr);
return result; //返回被解密的字符串
};
/*******
* @description: 校验数据是否一致
* @author: 琴时
* @param {String} arg1 [未加密]
* @param {String} arg2 [已加密]
* @return {boolean} 返回校验结果<布尔值>
*/
var checkCode = exports.checkCode = function checkCode(arg1, arg2) {
arg1 = arg1 ? arg1.toString() : '';
return arg1 === fromCode(arg2);
};