/**
* 基础方法
*/
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
}
athena__基于Lodash封装常用基础方法
猜你喜欢
转载自blog.csdn.net/qq_37126704/article/details/86690416
今日推荐
周排行