@hzy1123581324/z-view-ui
Version:
z-view-ui是使用vue3开发的组件,开发中,有部分组件功能未实现,慎用
529 lines (489 loc) • 15.5 kB
JavaScript
export const pattern = {
// 至少有一个数字,一个字母的6-18位数字字母
password :/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,18}$/,
// /\s+/g
// 邮箱验证
email: /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/,
// 手机号验证
phone: /^1[23456789]\d{9}$/,
// 网络路径
url: /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i,
hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i,
// 日期验证
dateISO: /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/,
number: /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/,
//身份证
idCard: /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/,
// 信用卡
creditCardVerification: {
electron: /^(4026|417500|4405|4508|4844|4913|4917)\d+$/,
maestro: /^(5018|5020|5038|5612|5893|6304|6759|6761|6762|6763|0604|6390)\d+$/,
dankort: /^(5019)\d+$/,
interpayment: /^(636)\d+$/,
unionpay: /^(62|88)\d+$/,
visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
mastercard: /^5[1-5][0-9]{14}$/,
amex: /^3[47]\d+$/,
diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
jcb: /^(?:2131|1800|35\d{3})\d{11}$/
},
zipCode: /[1-9]\d{5}(?!\d)/,
ip: /^((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)))$/,
}
/**
* @description 验证卡号属于那个信用卡
* @param {Object} number
* @return {String} 信用卡名称
*
*/
export function detectCardType(number) {
for (var key in pattern.creditCardVerification) {
if (pattern.creditCardVerification[key].test(number)) {
return key
}
}
}
// is image URL?
const iExt = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp'].map(f => '.' + f);
/**
* @description 判断是否是图片后缀
* @param {Object} url
* @return {Boolean} 是否是图片
*/
export function isImage(url) {
return iExt.reduce((ret, ext) => ret || url.endsWith(ext), false);
}
// <div id="test">aaa</div>
/**
* @description 判断是否是图片后缀
* @param {Object} url
* @return {Boolean} 是否是图片
*/
export function isElement(obj) {
var testDiv = document.createElement('div');
if (obj && obj.nodeType === 1) { //先过滤最简单的
if (window.Node && (obj instanceof Node)) {
//如果是IE9,则判定其是否Node的实例
//由于obj可能是来自另一个文档对象,因此不能轻易返回false
return true;
}
try { //最后以这种效率非常差但肯定可行的方案进行判定
testDiv.appendChild(obj);
testDiv.removeChild(obj);
} catch (e) {
return false;
}
return true;
}
return false;
}
// var a = {
// nodeType: 1
// }
// console.log(isElement(document.getElementById("test")));
// console.log(isElement(document.getElementById("test").nextSibling));
// console.log(isElement(a));
/**
* @description 判断闰年的函数
* @param {Number|String} year
* @return {Boolean} 是否是闰年
*/
export function isLeap(year) {
// 条件:能被4整除并且不能被100整除,或者被400整除的
var flag = false;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
flag = true;
}
return flag;
}
/**
* @description 判断是否是合格的密码
* @param {Number|String} val 要验证的密码
* @param {Number} min 最小长度
* @param {Number} max 最大长度
* @return {Boolean} 是否符合
*/
function pwdReg(val,min=6,max=18){
const reg = new RegExp(`^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{${min},${max}}$`)
console.log(reg)
return reg.test(val)
}
/**
* @description 判断是否是ios浏览器
* @return {Boolean} result
*/
export function isIos() {
var m = navigator.userAgent;
var isIos = !!m.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
let result = isIos ? true : false;
return result;
}
/**
* @description 判断是否是Facebook浏览器
* @return {Boolean} result
*/
export function isFacebookApp() {
var ua = navigator.userAgent || navigator.vendor || window.opera;
return (ua.indexOf("FBAN") > -1) || (ua.indexOf("FBAV") > -1);
}
/**
* @param {String} value 验证字符串
* @return {Boolean} 是否是16进制
*/
export function ishex(value) {
return pattern.hex.test(value);
}
/**
* 验证电子邮箱格式
*/
export function isEmail(value) {
return pattern.email.test(value);
}
// 判断是否是propsmise
export function isPromise(obj) {
//有实际含义的变量才执行方法,变量null,undefined和''空串都为false
console.log(!!obj);
console.log((typeof obj === 'object' || typeof obj === 'function'));
console.log(typeof obj.then === 'function');
console.log(obj.then);
// 初始promise 或 promise.then返回的
return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
}
/**
* 验证手机好格式
*/
export function isMobile(value) {
return pattern.phone.test(value)
}
/**
* 是否是手机终端
* @param {Object} value
* @return {Boolean} false
*/
export function isMobileTerminal() {
var sUserAgent = navigator.userAgent.toLowerCase();
var bIsIpad = sUserAgent.match(/ipad/i) == 'ipad';
var bIsIphone = sUserAgent.match(/iphone os/i) == 'iphone os';
var bIsMidp = sUserAgent.match(/midp/i) == 'midp';
var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == 'rv:1.2.3.4';
var bIsUc = sUserAgent.match(/ucweb/i) == 'web';
var bIsCE = sUserAgent.match(/windows ce/i) == 'windows ce';
var bIsWM = sUserAgent.match(/windows mobile/i) == 'windows mobile';
var bIsAndroid = sUserAgent.match(/android/i) == 'android';
if (bIsIpad || bIsIphone || bIsMidp || bIsUc7 || bIsUc || bIsCE || bIsWM || bIsAndroid) {
return true;
} else {
return false;
}
}
/**
* 验证URL格式
*/
export function isUrl(value) {
return pattern.url.test(value)
}
/**
* 是否是字符串
*/
export function isString(value) {
return Object.prototype.toString.call(value) === '[object String]';
}
/**
* 是否是数组
*/
export function isArray(value) {
if (typeof Array.isArray === 'function') {
return Array.isArray(value)
}
return Object.prototype.toString.call(value) === '[object Array]'
}
/**
* 是否是对象
*/
export function isObject(value) {
return Object.prototype.toString.call(value) === '[object Object]'
}
/**
* 是否为空对象
*/
export function isEmptyObject(obj) {
return Object.keys(obj).length == 0;
}
/**
* 验证日期格式
*/
export function isDate(value) {
return !/Invalid|NaN/.test(new Date(value).toString())
}
/**
* 验证ISO类型的日期格式
*/
export function isDateISO(value) {
return pattern.dateISO.test(value)
}
/**
* 验证十进制数字
*/
export function isNumber(value) {
return pattern.number.test(value)
}
/**
* 验证是否是数字
*/
export function isNum(value) {
if (!value) {
return false;
}
return !isNaN(parseFloat(value));
}
/**
* 验证整数
*/
export function isDigits(value) {
return /^\d+$/.test(value)
}
/**
* 验证身份证号码
*/
export function isIdCard(value) {
return pattern.idCard.test(value)
}
/**
* 是否车牌号
*/
export function isCarNo(value) {
// 新能源车牌
const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
// 旧车牌
const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
if (value.length === 7) {
return creg.test(value);
} else if (value.length === 8) {
return xreg.test(value);
} else {
return false;
}
}
export function isHuawei(){
const agent = navigator.userAgent.toLowerCase();
//华为浏览器
if(agent.indexOf("huaweioem") > 0) {
return true;
}else{
return false
}
}
/**
* 金额,只允许2位小数
*/
export function isAmount(value) {
//金额,只允许保留两位小数
return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0.\d{1,2}$/.test(value);
}
/**
* @description 是否是中文
*/
export function isChinese(value) {
let reg = /^[\u4e00-\u9fa5]+$/gi;
return reg.test(value);
}
/**
* @description 是否是中文名字
*/
export function isChineseName(value, min = 2, max = 4) {
var reg = new RegExp(`^[\u4e00-\u9fa5]{${min},${max}}$`, );
return reg.test(value);
}
/**
* 只能输入字母
*/
export function isLetter(value) {
return /^[a-zA-Z]*$/.test(value);
}
/**
* 只能是字母或者数字
*/
export function isEnOrNum(value) {
//英文或者数字
let reg = /^[0-9a-zA-Z]*$/g;
return reg.test(value);
}
/**
* 验证是否包含某个值
*/
export function isContains(value, param) {
return value.indexOf(param) >= 0;
}
/**
* 验证一个值范围[min, max]
*/
export function isRange(value, param) {
return value >= param[0] && value <= param[1]
}
/**
* 验证一个长度范围[min, max]
*/
export function isRangeLength(value, param) {
return value.length >= param[0] && value.length <= param[1]
}
/**
* 判断是否为空
*/
export function isEmpty(value) {
switch (typeof value) {
case 'undefined':
return true;
case 'string':
if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
break;
case 'boolean':
if (!value) return true;
break;
case 'number':
if (0 === value || isNaN(value)) return true;
break;
case 'object':
if (null === value || value.length === 0) return true;
for (var i in value) {
return false;
}
return true;
}
return false;
}
/**
* @description [isFullscreen 判断浏览器是否全屏]
* @return [全屏则返回当前调用全屏的元素,不全屏返回false]
*/
export function isFullscreen() {
// #ifdef H5
return document.fullscreenElement || document.msFullscreenElement || document.mozFullScreenElement || document
.webkitFullscreenElement || false;
// #endif
// #ifndef H5
return true;
// #endif
}
/**
* @description 判断浏览器是否全屏
* @return [全屏则返回当前调用全屏的元素,不全屏返回false]
*/
export function isFullscreenForNoScroll() {
// #ifndef H5
return true
// #endif
// #ifdef H5
const explorer = window.navigator.userAgent.toLowerCase();
if (explorer.indexOf('chrome') > 0) {
//webkit
if (document.body.scrollHeight === window.screen.height && document.body.scrollWidth === window.screen.width) {
return true;
// alert("全屏");
} else {
return false;
// alert("不全屏");
}
} else {
//IE 9+ fireFox
if (window.outerHeight === window.screen.height && window.outerWidth === window.screen.width) {
return true;
// alert("全屏");
} else {
return false;
// alert("不全屏");
}
}
// #endif
}
/**
* 判断是否是JSON字符串
*/
export function isJSON(str) {
if (typeof str == 'string') {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return (true, obj);
} else {
return false;
}
} catch (e) {
// console.log('error:'+str+'!!!'+e);
return false;
}
}
return false
}
/**
* @description 对比两个数组是否有相同元素
*
*/
export function listsHasCommon(arr = [], arrOther = []) {
return arr.some((item) => arrOther.includes(item));
}
/**
* @description 获取富文本标签内容
* @param {Object} str
* @return {}
*/
export function getText(str) {
return str.replace(/<[^<>]+>/g, ""); //这里是去除标签
}
/*
版本号的格式为 X.Y.Z(又称 Major.Minor.Patch),递增的规则为:
X 表示主版本号,当 API 的兼容性变化时,X 需递增。
Y 表示次版本号,当增加功能时(不影响 API 的兼容性),Y 需递增。
Z 表示修订号,当做 Bug 修复时(不影响 API 的兼容性),Z 需递增。
详细的规则如下:
X, Y, Z 必须为非负整数,且不得包含前导零,必须按数值递增,如 1.9.0 -> 1.10.0 -> 1.11.0
0.Y.Z 的版本号表明软件处于初始开发阶段,意味着 API 可能不稳定;1.0.0 表明版本已有稳定的 API。
当 API 的兼容性变化时,X 必须递增,Y 和 Z 同时设置为 0;当新增功能(不影响 API 的兼容性)或者 API 被标记为 Deprecated 时,Y 必须递增,同时 Z 设置为 0;当进行 bug fix 时,Z 必须递增。
先行版本号(Pre-release)意味该版本不稳定,可能存在兼容性问题,其格式为:X.Y.Z.[a-c][正整数],如 1.0.0.a1,1.0.0.b99,1.0.0.c1000。
开发版本号常用于 CI-CD,格式为 X.Y.Z.dev[正整数],如 1.0.1.dev4。
版本号的排序规则为依次比较主版本号、次版本号和修订号的数值,如 1.0.0 < 1.0.1 < 1.1.1 < 2.0.0;对于先行版本号和开发版本号,有:1.0.0.a100 < 1.0.0,2.1.0.dev3 < 2.1.0;当存在字母时,以 ASCII 的排序来比较,如 1.0.0.a1 < 1.0.0.b1。
注意:版本一经发布,不得修改其内容,任何修改必须在新版本发布!
一些修饰的词
alpha:内部版本
beta:测试版
demo:演示版
enhance:增强版
free:自由版
full version:完整版,即正式版
lts:长期维护版本
release:发行版
rc:即将作为正式版发布
standard:标准版
ultimate:旗舰版
upgrade:升级版
*/
export function compareVersion(version1,version2){
// 将大V 转换成小写V
version1 = version1.toLowerCase();
version2 = version2.toLowerCase();
if(version1 === version2){
// 版本相同
console.log('version1的版本跟version2的版本相同')
return 0;
}else{
// 去掉v
version1 = version1.split('v').join('');
version2 = version2.split('v').join('');
let version1_arr = version1.split('.');
let version2_arr = version2.split('.');
let maxLen = Math.max(version1_arr.length,version2_arr.length);
for(let i = 0;i< maxLen; i++){
let v1 = version1_arr[i]|| 0;
let v2 = version2_arr[i]|| 0;
if(v1===v2){
continue
}else if( v1 - v2 >0){
console.log('version1的版本比version2的版本大')
return 1
}else{
console.log('version1的版本比version2的版本小')
return -1
}
}
}
}