UNPKG

zcloud-ui

Version:

A Component Library for Vue.js.

580 lines (553 loc) 15.3 kB
// 格式化图片 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+$/ // 正整数 };