athena__基于Lodash封装常用基础方法

/**
 * 基础方法
 */
import toastr from 'toastr'
import lodash from 'lodash'
import sweetalert from 'bootstrap-sweetalert'
import {loginUserKey} from 'src/config/index.js'
import store from 'store'
import FileSaver from 'file-saver'
import {csvFormat, csvFormatRows} from 'd3-dsv'
import $ from 'jquery'
import MetronicApp from 'MetronicApp'
import {MessageBox} from 'element-ui'

// 获取object 里的的数据,避免保错
export function dotData (object, dotString, defaultValue = undefined) {
  return lodash.get(object, dotString, defaultValue)
}

// 根据点语法设置值
export function setDotData (object, path, value) {
  lodash.set(object, path, value)
}

// 从对象中取
export const pick = lodash.pick

// 菜单展示数据
export function canRoutePushPath (path) {
  let arrPk = store.get('menuListPathPk')
  return !!arrPk[path]
}

// 提示
export function alert (message, title = '提示', type = 'error') {
  toastr.options = {
    closeButton: true,
    debug: false,
    progressBar: false,
    positionClass: 'toast-top-right',
    onclick: null,
    showDuration: 300,
    hideDuration: 1000,
    timeOut: 5000,
    extendedTimeOut: 1000,
    showEasing: 'swing',
    hideEasing: 'linear',
    showMethod: 'fadeIn',
    hideMethod: 'fadeOut'
  }
  toastr[type](message, title)
}

// 一款提示框插件
export function swal (config, confirmFunc = undefined) {
  config.allowEscapeKey = false
  if (config.customClass) { // 目的: 修正快速点击时的弹窗突然关闭
    // visible
    if (!/visible/.test(config.customClass)) {
      config.customClass += ' visible'
    }
  } else {
    config.customClass = 'visible'
  }
  if (confirmFunc) {
    sweetalert(config, confirmFunc)
  } else {
    sweetalert(config)
  }
}

// 数组转化为主键对象
export function arrayPk (arr = [], id = 'id') {
  let refer = {}
  for (let v of arr) {
    refer[v[id]] = v
  }
  return refer
}

// 主键对象转化为数组
export function pkArray (obj) {
  let refer = []
  for (let k in obj) {
    refer.push(obj[k])
  }
  return refer
}

/**
 * 数组转化为数结构
 * @param arr
 * @param pk
 * @param pid
 * @param child
 * @param root
 * @param toString 判断是否把数字转化为string
 * @returns {Array}
 */
export function arrayToTree (arr, pk = 'id', pid = 'pid', child = '_child', root = 0, toString = false) {
  let refer = arrayPk(arr, pk)
  let tree = []
  let parent = []
  if (toString) {
    root = String(root)
  }
  arr.forEach((data, key) => {
    let parentId = toString ? String(data[pid]) : data[pid]
    if (root === parentId) {
      tree.push(arr[key])
    } else {
      if (refer[parentId]) {
        parent = refer[parentId]
        if (!Array.isArray(parent[child])) {
          parent[child] = []
        }
        parent[child].push(arr[key])
      }
    }
  })
  return tree
}

// 数据树有子节点就回掉callback
export function hasChildCallBack (treeData, callback = (v) => {
  console.log(v)
}, child = '_child') {
  if (Array.isArray(treeData)) {
    treeData.forEach(v => {
      let childArr = dotData(v, child)
      if (childArr) {
        callback(v)
        hasChildCallBack(childArr, callback, child)
      }
    })
  }
}

// 树结构的数据转化为array 结构
export function treeToArray (arr, child = '_child') {
  let copyArr = copy(arr, true)
  let temp = []
  if (Array.isArray(copyArr)) {
    copyArr.forEach(v => {
      let childArr = dotData(v, child)
      if (Array.isArray(childArr) && childArr.length > 0) {
        let deepArr = treeToArray(childArr, child)
        delete v[child]
        deepArr.forEach(v2 => {
          temp.push(v2)
        })
      }
      temp.push(v)
    })
  }
  return temp
}

// 拷贝数组或对象
export function copy (value, deep = false) {
  if (deep) {
    return lodash.cloneDeep(value)
  }
  return lodash.clone(value)
}

// copy alias
export function clone (value, deep = false) {
  return copy(value, deep)
}

// 判断复杂对象是否相等
export const isEqual = lodash.isEqual

export const isEqualWith = lodash.isEqualWith

export function isEqualExcludeArrayOrder (obj, otherObj) {
  if (lodash.isPlainObject(obj)) {
    for (let k in obj) {
      let otherObjKValue = dotData(otherObj, k)
      if (!isEqualExcludeArrayOrder(obj[k], otherObjKValue)) {
        return false
      }
    }
    return true
  } else if (Array.isArray(obj)) {
    if (Array.isArray(otherObj) && obj.length === otherObj.length) {
      let copyOtherObj = copy(otherObj, true)
      for (let v of obj) {
        let hasLessOneSameFlag = false
        for (let k2 in copyOtherObj) {
          if (isEqualExcludeArrayOrder(v, copyOtherObj[k2])) {
            hasLessOneSameFlag = true
            copyOtherObj.splice(k2, 1)
            break
          }
        }
        if (!hasLessOneSameFlag) {
          return false
        }
      }
      return true
    } else {
      return false
    }
  } else {
    return isEqual(obj, otherObj)
  }
}

// array_column
export function arrayColumn (arr, key) {
  let temp = []
  arr.forEach(v => {
    temp.push(v[key])
  })
  return temp
}

//  判断是否是ie9
export function isIE9 () {
  return !!navigator.userAgent.match(/MSIE 9.0/)
}

// 判断支持 placeholder
export function supportPlaceHolder () {
  return 'placeholder' in document.createElement('input')
}

// 深度克隆一个vue对象
export function deepCloneNodes (vnodes, createElement) {
  function cloneVNode (vnode) {
    const clonedChildren = vnode.children && vnode.children.map(vnode => cloneVNode(vnode))
    const cloned = createElement(vnode.tag, vnode.data, clonedChildren)
    cloned.text = vnode.text
    cloned.isComment = vnode.isComment
    cloned.componentOptions = vnode.componentOptions
    cloned.elm = vnode.elm
    cloned.context = vnode.context
    cloned.ns = vnode.ns
    cloned.isStatic = vnode.isStatic
    cloned.key = vnode.key
    return cloned
  }
  const clonedVNodes = vnodes.map(vnode => cloneVNode(vnode))
  return clonedVNodes
}

// 将map 转化为值
export function mapGetValue (object) {
  if (Array.isArray(object)) {
    let temp = []
    for (let value of object) {
      temp.push(mapGetValue(value))
    }
    return temp
  } else {
    let temp = {}
    const isObject = lodash.isObjectLike(object)
    if (isObject) {
      for (let key in object) {
        let objectValue = object[key]
        if (lodash.isObjectLike(objectValue) && !/Map$/.test(key)) {
          temp[key] = mapGetValue(objectValue)
        } else {
          if (/Map$/.test(key)) {
            const value = dotData(objectValue, 'value')
            if (value !== null || value !== undefined) {
              temp[key.replace(/Map$/, '')] = value
              delete temp[key]
            }
          } else {
            temp[key] = objectValue
          }
        }
      }
    } else {
      temp = object
    }
    return temp
  }
}
// 映射值
export function mapValueOut (string) {
  if (string === '') {}
}
// 对象合并
export const merge = lodash.merge

// 删除一条数据
export function delArr (arr, index) {
  if (arr.length > 1) {
    arr.splice(index, 1)
  }
}

// [{value: '', text: ''}, ...] 形式转化为map
export function valueMapText (arr) {
  let temp = new Map()
  arr.forEach(v => {
    temp.set(v.value, v.text)
  })
  return temp
}

// 替换null 为 ''空
export function replaceNullDeep (object) {
  if (Array.isArray(object)) {
    let temp = []
    for (let value of object) {
      temp.push(replaceNullDeep(value))
    }
    return temp
  } else {
    let temp = {}
    const isObject = lodash.isObjectLike(object)
    if (isObject && object) {
      for (let k in object) {
        temp[k] = replaceNullDeep(object[k])
      }
    } else {
      temp = object === null ? '' : object
    }
    return temp
  }
}

// 是网点账号
export function isBranch () {
  const loginUser = store.get(loginUserKey)
  const isBranch = dotData(loginUser, 'isbranch')
  return isBranch !== 'false'
}

// 下载文件
export function downloadFile (content, fileType, downloadFileName) {
  let isFileSaverSupported = false
  try {
    isFileSaverSupported = !!new Blob()
  } catch (e) {
    isFileSaverSupported = false
  }
  if (!isFileSaverSupported) {
    alert('File download not supported in your Browser. Please update to a latest browser.')
    return
  }
  let mimeType = `text/${fileType};charset=utf-8`
  let filename = (downloadFileName || 'Porumai') + '.' + fileType
  // ref: https://github.com/eligrey/FileSaver.js
  var file = new File([content], filename, {type: mimeType})

  FileSaver.saveAs(file, filename)
}

// download json as csv
export function downloadCSV (json, downloadFileName, isColumnHeader = false) {
  const isArray = lodash.isArray(json)
  if (!isArray) {
    alert('JSON not an array!. Cannot convert JSON to CSV')
    // do not proceed
    return
  }
  // now we need to find which module to use for the conversion
  let parsed = ''
  let parseError = false
  let parseErrorMsg = ''
  if (isColumnHeader) {
    try {
      parsed = csvFormat(json)
      parseError = false
    } catch (e) {
      parseError = true
      parseErrorMsg = 'CSV conversion Failed. Please check if JSON is array of objects.'
    }
  } else {
    try {
      parsed = csvFormatRows(json)
      parseError = false
    } catch (e) {
      parseError = true
      parseErrorMsg = 'CSV conversion Failed. Please check if JSON is array of arrays.'
    }
  }
  if (parseError) {
    // show the error message
    alert(parseErrorMsg)
    // do not proceed
    return
  }
  downloadFile(parsed, 'csv', downloadFileName)
}

// 格式一下导出excel json
export function formatExcelJson (arr, header) {
  let temp = []
  let row = []
  for (let k in header) {
    row.push(header[k])
  }
  temp.push(row)
  arr.forEach(v => {
    let row = []
    for (let k in header) {
      row.push(dotData(v, k))
    }
    temp.push(row)
  })
  return temp
}
// 过滤掉数据中的null、undefined
export function trimFun (object) {
  if (Array.isArray(object)) {
    for (let item of object) {
      if (!lodash.isObjectLike(object) && !Array.isArray(object)) {
        item = lodash.trim(item)
      } else {
        trimFun(item)
      }
    }
  } else {
    if (lodash.isObjectLike(object)) {
      for (let key in object) {
        if (!lodash.isObjectLike(object[key]) && !Array.isArray(object[key])) {
          object[key] = lodash.trim(object[key])
        } else {
          trimFun(object[key])
        }
      }
    }
  }
  return object
}
// 过滤掉对象内字符串内的空格
export function replaceSpaceDeep (obj) {
  for (let k in obj) {
    if (lodash.isString(obj[k])) {
      obj[k] = lodash.trim(obj[k])
    }
  }
  return obj
}

// 用户token
export function getToken () {
  return dotData(store.get(loginUserKey), 'token')
}

// 将一个json 字符串转化未 数组
export function handleJsonStringArr (str) {
  if (Array.isArray(str)) {
    return str
  }
  if (str) {
    try {
      let arr = JSON.parse(str)
      if (Array.isArray(arr)) {
        return arr
      } else {
        console.error('不是一个可转化为数组的json串:' + str)
      }
    } catch (e) {
      console.error(e)
    }
  }
  return []
}

// 菜单设置
export function setMenuActive (tree, id, pidKey = 'pid', active = 'active') {
  tree[id][active] = true
  let pid = tree[id][pidKey]
  let pidTree = tree[pid]
  if (pidTree) {
    setMenuActive(tree, pid, pidKey, active)
  }
}

// 验证打印组件
export function validateLODOP (LODOP) {
  if (LODOP) {
    if (LODOP.VERSION < '6.2.1.8') { // 2017年6月3号LODOP最新版本号'6.2.1.8'
      swal({
        title: '温馨提示!',
        text: '<span style="color: #f3c200;font-size: 16px!important;">你打印插件版本过低,请点击' +
        '<a style="color: #32c5d2;font-size: 16px!important;" href="/static/clodop-download/c_lodop.zip">下载</a>新版本</span>',
        confirmButtonText: '关闭',
        html: true
      })
    } else {
      return true
    }
  } else {
    swal({
      title: '温馨提示!',
      text: '<span style="color: #f3c200;font-size: 16px!important;">你还没有安装打印插件,请点击' +
      '<a style="color: #32c5d2;font-size: 16px!important;" href="/static/clodop-download/c_lodop.zip">下载</a></span>',
      confirmButtonText: '关闭',
      html: true
    })
  }
  return false
}

//  blockUI, unblockUI
// 异步获取打印插件
export function getLodop () {
  return new Promise((resolve, reject) => {
    blockUI({
      boxed: true,
      message: '打印组件加载中'
    })
    $.ajax({
      url: 'http://localhost:8000/CLodopfuncs.js',
      dataType: 'script',
      cache: true
    }).done((script, textStatus) => {
      resolve(window.getCLodop())
    }).fail((jqxhr, settings, exception) => {
      $.ajax({
        url: 'http://localhost:18000/CLodopfuncs.js',
        dataType: 'script',
        cache: true
      }).done((script, textStatus) => {
        resolve(window.getCLodop())
      }).fail((jqxhr, settings, exception) => {
        resolve(null)
      })
    })
  }).then(reuslt => {
    validateLODOP(reuslt)
    unblockUI()
    return reuslt
  })
}

// 加loading 并组织操作
export function blockUI (options = {}) {
  // options.target = '.page-content'
  MetronicApp.blockUI(options)
}

// 移除上一个
export function unblockUI (target = undefined) {
  MetronicApp.unblockUI(target)
}

// 加载 script
export function loadScript (url, cache = true) {
  return new Promise((resolve, reject) => {
    $.ajax({
      url,
      dataType: 'script',
      cache
    }).done((script, textStatus) => {
      let reponse = {
        MMapOptions: window.MMapOptions,
        MMap: window.MMap,
        MTrackOptions: window.MTrackOptions,
        MTrack: window.MTrack,
        MTrackPoint: window.MTrackPoint,
        MLngLat: window.MLngLat,
        MPersonOptions: window.MPersonOptions,
        MPerson: window.MPerson
        // addPersonClickListener: window.addPersonClickListener()
      }
      resolve(reponse)
    })
  })
}

/**
 * @author 封装 element-ui confirm
 * @param text
 * @param title
 * @param config
 * @returns {Promise}
 */
export function confirm (text, title = '提示', config = {}) {
  return new Promise((resolve, reject) => {
    let confirmButtonLoadingClose = () => {}
    let _config = merge({
      showCancelButton: true,
      closeOnClickModal: false,
      center: true
    }, config)
    let afterCloseResolve = () => {}
    _config.beforeClose = (action, instance, done) => {
      if (lodash.isFunction(config.beforeClose)) {
        config.beforeClose(action, instance, () => {})
      }
      if (lodash.isFunction(config.confirmCallBack)) {
        if (action === 'confirm') {
          instance.confirmButtonLoading = true
          confirmButtonLoadingClose = () => {
            instance.confirmButtonLoading = false
          }
          config.confirmCallBack({
            confirmButtonLoadingClose,
            close: () => new Promise((resolve, reject) => {
              done()
              afterCloseResolve = resolve
            }),
            action
          })
        } else {
          done()
        }
      }
      if (!config.confirmButtonLoading) {
        done()
      }
    }
    delete _config.confirmButtonLoading
    MessageBox.confirm(text, title, _config).then(_ => {
      afterCloseResolve()
      resolve()
    }).catch(err => {
      afterCloseResolve()
      reject(err)
    })
  })
}

// 创建一个有值的数组
export function cleanArray (actual) {
  const newArray = []
  for (let i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i])
    }
  }
  return newArray
}

// 格式参数
export function param (json) {
  if (!json) return ''
  return cleanArray(
    Object.keys(json).map(key => {
      if (json[key] === undefined) return ''
      return encodeURIComponent(key) + '=' + encodeURIComponent(Array.isArray(json[key]) ? JSON.stringify(json[key]) : json[key])
    })
  ).join('&')
}

/**
 * 登陆用户
 * @returns {*} || undefined
 */
export function getLoginUser () {
  return store.get(loginUserKey)
}

export default {
  copy,
  arrayToTree,
  arrayPk,
  pkArray,
  // 设置活动菜单
  setMenuActive,
  // 提示
  alert,
  dotData,
  arrayColumn,
  isIE9,
  supportPlaceHolder,
  isEqual,
  swal,
  mapGetValue,
  merge,
  trimFun,
  replaceSpaceDeep,
  handleJsonStringArr
}

猜你喜欢

转载自blog.csdn.net/qq_37126704/article/details/86690416