util2.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. import Md5 from './md52'
  2. import Base64 from './base64'
  3. import Cache from './cache'
  4. import Global from './global'
  5. //缓存 该缓存只在本文件调用
  6. let _storage = {}
  7. Cache.defineProperty(_storage, 'refreshPage')
  8. //工具类
  9. let util = {}
  10. //md5加密
  11. util.md5 = value => {
  12. return Md5(value)
  13. }
  14. //base64编码
  15. util.base64Encode = value => {
  16. return Base64.encode(value)
  17. }
  18. //base64解码
  19. util.base64Decode = value => {
  20. try {
  21. return Base64.decode(value)
  22. } catch (ex) {
  23. return value
  24. }
  25. }
  26. //是否为手机号码
  27. util.isPhone = phone => {
  28. let pat = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/
  29. return pat.test(phone)
  30. }
  31. //去除两边空格
  32. util.trim = value => {
  33. if (value) {
  34. return value.replace(/^\s+|\s+$/gm, '')
  35. }
  36. return ''
  37. }
  38. //根据QueryString参数名称获取值
  39. util.getQueryStringByName = (url, name) => {
  40. var result = url.match(new RegExp('[?&]' + name + '=([^&]+)', 'i'))
  41. if (result == null || result.length < 1) {
  42. return ''
  43. }
  44. return result[1]
  45. }
  46. // 时间函数-tian=0(获取当前时间)-accuracy=1(获取年月日)
  47. util.getTime = (tian, accuracy) => {
  48. //获取当前时间戳
  49. var timestamp = Date.parse(new Date())
  50. timestamp = timestamp / 1000
  51. var tomorrow_timetamp = timestamp - tian * 24 * 60 * 60
  52. var date = new Date(tomorrow_timetamp * 1000)
  53. //年
  54. var Y = date.getFullYear()
  55. //月
  56. var M =
  57. date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
  58. //日
  59. var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  60. //时
  61. var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  62. //分
  63. var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  64. //秒
  65. var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  66. var Time = Y + '-' + M + '-' + D
  67. var Time2 = Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s
  68. if (accuracy == '1') {
  69. return Time
  70. } else {
  71. return Time2
  72. }
  73. }
  74. // 格式化日期 2019-01-01 TT(WW)
  75. util.dateFormat = (
  76. value = new Date(),
  77. format = 'yyyy-MM-dd',
  78. isInit = false
  79. ) => {
  80. if (value) {
  81. var date = typeof value == 'string' ? value.replace(/\-/g, '/') : value
  82. var d = new Date(date)
  83. var week = ''
  84. var label = ''
  85. if (isInit) {
  86. var cdt = new Date()
  87. var cur = new Date(
  88. cdt.getFullYear() + '/' + (cdt.getMonth() + 1) + '/' + cdt.getDate()
  89. )
  90. var diffTime = d.getTime() - cur.getTime()
  91. var oneDayTime = 24 * 60 * 60 * 1000
  92. var twoDayTime = 48 * 60 * 60 * 1000
  93. var threeDayTime = 72 * 60 * 60 * 1000
  94. let weeks = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
  95. if (diffTime > 0) {
  96. if (diffTime <= oneDayTime) {
  97. label = '今天'
  98. } else if (diffTime <= twoDayTime) {
  99. label = '明天'
  100. } else if (diffTime <= threeDayTime) {
  101. label = '后天'
  102. }
  103. }
  104. week = weeks[d.getDay()]
  105. }
  106. var o = {
  107. 'T+': label,
  108. 'W+': week,
  109. 'M+': d.getMonth() + 1, //month
  110. 'd+': d.getDate(), //day
  111. 'h+': d.getHours(), //hour
  112. 'm+': d.getMinutes(), //minute
  113. 's+': d.getSeconds(), //second
  114. 'q+': Math.floor((d.getMonth() + 3) / 3), //quarter
  115. S: d.getMilliseconds() //millisecond
  116. }
  117. if (/(y+)/.test(format)) {
  118. format = format.replace(
  119. RegExp.$1,
  120. (d.getFullYear() + '').substr(4 - RegExp.$1.length)
  121. )
  122. }
  123. for (var k in o) {
  124. if (k == 'T+' && !label) continue
  125. if (new RegExp('(' + k + ')').test(format)) {
  126. format = format.replace(
  127. RegExp.$1,
  128. RegExp.$1.length == 1
  129. ? o[k]
  130. : ('00' + o[k]).substr(('' + o[k]).length)
  131. )
  132. }
  133. }
  134. return format
  135. }
  136. return value
  137. }
  138. //四舍五入保留2位小数(不够位数,则用0替补)
  139. util.keepTwoDecimalFull = num => {
  140. var result = parseFloat(num)
  141. if (isNaN(result)) {
  142. return false
  143. }
  144. result = Math.round(num * 100) / 100
  145. var s_x = result.toString()
  146. var pos_decimal = s_x.indexOf('.')
  147. if (pos_decimal < 0) {
  148. pos_decimal = s_x.length
  149. s_x += '.'
  150. }
  151. while (s_x.length <= pos_decimal + 2) {
  152. s_x += '0'
  153. }
  154. return s_x
  155. }
  156. // 活动倒计时 需要在外面调用 如:setInterval("countDown()",1000);
  157. util.countDown = (day, hour, minute, second) => {
  158. var flag = false
  159. second -= 1
  160. if (second == 0) {
  161. minute = minute - 1
  162. second = 60
  163. if (minute < 0) {
  164. hour = hour - 1
  165. minute = 59
  166. if (hour < 0) {
  167. day -= 1
  168. hour = 23
  169. if (day < 0) {
  170. flag = true
  171. }
  172. }
  173. }
  174. }
  175. if (flag) {
  176. return '活动结束'
  177. } else {
  178. return day + '天' + hour + '小时' + minute + '分' + second + '秒'
  179. }
  180. }
  181. // 两个时间相差 天 小时 分钟 秒 date1、date2格式:'2019-06-29 14:36:10'或'2019/06/29 14:36:10'
  182. util.timeComparison = (date1, date2) => {
  183. // var date1 = '2019-06-29 14:36:10'; //开始时间
  184. // var date2 = new Date(); //结束时间
  185. var date3 = date2.getTime() - date1.getTime() //时间差的毫秒数
  186. //------------------------------
  187. //计算出相差天数
  188. var days = Math.floor(date3 / (24 * 3600 * 1000))
  189. //计算出小时数
  190. var leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
  191. var hours = Math.floor(leave1 / (3600 * 1000))
  192. //计算相差分钟数
  193. var leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
  194. var minutes = Math.floor(leave2 / (60 * 1000))
  195. //计算相差秒数
  196. var leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
  197. var seconds = (leave3 / 1000).toFixed(1)
  198. return (
  199. ' 相差 ' +
  200. days +
  201. '天 ' +
  202. hours +
  203. '小时 ' +
  204. minutes +
  205. ' 分钟' +
  206. seconds +
  207. ' 秒'
  208. )
  209. }
  210. util.timeComparisonActive = (date1, date2, isNeedMillSecond = true) => {
  211. // var date1 = '2019-06-29 14:36:10'; //开始时间
  212. // var date2 = new Date(); //结束时间
  213. var date3 = date2.getTime() - date1.getTime() //时间差的毫秒数
  214. if (parseInt(date3) <= 0) {
  215. date3 = 0
  216. }
  217. //------------------------------
  218. //计算出相差天数
  219. var days = Math.floor(date3 / (24 * 3600 * 1000))
  220. //计算出小时数
  221. var leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
  222. var hours = Math.floor(leave1 / (3600 * 1000))
  223. //计算相差分钟数
  224. var leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
  225. var minutes = Math.floor(leave2 / (60 * 1000))
  226. //计算相差秒数
  227. var leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
  228. if (isNeedMillSecond) {
  229. var seconds = (leave3 / 1000).toFixed(1)
  230. } else {
  231. var seconds = Math.floor(leave3 / 1000)
  232. }
  233. var allSeconds =
  234. days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds
  235. hours = days * 24 + hours < 10 ? '0' + (days * 24 + hours) : days * 24 + hours
  236. minutes = minutes < 10 ? '0' + minutes : minutes
  237. seconds = seconds < 10 ? '0' + seconds : seconds
  238. days = days < 10 ? '0' + days : days
  239. var isEnd = allSeconds > 0 ? false : true
  240. return {days, hours, minutes, seconds, isEnd}
  241. }
  242. /**
  243. * 数组去重
  244. * @param {Array} arr 源数组
  245. *
  246. * @return {Array} newArr 去重后的数组
  247. */
  248. util.uniqueArray = (arr) => {
  249. let newArr = []
  250. arr.forEach(item => {
  251. return newArr.includes(item) ? '' : newArr.push(item)
  252. })
  253. return newArr
  254. }
  255. util.checkMobile = phoneStr => {
  256. if (phoneStr.length < 11) {
  257. return false
  258. } else if (!/^1[3|4|5|6|7|8][0-9]\d{4,8}$/.test(phoneStr)) {
  259. return false
  260. } else {
  261. return true
  262. }
  263. }
  264. /**
  265. * 序列化对象
  266. * @param {Object} data 标准JS对象 { key:value,... }
  267. */
  268. util.serialize = (data, isEncode = false) => {
  269. if (!data) return ''
  270. var pairs = []
  271. for (var name in data) {
  272. if (!data.hasOwnProperty(name)) continue
  273. if (typeof data[name] === 'function') continue
  274. var value =
  275. data[name] != null && typeof data[name] != 'undefined'
  276. ? data[name].toString()
  277. : ''
  278. if (isEncode) {
  279. name = encodeURIComponent(name)
  280. value = encodeURIComponent(value)
  281. }
  282. pairs.push(name + '=' + value)
  283. }
  284. return pairs.join('&')
  285. }
  286. // 判定指定路由是否在刷新队列
  287. util.isInRefreshList = (route = '') => {
  288. if (!route) return false
  289. let list = _storage.refreshPage || []
  290. return list.indexOf(route) != -1
  291. }
  292. // 添加指定页面到待刷新页面
  293. util.refreshPage = (routes = []) => {
  294. let list = _storage.refreshPage || []
  295. for (var i in routes) {
  296. let route = routes[i]
  297. if (route.indexOf('/') === 0) {
  298. console.error('routes[' + i + "] 不应该以 '/' 开头")
  299. } else {
  300. if (!list.includes(route)) {
  301. list.push(route)
  302. console.log('refreshPage push', list)
  303. }
  304. }
  305. }
  306. _storage.refreshPage = list
  307. }
  308. // 判定是否刷新当前页面并执行刷新
  309. util.doIsRefreshPage = route => {
  310. let isRefresh = false
  311. if (typeof route == 'string') {
  312. let page = route.indexOf('/') === 0 ? route.substring(1) : route
  313. let list = _storage.refreshPage || []
  314. let temp = []
  315. for (var i in list) {
  316. let item = list[i]
  317. if (item == page) {
  318. isRefresh = true
  319. } else {
  320. temp.push(item)
  321. }
  322. }
  323. _storage.refreshPage = temp
  324. }
  325. return isRefresh
  326. }
  327. //获取某一个页面上下文 context
  328. util.getPageCtx = (idx = 0) => {
  329. let pages = getCurrentPages()
  330. if (pages.length > 0) {
  331. return pages[pages.length - 1 - idx] || {}
  332. }
  333. return {}
  334. }
  335. /**
  336. * 生成日期对象
  337. * @param {String,Number} value 日期 字符串 或者 毫秒数字
  338. * @return {Date} [date = new Date()] 日期对象
  339. */
  340. util.createDate = (value) => {
  341. let date = typeof (value) == 'string' ? value.replace(/\-/g, '/') : value
  342. return new Date(date)
  343. }
  344. //获取当前页面路由
  345. util.getCurrentRoute = () => {
  346. let page = util.getPageCtx()
  347. if (page.route) {
  348. return page.route
  349. }
  350. return ''
  351. }
  352. //更新管理
  353. util.updateManager = () => {
  354. if (
  355. [
  356. Global.platform.baidu,
  357. Global.platform.weixin,
  358. Global.platform.toutiao
  359. ].includes(process.env.VUE_APP_PLATFORM)
  360. ) {
  361. const updateManager = uni.getUpdateManager()
  362. updateManager.onCheckForUpdate(res => {
  363. // 请求完新版本信息的回调
  364. // console.log('updateManager', res.hasUpdate)
  365. })
  366. updateManager.onUpdateReady(() => {
  367. wx.showModal({
  368. title: '更新提示',
  369. content: '新版本已经准备好,是否重启应用?',
  370. success: res => {
  371. if (res.confirm) {
  372. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  373. updateManager.applyUpdate()
  374. }
  375. }
  376. })
  377. })
  378. updateManager.onUpdateFailed(() => {
  379. // 新版本下载失败
  380. })
  381. }
  382. }
  383. util.preview = async (src) => {
  384. const urls = typeof src === 'string' ? [src] : src
  385. const filePath = async src => src.match(/^http/) ? src : (await uni.compressImage({
  386. src,
  387. quality: 100
  388. }))[1].tempFilePath
  389. for (let i = 0; i < urls.length; i++) {
  390. urls[i] = await filePath(urls[i])
  391. }
  392. uni.previewImage({urls})
  393. }
  394. /**
  395. * 订阅认证信息
  396. */
  397. util.subscribe = (tmplIds) => {
  398. return new Promise((resolve, reject) => {
  399. uni.requestSubscribeMessage({
  400. tmplIds,
  401. success(res) {
  402. resolve(res)
  403. },
  404. fail(err) {
  405. reject(err)
  406. }
  407. })
  408. })
  409. }
  410. //回到上一页刷新页面
  411. util.isReloadAndBack = () => {
  412. let prePage = util.getPageCtx(1)
  413. prePage.setData({
  414. "reload": true
  415. })
  416. uni.navigateBack({
  417. delta: 1
  418. })
  419. }
  420. //onshow方法通过刷新mescroll数据
  421. util.reload = (mescroll) => {
  422. let page = util.getPageCtx()
  423. if (page.data.reload) {
  424. mescroll.resetUpScroll();
  425. page.data.reload = false
  426. }
  427. }
  428. util.showModal = (content, isShowCancel = true, title = '提示',) => {
  429. return new Promise((resolve, reject) => {
  430. uni.showModal({
  431. title: title,
  432. content: content,
  433. showCancel: isShowCancel,
  434. success: (res) => {
  435. if (res.confirm) {
  436. resolve(res)
  437. }
  438. }
  439. });
  440. })
  441. }
  442. util.showLoading = (title = '加载中...') => {
  443. uni.showLoading({
  444. title
  445. })
  446. }
  447. export default util