实习简单总结
1. 校验函数
(1) IPv4
/**
* 校验IPv4
* @param ipAddress ip地址
*/
function isValidIPv4(_rules: Object, value: string, callback: Function): boolean {
// IPv4地址的正则表达式
const ipv4Pattern = /^(\d{1,3}\.){3}\d{1,3}$/;
// 首先检查是否符合基本的格式
if (!ipv4Pattern.test(value)) {
callback('IP格式不对');
}
// 分割成四个部分
const parts = value.split('.');
// 检查每个部分是否在0到255之间
for (let part of parts) {
const num = parseInt(part, 10);
if (num < 0 || num > 255) {
callback('IP格式不对');
}
}
callback();
}
补充一下ipv4的正则
const ipv4 =
/^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))|\*)((\/([012]\d|3[012]|\d))?)(,((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))|\*)((\/([012]\d|3[012]|\d))?))*$/;
(2) IPV6
/**
* 是否合法IPv6地址
* @param value
* @param callback
*/
const ipv6 =
/^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^:((:[\da-fA-F]{1,4}){1,6}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){6}:(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$/;
function validateIpv6(rule: any, value: any, callback: any) {
if (value === '' || typeof value === 'undefined' || value == null) {
// callback(new Error('请输入IP地址'));
callback(); //非必须参数
}
let iparr = String(value).trim().split(',');
// console.log(iparr);
//判断ipv6
let ip6 = !ipv6.test(iparr[0]);
if (ip6) {
callback(new Error('请输入正确的IP格式'));
}
callback();
}
(3) DNS校验(要么是IPV4要么是IPV6)
const ipv4 =
/^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))|\*)((\/([012]\d|3[012]|\d))?)(,((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))|\*)((\/([012]\d|3[012]|\d))?))*$/;
const ipv6 =
/^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^:((:[\da-fA-F]{1,4}){1,6}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$|^([\da-fA-F]{1,4}:){6}:(\/([1-9]?\d|(1([0-1]\d|2[0-8]))))?$/;
/**
* dns校验
* @param rule
* @param value
* @param callback
*/
function validateDNSIP(rule: any, value: any, callback: any) {
if (value === '' || typeof value === 'undefined' || value == null) {
// callback(new Error('请输入IP地址'));
callback(); //非必须参数
}
let iparr = String(value).trim().split(',');
// console.log(iparr);
let ip6 = ipv6.test(iparr[0]);
let ip4 = ipv4.test(iparr[0]);
if (ip6 || ip4) {
callback();
}
callback(new Error('请输入正确的IP格式'));
}
(3) 校验码
/**
* 校验验证码,必须6位数字
*/
export const validateCode = (_rules: Object, value: string, callback: Function) => {
const reg = /^[0-9]\d{5}$/;
if (value === '') {
callback('请输入验证码');
} else if (reg.test(value)) {
callback();
} else {
callback(new Error('验证码为6位数字'));
}
};
(4) 端口号校验
function validatePort(_rules: Object, value: string, callback: Function) {
if (/^[1-9][0-9]*$/.test(value) && parseInt(value, 10) <= 65535) {
callback();
} else {
callback('请输入正确的端口格式');
}
}
(5) 中英文数字及特殊字符限制最大长度
/**
* 中英文数字及特殊字符,最多64字符
* @param _rules
* @param value
* @param callback
*/
function validateThreatName(_rules: Object, value: string, callback: Function): boolean {
// 定义正则表达式,匹配中英文字符、数字和特殊字符
const regex = /^[\u4e00-\u9fa5a-zA-Z0-9_-]{1,64}$/;
// 使用正则表达式测试输入字符串
if (regex.test(value)) {
callback();
} else {
callback('威胁名称支持中英文数字及特殊字符_-,最多64字符');
}
}
(6) 校验带小数点的百分比
/**
* 校验百分比,允许小数后4位
* @param input 输入
*/
const validateNumber = (input: any) => {
// 检查输入是否以 0 开头(排除 0 本身)
if (/^0[0-9]+$/.test(input)) {
return false;
}
// 将输入转换为数字
const number = parseFloat(input);
// 检查是否为有效数字
if (isNaN(number)) {
return false;
}
// 检查是否在1到100之间
if (number < 1 || number > 100) {
return false;
}
// 检查小数部分是否超过4位
const decimalPart = (input.toString().split('.')[1] || '').length;
if (decimalPart > 4) {
return false;
}
// 如果所有条件都满足,返回true
return true;
};
(7) 校验手机号
/**
* 校验手机号
*/
export const validatePhoneNumber = (_rules: Object, value: string, callback: Function) => {
const reg = /^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[3-8]{1})|(18[0-9]{1})|(19[0-9]{1})|(14[5-7]{1}))+\d{8})$/;
if (value === '') {
callback('请输入手机号码');
} else if (reg.test(value)) {
callback();
} else {
callback(new Error('请输入正确的手机号码'));
}
};
(8) ※可以按照密码强度需求修改的校验
登录密码强度要求:(1:小写字母;2:大写字母;3:数字;4:特殊字符)
passWordsStrength.strength中是列表[], [1,3]表示密码必须包含小写字母和数字
校验函数如下
/**
* "codeDesc": "登录密码强度要求:(1:小写字母;2:大写字母;3:数字;4:特殊字符)"
* 密码校验
*/
const validatePassword = (_rules: Object, value: string, callback: Function) => {
if (value.indexOf(' ') != -1) {
callback('密码不能包含空格');
}
let passWordType = 0; //用1111 4个bt位表示密码类型
for (let num of passWordsStrength.strength) {
if (num == 1) {
passWordType = passWordType | 1;
}
if (num == 2) {
passWordType = passWordType | 2;
}
if (num == 3) {
passWordType = passWordType | 4;
}
if (num == 4) {
passWordType = passWordType | 8;
}
}
let passWordLength = passWordsStrength.length; //密码最小长度是系统设置的最大长度写死为20
if (value.length < passWordLength || value.length > 20) {
callback(tips.value);
}
if (!containsLowerCase(value) && passWordType & 1) {
callback('密码必须包含小写字母');
}
if (!containsUpperCase(value) && passWordType & 2) {
callback('密码必须包含大写字母');
}
if (!containsNumber(value) && passWordType & 4) {
callback('密码必须包含数字');
}
if (!containsSpecialCharacter(value) && passWordType & 8) {
callback('密码必须包特殊字符');
} else {
callback();
}
};
const containsLowerCase = (str: string): boolean => {
// 使用正则表达式检查字符串是否包含小写字母
return /[a-z]/.test(str);
};
function containsUpperCase(str: string): boolean {
// 使用正则表达式检查字符串是否包含大写字母
return /[A-Z]/.test(str);
}
function containsNumber(str: string): boolean {
// 使用正则表达式检查字符串是否包含数字
return /\d/.test(str);
}
function containsSpecialCharacter(str: string): boolean {
// 定义允许的特殊字符
// const specialCharacters = /[!@#$%^&*()]/;
const specialCharacters = /[!@#$%^&*()\-_=+|{}$$:;'<>,.?]/;
// 使用正则表达式检查字符串是否包含至少一个特殊字符
return specialCharacters.test(str);
}
由于不同的密码强度,提示也不一样,所以需要针对密码类型计算提示
const getTips = () => {
let passWordType = 0; //用1111 4个bt位表示密码类型
for (let num of passWordsStrength.strength) {
if (num == 1) {
passWordType = passWordType | 1;
}
if (num == 2) {
passWordType = passWordType | 2;
}
if (num == 3) {
passWordType = passWordType | 4;
}
if (num == 4) {
passWordType = passWordType | 8;
}
}
let passWordLength = passWordsStrength.length;
tips.value =
'密码必须包含' +
((passWordType & 0b11) === 0b11 ? '大小写字母' : (passWordType & 0b1 ? '小写字母' : '') + (passWordType & 2 ? '大写字母' : '')) +
(passWordType & 0b1100 && passWordType & 0b0011 ? '、' : '') +
(passWordType & 4 ? '数字' : '') +
(passWordType & 0b1000 && passWordType & 0b0111 ? '、' : '') +
(passWordType & 8 ? '特殊字符' : '') +
'且长度为' +
passWordLength +
'~20位';
};
2. 前端定时任务
const onMountedLoad = async () => {
//需要定时执行的任务
Promise.all([getAlarmType(), getAlarmInfo(), getGeo(), getThreadPerceptTotal(), getList()]);
};
let timeoutID: number | undefined = undefined;
// 定时任务
const onTimeRefresh = () => {
console.log('调用');
let timeMargion = 1000 * 60 * autoRefreshTime.value;
console.log(timeMargion);
timeoutID = setTimeout(function () {
onMountedLoad().then().finally(onTimeRefresh);
}, timeMargion);
};