src/utils/validate.js
/**
* 公用js方法
*/
/**
* @description 判读是否为外链
* @param path
* @returns {boolean}
*/
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
/**
* @description 判读是否为网络链接
* @param path
* @returns {boolean}
*/
export function isHttp(path) {
let newStr = path.indexOf("http");
if (newStr == 0) {
return true;
}
if (newStr == -1) {
return false;
}
}
/**
* @description 校验是否小于6位
* @param str
* @returns {boolean}
*/
export function isPassword(str) {
return str.length >= 6
}
/**
* @description 判断是否为数字
* @param value
* @returns {boolean}
*/
export function isNumber(value) {
const reg = /^[0-9]*$/
return reg.test(value)
}
//生成大写金额
export function intToChinese(money, unit) {
//汉字的数字
var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
//基本单位
var cnIntRadice = new Array('', '拾', '佰', '仟');
//对应整数部分扩展单位
var cnIntUnits = new Array('', '万', '亿', '兆');
//对应小数部分单位
var cnDecUnits = new Array('角', '分', '毫', '厘');
//整数金额时后面跟的字符
var cnInteger = '整';
//整型完以后的单位
var cnIntLast = unit;
//最大处理的数字
var maxNum = 999999999999999.9999;
//金额整数部分
var integerNum;
//金额小数部分
var decimalNum;
//输出的中文金额字符串
var chineseStr = '';
//分离金额后用的数组,预定义
var parts;
if (money === '') { //不能用==
return '';
}
money = parseFloat(money);
if (money >= maxNum) {
//超出最大处理数字
return '';
}
if (money == 0) {
chineseStr = cnNums[0] + cnIntLast + cnInteger;
return chineseStr;
}
//转换为字符串
money = money.toString();
if (money.indexOf('.') == -1) {
integerNum = money;
decimalNum = '';
} else {
parts = money.split('.');
integerNum = parts[0];
decimalNum = parts[1].substr(0, 4);
}
//获取整型部分转换
if (parseInt(integerNum, 10) > 0) {
var zeroCount = 0;
var IntLen = integerNum.length;
for (var i = 0; i < IntLen; i++) {
var n = integerNum.substr(i, 1);
var p = IntLen - i - 1;
var q = p / 4;
var m = p % 4;
if (n == '0') {
zeroCount++;
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0];
}
//归零
zeroCount = 0;
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
}
if (m == 0 && zeroCount < 4) {
chineseStr += cnIntUnits[q];
}
}
chineseStr += cnIntLast;
}
//小数部分
if (decimalNum != '') {
var decLen = decimalNum.length;
for (var i = 0; i < decLen; i++) {
var n = decimalNum.substr(i, 1);
if (n != '0') {
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
}
}
}
if (chineseStr == '') {
chineseStr += cnNums[0] + cnIntLast + cnInteger;
} else if (decimalNum == '') {
chineseStr += cnInteger;
}
return chineseStr;
}
// 校验保留两位小数金额
export function isDecimal2(value) {
const reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/
return reg.test(value)
}
// 校验保留四位小数金额
export function isDecimal4(value) {
const reg = /^([1-9]\d{0,15}|0)(\.\d{1,4})?$/
return reg.test(value)
}
/**
* @description 判断是否为IP
* @param ip
* @returns {boolean}
*/
export function isIP(ip) {
const reg = /^(\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])$/
return reg.test(ip)
}
/**
* @description 判断是否是传统网站
* @param url
* @returns {boolean}
*/
export function isUrl(url) {
const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
return reg.test(url)
}
/**
* @description 判断是否是小写字母
* @param str
* @returns {boolean}
*/
export function isLowerCase(str) {
const reg = /^[a-z]+$/
return reg.test(str)
}
/**
* @description 判断是否是大写字母
* @param str
* @returns {boolean}
*/
export function isUpperCase(str) {
const reg = /^[A-Z]+$/
return reg.test(str)
}
/**
* @description 判断是否是大写字母开头
* @param str
* @returns {boolean}
*/
export function isAlphabets(str) {
const reg = /^[A-Za-z]+$/
return reg.test(str)
}
/**
* @description 判断是否是字符串
* @param str
* @returns {boolean}
*/
export function isString(str) {
return typeof str === 'string' || str instanceof String
}
/**
* @description 判断是否是数组
* @param arg
* @returns {arg is any[]|boolean}
*/
export function isArray(arg) {
if (typeof Array.isArray === 'undefined') {
return Object.prototype.toString.call(arg) === '[object Array]'
}
return Array.isArray(arg)
}
/**
* @description 判断是否是端口号
* @param str
* @returns {boolean}
*/
export function isPort(str) {
const reg = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
return reg.test(str)
}
/**
* @description 判断是否是手机号
* @param str
* @returns {boolean}
*/
export function isPhone(str) {
const reg = /^1\d{10}$/
return reg.test(str)
}
/**
* @description 判断是否是身份证号(第二代)
* @param str
* @returns {boolean}
*/
export function isIdCard(str) {
const reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
return reg.test(str)
}
/**
* @description 判断是否是邮箱
* @param str
* @returns {boolean}
*/
export function isEmail(str) {
const reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
return reg.test(str)
}
/**
* @description 判断是否中文
* @param str
* @returns {boolean}
*/
export function isChina(str) {
const reg = /^[\u4E00-\u9FA5]{2,4}$/
return reg.test(str)
}
/**
* @description 判断是否为空(包含false)
* @param str
* @returns {boolean}
*/
export function isBlank(str) {
return (
str == null ||
false ||
str === '' ||
str.trim() === '' ||
str.toLocaleLowerCase().trim() === 'null'
)
}
/**
* @description 判断是否为空(不包含false)
* @param str
* @returns {boolean}
*/
export function isEmpty(obj) { // 为空情况
const empty_arr = ['', undefined, null];
return (empty_arr.indexOf(obj) > -1 || obj.toString().trim() === '');
}
/**
* @description 判断是否为固话
* @param str
* @returns {boolean}
*/
export function isTel(str) {
const reg = /^(400|800)([0-9\\-]{7,10})|(([0-9]{4}|[0-9]{3})(-| )?)?([0-9]{7,8})((-| |转)*([0-9]{1,4}))?$/
return reg.test(str)
}
/**
* @description 判断是否为数字且最多两位小数
* @param str
* @returns {boolean}
*/
export function isNum(str) {
const reg = /^\d+(\.\d{1,2})?$/
return reg.test(str)
}
/**
* @description 判断经度 -180.0~+180.0(整数部分为0~180,必须输入1到5位小数)
* @param str
* @returns {boolean}
*/
export function isLongitude(str) {
const reg = /^[-|+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$/
return reg.test(str)
}
/**
* @description 判断纬度 -90.0~+90.0(整数部分为0~90,必须输入1到5位小数)
* @param str
* @returns {boolean}
*/
export function isLatitude(str) {
const reg = /^[-|+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$/
return reg.test(str)
}
/**
* @description rtsp校验,只要有rtsp:// 是否是流传输
* @param str
* @returns {boolean}
*/
export function isRTSP(str) {
const reg = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\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])$/
const reg1 = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\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]):[0-9]{1,5}/
const reg2 = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\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])\//
return reg.test(str) || reg1.test(str) || reg2.test(str)
}
/**
* @description 查看是否是移动端
* @returns {boolean}
*/
export function handleIsMobile() {
return document.body.getBoundingClientRect().width - 1 < 992;
}
/**
* @description 剔除空对象的方法
*/
export function filterParams(obj) { // 剔除对象的空属性
var _newObj = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) { // 判断对象中是否有这个属性
if (isEmpty(obj[key])) continue;
_newObj[key] = typeof obj[key] === 'object' ? (
obj[key] instanceof Array ? arrayFilterParams(obj[key]) : filterParams(obj[key])
) : obj[key];
}
}
return _newObj;
}
/**
* @description 剔除数组中的空值
*/
export function arrayFilterParams(arr) {
var err = [];
const empty_arr = ['', undefined, null];
arr.forEach((item, index) => {
if (isEmpty(item)) return;
err.push(
typeof item === 'object' ? (
item instanceof Array ? arrayFilterParams(item) : filterParams(item)
) : item
);
})
return err;
}
/**
* @description 获取树结构的数据
* @param func //过滤回调函数, data=>data.[要判断的字段]==‘要判断的值’
* @param tree //完整树
* @param des //pro 获取树节点的全部数据 next 获取子节点的全部数据 this 获取当前节点的全部数据, all 单树数据
* @param code //要查询的字段名,没有时全部返回
*/
export function getTreeData(func, tree, des, code) {
let getData = treeFindPath(tree, func, code)
// treeFindPath(tree, data=> data.name==='水上分局')
if (des == "pro") {
return getData[getData.length - 2];
} else if (des == "all") {
return getData
} else if (des == "next") {
return getData[getData.length - 1].children;
} else {
return getData[getData.length - 1];
}
}
function treeFindPath(tree, func, code, path = []) {
if (!tree) return []
for (const data of tree) {
// 这里按照你的需求来存放最后返回的内容吧
if (code) {
path.push(data[code])
} else {
path.push(data)
}
if (func(data)) return path
if (data.children) {
const findChildren = treeFindPath(data.children, func, code, path)
if (findChildren.length) return findChildren
}
path.pop()
}
return []
}
/**
* @description 获取n位随机数 字母和数字
* @param n 多少位
* @returns
*/
export function randomn(n) {
let res = ''
for (; res.length < n; res += Math.random().toString(36).substr(2).toUpperCase()) { }
return res.substr(0, n)
}
/**
* @description 返回数据类型
* @param
* @returns
*/
export function type(para) {
return Object.prototype.toString.call(para)
}
/**
* @description 数组去重
* @param
* @returns
*/
export function delRepeatArray(arr) {
return [...new Set(arr)]
}
/**
* @description 判断是否是函数
* @param fun
* @returns {boolean}
*/
export function isFunction(fun) {
try {
if (fun && typeof fun === "function") {
return Object.prototype.toString.call(fun) === '[object Function]'
} else {
return false;
}
} catch (error) {
return false;
}
}
/**
* @description 判断是否为正整数
* @param value 输入要判断的内容
* @returns {boolean}
*/
export function isPositiveInteger(value) {
var r = /^\+?[1-9][0-9]*$/;
if (r.test(value)) {
return true;
} else {
return false;
}
}
/**
* @description 时间戳转时间
* @param value 时间戳
* @param tag 分割符 ["-",":"]//两个参数,第一个是年月日分隔符,第二个是时分秒分割符
* @returns {boolean}
*/
export function getDate(value, tag) {
var date = new Date(value);
if (tag) {
let Y = date.getFullYear() + tag[0];
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + tag[0];
let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
let h = date.getHours() + tag[1];
let m = date.getMinutes() + tag[1];
let s = date.getSeconds();
return Y + M + D + h + m + s
} else {
let Y = date.getFullYear() + '-';
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
let h = date.getHours() + ':';
let m = date.getMinutes() + ':';
let s = date.getSeconds();
return Y + M + D + h + m + s
}
}
/**
* @description 获取当前解析地址 (包含端口号)
* @param type 类型
* @returns 获取当前解析地址
*/
export function getLocationUrl(type) {
if (!type) {
return window.location.host;
}
}
/**
* @description 将数字转成英文分割符号,保留两位小数(多用于金额)
* @param num 数字
* @returns 获取转换后的数字
*/
export function numberToStringForMoney(num) {
if (num === "" || num === undefined || num === 0 || num === null) {
return "0.00";
}
let number = JSON.parse(JSON.stringify(num));
number = Number(number).toFixed(2);//保留两位销售
number = Number(number).toLocaleString();//转换成三个一分割的数字
if (number.toString().split(".")[1]) {
let len = number.toString().split(".")[1].length;
if (len === 1) {
return number.toString() + "0"
} else {
return number.toString();
}
} else {
// alert(number);
return number.toString() + ".00";
}
}
/**
* @description 字典类:查找并返回对应的内容字段
* item 要匹配的字段
* obj 对象
* findItem 查找的字段名
* returnItem 返回的字段名
* @returns 查询的结果
*/
export function getSelectDict(item, obj, findItem, returnItem) {
if (obj instanceof Array) {
for (let i = 0; i < obj.length; i++) {
const element = obj[i];
if (
element[findItem] &&
item === element[findItem]
) {
return element[returnItem];
}
if (
element[findItem] == 0 &&
item === element[findItem]
) {
return element[returnItem];
}
}
} else {
const element = obj;
if (
element[findItem] &&
item === element[findItem]
) {
return element[returnItem];
}
if (
element[findItem] == 0 &&
item === element[findItem]
) {
return element[returnItem];
}
}
return;
}
export default {
isExternal,//判读是否为外链
isHttp,//判读是否为网络链接
isPassword,//校验是否小于6位
isNumber,//判断是否为数字
isDecimal2,// 校验保留两位小数金额
isDecimal4,// 校验保留四位小数金额
isIP,//判断是否为IP
isUrl,//判断是否是传统网站
isLowerCase,//判断是否是小写字母
isUpperCase,//判断是否是大写字母
isAlphabets,//判断是否是大写字母开头
isString,//判断是否是字符串
isArray,//判断是否是数组
isFunction,//判断是否是函数
isPort,//判断是否是端口号
isPhone,//判断是否是手机号
isIdCard,//判断是否是身份证号(第二代)
isEmail,//判断是否是邮箱
isChina,//判断是否中文
isBlank,//判断是否为空(包含false)
isEmpty,//判断是否为空(不包含false)
isTel,//判断是否为固话
isNum,//判断是否为数字且最多两位小数
isLongitude,//判断经度 -180.0~+180.0(整数部分为0~180,必须输入1到5位小数)
isLatitude,//判断纬度 -90.0~+90.0(整数部分为0~90,必须输入1到5位小数)
isRTSP,//rtsp校验,只要有rtsp:// 是否是流传输
handleIsMobile,//查看是否是移动端 提示:不是很准确,根据屏幕尺寸判断的
filterParams,//剔除空对象 剔除对象中的空元素(所有级别)
arrayFilterParams,//剔除数组中的空值
getTreeData,//获取树结构的数据 (提示:该函数较为复杂,请参考上面实现说明,以及全局搜索使用示例)
randomn,//获取n位随机数 字母和数字
type,//获取当前数据类型 返回数据类型
delRepeatArray,//数组去重
intToChinese,//生成对应的大写金额
isPositiveInteger,//判断是否为正整数
getDate,//时间戳转时间
getLocationUrl,//获取当前解析地址 (包含端口号)
numberToStringForMoney,//将数字转成英文分割符号,保留两位小数(多用于金额)
getSelectDict,//字典类:查找并返回对应的内容字段
}
参考:
前端常用方法工具函数