| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- import { injectable, Service } from './service'
- /** 常用方法 */
- @injectable
- export default class FnService extends Service {
- /**
- * 格式化日期
- * @param date Date
- * @param fmt 日期格式
- * @returns
- */
- fomartTime(date: Date, fmt = 'yyyy-MM-dd hh:mm:ss') {
- if (!date) return ''
- const o = {
- 'M+': date.getMonth() + 1, //月份
- 'd+': date.getDate(), //日
- 'h+': date.getHours(), //小时
- 'm+': date.getMinutes(), //分
- 's+': date.getSeconds(), //秒
- 'q+': Math.floor((date.getMonth() + 3) / 3), //季度
- 'S': date.getMilliseconds() //毫秒
- } as any
- if (/(y+)/.test(fmt)) {
- fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
- }
- for (let k in o) {
- if (new RegExp('(' + k + ')').test(fmt)) {
- fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
- }
- }
- return fmt
- }
- /**
- * 距当前时间点的时长
- * @prama time 13位时间戳
- * @return str x秒 / x分钟 / x小时
- */
- timeDuration(datetime: string) {
- if (datetime == null) return ''
- datetime = datetime.replace(/-/g, '/')
- const time = new Date()
- let outTime = new Date(datetime)
- if (/^[1-9]\d*$/.test(datetime)) {
- outTime = new Date(parseInt(datetime) * 1000)
- }
- if (
- time.getTime() < outTime.getTime() ||
- time.getFullYear() !== outTime.getFullYear()
- ) {
- return this.fomartTime(outTime, 'yyyy-MM-dd hh:mm')
- }
- if (time.getMonth() !== outTime.getMonth()) {
- return this.fomartTime(outTime, 'MM-dd hh:mm')
- }
- if (time.getDate() !== outTime.getDate()) {
- const day = outTime.getDate() - time.getDate()
- if (day === -1) {
- return this.fomartTime(outTime, '昨天 hh:mm')
- }
- if (day === -2) {
- return this.fomartTime(outTime, '前天 hh:mm')
- }
- return this.fomartTime(outTime, 'MM-dd hh:mm')
- }
- const diff = time.getTime() - outTime.getTime()
- if (time.getHours() !== outTime.getHours() || diff > 30 * 60 * 1000) {
- return this.fomartTime(outTime, 'hh:mm')
- }
- let minutes = outTime.getMinutes() - time.getMinutes()
- if (minutes === 0) {
- return '刚刚'
- }
- minutes = Math.abs(minutes)
- return `${minutes}分钟前`
- }
- /**
- * 简单防抖
- * @param fn
- * @param interval
- * @returns
- */
- debounce(fn: (...arg: any[]) => any, duration = 300) {
- let timer = -1
- return function (this: unknown, ...args: any[]) {
- if (timer > -1) {
- clearTimeout(timer)
- }
- timer = window.setTimeout(() => {
- fn.bind(this)(...args)
- timer = -1
- }, duration)
- }
- }
- /**
- * 简单节流
- * @param fn
- * @param interval
- * @returns
- */
- throttle(fn: (...arg: any[]) => any, interval = 300) {
- let lock = false
- return function (this: unknown, ...args: any[]) {
- if (lock) return
- lock = true
- setTimeout(() => lock = false, interval)
- fn.bind(this)(...args)
- }
- }
- /**
- * base64 转file
- * @param dataurl base64
- * @param filename
- * @returns
- */
- base64ImgtoFile(base64: string, filename = 'file') {
- const arr = base64.split(',') as any
- const mime = arr[0].match(/:(.*?);/)[1]
- const suffix = mime.split('/')[1]
- const bstr = atob(arr[1])
- let n = bstr.length
- const u8arr = new Uint8Array(n)
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n)
- }
- return new File([u8arr], `${filename}.${suffix}`, {
- type: mime
- })
- }
- /**
- * 关键字去重
- * @param arr 数组
- * @param key 关键字
- * @returns 去重后
- */
- unique(arr: Array<any>, key: string) {
- const res = []
- const obj = {} as any
- for (let i = 0; i < arr.length; i++) {
- if (!obj[arr[i][key]]) {
- res.push(arr[i])
- obj[arr[i][key]] = true
- }
- }
- return res
- }
- /**
- * 同步睡眠
- * @param ms 毫秒
- */
- sleep = (ms: number) => new Promise((resolve) => { setTimeout(resolve, ms) })
- /**
- * 多维数组转一维
- * @param arr
- * @returns
- */
- flatten: any = (arr: Array<any>) => [].concat(...arr.map((x) => (Array.isArray(x) ? this.flatten(x) : x)))
- /**
- * 多字段匹配
- * @param data 数组|数组对象
- * @param key
- * @returns
- */
- search(data: Array<any>, key: string) {
- const list = data.filter((el) => {
- let bt = ''
- bt += el.name
- bt += el.eg
- return bt.match(key)
- })
- return list
- }
- /**
- * 格式化掌子面里程
- * @param num 里程
- * @returns
- */
- mileage2string(num: number) {
- const a = Math.floor(num / 1000).toString()
- const ab = parseFloat((num % 1000).toFixed(1))
- const b = Math.floor(num % 1000).toString()
- const c = b.length === 1 ? `00${ab}` : b.length === 2 ? `0${ab}` : ab
- return `${a}+${c}`
- }
- /**
- * 对象数组去重
- * @param arr 传入数组
- * @param key 需要对比的键
- * @returns 去重后的数组
- */
- uniqueArr<T = any>(arr: T[], key: keyof T) {
- const newArr = [] as T[]
- const valueList = [] as any[]
- for (const item of arr) {
- if (valueList.indexOf(item[key]) === -1) {
- valueList.push(item[key])
- newArr.push(item)
- }
- }
- return newArr
- }
- /**
- * 数组按指定key值分组
- * @param {*} array
- * @param {*} id
- * @returns
- */
- groupBy(array: Array<any>, id: string) {
- const groups = {} as any
- array.forEach((o) => {
- let group = JSON.stringify(o[id])
- if (typeof o[id] === 'string') {
- group = o[id]
- }
- groups[group] = groups[group] || []
- groups[group].push(o)
- })
- // return Object.values(groups);
- return groups
- }
-
- }
|