fn.service.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import { injectable, Service } from './service'
  2. /** 常用方法 */
  3. @injectable
  4. export default class FnService extends Service {
  5. /**
  6. * 格式化日期
  7. * @param date Date
  8. * @param fmt 日期格式
  9. * @returns
  10. */
  11. fomartTime(date: Date, fmt = 'yyyy-MM-dd hh:mm:ss') {
  12. if (!date) return ''
  13. const o = {
  14. 'M+': date.getMonth() + 1, //月份
  15. 'd+': date.getDate(), //日
  16. 'h+': date.getHours(), //小时
  17. 'm+': date.getMinutes(), //分
  18. 's+': date.getSeconds(), //秒
  19. 'q+': Math.floor((date.getMonth() + 3) / 3), //季度
  20. 'S': date.getMilliseconds() //毫秒
  21. } as any
  22. if (/(y+)/.test(fmt)) {
  23. fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  24. }
  25. for (let k in o) {
  26. if (new RegExp('(' + k + ')').test(fmt)) {
  27. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
  28. }
  29. }
  30. return fmt
  31. }
  32. /**
  33. * 距当前时间点的时长
  34. * @prama time 13位时间戳
  35. * @return str x秒 / x分钟 / x小时
  36. */
  37. timeDuration(datetime: string) {
  38. if (datetime == null) return ''
  39. datetime = datetime.replace(/-/g, '/')
  40. const time = new Date()
  41. let outTime = new Date(datetime)
  42. if (/^[1-9]\d*$/.test(datetime)) {
  43. outTime = new Date(parseInt(datetime) * 1000)
  44. }
  45. if (
  46. time.getTime() < outTime.getTime() ||
  47. time.getFullYear() !== outTime.getFullYear()
  48. ) {
  49. return this.fomartTime(outTime, 'yyyy-MM-dd hh:mm')
  50. }
  51. if (time.getMonth() !== outTime.getMonth()) {
  52. return this.fomartTime(outTime, 'MM-dd hh:mm')
  53. }
  54. if (time.getDate() !== outTime.getDate()) {
  55. const day = outTime.getDate() - time.getDate()
  56. if (day === -1) {
  57. return this.fomartTime(outTime, '昨天 hh:mm')
  58. }
  59. if (day === -2) {
  60. return this.fomartTime(outTime, '前天 hh:mm')
  61. }
  62. return this.fomartTime(outTime, 'MM-dd hh:mm')
  63. }
  64. const diff = time.getTime() - outTime.getTime()
  65. if (time.getHours() !== outTime.getHours() || diff > 30 * 60 * 1000) {
  66. return this.fomartTime(outTime, 'hh:mm')
  67. }
  68. let minutes = outTime.getMinutes() - time.getMinutes()
  69. if (minutes === 0) {
  70. return '刚刚'
  71. }
  72. minutes = Math.abs(minutes)
  73. return `${minutes}分钟前`
  74. }
  75. /**
  76. * 简单防抖
  77. * @param fn
  78. * @param interval
  79. * @returns
  80. */
  81. debounce(fn: (...arg: any[]) => any, duration = 300) {
  82. let timer = -1
  83. return function (this: unknown, ...args: any[]) {
  84. if (timer > -1) {
  85. clearTimeout(timer)
  86. }
  87. timer = window.setTimeout(() => {
  88. fn.bind(this)(...args)
  89. timer = -1
  90. }, duration)
  91. }
  92. }
  93. /**
  94. * 简单节流
  95. * @param fn
  96. * @param interval
  97. * @returns
  98. */
  99. throttle(fn: (...arg: any[]) => any, interval = 300) {
  100. let lock = false
  101. return function (this: unknown, ...args: any[]) {
  102. if (lock) return
  103. lock = true
  104. setTimeout(() => lock = false, interval)
  105. fn.bind(this)(...args)
  106. }
  107. }
  108. /**
  109. * base64 转file
  110. * @param dataurl base64
  111. * @param filename
  112. * @returns
  113. */
  114. base64ImgtoFile(base64: string, filename = 'file') {
  115. const arr = base64.split(',') as any
  116. const mime = arr[0].match(/:(.*?);/)[1]
  117. const suffix = mime.split('/')[1]
  118. const bstr = atob(arr[1])
  119. let n = bstr.length
  120. const u8arr = new Uint8Array(n)
  121. while (n--) {
  122. u8arr[n] = bstr.charCodeAt(n)
  123. }
  124. return new File([u8arr], `${filename}.${suffix}`, {
  125. type: mime
  126. })
  127. }
  128. /**
  129. * 关键字去重
  130. * @param arr 数组
  131. * @param key 关键字
  132. * @returns 去重后
  133. */
  134. unique(arr: Array<any>, key: string) {
  135. const res = []
  136. const obj = {} as any
  137. for (let i = 0; i < arr.length; i++) {
  138. if (!obj[arr[i][key]]) {
  139. res.push(arr[i])
  140. obj[arr[i][key]] = true
  141. }
  142. }
  143. return res
  144. }
  145. /**
  146. * 同步睡眠
  147. * @param ms 毫秒
  148. */
  149. sleep = (ms: number) => new Promise((resolve) => { setTimeout(resolve, ms) })
  150. /**
  151. * 多维数组转一维
  152. * @param arr
  153. * @returns
  154. */
  155. flatten: any = (arr: Array<any>) => [].concat(...arr.map((x) => (Array.isArray(x) ? this.flatten(x) : x)))
  156. /**
  157. * 多字段匹配
  158. * @param data 数组|数组对象
  159. * @param key
  160. * @returns
  161. */
  162. search(data: Array<any>, key: string) {
  163. const list = data.filter((el) => {
  164. let bt = ''
  165. bt += el.name
  166. bt += el.eg
  167. return bt.match(key)
  168. })
  169. return list
  170. }
  171. /**
  172. * 格式化掌子面里程
  173. * @param num 里程
  174. * @returns
  175. */
  176. mileage2string(num: number) {
  177. const a = Math.floor(num / 1000).toString()
  178. const ab = parseFloat((num % 1000).toFixed(1))
  179. const b = Math.floor(num % 1000).toString()
  180. const c = b.length === 1 ? `00${ab}` : b.length === 2 ? `0${ab}` : ab
  181. return `${a}+${c}`
  182. }
  183. /**
  184. * 对象数组去重
  185. * @param arr 传入数组
  186. * @param key 需要对比的键
  187. * @returns 去重后的数组
  188. */
  189. uniqueArr<T = any>(arr: T[], key: keyof T) {
  190. const newArr = [] as T[]
  191. const valueList = [] as any[]
  192. for (const item of arr) {
  193. if (valueList.indexOf(item[key]) === -1) {
  194. valueList.push(item[key])
  195. newArr.push(item)
  196. }
  197. }
  198. return newArr
  199. }
  200. /**
  201. * 数组按指定key值分组
  202. * @param {*} array
  203. * @param {*} id
  204. * @returns
  205. */
  206. groupBy(array: Array<any>, id: string) {
  207. const groups = {} as any
  208. array.forEach((o) => {
  209. let group = JSON.stringify(o[id])
  210. if (typeof o[id] === 'string') {
  211. group = o[id]
  212. }
  213. groups[group] = groups[group] || []
  214. groups[group].push(o)
  215. })
  216. // return Object.values(groups);
  217. return groups
  218. }
  219. }