let base = { addDays(date, days) { //给指定日期增加天数 if (!days) { return date; } let dateArr = date.split(' '); date = new Date(new Date(date).setDate(new Date(date).getDate() + days)); var year = date.getFullYear(); var month = date.getMonth() + 1; if (month < 10) { month = '0' + month; } var day = date.getDate(); if (day < 10) { day = '0' + day; } date = year + '-' + month + '-' + day; if (dateArr.length == 1) { return date; } return date + ' ' + dateArr[1]; }, //获取当前时间,time是否带时分秒 getDate(time) { let date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let datetime = year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day); if (!time) { return datetime; } let hour = date.getHours(); let minutes = date.getMinutes(); let second = date.getSeconds(); return ( datetime + '' + ' ' + (hour < 10 ? '0' + hour : hour) + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (second < 10 ? '0' + second : second) ); }, isPhone(val) { return /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(val); }, isDecimal(val) { return /(^[\-0-9][0-9]*(.[0-9]+)?)$/.test(val); }, isNumber(val) { return /(^[\-0-9][0-9]*([0-9]+)?)$/.test(val); }, isMail(val) { return /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(val); }, isUrl(url) { return this.checkUrl(url); }, checkUrl(url) { // url= 协议://(ftp的登录信息)[IP|域名](:端口号)(/或?请求参数) var strRegex = '^((https|http|ftp)://)?' + // (https或http或ftp):// 可有可无 "(([\\w_!~*'()\\.&=+$%-]+: )?[\\w_!~*'()\\.&=+$%-]+@)?" + // ftp的user@ 可有可无 '(([0-9]{1,3}\\.){3}[0-9]{1,3}' + // IP形式的URL- 3位数字.3位数字.3位数字.3位数字 '|' + // 允许IP和DOMAIN(域名) '(localhost)|' + // 匹配localhost "([\\w_!~*'()-]+\\.)*" + // 域名- 至少一个[英文或数字_!~*\'()-]加上. '\\w+\\.' + // 一级域名 -英文或数字 加上. '[a-zA-Z]{1,6})' + // 顶级域名- 1-6位英文 '(:[0-9]{1,5})?' + // 端口- :80 ,1-5位数字 '((/?)|' + // url无参数结尾 - 斜杆或这没有 "(/[\\w_!~*'()\\.;?:@&=+$,%#-]+)+/?)$"; // 请求参数结尾- 英文或数字和[]内的各种字符 var re = new RegExp(strRegex, 'i'); // i不区分大小写 // 将url做uri转码后再匹配,解除请求参数中的中文和空字符影响 if (re.test(encodeURI(url))) { return true; } return false; }, matchUrlIp(url, ip) { // url使用是否使用的当前ip if (!url || !ip) { return false; } return url.indexOf(ip.replace('https://', '').replace('http://', '')) >= 0; }, getImgSrc(src, httpUrl) { if (this.isUrl(src)) { return src; } if (httpUrl) { return httpUrl + src; } return src; }, previewImg(src, httpUrl) { // 图片预览,目前只支持单图片预览 if (src && !this.isUrl(src) && httpUrl) { if ( src.substr(0, 1) == '/' && httpUrl.substr(httpUrl.length - 1, 1) == '/' ) { src = src.substr(1); } src = httpUrl + src; } let id = 'vol-preview'; let $div = document.getElementById(id); if (!$div) { $div = document.createElement('div'); $div.setAttribute('id', 'vol-preview'); let $mask = document.createElement('div'); $mask.style.position = 'absolute'; $mask.style.width = '100%'; $mask.style.height = '100%'; $mask.style.background = 'black'; $mask.style.opacity = '0.6'; $div.appendChild($mask); $div.style.position = 'fixed'; $div.style.width = '100%'; $div.style.height = '100%'; // $div.style.overflow = "scroll"; $div.style.top = 0; $div.style['z-index'] = 9999999; let $img = document.createElement('img'); $img.setAttribute('class', 'vol-preview-img'); $img.style.position = 'absolute'; $img.style.top = '50%'; $img.style.left = '50%'; $img.style['max-width'] = '90%'; $img.style['max-height'] = '90%'; $img.style.transform = 'translate(-50%,-50%)'; // $img.src = src; $img.setAttribute('src', src); $div.appendChild($img); $div.addEventListener('click', function() { this.style.display = 'none'; }); document.body.appendChild($div); return; } let $img1 = document.body .appendChild($div) .querySelector('.vol-preview-img'); // img.src = src; $img1.setAttribute('src', src); $div.style.display = 'block'; }, // 下载文件 $element 标签, url完整url, fileName 文件名, header 以key/value传值 // backGroundUrl 后台url,如果后台url直接从后台下载,其他全部通过点击a标签下载 dowloadFile(url, fileName, header, backGroundUrl) { if (!url) return alert('此文件没有url不能下载'); if (!this.isUrl(url)) { url = backGroundUrl + url; } window.open(url); }, downloadImg(data) { if (!data.url || !data.callback || typeof data.callback !== 'function') { return; } // url, backGroundUrl, header, callback if ( this.isUrl(data.url) && !this.matchUrlIp(data.url, data.backGroundUrl) ) { return data.url; } // 通过后台api服务器下载 if (!this.isUrl(data.url)) { if (!this.isUrl(data.backGroundUrl + data.url)) { return; } data.url = data.backGroundUrl + data.url; } var xmlResquest = new XMLHttpRequest(); xmlResquest.open('get', data.url, true); xmlResquest.responseType = 'blob'; xmlResquest.setRequestHeader('Content-Type', 'application/json'); if (data.header && typeof data.header === 'object') { for (const key in data.header) { xmlResquest.setRequestHeader(key, data.header[key]); } } xmlResquest.onload = function() { if (this.status == 200) { var blob = this.response; callback(window.URL.createObjectURL(blob)); } }; xmlResquest.send(); }, // 2020.06.01增加通用方法,将普通对象转换为tree结构 // data数据格式[ // { name: 'tree1', id: 1, parentId: 0 }, // { name: 'tree2', id: 2, parentId: 0 }] // 1、id与parentId这两个字段必须有 // 2、树形tree需要注意Id与parentId循环依赖的问题 // 3、callback每次生成一新的节点的时回调的方法 convertTree(data, callback) { var treeIds = []; var root_data = []; if (data.length>100) { data = JSON.parse(JSON.stringify(data)); } data.forEach((x) => { // if (!x.children) { // x.children = [] // } if ( !x.hidden && x.id !== undefined && x.id !== x.parentId && !data.some((s) => { return x.parentId == s.id; }) ) { x.isRoot = true; callback && callback(x, data, true, treeIds); root_data.push(x); getTree(x.id, x, data, callback, treeIds); } else { callback && callback(x, data, true, treeIds); } }); var exceptionNodes = data.filter((f) => { return treeIds.indexOf(f.id) == -1 && !f.hidden; }); root_data.push(...exceptionNodes); return root_data; }, getTreeAllParent(id, data) { // 获取某个节点的所有父节点信息2020.11.01 var nodes = []; if (!(data instanceof Array)) { return nodes; } if (data.length>100) { data = JSON.parse(JSON.stringify(data)); } data.forEach((x) => { if (x.id === x.parentId) { x.parentId = 0; } else if (data.some((c) => c.parentId === x.id && c.id === x.parentId)) { x.parentId = 0; } }); var _child = data.find((x) => { return x.id === id; }); if (!_child) { return []; } nodes.push(_child); var _parentIds = [_child.parentId]; for (let index = 0; index < _parentIds.length; index++) { var _node = data.find((x) => { return x.id === _parentIds[index] && x.id !== x.parentId; }); if (!_node) { return nodes; } _parentIds.push(_node.parentId); nodes.unshift(_node); } return nodes; }, //获取所有节点的子节点 // data数据格式[ // { name: 'tree1', id: 1, parentId: 0 }, // { name: 'tree2', id: 2, parentId: 0 }] getTreeAllChildren(id, data) { //递归获取某个节点的所有子节点信息 var nodes = []; if (!(data instanceof Array)) { return nodes; } if (data.length>100) { data = JSON.parse(JSON.stringify(data)); } var _child = data.find((x) => { return x.id === id; }); if (!_child) { return []; } nodes.push(_child); var _parentIds = [_child.id]; for (let index = 0; index < _parentIds.length; index++) { data.forEach((_node) => { if ( _node.parentId === _parentIds[index] && _node.parentId !== _node.id ) { _parentIds.push(_node.id); nodes.unshift(_node); } }); } return nodes; }, //获取所有子节点的id // data数据格式[ // { name: 'tree1', id: 1, parentId: 0 }, // { name: 'tree2', id: 2, parentId: 0 }] getTreeAllChildrenId(id, data) { return this.getTreeAllChildren(id, data).map((c) => { return c.id; }); } }; export default base; // 2020.06.01增加通用方法,将普通对象转换为tree结构 function getTree(id, node, data, callback, treeIds) { if (treeIds.indexOf(id) == -1) { treeIds.push(id); } data.forEach((x) => { if (!x.hidden && x.parentId == id) { if (!node.children) node.children = []; callback && callback(x, node, false); node.children.push(x); getTree(x.id, x, data, callback, treeIds); } }); }