226 lines
5.5 KiB
JavaScript
226 lines
5.5 KiB
JavaScript
import Vue from 'vue'
|
|
|
|
const findTarget = function(obj, prop) {
|
|
let target = obj
|
|
let targetProp = prop
|
|
if (typeof prop === 'string') {
|
|
const paths = prop.split('.')
|
|
targetProp = paths.pop()
|
|
for (const path of paths) {
|
|
if (!obj[path]) {
|
|
Vue.set(obj, path, createPathObject({}))
|
|
}
|
|
target = obj[path]
|
|
}
|
|
}
|
|
return [target, targetProp]
|
|
}
|
|
|
|
function getAllKeys(obj, parent) {
|
|
const result = []
|
|
for (const key in obj) {
|
|
const nextKey = (parent ? `${parent}.` : '') + key
|
|
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
|
|
result.push(...getAllKeys(obj[key], nextKey))
|
|
} else {
|
|
result.push(nextKey)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
export function createPathObject(originObject) {
|
|
originObject = originObject || {}
|
|
return originObject._isPathObject ? originObject : new Proxy(originObject, {
|
|
set: (obj, prop, value) => {
|
|
const [target, targetProp] = findTarget(obj, prop)
|
|
Vue.set(target, targetProp, value)
|
|
return true
|
|
},
|
|
get: (obj, prop) => {
|
|
if (prop === '_isPathObject') {
|
|
return true
|
|
}
|
|
if (prop === '_pathKeys') {
|
|
return getAllKeys(obj)
|
|
}
|
|
const [target, targetProp] = findTarget(obj, prop)
|
|
return target[targetProp]
|
|
},
|
|
has: (obj, prop) => {
|
|
const [target, targetProp] = findTarget(obj, prop)
|
|
return targetProp in target
|
|
},
|
|
deleteProperty: (obj, prop) => {
|
|
const [target, targetProp] = findTarget(obj, prop)
|
|
Vue.delete(target, targetProp)
|
|
return true
|
|
}
|
|
})
|
|
}
|
|
|
|
export function assignPathObject(target, ...args) {
|
|
const pathObjectTarget = createPathObject(target)
|
|
for (const obj of args) {
|
|
const pathObj = createPathObject(obj)
|
|
for (const key of pathObj._pathKeys) {
|
|
pathObjectTarget[key] = pathObj[key]
|
|
}
|
|
}
|
|
return pathObjectTarget
|
|
}
|
|
|
|
/**
|
|
* 格式化时间
|
|
* @param {(Object|string|number)} time
|
|
* @param {string} cFormat
|
|
* @returns {string}
|
|
*/
|
|
export function parseDate(time, format = 'yyyy-MM-dd hh:mm:ss') {
|
|
const date = time instanceof Date ? time : new Date(time)
|
|
if (isNaN(date.valueOf())) {
|
|
return ''
|
|
}
|
|
const o = {
|
|
'M+': date.getMonth() + 1, // 月份
|
|
'd+': date.getDate(), // 日
|
|
'h+': date.getHours(), // 小时
|
|
'H+': date.getHours(), // 小时
|
|
'm+': date.getMinutes(), // 分
|
|
's+': date.getSeconds(), // 秒
|
|
'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
|
|
'S': date.getMilliseconds() // 毫秒
|
|
}
|
|
if (/(y+)/.test(format)) {
|
|
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
|
|
}
|
|
for (const k in o) {
|
|
if (new RegExp('(' + k + ')').test(format)) {
|
|
format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
|
|
}
|
|
}
|
|
if (/CN/.test(format)) {
|
|
format = format.replace('CN', () => {
|
|
const now = Date.now()
|
|
const diff = (now - date) / 1000
|
|
if (diff < 30) {
|
|
return '刚刚'
|
|
} else if (diff < 3600) {
|
|
// less 1 hour
|
|
return Math.ceil(diff / 60) + '分钟前'
|
|
} else if (diff < 3600 * 24) {
|
|
return Math.ceil(diff / 3600) + '小时前'
|
|
} else if (diff < 3600 * 24 * 2) {
|
|
return '1天前'
|
|
}
|
|
})
|
|
}
|
|
return format
|
|
}
|
|
|
|
const warningMap = new Set()
|
|
export function showWarning(text) {
|
|
if (!warningMap.has(text)) {
|
|
console.warn(`[EasyComponent]${text}`)
|
|
warningMap.add(text)
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {*} options
|
|
* @param {*} predicate
|
|
* @param {*} deepLimit 往下查找深度限制 1表示仅在顶层查找
|
|
* @returns
|
|
*/
|
|
export function findDeepOption(options, predicate, deepLimit) {
|
|
for (const item of options) {
|
|
if (predicate(item)) {
|
|
return item
|
|
}
|
|
if (typeof deepLimit === 'number') {
|
|
deepLimit = deepLimit - 1
|
|
}
|
|
if (Array.isArray(item.children) && (typeof deepLimit !== 'number' || deepLimit > 0)) {
|
|
const child = findDeepOption(item.children, predicate, deepLimit)
|
|
if (child) {
|
|
return child
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export function findDeepOptionIndex(options, predicate, scopeData = { index: -1 }) {
|
|
for (const item of options) {
|
|
scopeData.index++
|
|
if (predicate(item)) {
|
|
return scopeData.index
|
|
}
|
|
if (Array.isArray(item.children)) {
|
|
const childIndex = findDeepOptionIndex(item.children, predicate, scopeData)
|
|
if (childIndex > -1) {
|
|
return childIndex
|
|
}
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
export function filterDeepOption(options, predicate, arr = []) {
|
|
for (const item of options) {
|
|
if (predicate(item)) {
|
|
arr.push(item)
|
|
}
|
|
if (Array.isArray(item.children)) {
|
|
filterDeepOption(item.children, predicate, arr)
|
|
}
|
|
}
|
|
return arr
|
|
}
|
|
|
|
export function JSONStringify(obj) {
|
|
return JSON.stringify(obj, (key, value) => {
|
|
if (typeof value === 'function') {
|
|
return value.toString()
|
|
}
|
|
return value
|
|
})
|
|
}
|
|
|
|
export function deepClone(obj) {
|
|
if (typeof obj !== 'object' || obj === null) {
|
|
return obj
|
|
}
|
|
if (obj instanceof File) {
|
|
return obj
|
|
}
|
|
if (Array.isArray(obj)) {
|
|
const newArr = []
|
|
for (const item of obj) {
|
|
newArr.push(deepClone(item))
|
|
}
|
|
return newArr
|
|
}
|
|
const newObj = {}
|
|
for (const key in obj) {
|
|
if (typeof obj[key] === 'object') {
|
|
newObj[key] = deepClone(obj[key])
|
|
} else {
|
|
newObj[key] = obj[key]
|
|
}
|
|
}
|
|
return newObj
|
|
}
|
|
|
|
/**
|
|
* 取第一个不为undefined的值
|
|
*/
|
|
export function getValueByLevel(...args) {
|
|
for (const value of args) {
|
|
if (value !== undefined) {
|
|
return value
|
|
}
|
|
}
|
|
return undefined
|
|
}
|