文章目录
一.学习到的知识(ip地址和子网掩码校验)
1. 输入框使用正则限制输入
input输入框要限制只能输入数字设置 type=“number” 使用其他的UI组件或多或少都会带有默认样式,input输入框可以有oninput监听时间使用正则可以把用户输入的不符合正则的替换成空字符串。
例如:
<el-input oninput="value=value.replace(/[^0-9]/g,'')" v-model="mainForm.VLAN_ID" size="small" placeholder="VLAN ID">
</el-input>
2.使用正则匹配IP地址并且区分(A,B,C,广播,保留地址)
function judgeIpType(ip) {
// ip地址 , A类地址, B类地址, C类地址正则
let ipReg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
let AReg = /^(\d|[1-9]\d|1[0-1]\d|12[0-7])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}/;
let BReg = /^(12[8-9]|1[3-8]\d|19[0-1])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}/;
let CReg = /^(19[2-9]|2[0-1]\d|22[0-3])((\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))){3}/;
if (!ipReg.test(ip)) {
return false;
} else if (AReg.test(ip)) {
return 'A';
} else if (BReg.test(ip)) {
return 'B';
} else if (CReg.test(ip)) {
return 'C';
} else {
// D,E地址
return false;
}
}
3.校验子网掩码格式要求
知识:
1.按位 & 运算 两个二进制数进行&运算 1&1 = 1 1&0 = 0
2.二进制和十进制相互转换
二进制 => 十进制 (168).toString(2) => '10101000'
十进制 => 二进制 parseInt('10101000',2) => 168
ob1010表示二进制数
子网掩码 例如255.255.255.0 将这四段都转换成8位数二进制字符串然后并在一起得到32位二进制数字
如果该字符串前面是1后面是0则合法 全是1或者全是0不合法的
A,B,C类IP地址默认子网掩码:
defaultMaskA = ‘255.0.0.0’;
defaultMaskB = ‘255.255.0.0’;
defaultMaskC = ‘255.255.255.0’;
function _checkIput_fomartIP(ip) {
return (ip + 256).toString(2).substring(1); //格式化输出(补零)
}
utilTool.validateMask = function (MaskStr) {
var IPArray = MaskStr.split('.');
var ip1 = parseInt(IPArray[0]);
var ip2 = parseInt(IPArray[1]);
var ip3 = parseInt(IPArray[2]);
var ip4 = parseInt(IPArray[3]);
let count = 0;
if (ip1 < 0 || ip1 > 255 || ip2 < 0 || ip2 > 255 || ip3 < 0 || ip3 > 255 || ip4 < 0 || ip4 > 255) {
return false;
}
var ip_binary = _checkIput_fomartIP(ip1) + _checkIput_fomartIP(ip2) + _checkIput_fomartIP(ip3) + _checkIput_fomartIP(ip4);
if (-1 != ip_binary.indexOf('01')) {
return false;
}
// 全是0或者全是1的也判断错误
for (let i = 0; i < ip_binary.length; i++) {
if (ip_binary[i] == '0') {
count++;
}
}
if (count == 32) return false;
count = 0;
for (let i = 0; i < ip_binary.length; i++) {
if (ip_binary[i] == '1') {
count++;
}
}
if (count == 32) return false;
return true;
};
4.简单的将十进制数转换成8位二进制数不足补0
//将ip地址转换成32位二进制数字
function to32bitStr(ip) {
let arr = ip.split('.');
let str = '';
arr.map((item) => {
str += (parseInt(item) + 256).toString(2).substring(1);
});
return str;
}
// 转换成8位的二进制数不足的前面补零
function to8Bit(number) {
var result = parseInt(number).toString(2);
while (result.length < 8) {
result = '0' + result;
}
return result;
}
5.简单判断两台设备能否相互通信
如果两个设置都在同一个子网或者说是同一个网段下是可以相互通信的如何判断两台设备在同一个网段下呢?简单的方式是各自的ip和子网掩码进行&运算 如果两台主机结果相同那么他们就是在同一个网段下
// 前提是ip和子网掩码符合相应的格式
utilTool.judgeIsTalk = function (ip1, mask1, ip2, mask2) {
if (to32bitStr(ip1) == to32bitStr(ip2)) {
console.log('IP相同');
return false;
}
if ((to32bitStr(ip1) & to32bitStr(mask1)) == (to32bitStr(ip2) & to32bitStr(mask2))) {
console.log('在同一个网段!');
return true;
} else {
console.log('不在同一个网段!');
return false;
}
};
二. 遇到的问题
经常要对表单数据进行操作有的时候会发现表单数据是错的或者没有清空所以最后对表单对象进行深拷贝 JSON.parse(JSON.stringify(form))