前端实习校验函数汇总(未完成)

发布于:2025-06-12 ⋅ 阅读:(10) ⋅ 点赞:(0)

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);
};