util.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. /**
  2. * @param {*} date
  3. * @returns 2019/08/10 12:12:12
  4. */
  5. export const formatTime = date => {
  6. const year = date.getFullYear()
  7. const month = date.getMonth() + 1
  8. const day = date.getDate()
  9. const hour = date.getHours()
  10. const minute = date.getMinutes()
  11. const second = date.getSeconds()
  12. return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
  13. }
  14. const formatNumber = n => {
  15. n = n.toString()
  16. return n[1] ? n : '0' + n
  17. }
  18. /**
  19. * 版本号比较
  20. * https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html
  21. */
  22. export const compareVersion = function (v1, v2) {
  23. v1 = v1.split('.')
  24. v2 = v2.split('.')
  25. const len = Math.max(v1.length, v2.length)
  26. while (v1.length < len) {
  27. v1.push('0')
  28. }
  29. while (v2.length < len) {
  30. v2.push('0')
  31. }
  32. for (let i = 0; i < len; i++) {
  33. const num1 = parseInt(v1[i])
  34. const num2 = parseInt(v2[i])
  35. if (num1 > num2) {
  36. return 1
  37. } else if (num1 < num2) {
  38. return -1
  39. }
  40. }
  41. return 0
  42. }
  43. // 由于wx.getStorageSync有一定概率取不到值,若取不到再取一次
  44. export const getStorageSync = key => {
  45. try {
  46. let value = wx.getStorageSync(key)
  47. if (!value) {
  48. value = wx.getStorageSync(key)
  49. }
  50. return value || ''
  51. } catch (e) {
  52. return ''
  53. }
  54. }
  55. export const setStorageSync = (key, value) => {
  56. if (key) {
  57. try {
  58. wx.setStorageSync(key, isUndef(value) ? '' : value)
  59. } catch (e) {
  60. // Do something when catch error
  61. }
  62. }
  63. }
  64. export const removeStorageSync = key => {
  65. if (key) {
  66. try {
  67. wx.removeStorageSync(key)
  68. } catch (e) {
  69. // Do something when catch error
  70. }
  71. }
  72. }
  73. export const clearStorageSync = () => {
  74. try {
  75. wx.clearStorageSync()
  76. } catch (e) {
  77. // Do something when catch error
  78. }
  79. }
  80. // 获取用户登录信息
  81. export const getLoginUserInfo = () => {
  82. return getStorageSync('USERINFO')
  83. }
  84. export const showToast = obj => {
  85. /*wx.showToast*/
  86. if (!obj || !obj.title) {
  87. return console.warn('title is required!')
  88. }
  89. try {
  90. obj.icon = obj.icon || 'none'
  91. obj.duration = obj.duration || 3000
  92. obj.mask = obj.mask || false
  93. wx.showToast(obj)
  94. } catch (e) {
  95. // Do something when catch error
  96. }
  97. }
  98. export const showModal = obj => {
  99. if (!obj || !obj.content) {
  100. return console.warn('content is required!')
  101. }
  102. try {
  103. wx.showModal({
  104. title: obj.title || '',
  105. content: obj.content || '',
  106. showCancel: obj.showCancel ? true : false,
  107. cancelText: obj.cancelText || '取消',
  108. confirmText: obj.confirmText || '确定',
  109. success: function (res) {
  110. if (obj.success) obj.success(res)
  111. }
  112. })
  113. } catch (e) {
  114. // Do something when catch error
  115. }
  116. }
  117. export const showLoading = obj => {
  118. if (!obj || !obj.title) {
  119. return console.warn('title is required!')
  120. }
  121. try {
  122. wx.showLoading({
  123. title: obj.title,
  124. mask: obj.mask || false,
  125. success: function (res) {
  126. if (obj.success) obj.success(res)
  127. }
  128. })
  129. } catch (e) {
  130. // Do something when catch error
  131. }
  132. }
  133. export const hideLoading = obj => {
  134. try {
  135. wx.hideLoading({
  136. success: function (res) {
  137. if (obj && obj.success) obj.success(res)
  138. }
  139. })
  140. } catch (e) {
  141. // Do something when catch error
  142. }
  143. }
  144. export const showActionSheet = function (obj) {
  145. try {
  146. wx.showActionSheet({
  147. itemList: obj.itemList,
  148. itemColor: obj.itemColor || '#000',
  149. success(res) {
  150. if (obj.success) obj.success(res.tapIndex)
  151. },
  152. fail(res) {
  153. if (obj.fail) obj.fail(res)
  154. }
  155. })
  156. } catch (e) {
  157. // Do something when catch error
  158. }
  159. }
  160. export const chooseImage = function (obj) {
  161. if (!obj) return
  162. try {
  163. wx.chooseImage({
  164. count: obj.count || 1,
  165. sizeType: obj.sizeType || ['original', 'compressed'],
  166. sourceType: obj.sourceType || ['album', 'camera'],
  167. success(res) {
  168. // tempFilePath可以作为img标签的src属性显示图片
  169. const tempFilePaths = res.tempFilePaths
  170. if (obj.success) obj.success(tempFilePaths)
  171. }
  172. })
  173. } catch (e) {
  174. // Do something when catch error
  175. }
  176. }
  177. export const reLaunch = function (path) {
  178. try {
  179. wx.reLaunch({
  180. url: path
  181. })
  182. } catch (e) {
  183. // Do something when catch error
  184. }
  185. }
  186. export const redirectTo = function (path) {
  187. try {
  188. wx.redirectTo({
  189. url: path
  190. })
  191. } catch (e) {
  192. // Do something when catch error
  193. }
  194. }
  195. export const navigateTo = function (path) {
  196. try {
  197. wx.navigateTo({
  198. url: path
  199. })
  200. } catch (e) {
  201. // Do something when catch error
  202. }
  203. }
  204. export const navigateBack = function (delta) {
  205. try {
  206. wx.navigateBack({
  207. delta: delta || 1
  208. })
  209. } catch (e) {
  210. // Do something when catch error
  211. }
  212. }
  213. export const promisify = fun => {
  214. /* function使用转成Promise形式 */
  215. return (options, ...params) => {
  216. return new Promise((resolve, reject) => {
  217. const extras = {
  218. success: resolve,
  219. fail: reject
  220. }
  221. fun({
  222. ...options,
  223. ...extras
  224. },
  225. ...params
  226. )
  227. })
  228. }
  229. }
  230. export const filterEmoji = str => {
  231. /*过滤表情*/
  232. if (str) {
  233. return str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, '')
  234. }
  235. return ''
  236. }
  237. export const isUndef = val => {
  238. return val === undefined || val === null
  239. }
  240. export const isDef = val => {
  241. return val !== undefined && val !== null
  242. }
  243. export const deepClone = obj => {
  244. /*深度克隆对象*/
  245. if (null === obj || 'object' !== typeof obj) {
  246. return obj
  247. }
  248. let clone
  249. if (obj instanceof Date) {
  250. clone = new Date()
  251. clone.setTime(obj.getTime())
  252. return clone
  253. }
  254. if (obj instanceof Array) {
  255. clone = []
  256. let i,
  257. n = obj.length
  258. for (i = 0; i < n; i++) {
  259. clone[i] = util.deepClone(obj[i])
  260. }
  261. return clone
  262. }
  263. if (obj instanceof Object) {
  264. clone = {}
  265. for (let key in obj) {
  266. if (obj.hasOwnProperty(key)) {
  267. clone[key] = util.deepClone(obj[key])
  268. }
  269. }
  270. return clone
  271. }
  272. throw new Error(`Unable to clone obj! Its type isn't supported.`)
  273. }
  274. export const money = (m, c, w) => {
  275. /*m:金额c:保留小数位数,只能取值0,1,2w:1返回整个金额,2返回整数部分,3返回小数部分*/
  276. if (c !== 0 && c !== 1 && c !== 2) {
  277. console.log('传入保留小数位数参数错误')
  278. return ''
  279. }
  280. if (w !== 1 && w !== 2 && w !== 3) {
  281. console.log('传入返回类型参数错误')
  282. return ''
  283. }
  284. if (0 === m) {
  285. /*由于0=false,需特殊处理*/
  286. return deal('0', '')
  287. } else {
  288. if (!m || isNaN(m)) {
  289. return ''
  290. }
  291. m = m.toString()
  292. if (-1 === m.indexOf('.')) {
  293. return deal(m, '')
  294. } else {
  295. var s_arr = m.split('.')
  296. return deal(s_arr[0], s_arr[1])
  297. }
  298. }
  299. function deal(p, f) {
  300. /*p为整数部分*/
  301. if (0 === c) {
  302. if (1 === w) {
  303. return p
  304. } else if (2 === w) {
  305. return p
  306. } else if (3 === w) {
  307. return ''
  308. }
  309. } else if (1 === c) {
  310. if (0 === f.length) {
  311. f = '0'
  312. } else if (f.length >= 2) {
  313. f = f.substring(0, 1)
  314. }
  315. if (1 === w) {
  316. return p + '.' + f
  317. } else if (2 === w) {
  318. return p
  319. } else if (3 === w) {
  320. return f
  321. }
  322. } else if (2 === c) {
  323. if (0 === f.length) {
  324. f = '00'
  325. } else if (1 === f.length) {
  326. f = f + '0'
  327. } else if (f.length >= 3) {
  328. f = f.substring(0, 2)
  329. }
  330. if (1 === w) {
  331. return p + '.' + f
  332. } else if (2 === w) {
  333. return p
  334. } else if (3 === w) {
  335. return f
  336. }
  337. }
  338. }
  339. }
  340. // ahex 转 rgba
  341. export const colorToRgba = (color) => {
  342. let rgba = ''
  343. color = color.substr(1)
  344. let colorLen = color.length
  345. let aValue, rValue, gValue, bValue
  346. aValue = '0xFF'
  347. if (colorLen === 6 || colorLen === 8) {
  348. if (colorLen === 8) {
  349. aValue = '0x' + color.substr(0, 2)
  350. color = color.substr(2)
  351. }
  352. rValue = '0x' + color.substr(0, 2)
  353. gValue = '0x' + color.substr(2, 2)
  354. bValue = '0x' + color.substr(4, 2)
  355. let alpha = parseInt(aValue) / 255.0
  356. if (JSON.stringify(alpha).length > 4) {
  357. //小数点超过三位,四舍五入小数点后两位
  358. alpha = alpha.toFixed(2)
  359. }
  360. rgba =
  361. 'rgba(' +
  362. parseInt(rValue) +
  363. ',' +
  364. parseInt(gValue) +
  365. ',' +
  366. parseInt(bValue) +
  367. ',' +
  368. alpha +
  369. ')'
  370. }
  371. return rgba
  372. }
  373. export const dateToTimestamp = (date) => {
  374. // 可以这样做
  375. var timestamp = new Date(date.replace(/-/g, '/')).valueOf()
  376. return timestamp
  377. }
  378. export const timestampToDate = (timestamp) => {
  379. let date = new Date(timestamp * 1000)
  380. const Y = date.getFullYear() + '-'
  381. const M =
  382. (date.getMonth() + 1 < 10 ?
  383. '0' + (date.getMonth() + 1) :
  384. date.getMonth() + 1) + '-'
  385. const D = date.getDate()
  386. return Y + M + D
  387. }
  388. // 脱敏处理,str脱敏字符串,左边保留字数,右边保留字数,替换字符串*
  389. export const desensitization = (str, begin, end, char) => {
  390. let len = str.length
  391. const c = char || '*'
  392. if (len > 1) {
  393. if (len <= begin) {
  394. let leftStr = str.substring(0, 1)
  395. let s = ''
  396. try {
  397. for (let i = 1; i < len; i++) {
  398. s = s + c
  399. }
  400. } catch (error) {
  401. return str
  402. }
  403. s = leftStr + s
  404. return s
  405. } else if (len <= end) {
  406. let leftStr = str.substring(0, begin)
  407. let rightStr = str.substring(len - 1, len)
  408. let s = ''
  409. try {
  410. for (let i = 0; i < len - begin; i++) {
  411. s = s + c
  412. }
  413. } catch (error) {
  414. return str
  415. }
  416. s = leftStr + s + rightStr
  417. return s
  418. } else {
  419. var leftStr = str.substring(0, begin)
  420. var rightStr = str.substring(len - end, len)
  421. let s = ''
  422. try {
  423. for (let i = 0; i < len - end - begin; i++) {
  424. s = s + c
  425. }
  426. } catch (error) {
  427. return str
  428. }
  429. s = leftStr + s + rightStr
  430. return s
  431. }
  432. } else {
  433. return str
  434. }
  435. }
  436. /**
  437. * 表单验证
  438. */
  439. export const validator = {
  440. /*校验字段合法性rule*/
  441. checkMobile: s => {
  442. /*校验手机号格式是否正确*/
  443. if (s) {
  444. var rule = /^\d{3,20}$/
  445. return rule.test(s)
  446. }
  447. return false
  448. },
  449. checkEmail: s => {
  450. /*校验邮箱格式是否正确*/
  451. if (s) {
  452. var rule = /^(([^<>()\[\]\\.,:\s@"]+(\.[^<>()\[\]\\.,:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  453. return rule.test(s)
  454. }
  455. return false
  456. },
  457. checkPwd: s => {
  458. /*校验登录密码格式是否正确*/
  459. if (s) {
  460. var rule = /^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[a-zA-Z0-9]{8,16}$/
  461. return rule.test(s)
  462. }
  463. return false
  464. },
  465. checkCode: s => {
  466. /*校验短信或邮箱验证码格式是否正确*/
  467. if (s) {
  468. var rule = /^\d{6}$/
  469. return rule.test(s)
  470. }
  471. return false
  472. },
  473. checkImgCode: s => {
  474. /*校验图片验证码格式是否正确*/
  475. if (s) {
  476. var rule = /^[a-zA-Z]{4}$/
  477. return rule.test(s)
  478. }
  479. return false
  480. },
  481. checkNickname: s => {
  482. /*校验昵称格式是否正确*/
  483. if (s) {
  484. var rule = /^[A-Za-z0-9\u4e00-\u9fa5]{2,20}$/
  485. return rule.test(s)
  486. }
  487. return false
  488. }
  489. }