zcloud-ui
Version:
A Component Library for Vue.js.
580 lines (553 loc) • 15.3 kB
JavaScript
// 格式化图片
import pdf from './img/pdf.png'; // daf
import compressPackage from './img/package.png';
import noimg from './img/noimage.png';
import doc from './img/doc.png';
import txt from './img/txt.png';
import excel from './img/excel.png';
/**
* 密码加密处理
*/
import CryptoJS from 'zcloud-ui/src/utils/aes/aes-min.min.js';
import SHA256 from 'zcloud-ui/src/utils/sha256/sha256.min.js';
// 环境配置
import { Environment } from 'zcloud-ui/src/config/index';
import Download from 'zcloud-ui/src/utils/download';
/**
* 金额格式化
* @param {*str} n
*/
export const parseMoney = (n) => {
let _str = '';
if (isNaN(n)) {
return;
}
let re = /^[0-9]*[1-9][0-9]*$/; // 判断是不是整数
if (re.test(n) || n == 0) { //eslint-disable-line
if (n == 0) {//eslint-disable-line
_str = n + '.00';
} else {
_str = parseNum(n) + '.00';
}
} else {
let k = '.' + n.toString().split('.')[1]; // 截取小数
if (k.length <= 2) {
k += '0';
}
k = k.substr(0, 3);
let h = JSON.parse(n.toString().split('.')[0]);
_str = parseNum(h) + k;
}
return _str;
};
/**
* 金额格式化,可正负
* @param {*} value
*/
export const parseMoneyPM = (value, show = '--') => {
value = Number(value);
if (value === 0) {
return '0.00';
}
if (!value || Number.isNaN(value)) {
return show;
}
let title = value < 0 ? '-' : '';
return title + parseMoney(Math.abs(value));
};
// 获取类型
export const getType = (obj) =>
Object.prototype.toString.call(obj).slice(8, -1);
/**
* 每3位加个','
* @param {*} num
*/
export const parseNum = (num) => {
let list = new String(num).split('').reverse(); // eslint-disable-line no-new-wrappers
for (var i = 0; i < list.length; i++) {
if (i % 4 === 3) {
list.splice(i, 0, ',');
}
}
return list.reverse().join('');
};
/**
* 获取当前时间,格式 yyyy-mm-dd
*/
export const getNowFormatDate = () => {
let date = new Date();
let seperator1 = '-';
let year = date.getFullYear();
let month = date.getMonth() + 1;
let strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = '0' + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = '0' + strDate;
}
var currentdate = year + seperator1 + month + seperator1 + strDate;
return currentdate;
};
/**
* 时间格式化
* @param {*Date/String} time new Date()
* @param {*} fmt //yyyy-MM-dd
*/
export const format = (time, fmt = 'yyyy-MM-dd') => {
if (getType(time) === 'String') {
if (!time) return '';
time = new Date(time);
}
let o = {
'M+': time.getMonth() + 1, // 月份
'd+': time.getDate(), // 日
'H+': time.getHours(), // 小时
'h+': time.getHours(), // 小时
'm+': time.getMinutes(), // 分
's+': time.getSeconds(), // 秒
'q+': Math.floor((time.getMonth() + 3) / 3), // 季度
S: time.getMilliseconds() // 毫秒
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(
RegExp.$1,
(time.getFullYear() + '').substr(4 - RegExp.$1.length)
);
}
for (var k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
);
}
}
return fmt;
};
/**
* 获取2个时间的间距
* @param {*Date/String }day1 时间1
* @param {*Date/String }day1 时间2
* @return {* int} day 时间
*/
export const getDaySpace = (day1, day2) => {
if (getType(day1) === 'String') {
if (!day1) return '';
day1 = new Date(day1);
}
if (getType(day2) === 'String') {
if (!day2) return '';
day2 = new Date(day2);
}
return Math.ceil(Math.abs(day1.getTime() - day2.getTime()) / 86400000);
};
/**
* 获取上一个月
* @param {* new Date()} date
*/
export const getPreMonth = (msg) => {
let date = format(msg, 'yyyy-MM');
let arr = date.split('-'),
year = arr[0], // 获取当前日期的年份
month = arr[1], // 获取当前日期的月份
day = arr[2]; // 获取当前日期的日
let year2 = year,
month2 = parseInt(month) - 1;
if (month2 === 0) {
year2 = parseInt(year2) - 1;
month2 = 12;
}
let day2 = day,
days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
if (month2 < 10) {
month2 = '0' + month2;
}
let t2 = year2 + '-' + month2;
return t2;
};
/**
* 注册自定义事件,并触发
*/
export const tirggerEvent = (name = 'resize') => {
let myEvent = new Event(name);
window.dispatchEvent(myEvent);
};
/**
*
* @param {*文件上传支持的类型} item
* @param {*定制化上传类型} type
*/
export const getFileType = (item, type = 'all') => {
if (!item) {
return null;
}
const supportType = {
// 支持上传的文件类型
img: ['image', 'pdf'],
zto: ['image', 'pdf', 'doc', 'xls', 'rar'],
file: ['doc', 'rar', 'xls', 'txt', 'ppt'],
bids: ['pdf', 'doc', 'rar'], // 为招标准备的格式
wxp: ['doc', 'xls', 'pdf']
};
// 所支持的文件类型
let fileTypes = [
['image', 'jpg', 'jpeg', 'png', 'pic', 'bmp', 'gif'],
['pdf'],
['doc', 'docx'],
['rar', 'zip'],
['xls', 'xlsx'],
['ppt', 'pptx'],
['txt'],
['mp3', 'm3u8'],
['mp4', 'rmvb', 'avi', '3gb']
],
getFile = null;
if (item.indexOf('.') > -1) {
item = filterToken(item);
let etx = '';
// 如果是签名预览
if (item.indexOf('sign') !== -1) {
etx = item.split('?')[0].split('/').pop().split('.')[1];
} else {
etx = (item.split('.').pop() || '').toLowerCase();
}
if (type !== 'all') {
// 过滤上传的文件类型
fileTypes = fileTypes.filter((item) =>
supportType[type].includes(item[0])
);
}
for (const file of fileTypes) {
if (file.includes(etx)) {
getFile = file[0];
break;
}
}
}
return getFile;
};
export const formatFile = (item, token, sign = false) => {
let thumbnail = '';
let fileType = getFileType(item);
switch (fileType) {
case 'image':
if (sign) {
thumbnail =
Environment.IMAGE_DOWNLOAD + item + '?' + sign;
} else {
thumbnail =
Environment.IMAGE_DOWNLOAD + item + '?token=' + token || Environment.TOKEN;
}
break;
case 'pdf':
thumbnail = pdf;
break;
case 'rar':
thumbnail = compressPackage;
break;
case 'xls':
thumbnail = excel;
break;
case 'txt':
thumbnail = txt;
break;
case 'doc':
thumbnail = doc;
break;
default:
thumbnail = noimg;
break;
}
return thumbnail;
};
/**
* 文件下载 针对特殊流文件下载
* @param {*下载链接} data
*/
export const downloadFileIf = (data) => {
var iframe = document.createElement('iframe');
iframe.src = data;
iframe.style.display = 'none';
document.body.appendChild(iframe);
setTimeout(() => {
$('iframe').remove();
}, 1000);
};
/**
* copy 功能
* @param {*} text
*/
export const copyValue = (text) => {
const oInput = document.createElement('input');
oInput.value = text;
document.body.appendChild(oInput);
oInput.select();
document.execCommand('Copy');
oInput.className = 'oInput';
oInput.style.display = 'none';
};
/**
*
* @param {*改变图片大小} src
* @param {*} size
*/
export const changeImgSize = (src, size = '100x100') => {
let i = src.lastIndexOf('.');
return (src = src.substring(0, i) + '_' + size + src.substring(i));
};
export const encryption = (password, clientid, token) => {
let _encrypted = CryptoJS.AES.encrypt(
CryptoJS.enc.Utf8.parse(SHA256(password)),
CryptoJS.enc.Utf8.parse(clientid),
{
iv: CryptoJS.enc.Utf8.parse(token),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Iso10126
}
);
return CryptoJS.enc.Base64.stringify(_encrypted.ciphertext);
};
/**
* 监听事件
* @param {*对象名} obj
* @param {*绑定类型} evtype
* @param {*函数} fn
* @param {*} useCapture
*/
export const addEvent = (obj, evtype, fn, useCapture) => {
if (obj.addEventListener) {
obj.addEventListener(evtype, fn, useCapture);
} else if (obj.attachEvent) {
obj.attachEvent('on' + evtype, fn); // IE不支持事件捕获
} else {
obj['on' + evtype] = fn; // 事实上这种情况不会存在
}
};
/**
* 解绑监听事件
* @param {*对象名} obj
* @param {*解绑类型} evtype
* @param {*函数} fn
* @param {*} useCapture
*/
export const delEvent = (obj, evtype, fn, useCapture) => {
if (obj.removeEventListener) {
obj.removeEventListener(evtype, fn, useCapture);
} else if (obj.detachEvent) {
obj.detachEvent('on' + evtype, fn);
} else {
obj['on' + evtype] = null;
}
};
/**
* 文件下载
* @param {*下载链接} data
* @param {*下载文件名} strFileName
*/
export const downloadFile = (data, strFileName) => {
// 判断是否支持download
const isSupportDownload = 'download' in document.createElement('a');
const fileName =
filterToken(data)
.split('/')
.reverse()[0] || strFileName;
const fileType = getFileType(data);
if (fileType === 'image' || fileType === 'pdf') {
var x = new XMLHttpRequest();
x.open('GET', data, true);
x.responseType = 'blob';
x.onload = function (e) {
Download(data, fileName);
};
x.send();
} else {
if (isSupportDownload) {
const aLink = document.createElement('a');
const evt = document.createEvent('MouseEvents');
evt.initEvent('click', false, false); // initEvent 不加后两个参数在FF下会报错
aLink.href = data + '?action=download';
aLink.download = fileName;
aLink.dispatchEvent(evt);
} else {
var iframe = document.createElement('iframe');
iframe.src = data + '?action=download';
iframe.style.display = 'none';
document.body.appendChild(iframe);
setTimeout(() => {
$('iframe').remove();
}, 1000);
}
}
};
// 为Token图做处理
export const filterToken = (item) => {
if (item.includes('?token=')) {
// 对待token的特殊处理
item = item.split('?token=')[0];
}
return item;
};
/**
*时间戳转时间
*get getByteLen
* @param {timestamp} time 时间戳
* @param {hand} Boolean 是否自定义格式化
* @param {ftm} 'yyyy-MM-dd hh:mm:ss' 格式化
* @returns yy-mm-dd hh:mm:ss
*/
export const ftime = (timestamp, hand, ftm = 'yyyy-MM-dd') => {
if (!timestamp) return '';
var date = new Date(timestamp);
if (hand) {
return format(date, ftm);
} else {
var Y = date.getFullYear() + '-';
var M =
(date.getMonth() + 1 < 10
? '0' + (date.getMonth() + 1)
: date.getMonth() + 1) + '-';
var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
var h =
(date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
var m =
(date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) +
':';
var s =
date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D + h + m + s;
}
};
/**
* 跳转地址
* @param
*/
export const jumpAddress = () => {
if (Environment.LOGIN_UN && Environment.LOGIN_UN !== '/login') {
return `${
Environment.LOGIN_UN
}#/login?redirect=dashboard&appcode=${Environment.APPCODE || 'OMP'}&returnURL=${window.location.href}`;
} else {
return '/login';
}
};
/**
* 获取前后天数
* @param {* }ff 格式化
* @param {* int} day 前后天数
*/
export const getAnyDay = (day = 0, ff = 'yyyy-MM-dd') => {
let time = new Date().getTime();
return format(new Date(time + 86400000 * day), ff);
};
/**
* 演时器
* @param {Number} interval
*/
export const sleep = (interval) =>
new Promise((resolve) => {
setTimeout(resolve, interval);
});
// 去掉多余空的children
export const reverseData = (list, map) => {
list.forEach((item) => {
if (map) {
item.id = item[map.id];
item.label = item[map.label];
} else {
item.id = item.id || item.no;
item.label = item.label || item.name;
}
if (item.children && item.children.length) {
reverseData(item.children, map);
} else {
delete item.children;
}
});
return list;
};
/**
* 匹配下拉名称
* @param {} id
* @param {*} source
*/
export const getSelectValue = (id, source = []) => {
let result = '';
source.forEach((item) => {
let value = item.id || item.value || item.val;
if (id === value) {
result = item.text || item.label || item.name;
}
});
return result;
};
// 获取浏览器名称
export const getUaName = () => {
const u = window.navigator.userAgent;
const O = {
isOpera: u.indexOf('OPR') > -1,
isFF: u.indexOf('Firefox') > -1,
isQQBrowser: u.indexOf('QQBrowser') > -1,
isEdge: u.indexOf('Edge') > -1,
isChrome: u.indexOf('Chrome') > -1,
isSafari: u.indexOf('Safari') > -1,
isIE: u.indexOf('Trident') > -1, // ie
ie11lt: u.indexOf('compatible') > -1 && u.indexOf('MSIE') > -1, // ie11-
ie11gt: u.indexOf('rv:11.0') > -1, // ie11
isMobile: u.indexOf('Mobile') > -1,
isAndroid: u.indexOf('Android') > -1,
isPad: u.indexOf('iPad') > -1,
isIphone: u.indexOf('iPhone') > -1,
weiXin: u.indexOf('MicroMessenger') !== -1 // 是否为微信浏览器
}; // 校验浏览器类型
let b = ''; // 版本
if (O.isOpera) {
b = 'Opera';
} else if (O.isFF) {
b = 'Firefox';
} else if (O.isQQBrowser) {
b = 'QQBrowser';
} else if (O.isEdge) {
b = 'Edge';
} else if (O.isMobile && O.isAndroid) {
b = 'Android';
} else if (O.isMobile && O.isPad) {
b = 'iPad';
} else if (O.isMobile && O.isIphone) {
b = 'iPhone';
} else if (O.isChrome) {
b = 'Chrome';
} else if (O.isSafari) {
b = 'Safari';
} else if (O.isEdge) {
b = 'Edge';
} else if (O.isIE && O.ie11gt) {
b = 11;
} else if (O.isIE && O.ie11lt) {
new RegExp('MSIE (\\d+\\.\\d+);').test(u);
b = parseFloat(RegExp.$1);
}
return b;
};
// 正则
export const regexp = {
phone: /^1\d{10}$/, // 手机电话
email: /^(?=\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$).{5,50}$/, // 电子邮箱
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))))$/,
idcard: /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/, // 身份证
digit: /^[0-9]*$/, // 数字
bankcard: /^\d{6,50}$/,
tel: /^((1\d{10})|(0\d{2,3}-\d{7,8})|(0\d{2,3}\d{7,8}))$/,
chinese: /^[\u4e00-\u9fa5]*$/, // 匹配中文
internationalTel: /\d{3}-\d{8}|\d{4}-\d{7}/, // 国际电话
password1: /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/, // 最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
password2: /^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$/, // 中等强度密码(密码为7位及以上,大小字母、数字三项中有两项,特殊字符可有可无)
num: /^\d{1,}$/, // 纯数字正则
en: /^\d{1,}$/, // 纯英文字母正则
decimals: /^\d+\.\d+$/, // 是否小数
integer: /^\d+$/ // 正整数
};