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); 
 | 
    } 
 | 
  }); 
 | 
} 
 |