util.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. const util = {
  2. getStorageSync: (key) => {
  3. /*由于wx.getStorageSync有一定概率取不到值,若取不到再取一次*/
  4. try {
  5. let value = wx.getStorageSync(key);
  6. if (!value) {
  7. value = wx.getStorageSync(key);
  8. }
  9. return value;
  10. } catch (e) {
  11. return null;
  12. }
  13. },
  14. setStorageSync: (key, obj) => {
  15. /*wx.setStorageSync*/
  16. if (key && obj) {
  17. try {
  18. wx.setStorageSync(key, obj);
  19. } catch (e) {
  20. // Do something when catch error
  21. }
  22. }
  23. },
  24. removeStorageSync: (key) => {
  25. /*wx.removeStorageSync*/
  26. if (key) {
  27. try {
  28. wx.removeStorageSync(key);
  29. } catch (e) {
  30. // Do something when catch error
  31. }
  32. }
  33. },
  34. clearStorageSync: () => {
  35. /*wx.clearStorageSync*/
  36. try {
  37. wx.clearStorageSync();
  38. } catch (e) {
  39. // Do something when catch error
  40. }
  41. },
  42. showToast: (obj) => {
  43. /*wx.showToast*/
  44. try {
  45. wx.showToast({
  46. title: obj.title || "",
  47. icon: obj.icon || "none",
  48. duration: obj.duration || 3000,
  49. mask: obj.mask || false,
  50. });
  51. } catch (e) {
  52. // Do something when catch error
  53. }
  54. },
  55. showModal: (obj) => {
  56. if (!obj) return;
  57. try {
  58. wx.showModal({
  59. title: obj.title || "",
  60. content: obj.content || "",
  61. showCancel: obj.showCancel == null ? true : false,
  62. confirmText: obj.confirmText || "确定",
  63. success: function (res) {
  64. if (res.confirm) {
  65. if (obj.success) obj.success(res);
  66. }
  67. },
  68. });
  69. } catch (e) {
  70. // Do something when catch error
  71. }
  72. },
  73. showLoading: (obj) => {
  74. if (!obj) return;
  75. try {
  76. wx.showLoading({
  77. title: obj.title || "",
  78. content: obj.mask == null ? false : obj.mask,
  79. success: function (res) {
  80. if (res.confirm) {
  81. if (obj.success) obj.success(res);
  82. }
  83. },
  84. fail: function (res) {
  85. if (obj.fail) obj.fail(res);
  86. },
  87. complete: function (res) {
  88. if (obj.complete) obj.complete(res);
  89. },
  90. });
  91. } catch (e) {
  92. // Do something when catch error
  93. }
  94. },
  95. hideLoading: (obj) => {
  96. if (!obj) {
  97. try {
  98. wx.hideLoading();
  99. } catch (e) {
  100. // Do something when catch error
  101. }
  102. } else {
  103. try {
  104. wx.hideLoading({
  105. success: function (res) {
  106. if (res.confirm) {
  107. if (obj.success) obj.success(res);
  108. }
  109. },
  110. fail: function (res) {
  111. if (obj.fail) obj.fail(res);
  112. },
  113. complete: function (res) {
  114. if (obj.fail) obj.complete(res);
  115. },
  116. });
  117. } catch (e) {
  118. // Do something when catch error
  119. }
  120. }
  121. },
  122. promisify: (api) => {
  123. /*wx api使用转成Promise形式*/
  124. return (options, ...params) => {
  125. return new Promise((resolve, reject) => {
  126. const extras = {
  127. success: resolve,
  128. fail: reject,
  129. };
  130. api(
  131. {
  132. ...options,
  133. ...extras,
  134. },
  135. ...params
  136. );
  137. });
  138. };
  139. },
  140. isExist: (obj) => {
  141. if (
  142. null === obj ||
  143. obj === undefined ||
  144. obj === "undefined" ||
  145. "null" === obj
  146. ) {
  147. return false;
  148. }
  149. return true;
  150. },
  151. jsonClone: (obj) => {
  152. try {
  153. return JSON.parse(JSON.stringify(obj));
  154. } catch (e) {
  155. return obj;
  156. }
  157. },
  158. deepClone: (obj) => {
  159. /*深度克隆对象*/
  160. if (null === obj || "object" !== typeof obj) {
  161. return obj;
  162. }
  163. let clone;
  164. if (obj instanceof Date) {
  165. clone = new Date();
  166. clone.setTime(obj.getTime());
  167. return clone;
  168. }
  169. if (obj instanceof Array) {
  170. clone = [];
  171. let i,
  172. n = obj.length;
  173. for (i = 0; i < n; i++) {
  174. clone[i] = util.deepClone(obj[i]);
  175. }
  176. return clone;
  177. }
  178. if (obj instanceof Object) {
  179. clone = {};
  180. for (let key in obj) {
  181. if (obj.hasOwnProperty(key)) {
  182. clone[key] = util.deepClone(obj[key]);
  183. }
  184. }
  185. return clone;
  186. }
  187. throw new Error(`Unable to clone obj! Its type isn't supported.`);
  188. },
  189. arrayRemove: (val, arr) => {
  190. /*删除数组内某个元素*/
  191. if (!arr || !Array.isArray(arr)) {
  192. return;
  193. }
  194. arr.forEach((v, i, a) => {
  195. if (val === v) {
  196. a.splice(i, 1);
  197. }
  198. });
  199. },
  200. cstr: (s) => {
  201. /*处理null、undefined或NaN字符串*/
  202. if (s) {
  203. return s.toString();
  204. } else {
  205. return "";
  206. }
  207. },
  208. formatTimeCount: (t) => {
  209. /*格式化时间戳差*/
  210. if (t > 0) {
  211. let h = Math.floor((t / 60 / 60) % 24);
  212. if (h < 10) {
  213. h = `0${h}`;
  214. }
  215. let m = Math.floor((t / 60) % 60);
  216. if (m < 10) {
  217. m = `0${m}`;
  218. }
  219. let s = Math.floor(t % 60);
  220. if (s < 10) {
  221. s = `0${s}`;
  222. }
  223. return `${h}:${m}:${s}`;
  224. }
  225. return "";
  226. },
  227. formatTimeStr: (t) => {
  228. if (t) {
  229. t = parseInt(t);
  230. let time = new Date(t * 1000);
  231. let year = time.getFullYear();
  232. let month = time.getMonth() + 1;
  233. if (month < 10) {
  234. month = `0${month}`;
  235. }
  236. let date = time.getDate();
  237. if (date < 10) {
  238. date = `0${date}`;
  239. }
  240. let hour = time.getHours();
  241. if (hour < 10) {
  242. hour = `0${hour}`;
  243. }
  244. let minute = time.getMinutes();
  245. if (minute < 10) {
  246. minute = `0${minute}`;
  247. }
  248. let second = time.getSeconds();
  249. if (second < 10) {
  250. second = `0${second}`;
  251. }
  252. return `${year}-${month}-${date} ${hour}:${minute}:${second}`;
  253. }
  254. return "";
  255. },
  256. money: (m, c, w) => {
  257. /*m:金额;c:保留小数位数,只能取值0,1,2;w:1返回整个金额,2返回整数部分,3返回小数部分*/
  258. if (c !== 0 && c !== 1 && c !== 2) {
  259. console.log("传入保留小数位数参数错误");
  260. return "";
  261. }
  262. if (w !== 1 && w !== 2 && w !== 3) {
  263. console.log("传入返回类型参数错误");
  264. return "";
  265. }
  266. if (0 === m) {
  267. /*由于0=false,需特殊处理*/
  268. return deal("0", "");
  269. } else {
  270. if (!m || isNaN(m)) {
  271. return "";
  272. }
  273. m = m.toString();
  274. if (-1 === m.indexOf(".")) {
  275. return deal(m, "");
  276. } else {
  277. var s_arr = m.split(".");
  278. return deal(s_arr[0], s_arr[1]);
  279. }
  280. }
  281. function deal(p, f) {
  282. /*p为整数部分*/
  283. if (0 === c) {
  284. if (1 === w) {
  285. return p;
  286. } else if (2 === w) {
  287. return p;
  288. } else if (3 === w) {
  289. return "";
  290. }
  291. } else if (1 === c) {
  292. if (0 === f.length) {
  293. f = "0";
  294. } else if (f.length >= 2) {
  295. f = f.substring(0, 1);
  296. }
  297. if (1 === w) {
  298. return p + "." + f;
  299. } else if (2 === w) {
  300. return p;
  301. } else if (3 === w) {
  302. return f;
  303. }
  304. } else if (2 === c) {
  305. if (0 === f.length) {
  306. f = "00";
  307. } else if (1 === f.length) {
  308. f = f + "0";
  309. } else if (f.length >= 3) {
  310. f = f.substring(0, 2);
  311. }
  312. if (1 === w) {
  313. return p + "." + f;
  314. } else if (2 === w) {
  315. return p;
  316. } else if (3 === w) {
  317. return f;
  318. }
  319. }
  320. }
  321. },
  322. /**
  323. * 版本号比较
  324. * https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html
  325. */
  326. compareVersion: function (v1, v2) {
  327. v1 = v1.split(".");
  328. v2 = v2.split(".");
  329. const len = Math.max(v1.length, v2.length);
  330. while (v1.length < len) {
  331. v1.push("0");
  332. }
  333. while (v2.length < len) {
  334. v2.push("0");
  335. }
  336. for (let i = 0; i < len; i++) {
  337. const num1 = parseInt(v1[i]);
  338. const num2 = parseInt(v2[i]);
  339. if (num1 > num2) {
  340. return 1;
  341. } else if (num1 < num2) {
  342. return -1;
  343. }
  344. }
  345. return 0;
  346. },
  347. isUndef: (val) => {
  348. return val === undefined || val === null;
  349. },
  350. getUrlQuery(url) {
  351. const result = {};
  352. if (typeof url !== "string") return result;
  353. const query = url.split("?")[1];
  354. if (!query) return result;
  355. query.split("&").forEach((value) => {
  356. const v = value.split("=");
  357. result[v[0]] = v[1];
  358. });
  359. return result;
  360. },
  361. /**
  362. * 函数防抖(只执行最后一次点击)
  363. */
  364. debounce: (fn, delay) => {
  365. let timer = null;
  366. delay = delay || 300;
  367. return (...args) => {
  368. clearTimeout(timer);
  369. timer = setTimeout(() => {
  370. fn.apply(this, args);
  371. }, delay);
  372. };
  373. },
  374. /**
  375. * 函数节流
  376. */
  377. throttle: (fn, delay) => {
  378. let last = Date.now();
  379. delay = delay || 300;
  380. return (...args) => {
  381. let now = Date.now();
  382. if (now - last >= delay) {
  383. last = now;
  384. fn.apply(this, args);
  385. }
  386. };
  387. },
  388. getDateTimeStamp(dateStr) {
  389. return Date.parse(dateStr.replace(/-/gi, "/"));
  390. },
  391. getDateDiff(dateTimeStamp) {
  392. // dateTimeStamp为时间戳
  393. var minute = 1000 * 60;
  394. var hour = minute * 60;
  395. var day = hour * 24;
  396. var month = day * 30;
  397. var now = new Date().getTime();
  398. var diffValue = now - dateTimeStamp;
  399. if (diffValue < 0) {
  400. return "刚刚发表";
  401. }
  402. var monthC = diffValue / month;
  403. var weekC = diffValue / (7 * day);
  404. var dayC = diffValue / day;
  405. var hourC = diffValue / hour;
  406. var minC = diffValue / minute;
  407. var result;
  408. if (monthC >= 1) {
  409. result = parseInt(monthC) + "个月前";
  410. } else if (weekC >= 1) {
  411. result = parseInt(weekC) + "周前";
  412. } else if (dayC >= 1) {
  413. result = parseInt(dayC) + "天前";
  414. } else if (hourC >= 1) {
  415. result = parseInt(hourC) + "个小时前";
  416. } else if (minC >= 1) {
  417. result = parseInt(minC) + "分钟前";
  418. } else {
  419. result = "刚刚发表";
  420. }
  421. return result;
  422. },
  423. validator: {
  424. /*校验字段合法性rule*/
  425. checkMobile: (s) => {
  426. /*校验手机号格式是否正确*/
  427. if (s) {
  428. s = s.toString().trim();
  429. var rule = /^\d{3,20}$/;
  430. return rule.test(s);
  431. }
  432. return false;
  433. },
  434. checkEmail: (s) => {
  435. /*校验邮箱格式是否正确*/
  436. if (s) {
  437. s = s.toString().trim();
  438. 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,}))$/g;
  439. return rule.test(s);
  440. }
  441. return false;
  442. },
  443. checkPwd: (s) => {
  444. /*校验登录密码格式是否正确*/
  445. if (s) {
  446. s = s.toString().trim();
  447. var rule = /^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[a-zA-Z0-9]{8,16}$/;
  448. return rule.test(s);
  449. }
  450. return false;
  451. },
  452. checkCode: (s) => {
  453. /*校验短信或邮箱验证码格式是否正确*/
  454. if (s) {
  455. s = s.toString().trim();
  456. var rule = /^\d{6}$/;
  457. return rule.test(s);
  458. }
  459. return false;
  460. },
  461. checkImgCode: (s) => {
  462. /*校验图片验证码格式是否正确*/
  463. if (s) {
  464. s = s.toString().trim();
  465. var rule = /^[a-zA-Z]{4}$/;
  466. return rule.test(s);
  467. }
  468. return false;
  469. },
  470. checkNickname: (s) => {
  471. /*校验昵称格式是否正确*/
  472. if (s) {
  473. s = s.toString().trim();
  474. var rule = /^[A-Za-z0-9\u4e00-\u9fa5]{2,20}$/;
  475. return rule.test(s);
  476. }
  477. return false;
  478. },
  479. },
  480. };
  481. module.exports = util;