plugins/util/util.go

357 lines
9.9 KiB
Go

package util
import (
"encoding/hex"
"apigo.cloud/git/apigo/plugin"
"github.com/ssgo/u"
"gopkg.in/yaml.v3"
)
func init() {
plugin.Register(plugin.Plugin{
Id: "util",
Name: "基础工具",
JsCode: `
util.formatDate = function (date, fmt, timezone) {
let ret
if (!date) return ''
if (!fmt) fmt = 'YYYY-mm-dd HH:MM:SS'
const opt = {
'YYYY': date.getFullYear().toString(),
'YY': date.getFullYear().toString().substring(2),
'm+': (date.getMonth() + 1).toString(),
'd+': date.getDate().toString(),
'H+': date.getHours().toString(),
'h+': (date.getHours() % 12).toString(),
'APM': (date.getHours() > 12 ? 'PM' : 'AM'),
'M+': date.getMinutes().toString(),
'S+': date.getSeconds().toString(),
'YW': 'W' + Math.ceil(((date.getTime() - new Date(date.getFullYear(), 0, 0))) / (24 * 60 * 60 * 1000) / 7),
}
for (let k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt)
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
}
}
return fmt
}
util.parseDate = function (str) {
if (typeof str === 'number') str = str + ''
if (/^\d+[\\.]?\d*$/.test(str)) {
if (str.length === 10) str += '000'
return new Date(util.int(str))
}
if (str.length === 19) {
return new Date(parseInt(str.substr(0, 4)), parseInt(str.substr(5, 2)) - 1, parseInt(str.substr(8, 2)), parseInt(str.substr(11, 2)), parseInt(str.substr(14, 2)), parseInt(str.substr(17, 2)))
} else if (str.length === 10) {
return new Date(parseInt(str.substr(0, 4)), parseInt(str.substr(5, 2)) - 1, parseInt(str.substr(8, 2)))
} else if (str.length === 7) {
return new Date(parseInt(str.substr(0, 4)), parseInt(str.substr(5, 2)) - 1, 1)
} else if (str.length === 8) {
let date = new Date()
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), parseInt(str.substr(0, 2)), parseInt(str.substr(3, 2)), parseInt(str.substr(6, 2)))
} else if (str.length === 5) {
let date = new Date()
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), parseInt(str.substr(0, 2)), parseInt(str.substr(3, 2)), 0)
}
return new Date(str)
}
util.int = function (v) {
if (!v) return 0
if (typeof v === 'number' || v instanceof Number) return v
if (typeof v === 'object') v = v.toString ? v.toString() : ''
if (typeof v !== 'string') return 0
try {
return Math.round(parseFloat(v.replace(/,/g, '').trim())) || 0
} catch (e) {
return 0
}
}
util.float = function (v) {
if (!v) return 0.0
if (typeof v === 'number' || v instanceof Number) return v
if (typeof v === 'object') v = v.toString ? v.toString() : ''
if (typeof v !== 'string') return 0.0
try {
return parseFloat(v.replace(/,/g, '').trim()) || 0.0
} catch (e) {
return 0.0
}
}
util.str = function (v) {
if (!v) return ''
if (typeof v === 'string') return v
if (v.toString) return v.toString()
return ''
}
util.keysBy = function (obj, ...fieldAndValues) {
let keys = []
for (let k in obj) {
let match = true
if (fieldAndValues.length === 1) {
// 查找一位数组
if (obj[k] != fieldAndValues[0]) {
match = false
}
} else {
// 查找二维数组
for (let i = 0; i < fieldAndValues.length; i += 2) {
if (obj[k][fieldAndValues[i]] != fieldAndValues[i + 1]) {
match = false
break
}
}
}
if (match) {
keys.push(k)
}
}
return keys
}
util.listBy = function (obj, ...fieldAndValues) {
let list = obj instanceof Array || obj instanceof NodeList ? [] : {}
let keys = util.keysBy(obj, ...fieldAndValues)
for (let k of keys) {
if (obj instanceof Array || obj instanceof NodeList) {
list.push(obj[k])
} else {
list[k] = obj[k]
}
}
return list
}
util.hasBy = function (obj, ...fieldAndValues) {
let keys = util.keysBy(obj, ...fieldAndValues)
return keys.length > 0
}
util.getBy = function (obj, ...fieldAndValues) {
let keys = util.keysBy(obj, ...fieldAndValues)
if (keys.length > 0) return obj[keys[0]]
return null
}
util.setBy = function (obj, value, ...fieldAndValues) {
let keys = util.keysBy(obj, ...fieldAndValues)
if (keys.length > 0) obj[keys[0]] = value
}
util.indexBy = function (obj, ...fieldAndValues) {
let keys = util.keysBy(obj, ...fieldAndValues)
if (keys.length > 0) {
return obj instanceof Array || obj instanceof NodeList ? util.int(keys[0]) : keys[0]
}
return -1
}
util.removeBy = function (obj, ...fieldAndValues) {
let keys = util.keysBy(obj, ...fieldAndValues)
let n = 0
for (let i = keys.length - 1; i >= 0; i--) {
let k = keys[i]
if (obj instanceof Array || obj instanceof NodeList) {
obj.splice(k, 1)
} else {
delete obj[k]
}
n++
}
return n
}
util.removeArrayItem = function (list, item) {
let pos = list.indexOf(item)
if (pos !== -1) list.splice(pos, 1)
}
util.last = function (arr) {
if (arr && arr.length) {
return arr[arr.length - 1]
}
return null
}
util.len = function (obj) {
if (obj instanceof Array || obj instanceof NodeList) {
return obj.length
} else {
let n = 0
for (let k in obj) n++
return n
}
}
util.mergeBy = function (olds, news, ...fields) {
if (!olds) return news
for (let newItem of news) {
let fieldAndValues = []
for (let field of fields) {
fieldAndValues.push(field, newItem[field])
}
let oldIndex = util.indexBy(olds, ...fieldAndValues)
if (oldIndex === -1) {
olds.push(newItem)
} else {
olds[oldIndex] = newItem
}
}
return olds
}
util.sortBy = function (obj, field, isReverse = false, sortType) {
let list = obj instanceof Array || obj instanceof NodeList ? [] : {}
let sortedKeys = {}
let sortArr = []
for (let k in obj) {
let v = ''
if (field instanceof Array) {
for (let f of field) v += obj[k][f]
} else {
v = obj[k][field]
}
if (!sortedKeys[v]) {
sortedKeys[v] = true
sortArr.push(v)
}
}
sortArr.sort((a, b) => {
if(sortType === 'int'){
a = util.int(a)
b = util.int(b)
} else if(sortType === 'float'){
a = util.float(a)
b = util.float(b)
}
if (a == b) return 0
if (typeof a === 'number' && typeof b === 'number') {
return isReverse ? b - a : a - b
} else {
return (isReverse ? a < b : a > b) ? 1 : -1
}
})
for (let sortKey of sortArr) {
for (let k in obj) {
let v = ''
if (field instanceof Array) {
for (let f of field) v += obj[k][f]
} else {
v = obj[k][field]
}
if (obj instanceof Array || obj instanceof NodeList) {
if (v == sortKey) list.push(obj[k])
} else {
if (v == sortKey) list[k] = obj[k]
}
}
}
return list
}
util.in = function (v1, v2) {
if (!(v1 instanceof Array)) v1 = util.split(v1, /,\s*/)
return v1.indexOf(String(v2)) !== -1
}
util.uniquePush = function (arr, ...values) {
for (let v of values) {
if (arr.indexOf(v) === -1) arr.push(v)
}
}
util.clearEmpty = function (arr) {
let a = []
for (let v of arr) if (v) a.push(v)
return a
}
util.split = function (v1, v2) {
return util.clearEmpty(util.str(v1).split(v2))
}
util.join = function (arr, separator) {
return util.clearEmpty(arr).join(separator)
}
util.copy = function (obj, isDeepCopy) {
let newObj
if (obj instanceof Array || obj instanceof NodeList) {
newObj = []
for (let o of obj) {
if (isDeepCopy && typeof o === 'object' && o) o = util.copy(o)
newObj.push(o)
}
} else {
newObj = {}
for (let k in obj) {
let v = obj[k]
if (isDeepCopy && typeof v === 'object' && v) v = util.copy(v)
newObj[k] = v
}
}
return newObj
}
`,
Objects: map[string]interface{}{
// makeToken 生成指定长度的随机二进制数组
// makeToken size token长度
// makeToken return Hex编码的字符串
"makeToken": func(size int) string {
return hex.EncodeToString(u.MakeToken(size))
},
// makeTokenBytes 生成指定长度的随机二进制数组
// makeTokenBytes size token长度
// makeTokenBytes return 二进制数据
"makeTokenBytes": u.MakeToken,
// makeId 生成指定长度的随机ID
// makeId size ID长度(6~20)
// makeId return 二进制数据
"makeId": func(size int) string {
if size > 20 {
return u.UniqueId()
} else if size > 14 {
return u.UniqueId()[0:size]
} else if size > 12 {
return u.ShortUniqueId()[0:size]
} else if size > 10 {
return u.Id12()[0:size]
} else if size > 8 {
return u.Id10()[0:size]
} else if size >= 6 {
return u.Id8()[0:size]
} else {
return u.Id6()
}
},
// encodeYaml 将对象转换为YAML格式
// encodeYaml content 对象
// encodeYaml return YAML字符串
"encodeYaml": func(content interface{}) (string, error) {
buf, err := yaml.Marshal(content)
return string(buf), err
},
// decodeYaml 将YAML转化为对象
// decodeYaml content YAML字符串
// decodeYaml return 对象
"decodeYaml": func(content string) (interface{}, error) {
var data interface{}
err := yaml.Unmarshal([]byte(content), &data)
return data, err
},
},
})
}