globalFunctions.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. // 字符串处理相关函数
  2. // 手机号中间4位加* ------------>
  3. export function addConfusionForTel (tel) {
  4. const reg = /^(\d{3})\d{4}(\d{4})$/
  5. return tel.replace(reg, '$1****$2')
  6. }
  7. // 手机号加空格 ------------>
  8. export function addSpaceForTel (tel) {
  9. const regMap = {
  10. isConfuse: /^(\d{3})\*{4}(\d{4})$/,
  11. addSpace: /^(\d{3})(\d{4})(\d{4})$/
  12. }
  13. const confusion = regMap.isConfuse.test(tel)
  14. if (confusion) {
  15. return tel.replace(regMap.isConfuse, '$1 **** $2')
  16. } else {
  17. return tel.replace(regMap.addSpace, '$1 $2 $3')
  18. }
  19. }
  20. // 银行卡加空格
  21. export function addSpaceForBank (v, hasConfusion = false) {
  22. // 无*银行卡号加空格
  23. if (hasConfusion) {
  24. // 带有*的银行卡号字符串加空格
  25. return v.replace(/\s/g, '').replace(/(.{4})/g, '$1 ')
  26. } else {
  27. // 纯数字银行卡号字符串加空格
  28. return v.replace(/\s/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')
  29. }
  30. }
  31. // 银行卡加 **
  32. export function addConfusionForBank (v) {
  33. if (String(v).length < 12) {
  34. return v.replace(/\s/g, '').replace(/^(\d{2})\d+(\d{2})$/, '$1 **** **** $2')
  35. } else {
  36. return v.replace(/\s/g, '').replace(/^(\d{4})\d+(\d{4})$/, '$1 **** **** $2')
  37. }
  38. }
  39. export const debounce = (func, delay = 200, immediate) => {
  40. let timer = null
  41. return function () {
  42. let context = this
  43. let args = arguments
  44. if (timer) clearTimeout(timer)
  45. if (immediate) {
  46. let doNow = !timer
  47. timer = setTimeout(function () {
  48. timer = null
  49. }, delay)
  50. if (doNow) {
  51. func.apply(context, args)
  52. }
  53. } else {
  54. timer = setTimeout(function () {
  55. func.apply(context, args)
  56. }, delay)
  57. }
  58. }
  59. }
  60. // 获取url参数
  61. export function getParam(name) {
  62. let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
  63. let r = window.location.search.substr(1).match(reg)
  64. let context = '' // eslint-disable-line no-unused-vars
  65. if (r !== null) context = r[2]
  66. // 释放变量
  67. reg = null
  68. r = null
  69. return context === null || context === '' || context === 'undefined'
  70. ? ''
  71. : context
  72. }
  73. // 金额处理
  74. // 分转元
  75. export function fen2Yuan (v) {
  76. return v / 100
  77. }
  78. // 金额大写,链接:https://juejin.im/post/5a2a7a5051882535cd4abfce
  79. // upDigit(1682) result:"人民币壹仟陆佰捌拾贰元整"
  80. // upDigit(-1693) result:"欠壹仟陆佰玖拾叁元整"
  81. export function upPrice (n) {
  82. const fraction = ['角', '分', '厘']
  83. const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  84. const unit = [
  85. ['元', '万', '亿'],
  86. ['', '拾', '佰', '仟']
  87. ]
  88. // const head = n < 0 ? '欠人民币' : '人民币'
  89. const head = ''
  90. n = Math.abs(n)
  91. let s = ''
  92. for (let i = 0; i < fraction.length; i++) {
  93. s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '')
  94. }
  95. s = s || '整'
  96. n = Math.floor(n)
  97. for (let i = 0; i < unit[0].length && n > 0; i++) {
  98. let p = ''
  99. for (let j = 0; j < unit[1].length && n > 0; j++) {
  100. p = digit[n % 10] + unit[1][j] + p
  101. n = Math.floor(n / 10)
  102. }
  103. s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s
  104. // s = p + unit[0][i] + s;
  105. }
  106. return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整')
  107. }
  108. // 金额3位逗号分隔 ------------>
  109. /**
  110. * @param s 要格式化的数字(四舍五入)
  111. * @param n 保留几位小数(不传或者传-1 --> 如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
  112. * @param comma 是否小数点前每3位添加逗号
  113. */
  114. export function newFormat (s = 0, n = -1, comma = false) {
  115. n = n === -1 ? 0 : n
  116. if (n > 20 || n < -1) {
  117. n = 2
  118. }
  119. s = Number(s)
  120. return s.toLocaleString('zh-CN', {
  121. style: 'decimal',
  122. useGrouping: comma,
  123. minimumFractionDigits: n,
  124. maximumFractionDigits: n
  125. })
  126. }
  127. export function formatPrice (s, n = -1, comma = false) {
  128. // 如果不传s或者s为空,则直接返回0
  129. if (!s) return 0
  130. if (n !== -1) n = n > 0 && n <= 20 ? n : 2
  131. const intS = parseInt(String(s))
  132. let point = '.'
  133. let left = []
  134. let right = ''
  135. s = parseFloat((s + '').replace(/[^\d.-]/g, ''))
  136. // 没传n或者n为-1,默认(如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
  137. if (n === -1) {
  138. if (s === intS) {
  139. n = 0
  140. right = ''
  141. point = ''
  142. } else {
  143. n = 2
  144. s = s.toFixed(n)
  145. right = s.split('.')[1]
  146. }
  147. s = s + ''
  148. left = s.split('.')[0].split('').reverse()
  149. } else {
  150. s = parseFloat((s + '').replace(/[^\d.-]/g, '')).toFixed(n) + ''
  151. left = s.split('.')[0].split('').reverse()
  152. right = s.split('.')[1]
  153. }
  154. if (comma) {
  155. let t = ''
  156. for (let i = 0; i < left.length; i++) {
  157. t += left[i] + ((i + 1) % 3 === 0 && (i + 1) !== left.length ? ',' : '')
  158. }
  159. return t.split('').reverse().join('') + point + right
  160. }
  161. return left.reverse().join('') + point + right
  162. }
  163. // 时间格式化相关函数
  164. /*
  165. * 时间格式化函数(将时间格式化为,2019年08月12日,2019-08-12,2019/08/12的形式)
  166. * pattern参数(想要什么格式的数据就传入什么格式的数据)
  167. * · 'yyyy-MM-dd' ---> 输出如2019-09-20
  168. * · 'yyyy-MM-dd HH:mm' ---> 输出如2019-09-20 18:20
  169. * · 'yyyy-MM-dd HH:mm:ss' ---> 输出如2019-09-20 06:20:23
  170. * · 'yyyy/MM/dd' ---> 输出如2019/09/20
  171. * · 'yyyy年MM月dd日' ---> 输出如2019年09月20日
  172. * · 'yyyy年MM月dd日 HH时mm分' ---> 输出如2019年09月20日 18时20分
  173. * · 'yyyy年MM月dd日 HH时mm分ss秒' ---> 输出如2019年09月20日 18时20分23秒
  174. * · 'yyyy年MM月dd日 HH时mm分ss秒 EE' ---> 输出如2019年09月20日 18时20分23秒 周二
  175. * · 'yyyy年MM月dd日 HH时mm分ss秒 EEE' ---> 输出如2019年09月20日 18时20分23秒 星期二
  176. * 参考: https://www.cnblogs.com/mr-wuxiansheng/p/6296646.html
  177. */
  178. export function dateFormatter (date, fmt = 'yyyy-MM-dd HH:mm:ss') {
  179. // 将传入的date转为时间对象
  180. if (!date) return ''
  181. date = new Date(date)
  182. const o = {
  183. 'y+': date.getFullYear(),
  184. 'M+': date.getMonth() + 1, // 月份
  185. 'd+': date.getDate(), // 日
  186. // 12小时制
  187. 'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
  188. // 24小时制
  189. 'H+': date.getHours(), // 小时
  190. 'm+': date.getMinutes(), // 分
  191. 's+': date.getSeconds(), // 秒
  192. 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
  193. S: date.getMilliseconds(), // 毫秒
  194. 'E+': date.getDay() // 周
  195. }
  196. const week = ['日', '一', '二', '三', '四', '五', '六']
  197. if (/(y+)/.test(fmt)) {
  198. fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  199. }
  200. if (/(E+)/.test(fmt)) {
  201. fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '星期' : '周') : '') + week[date.getDay()])
  202. }
  203. for (const k in o) {
  204. if (new RegExp('(' + k + ')').test(fmt)) {
  205. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
  206. }
  207. }
  208. return fmt
  209. }
  210. // 金额类型转换
  211. export function moneyUnit(m, type = 'string', lv = 0) {
  212. const mUnit = {
  213. levelArr: ['元', '万', '亿', '万亿'],
  214. test(num, type, lv) {
  215. if (num === 0) {
  216. if (type === 'string') {
  217. return '0元'
  218. }
  219. if (type === 'lv') {
  220. return this.levelArr[lv]
  221. }
  222. if (type === 'number') {
  223. return 0
  224. }
  225. if (type === 'index') {
  226. return lv
  227. }
  228. if (type === 'transfer') {
  229. return 0
  230. }
  231. }
  232. let result = num / Math.pow(10000, lv)
  233. if (result >= 10000 && lv < 2) {
  234. return this.test(num, type, lv + 1)
  235. } else {
  236. if (type === 'string') {
  237. return (
  238. String(Math.floor((result * 100).toPrecision(12)) / 100).replace(
  239. '.00',
  240. ''
  241. ) + this.levelArr[lv]
  242. )
  243. }
  244. if (type === 'fixUnit') {
  245. if (this.levelArr[lv] === '亿') {
  246. return (
  247. String(Math.floor((result * 100).toPrecision(12)) / 100).replace(
  248. '.00',
  249. ''
  250. ) *
  251. 10000 +
  252. this.levelArr[lv - 1]
  253. )
  254. } else {
  255. return (
  256. String(Math.floor((result * 100).toPrecision(12)) / 100).replace(
  257. '.00',
  258. ''
  259. ) + this.levelArr[lv]
  260. )
  261. }
  262. }
  263. if (type === 'lv') {
  264. return this.levelArr[lv]
  265. }
  266. if (type === 'number') {
  267. return String(
  268. Math.floor((result * 100).toPrecision(12)) / 100
  269. ).replace('.00', '')
  270. }
  271. if (type === 'index') {
  272. return lv
  273. }
  274. }
  275. },
  276. // 需要传入固定的lv(此时lv为 levelArr 中的一个)
  277. transfer(num, lvString) {
  278. const index = this.levelArr.indexOf(lvString)
  279. if (index === -1 || index === 0) {
  280. return num
  281. } else {
  282. return (num / Math.pow(10000, index)).toFixed(2) + lvString
  283. }
  284. }
  285. }
  286. if (m === undefined || m === null) {
  287. return ''
  288. } else {
  289. if (type === 'transfer') {
  290. return mUnit.transfer(m, lv)
  291. } else {
  292. return mUnit.test(m, type, lv)
  293. }
  294. }
  295. }
  296. // 时间戳转换 多少秒、多少分、多少小时前、多少天前 超出10天显示年月日
  297. // 传入一个时间戳
  298. export function dateFromNow (timestamp) {
  299. const date1 = new Date(timestamp) // 开始时间
  300. const date2 = new Date() // 结束时间
  301. const date3 = date2.getTime() - date1.getTime() // 时间差的毫秒数
  302. // 计算出相差天数
  303. const days = Math.floor(date3 / (24 * 3600 * 1000))
  304. // 计算出小时数
  305. const leave1 = date3 % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
  306. const hours = Math.floor(leave1 / (3600 * 1000))
  307. // 计算相差分钟数
  308. const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
  309. const minutes = Math.floor(leave2 / (60 * 1000))
  310. // 计算相差秒数
  311. let td = '30秒前'
  312. if (days > 0) {
  313. if (days > 10) {
  314. const date1year = date1.getFullYear()
  315. const date2year = date2.getFullYear()
  316. let date1month = date1.getMonth() + 1
  317. let date1day = date1.getDate()
  318. if (date1month < 10) {
  319. date1month = '0' + date1month
  320. }
  321. if (date1day < 10) {
  322. date1day = '0' + date1day
  323. }
  324. if (date1year < date2year) {
  325. td = date1.getFullYear() + '-' + date1month + '-' + date1day
  326. } else {
  327. td = date1month + '-' + date1day
  328. }
  329. } else {
  330. td = days + '天前'
  331. }
  332. } else if (hours > 0) {
  333. td = hours + '小时前'
  334. } else if (minutes > 0) {
  335. td = minutes + '分钟前'
  336. }
  337. return td
  338. }
  339. // 文件大小格式化
  340. export function formatSize (size, pointLength, units) {
  341. size = Number(size)
  342. let unit = ''
  343. units = units || ['B', 'K', 'M', 'G', 'TB']
  344. while ((unit = units.shift()) && size > 1024) {
  345. size = size / 1024
  346. }
  347. return (unit === 'B' ? size : size.toFixed(pointLength === undefined ? 2 : pointLength)) + (unit || '')
  348. }
  349. // 文件类型转换
  350. export function docTypeConvert (docType = 'pdf') {
  351. const typeMap = {
  352. doc: 'word',
  353. docx: 'word',
  354. xls: 'excel',
  355. xlsx: 'excel',
  356. ppt: 'ppt',
  357. pdf: 'pdf',
  358. txt: 'txt',
  359. 1: 'word', // doc
  360. 2: 'pdf',
  361. 3: 'excel', // xls
  362. 4: 'ppt',
  363. 5: 'txt',
  364. 6: '其他'
  365. }
  366. const type = typeMap[docType]
  367. return type || docType // map中不存在的,则返回原始类型
  368. }
  369. /**
  370. * 通用关键字高亮替换
  371. * @param {String} value 要高亮的字符串
  372. * @param {String|Array} oldChar 要被替换的字符串(或数组)
  373. * @param {String|Array} newChar 要替换成的字符串(或数组)
  374. *
  375. * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` 高亮
  376. * 则此时 value -> `剑鱼标讯工具函数`
  377. * oldChar -> `工具`
  378. * newChar -> `<span class="highlight-text">工具</span>`
  379. *
  380. * 批量高亮-----
  381. * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` `剑鱼` 高亮
  382. * 则此时 value -> `剑鱼标讯工具函数批量高亮`
  383. * oldChar -> ['工具', '剑鱼']
  384. * newChar -> ['<span class="highlight-text">', '</span>']
  385. *
  386. * 注意:此时newChar为一个长度为2的数组,数组中为高亮标签的起始标签和结束标签
  387. *
  388. */
  389. export function replaceKeyword (value, oldChar, newChar) {
  390. if (!oldChar || !newChar) return value
  391. // oldChar的字符串数组,用来循环替换
  392. var oldCharArr = []
  393. if (Array.isArray(oldChar)) {
  394. oldCharArr = oldChar.concat()
  395. } else {
  396. oldCharArr.push(oldChar)
  397. }
  398. // 数组去重
  399. oldCharArr = Array.from(new Set(oldCharArr))
  400. try {
  401. oldCharArr.forEach(function (item) {
  402. // 去空格之后为空字符串,则直接跳过当前替换
  403. if (item.replace(/\s+/g, '')) {
  404. var oc = item
  405. oc = oc.replace(/\$/g, '\\$')
  406. .replace(/\(/g, '\\(')
  407. .replace(/\)/g, '\\)')
  408. .replace(/\*/g, '\\*')
  409. .replace(/\+/g, '\\+')
  410. .replace(/\./g, '\\.')
  411. .replace(/\[/g, '\\[')
  412. .replace(/\]/g, '\\]')
  413. .replace(/\?/g, '\\?')
  414. .replace(/\\/g, '\\')
  415. .replace(/\//g, '\\/')
  416. .replace(/\^/g, '\\^')
  417. .replace(/\{/g, '\\{')
  418. .replace(/\}/g, '\\}')
  419. .replace(/\|/g, '\\|')
  420. if (Array.isArray(newChar)) {
  421. // 批量高亮
  422. var tempV = value
  423. value = value.replace(new RegExp('(' + oc + ')', 'gmi'), newChar[0] + oc + newChar[1])
  424. if (value === tempV && oc.indexOf('+') !== -1) {
  425. var splitReg = oc.split('\\+')
  426. splitReg.map(function (v) {
  427. value = value.replace(new RegExp('(' + v + ')', 'gmi'), newChar[0] + v + newChar[1])
  428. })
  429. }
  430. } else {
  431. // 普通单个高亮
  432. value = value.replace(new RegExp('(' + oc + ')', 'gmi'), newChar)
  433. }
  434. }
  435. })
  436. } catch (e) {
  437. console.log(e)
  438. return value
  439. }
  440. return value
  441. }
  442. export function recoveryPageData (key, defaultValues = []) {
  443. return sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key) || '') : defaultValues
  444. }