FuncUtils.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. module.exports = {
  2. // ********** 其他 ********** //
  3. /**
  4. * 判断对象是否是字符串类型
  5. *
  6. * @author Wetion
  7. * @date 2019-03-22
  8. * @param {object} obj
  9. * @returns {Boolean}
  10. */
  11. isString (obj) {
  12. return Object.prototype.toString.call(obj) == '[object String]';
  13. },
  14. /**
  15. * 判断对象是否是数字类型
  16. *
  17. * @author Wetion
  18. * @date 2019-03-22
  19. * @param {object} obj
  20. * @returns {Boolean}
  21. */
  22. isNumber (obj) {
  23. return Object.prototype.toString.call(obj) == '[object Number]' && !isNaN(obj);
  24. },
  25. /**
  26. * 判断对象是否是布尔类型
  27. *
  28. * @author Wetion
  29. * @date 2019-03-22
  30. * @param {object} obj
  31. * @returns {Boolean}
  32. */
  33. isBoolean (obj) {
  34. return Object.prototype.toString.call(obj) == '[object Boolean]';
  35. },
  36. /**
  37. * 判断对象是否是数组类型
  38. *
  39. * @author Wetion
  40. * @date 2019-03-22
  41. * @param {object} obj
  42. * @returns {Boolean}
  43. */
  44. isArray (obj) {
  45. return Object.prototype.toString.call(obj) == '[object Array]';
  46. },
  47. /**
  48. * 判断对象是否是字典类型
  49. *
  50. * @author Wetion
  51. * @date 2019-03-22
  52. * @param {object} obj
  53. * @returns {Boolean}
  54. */
  55. isObject (obj) {
  56. return Object.prototype.toString.call(obj) == '[object Object]';
  57. },
  58. /**
  59. * 判断对象是否是未定义类型
  60. *
  61. * @author Wetion
  62. * @date 2019-03-22
  63. * @param {object} obj
  64. * @returns {Boolean}
  65. */
  66. isUndefined (obj) {
  67. return Object.prototype.toString.call(obj) == '[object Undefined]';
  68. },
  69. /**
  70. * 判断对象是否是函数类型
  71. *
  72. * @author Wetion
  73. * @date 2019-03-22
  74. * @param {object} obj
  75. * @returns {Boolean}
  76. */
  77. isFunction (obj) {
  78. return Object.prototype.toString.call(obj) == '[object Function]';
  79. },
  80. /**
  81. * 判断对象是否是空类型
  82. *
  83. * @author Wetion
  84. * @date 2019-03-22
  85. * @param {object} obj
  86. * @returns {Boolean}
  87. */
  88. isNull (obj) {
  89. return Object.prototype.toString.call(obj) == '[object Null]';
  90. },
  91. /**
  92. * 判断对象是否是标志类型
  93. *
  94. * @author Wetion
  95. * @date 2019-03-22
  96. * @param {object} obj
  97. * @returns {Boolean}
  98. */
  99. isSymbol (obj) {
  100. return Object.prototype.toString.call(obj) == '[object Symbol]';
  101. },
  102. /**
  103. * @description 整型长度补零
  104. * @author Wetion
  105. * @date 2019-05-21
  106. * @param {Number} num
  107. * @param {Number} length
  108. * @returns {String}
  109. */
  110. prefixInteger (num, length) {
  111. return (Array(length).join('0') + num).slice(-length);
  112. },
  113. /**
  114. * 拷贝对象
  115. *
  116. * @author Wetion
  117. * @date 2019-03-22
  118. * @param {object} obj 仅支持 Number, String, Array, Object, Boolean
  119. * @returns {object}
  120. */
  121. clone (obj) {
  122. return JSON.parse(JSON.stringify(obj));
  123. },
  124. // ********** Array ********** //
  125. /**
  126. * Buffer转字数组
  127. *
  128. * @author Wetion
  129. * @date 2019-03-22
  130. * @param {ArrayBuffer} buffer
  131. * @returns {Uint8Array}
  132. */
  133. bufferToUint8 (buffer) {
  134. let v = new DataView(buffer, 0);
  135. let a = new Array();
  136. for (let i = 0; i < v.byteLength; i++) {
  137. a[i] = v.getUint8(i);
  138. }
  139. return a;
  140. },
  141. /**
  142. * Buffer转字符串
  143. *
  144. * @author Wetion
  145. * @date 2019-03-22
  146. * @param {ArrayBuffer} buffer
  147. * @returns {string}
  148. */
  149. bufferToString (buffer) {
  150. return String.fromCharCode.apply(undefined, new Uint8Array(buffer));
  151. },
  152. /**
  153. * 数组转Buffer
  154. *
  155. * @author Wetion
  156. * @date 2019-03-22
  157. * @param {Uint8Array} arr
  158. * @returns {ArrayBuffer}
  159. */
  160. uint8ToBuffer (arr) {
  161. let b = new ArrayBuffer(arr.length);
  162. let v = new DataView(b, 0);
  163. for (let i = 0; i < arr.length; i++) {
  164. v.setUint8(i, arr[i]);
  165. }
  166. return b;
  167. },
  168. /**
  169. * Uint8数组转字符串
  170. *
  171. * @author Wetion
  172. * @date 2019-03-22
  173. * @param {Uint8Array} arr
  174. * @returns {String}
  175. */
  176. uint8ToString (arr){
  177. let dataString = '';
  178. for (let i = 0; i < arr.length; i++) {
  179. dataString += String.fromCharCode(arr[i]);
  180. }
  181. return dataString;
  182. },
  183. /**
  184. * utf8字符数组转字符串
  185. *
  186. * @author Wetion
  187. * @date 2019-03-22
  188. * @param {Array} arr
  189. * @returns {String}
  190. */
  191. utf8ToString (arr) {
  192. if (typeof arr === 'string') {
  193. return undefined;
  194. }
  195. let utf = '';
  196. for (let i = 0; i < arr.length; i++) {
  197. if (arr[i] == undefined) {
  198. break;
  199. }
  200. let one = arr[i].toString(2);
  201. let v = one.match(/^1+?(?=0)/);
  202. if (v && one.length == 8) {
  203. let bytesLength = v[0].length;
  204. let store = arr[i].toString(2).slice(7 - bytesLength);
  205. for (let st = 1; st < bytesLength; st++) {
  206. store += arr[st + i].toString(2).slice(2);
  207. }
  208. utf += String.fromCharCode(parseInt(store, 2));
  209. i += bytesLength - 1;
  210. } else {
  211. utf += String.fromCharCode(arr[i]);
  212. }
  213. }
  214. return utf;
  215. },
  216. /**
  217. * 数组查找元素
  218. *
  219. * @author Wetion
  220. * @date 2019-03-22
  221. * @param {Array} arr
  222. * @param {object} obj 要查找的对象
  223. * @returns {Number} 下标或-1
  224. */
  225. arraySearch (arr, obj) {
  226. for (let i in arr){
  227. if (arr[i] == obj){
  228. return i;
  229. }
  230. }
  231. return -1;
  232. },
  233. /**
  234. * 数组删除对象
  235. *
  236. * @author Wetion
  237. * @date 2019-03-22
  238. * @param {Array} arr
  239. * @param {object} obj 要删除的对象
  240. * @returns {Boolean} 删除结果 成功/失败
  241. */
  242. arrayRemove (arr, obj) {
  243. let index = this.arraySearch(arr, obj);
  244. if (index > -1) {
  245. arr.splice(index, 1);
  246. return true;
  247. }
  248. return false;
  249. },
  250. /**
  251. * 数组中是否存在某个对象
  252. *
  253. * @author Wetion
  254. * @date 2019-03-22
  255. * @param {Array} arr
  256. * @param {object} obj
  257. * @returns {Boolean}
  258. */
  259. arrayIsExist (arr, obj) {
  260. let index = this.arraySearch(arr, obj);
  261. return index > -1 ? true : false;
  262. },
  263. /**
  264. * 数组去重 (用的是Array的from方法)
  265. *
  266. * @author Wetion
  267. * @date 2019-03-22
  268. * @param {Array} arr
  269. * @returns {Array} 去重后的数组
  270. */
  271. arrayUnique (arr) {
  272. return Array.from(new Set(arr));
  273. },
  274. /**
  275. * 将数组乱序输出
  276. *
  277. * @author Wetion
  278. * @date 2019-03-22
  279. * @param {Array} arr
  280. * @returns {Array} 打乱后的数组
  281. */
  282. arrayUpset (arr) {
  283. return arr.sort(function (){
  284. return Math.random() - 0.5;
  285. });
  286. },
  287. /**
  288. * 获取数组的最大值,最小值,只针对数字类型的数组
  289. *
  290. * @author Wetion
  291. * @date 2019-03-22
  292. * @param {Array} arr
  293. * @param {Number} type 0:最小值,1:最大值
  294. * @returns {Number}
  295. */
  296. arrayCompare (arr, type) {
  297. if (type == 1){
  298. return Math.max.apply(undefined, arr);
  299. } else {
  300. return Math.min.apply(undefined, arr);
  301. }
  302. },
  303. /**
  304. * 得到数组的和,只针对数字类型数组
  305. *
  306. * @author Wetion
  307. * @date 2019-03-22
  308. * @param {Array} arr
  309. * @returns {Number} 和
  310. */
  311. arraySum (arr) {
  312. let sum = 0;
  313. for (let i = 0, len = arr.length; i < len; i++){
  314. sum += arr[i];
  315. }
  316. return sum;
  317. },
  318. /**
  319. * 数组的平均值,只针对数字类型数组,小数点可能会有很多位,这里不做处理,处理了使用就不灵活了!
  320. *
  321. * @author Wetion
  322. * @date 2019-03-22
  323. * @param {Array} arr
  324. * @returns {Number} 平均值
  325. */
  326. arrayAverage (arr) {
  327. let sum = this.arraySum(arr);
  328. let average = sum / arr.length;
  329. return average ;
  330. },
  331. /**
  332. * 随机获取数组中的某个元素
  333. *
  334. * @author Wetion
  335. * @date 2019-03-22
  336. * @param {Array} arr
  337. * @returns {object} 随机获取的对象
  338. */
  339. arrayRandom (arr) {
  340. return arr[Math.floor(Math.random() * arr.length)];
  341. },
  342. /**
  343. * 统计某个元素在数组中出现的次数
  344. *
  345. * @author Wetion
  346. * @date 2019-03-22
  347. * @param {Array} arr
  348. * @param {object} obj
  349. * @returns {Number} 出现的次数
  350. */
  351. arrayElementCount (arr, obj) {
  352. let num = 0;
  353. for (let i = 0, len = arr.length; i < len; i++) {
  354. if (obj == arr[i]) {
  355. num++;
  356. }
  357. }
  358. return num;
  359. },
  360. /**
  361. * @description 判断数组是否包含另一个数组
  362. * @author Wetion
  363. * @date 2019-05-22
  364. * @param {Array} aa
  365. * @param {Array} bb
  366. * @returns
  367. */
  368. arrayIsContained (aa, bb) {
  369. if (!(aa instanceof Array) || !(bb instanceof Array) || ((aa.length < bb.length))) {
  370. return false;
  371. }
  372. for (let i = 0; i < bb.length; i++) {
  373. let flag = false;
  374. for (let j = 0; j < aa.length; j++){
  375. if (aa[j] == bb[i]){
  376. flag = true;
  377. break;
  378. }
  379. }
  380. if (flag == false){
  381. return flag;
  382. }
  383. }
  384. return true;
  385. },
  386. // ********** String ********** //
  387. /**
  388. * 字符串转Buffer
  389. *
  390. * @author Wetion
  391. * @date 2019-03-22
  392. * @param {String} str
  393. * @returns {ArrayBuffer}
  394. */
  395. stringToBuffer (str) {
  396. let buf = new ArrayBuffer(str.length * 2); // 每个字符占用2个字节
  397. let bufView = new Uint16Array(buf);
  398. for (let i = 0, strLen = str.length; i < strLen; i++) {
  399. bufView[i] = str.charCodeAt(i);
  400. }
  401. return buf;
  402. },
  403. /**
  404. * 字符串转Uint8数组
  405. *
  406. * @author Wetion
  407. * @date 2019-03-22
  408. * @param {String} str
  409. * @returns {Uint8Array}
  410. */
  411. stringToUint8 (str){
  412. let arr = [];
  413. for (let i = 0, j = str.length; i < j; ++i) {
  414. arr.push(str.charCodeAt(i));
  415. }
  416. return new Uint8Array(arr);
  417. },
  418. /**
  419. * 字符串转utf8字符数组
  420. *
  421. * @author Wetion
  422. * @date 2019-03-22
  423. * @param {String} str
  424. * @returns {Array}
  425. */
  426. stringToUTF8 (str) {
  427. let back = [];
  428. for (let i = 0; i < str.length; i++) {
  429. let code = str.charCodeAt(i);
  430. if (0x00 <= code && code <= 0x7f) {
  431. back.push(code);
  432. } else if (0x80 <= code && code <= 0x7ff) {
  433. back.push((192 | (31 & (code >> 6))));
  434. back.push((128 | (63 & code)));
  435. } else if ((0x800 <= code && code <= 0xd7ff) || (0xe000 <= code && code <= 0xffff)) {
  436. back.push((224 | (15 & (code >> 12))));
  437. back.push((128 | (63 & (code >> 6))));
  438. back.push((128 | (63 & code)));
  439. }
  440. }
  441. for (let i = 0; i < back.length; i++) {
  442. back[i] &= 0xff;
  443. }
  444. return back;
  445. },
  446. // ********** 正则表达式 ********** //
  447. /**
  448. * 验证输入的字符串是否是有效的IP地址
  449. *
  450. * @author Wetion
  451. * @date 2019-03-22
  452. * @param {String} str
  453. * @returns {Boolean}
  454. */
  455. isIP (str) {
  456. let re = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
  457. return re.test(str);
  458. },
  459. /**
  460. * 判断是否是有效的端口(0~65535)
  461. *
  462. * @author Wetion
  463. * @date 2019-03-22
  464. * @param {Number} num
  465. * @returns {Boolean}
  466. */
  467. isPort (num) {
  468. let re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
  469. return re.test(num);
  470. },
  471. /**
  472. * 验证输入的字符串是否是域名
  473. *
  474. * @author Wetion
  475. * @date 2019-03-22
  476. * @param {String} str
  477. * @returns {Boolean}
  478. */
  479. isDomain (str) {
  480. let re = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/;
  481. return re.test(str);
  482. },
  483. /**
  484. * 验证输入的字符串是否是URL
  485. *
  486. * @author Wetion
  487. * @date 2019-03-22
  488. * @param {String} str
  489. * @returns {Boolean}
  490. */
  491. isUrl (str) {
  492. let strRegex = '^((https|http|ftp|rtsp|mms)?://)'
  493. + '?(([0-9a-z_!~*().&=+$%-]+: )?[0-9a-z_!~*().&=+$%-]+@)?' // ftp的user@
  494. + '(([0-9]{1,3}.){3}[0-9]{1,3}' // IP形式的URL- 199.194.52.184
  495. + '|' // 允许IP和DOMAIN(域名)
  496. + '([0-9a-z_!~*()-]+.)*' // 域名- www.
  497. + '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].' // 二级域名
  498. + '[a-z]{2,6})' // first level domain- .com or .museum
  499. + '(:[0-9]{1,4})?' // 端口- :80
  500. + '((/?)|' // a slash isn't required if there is no file name
  501. + '(/[0-9a-z_!~*().;?:@&=+$,%#-]+)+/?)$';
  502. let re = new RegExp(strRegex);
  503. return re.test(str);
  504. },
  505. /**
  506. * https -> http
  507. *
  508. * @author libo
  509. * @date 2020-01-06
  510. * @param {*} url
  511. * @returns
  512. */
  513. httpsToHttp (url) {
  514. return url.replace(/^https/, 'http');
  515. },
  516. /**
  517. * 验证输入的EMAIL格式是否正确
  518. *
  519. * @author Wetion
  520. * @date 2019-03-22
  521. * @param {String} str
  522. * @returns {Boolean}
  523. */
  524. isEmail (str) {
  525. let re = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
  526. return re.test(str);
  527. },
  528. /**
  529. * 验证输入的手机号码是否正确
  530. *
  531. * @author Wetion
  532. * @date 2019-03-22
  533. * @param {String} str
  534. * @returns {Boolean}
  535. */
  536. isMobile (str) {
  537. let re = /^1[3456789]\d{9}$/;
  538. return re.test(str);
  539. },
  540. /**
  541. * 验证输入的昵称格式是否有效 正确格式为:只能中英文,数字,下划线,减号
  542. *
  543. * @author Wetion
  544. * @date 2019-03-22
  545. * @param {String} str
  546. * @returns {Boolean}
  547. */
  548. isNickname (str) {
  549. let re = /^[\u4e00-\u9fa5A-Za-z0-9-_]*$/;
  550. return re.test(str);
  551. },
  552. /**
  553. * 判断是否是真实姓名
  554. *
  555. * @author libo
  556. * @date 2019-06-21
  557. * @param {String} str
  558. * @returns {Boolean}
  559. */
  560. isRealName (str) {
  561. let re = /^[\u4E00-\u9FA5]{2,4}$/;
  562. return re.test(str);
  563. },
  564. /**
  565. * 验证输入的密码格式是否有效 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线
  566. *
  567. * @author Wetion
  568. * @date 2019-03-22
  569. * @param {String} str
  570. * @returns {Boolean}
  571. */
  572. isPassword (str) {
  573. let re = /^[a-zA-Z]\w{5,17}$/;
  574. return re.test(str);
  575. },
  576. /**
  577. * 验证输入的身份证号格式是否有效(15位或18位数字)
  578. *
  579. * @author Wetion
  580. * @date 2019-03-22
  581. * @param {String} str
  582. * @returns {Boolean}
  583. */
  584. isIdCard (str) {
  585. let re = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
  586. return re.test(str);
  587. },
  588. // ********** Random ********** //
  589. /**
  590. * 随机整数
  591. *
  592. * @author Pyden
  593. * @date 2019-04-10
  594. * @param {Int} minInt 最小的整数
  595. * @param {Int} maxInt 最大的整数
  596. * @returns {Int}
  597. */
  598. randomInt (minInt, maxInt) {
  599. if (minInt === undefined) {
  600. return 0;
  601. }
  602. if (minInt == maxInt) {
  603. return minInt;
  604. }
  605. if (maxInt != undefined) {
  606. return parseInt(Math.random() * (maxInt - minInt + 1) + minInt, 10);
  607. } else {
  608. // 等价于: randomInt(1, minInt)
  609. return parseInt(Math.random() * minInt + 1, 10);
  610. }
  611. },
  612. /**
  613. * @description 随机权重下标
  614. * @author Wetion
  615. * @date 2019-06-10
  616. * @param {Array} arr 数字数组如:[1,2,3]
  617. * @returns
  618. */
  619. randomWeightIndex (arr){
  620. let index = 0;
  621. let totalWeight = this.arraySum(arr);
  622. let random = Math.random() * totalWeight;
  623. if (random <= arr[0]){
  624. return 0;
  625. } else if (random >= arr[arr.length - 1]){
  626. index = arr.length - 1;
  627. return index;
  628. } else {
  629. for (let i = 0 ;i < arr.length; i++){
  630. if (random <= arr[i]){
  631. index = i;
  632. } else if (random > arr[i] && random <= arr[i + 1]){
  633. index = i + 1;
  634. break;
  635. } else if (random > arr[i] && random <= arr[ i + 1] ){
  636. index = i + 1;
  637. break;
  638. }
  639. }
  640. }
  641. return index;
  642. },
  643. // 依据权重,返回选择结果
  644. randomConfByWeight (list, key) {
  645. let subkey = key || 'weight';
  646. let weights = [];
  647. let sum = 0;
  648. for (const v of list) {
  649. let weight = v[subkey] || 0;
  650. sum = sum + weight;
  651. weights.push(sum);
  652. }
  653. if (sum == 0) {
  654. let randomIndex = G.FuncUtils.randomInt(1, list.length);
  655. return list[randomIndex - 1];
  656. }
  657. let r = this.randomInt(1, sum);
  658. for (let i = 0; i < weights.length; i++) {
  659. const v = weights[i];
  660. if (r <= v) {
  661. return list[i];
  662. }
  663. }
  664. return undefined;
  665. },
  666. /**
  667. * @description 获取数值格式化
  668. * @author Wetion
  669. * @date 2019-07-01
  670. * @param {Number} num
  671. * @returns {String}
  672. */
  673. getNumericalFmt (num) {
  674. if (typeof num !== 'number') {
  675. return '0';
  676. }
  677. let numstr = '';
  678. if (num >= 100000000000) {
  679. let yi = Math.floor(num / 100000000);
  680. numstr = String(yi) + '亿';
  681. } else if (num >= 100000000) {
  682. let wan = Math.floor(num / 10000);
  683. numstr = String(wan) + '万';
  684. } else {
  685. numstr = String(num);
  686. }
  687. return numstr;
  688. },
  689. getPackageNumericalFmt (num) {
  690. if (typeof num !== 'number') {
  691. return '0';
  692. }
  693. let numstr = '';
  694. if (num >= 100000000) {
  695. let yi = Math.floor(num / 100000000);
  696. numstr = String(yi) + '亿';
  697. } else if (num >= 100000) {
  698. let wan = Math.floor(num / 10000);
  699. numstr = String(wan) + '万';
  700. } else {
  701. numstr = String(num);
  702. }
  703. return numstr;
  704. },
  705. /**
  706. * 给数字前补“0”
  707. *
  708. * @author Pyden
  709. * @date 2019-12-26
  710. * @param {Integer} num
  711. * @param {Integer} length
  712. * @param {String} [char='0']
  713. * @returns
  714. */
  715. numberPadding (num, length, char = '0') {
  716. for (let len = (num + '').length; len < length; len++) {
  717. num = char + num;
  718. }
  719. return num;
  720. },
  721. /**
  722. * 从身份证中获取生日
  723. *
  724. * @author zzk
  725. * @param {String} [char='0']
  726. * @returns
  727. */
  728. getBirthByIdCard (idCard) {
  729. idCard = idCard.toString();
  730. let num = idCard.length;
  731. if (num == 15 || num == 18) {
  732. let birth = idCard.slice(6, 14);
  733. return birth;
  734. }
  735. return undefined;
  736. },
  737. getAgeByBirth (birth) {
  738. if (birth && birth != '' ) {
  739. let nowTimestamp = G.TimeUtils.getCurrentTime();
  740. let now = new Date(parseInt(nowTimestamp) * 1000);
  741. let age = now.getFullYear() - Number(birth.slice(0, 4)) - 1;
  742. if (age < 0 )
  743. return 0;
  744. let month = Number(birth.slice(5, 6));
  745. if (now.getMonth() > month) {
  746. age = age + 1;
  747. }
  748. if (now.getMonth() == Number(birth.slice(4, 6)) && now.getDate() >= Number(birth.slice(6, 8)))
  749. age = age + 1;
  750. return age;
  751. }
  752. return 18;
  753. },
  754. /**
  755. * 原始路径转为混淆路径
  756. * @param {String} originPath
  757. * @param {String} pwd
  758. * @returns String
  759. */
  760. originToHxPath (originPath, pwd) {
  761. pwd = this.generatePwdArr(pwd);
  762. let arr = [];
  763. let length = originPath.length;
  764. for (let index = 0; index < length; index++) {
  765. const element = originPath.charAt(index);
  766. let newWord = element;
  767. if (element !== '/' && element !== '-') {
  768. newWord = pwd[element];
  769. }
  770. arr.push(newWord);
  771. }
  772. return arr.join('');
  773. },
  774. /**
  775. * 混淆路径转为原始路径
  776. * @param {String} hxPath
  777. * @param {String} pwd
  778. * @returns String
  779. */
  780. hxToOriginPath (hxPath, pwd) {
  781. pwd = this.generatePwdArr(pwd);
  782. let newPwd = this.invertPassword(pwd);
  783. let arr = [];
  784. pwd = newPwd;
  785. let length = hxPath.length;
  786. for (let index = 0; index < length; index++) {
  787. const element = hxPath.charAt(index);
  788. let newWord = element;
  789. if (element !== '/' && element !== '-') {
  790. newWord = pwd[element];
  791. }
  792. arr.push(newWord);
  793. }
  794. return arr.join('');
  795. },
  796. /**
  797. * 翻转密码 key-value =》 value - key
  798. * @param {Array} pwd
  799. * @returns Array
  800. */
  801. invertPassword (pwd) {
  802. let newArr = [];
  803. for (const key in pwd) {
  804. if (pwd.hasOwnProperty(key)) {
  805. const element = pwd[key];
  806. newArr[element] = key;
  807. }
  808. }
  809. return newArr;
  810. },
  811. generatePwdArr (pwd) {
  812. let keys = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
  813. let arr = [];
  814. for (let index = 0; index < keys.length; index++) {
  815. let key = keys[index];
  816. arr[key] = pwd.charAt(index);
  817. }
  818. return arr;
  819. },
  820. // 解析周期刷新时间 json
  821. parseCircleTimes (jsonList, suffix) {
  822. let type = jsonList.m;
  823. if (!G.FuncUtils.isNumber(type)) {
  824. cc.error('参数错误,没有m');
  825. type = undefined;
  826. }
  827. let hour = jsonList.hour || 0;
  828. hour = this.numberPadding(hour, 2);
  829. let min = jsonList.min || 0;
  830. min = this.numberPadding(min, 2);
  831. let day = jsonList.day || 0;
  832. let month = jsonList.month || 0;
  833. switch (type) {
  834. case 0:
  835. var hour1 = jsonList.hour || 0;
  836. var hour2 = hour1 + 12;
  837. hour1 = this.numberPadding(hour1, 2);
  838. return cc.js.formatStr('%s:%s和\n%s:%s%s', hour1, min, hour2, min, suffix);
  839. case 1:
  840. return cc.js.formatStr('每天%s:%s%s', hour, min, suffix);
  841. case 2:
  842. return cc.js.formatStr('每周%s的\n%s:%s%s', day, hour, min, suffix);
  843. case 3:
  844. return cc.js.formatStr('每月%s号\n%s:%s%s', day, hour, min, suffix);
  845. case 4:
  846. {
  847. let nowTimestamp = G.TimeUtils.getCurrentTime();
  848. let myDate = new Date(parseInt(nowTimestamp) * 1000);
  849. let tMonth = myDate.getMonth() + 1;
  850. let tDay = myDate.getDate();
  851. let tHour = myDate.getHours();
  852. let tMin = myDate.getMinutes();
  853. // 计算季节开始时间
  854. let quarterStart = parseInt(tMonth / 3) * 3;
  855. let needUpate = false;
  856. // 当前时间大于本季度刷新时间时,需要更新为下一个季度刷新时间
  857. if (tMonth > quarterStart + month) {
  858. needUpate = true;
  859. } else if (tMonth == quarterStart + month) {
  860. if (tDay > day) {
  861. needUpate = true;
  862. } else if (tDay === day) {
  863. if (tHour > hour) {
  864. needUpate = true;
  865. } else if (tHour == hour) {
  866. if (tMin > min) {
  867. needUpate = true;
  868. }
  869. }
  870. }
  871. }
  872. if (needUpate){
  873. quarterStart = quarterStart + 3;
  874. if (quarterStart >= 12) {
  875. quarterStart = quarterStart % 12;
  876. }
  877. }
  878. // 起始月份超过12的时候需要转为0
  879. if (quarterStart >= 12) {
  880. quarterStart = parseInt(quarterStart % 12);
  881. }
  882. return cc.js.formatStr('%s月%s号\n%s:%s%s', quarterStart + month, day, hour, min, suffix);
  883. }
  884. case 5:
  885. return cc.js.formatStr('每年%s月%s号\n%s:%s%s', month, day, hour, min, suffix);
  886. }
  887. }
  888. };