Utils.ts 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. import * as CryptoJS from "./aes.js"
  2. import { hmacSha256 } from "./hmacSha256"
  3. /**
  4. * 工具类
  5. */
  6. export class Utils {
  7. public constructor() {
  8. }
  9. /**
  10. * 打乱数组
  11. * @param arr 要打乱的数组
  12. * @returns 打乱后的数组
  13. */
  14. static Shuffle<T>(arr: Array<T>): Array<T> {
  15. var len = arr.length;
  16. for (var i = len - 1; i >= 0; i--) {
  17. var j = Math.floor(Math.random() * len);
  18. var temp = arr[i];
  19. arr[i] = arr[j];
  20. arr[j] = temp;
  21. }
  22. return arr;
  23. }
  24. /**
  25. * 获取固定长度字符串 用于太长名字截断
  26. * @param str 原字符串
  27. * @param len 取字符长度
  28. * @returns 返回的字符串
  29. */
  30. public static cutstr(str: string, len: number): string {
  31. var str_length = 0;
  32. var str_len = 0;
  33. let str_cut = "";
  34. str_len = str.length;
  35. for (var i = 0; i < str_len; i++) {
  36. let a = str.charAt(i);
  37. str_length++;
  38. if (escape(a).length > 4) {
  39. //中文字符的长度经编码之后大于4
  40. str_length++;
  41. }
  42. str_cut = str_cut.concat(a);
  43. if (str_length >= len) {
  44. str_cut = str_cut.concat("...");
  45. return str_cut;
  46. }
  47. }
  48. //如果给定字符串小于指定长度,则返回源字符串;
  49. if (str_length < len) {
  50. return str;
  51. }
  52. }
  53. /**
  54. * 取一个区间内随机整数
  55. * @param n 开始位置
  56. * @param m 结束位置
  57. * @returns 返回的随机整数
  58. */
  59. public static rnd(n, m): number {
  60. var random = Math.floor(Math.random() * (m - n + 1) + n);
  61. return random;
  62. }
  63. static _hasOwnProperty = Object.prototype.hasOwnProperty;
  64. /**
  65. * 一个对象是否有prop属性
  66. * @param obj 对象
  67. * @param prop 属性
  68. * @returns 返回是否有
  69. */
  70. static has(obj: any, prop: any) {
  71. return Utils._hasOwnProperty.call(obj, prop);
  72. }
  73. /**
  74. * 对比两个对象的大小
  75. * @param a 对象a
  76. * @param b 对象b
  77. * @returns 返回值 a < b : -1, a == b : 0, a > b : 1
  78. */
  79. static defaultCompare<T>(a: T, b: T): number {
  80. if (a < b) {
  81. return -1;
  82. } else if (a === b) {
  83. return 0;
  84. } else {
  85. return 1;
  86. }
  87. }
  88. /**
  89. * 将一个对象转为字符串
  90. * @param item 传入对象
  91. * @returns 返回值 字符串
  92. */
  93. static defaultToString(item: any): string {
  94. if (item === null) {
  95. return 'COLLECTION_NULL';
  96. } else if (Utils.isUndefined(item)) {
  97. return 'COLLECTION_UNDEFINED';
  98. } else if (Utils.isString(item)) {
  99. return '$s ' + item;
  100. } else {
  101. return '$o ' + item.toString();
  102. }
  103. }
  104. /**
  105. * 将所有属性用字符串格式拼接起来
  106. * @param item 要拼接属性的对象
  107. * @param join 拼接字符
  108. * @returns 返回值
  109. */
  110. static makeString<T>(item: T, join: string = ','): string {
  111. if (item === null) {
  112. return 'COLLECTION_NULL';
  113. } else if (Utils.isUndefined(item)) {
  114. return 'COLLECTION_UNDEFINED';
  115. } else if (Utils.isString(item)) {
  116. return item.toString();
  117. } else {
  118. let toret = '{';
  119. let first = true;
  120. for (const prop in item) {
  121. if (Utils.has(item, prop)) {
  122. if (first) {
  123. first = false;
  124. } else {
  125. toret = toret + join;
  126. }
  127. toret = toret + prop + ':' + (<any>item)[prop];
  128. }
  129. }
  130. return toret + '}';
  131. }
  132. }
  133. /**
  134. * 检查func是否是一个函数
  135. * @param func 传入的参数
  136. * @returns 返回值 bool
  137. */
  138. static isFunction(func: any): boolean {
  139. return (typeof func) === 'function';
  140. }
  141. /**
  142. * 检查obj是否是undefined
  143. * @param obj 传入参数
  144. * @returns 返回值 bool
  145. */
  146. static isUndefined(obj: any): boolean {
  147. return (typeof obj) === 'undefined';
  148. }
  149. /**
  150. * 检查一个对象是否是字符串
  151. * @param obj 要检查的对象
  152. * @param 返回值 true : 是, false : 不是
  153. */
  154. static isString(obj: any): boolean {
  155. return Object.prototype.toString.call(obj) === '[object String]';
  156. }
  157. /** 计算两点之间距离 */
  158. static dis(x1, y1, x2, y2): number {
  159. return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
  160. }
  161. /** 每角度对应弧度 */
  162. static radian: number = Math.PI / 180;
  163. /**设置数组显示 科学计数法 */
  164. static strShow(num: number): string {
  165. num = Math.floor(num);
  166. //最大数值保护
  167. if (num >= 18446744073700000000) {
  168. num = 18446744073700000000
  169. }
  170. let str = String(num);
  171. let str1 = str
  172. let len = str.length;
  173. let len1 = 0
  174. // console.log('strShow ', str)
  175. if (len > 3 && len < 6) {
  176. str1 = str
  177. len1 = str1.length
  178. str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  179. }
  180. else if (len >= 6 && len < 10) {
  181. str1 = str.substr(0, len - 4)
  182. len1 = str1.length
  183. if (len1 > 3) {
  184. str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  185. }
  186. str1 += '万'
  187. // str = str.substr(0, len - 3) + 'K';
  188. } else if (len >= 10 && len < 14) {
  189. str1 = str.substr(0, len - 8)
  190. len1 = str1.length
  191. if (len1 > 3) {
  192. str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  193. }
  194. str1 += '亿'
  195. // str = str.substr(0, len - 6) + 'B';
  196. } else if (len >= 14 && len < 18) {
  197. str1 = str.substr(0, len - 12)
  198. len1 = str1.length
  199. if (len1 > 3) {
  200. str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  201. }
  202. str1 += '兆'
  203. // str = str.substr(0, len - 9) + 'KB';
  204. } else if (len >= 18 && len < 22) {
  205. str1 = str.substr(0, len - 16)
  206. len1 = str1.length
  207. if (len1 > 3) {
  208. str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  209. }
  210. str1 += '万兆'
  211. // str = str.substr(0, len - 12) + 'MB';
  212. }
  213. // else if (len >= 18 && len < 21) {
  214. // str1 = str.substr(0, len - 15)
  215. // len1 = str1.length
  216. // if (len1 > 3) {
  217. // str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  218. // }
  219. // str1 += 'GB'
  220. // // str = str.substr(0, len - 15) + 'GB';
  221. // } else if (len >= 21 && len < 24) {
  222. // str1 = str.substr(0, len - 18)
  223. // len1 = str1.length
  224. // if (len1 > 3) {
  225. // str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  226. // }
  227. // str1 += 'TB'
  228. // // str = str.substr(0, len - 18) + 'TB';
  229. // } else if (len >= 24 && len < 27) {
  230. // str1 = str.substr(0, len - 21)
  231. // len1 = str1.length
  232. // if (len1 > 3) {
  233. // str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  234. // }
  235. // str1 += 'AB'
  236. // // str = str.substr(0, len - 18) + 'TB';
  237. // } else if (len >= 27 && len < 30) {
  238. // str1 = str.substr(0, len - 24)
  239. // len1 = str1.length
  240. // if (len1 > 3) {
  241. // str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  242. // }
  243. // str1 += 'BB'
  244. // // str = str.substr(0, len - 18) + 'TB';
  245. // } else if (len >= 30 && len < 33) {
  246. // str1 = str.substr(0, len - 27)
  247. // len1 = str1.length
  248. // if (len1 > 3) {
  249. // str1 = str1.substr(0, len1 - 3) + ',' + str1.substr(len1 - 3)
  250. // }
  251. // str1 += 'CB'
  252. // // str = str.substr(0, len - 18) + 'TB';
  253. // }
  254. //console.log("STR:" + str1);
  255. return str1;
  256. }
  257. /**
  258. * 倒计时转换为时间格式(h:m:s) ,可自定义
  259. * @param t 秒
  260. * @param f 格式
  261. */
  262. public static ParseTime2Format(t: number, f: string = "h:m:s"): string {
  263. var d: number = Math.floor(t / 24 / 3600);
  264. var h: number = Math.floor((t / 3600) % 24);
  265. var m: number = Math.floor((t % 3600) / 60);
  266. var s: number = (t % 3600) % 60;
  267. function parse_format(t: number): string {
  268. var s: string = t.toString();
  269. if (t < 10) {
  270. s = "0" + t;
  271. }
  272. return s;
  273. }
  274. if (f.indexOf("d") != -1) {
  275. f = f.replace(/d/g, parse_format(d));
  276. }
  277. else {
  278. h += d * 24;
  279. }
  280. if (f.indexOf("h") != -1) {
  281. f = f.replace(/h/g, parse_format(h));
  282. } else {
  283. m += h * 60;
  284. }
  285. if (f.indexOf("m") != -1) {
  286. f = f.replace(/m/g, parse_format(m));
  287. } else {
  288. if (f.indexOf("h") != -1) {
  289. s += m * 60;
  290. } else {
  291. s = t;
  292. }
  293. }
  294. if (f.indexOf("s") != -1) {
  295. f = f.replace(/s/g, parse_format(s));
  296. }
  297. return f;
  298. }
  299. // 随机生成32位字符串
  300. static randomString(len = 32) {
  301. let $chars =
  302. 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  303. let maxPos = $chars.length
  304. let pwd = ''
  305. for (let i = 0; i < len; i++) {
  306. pwd += $chars.charAt(Math.floor(Math.random() * maxPos))
  307. }
  308. return pwd
  309. }
  310. //说明:
  311. // 1.如果加密解密涉及到前端和后端,则这里的key要保持和后端的key一致
  312. // 2.AES的算法模式有好几种(ECB,CBC,CFB,OFB),所以也要和后端保持一致
  313. // 3.AES的补码方式有两种(PKS5,PKS7),所以也要和后端保持一致
  314. // 4.AES的密钥长度有三种(128,192,256,默认是128),所以也要和后端保持一致
  315. // 5.AES的加密结果编码方式有两种(base64和十六进制),具体怎么选择由自己定,但是加密和解密的编码方式要统一
  316. //十六位十六进制数作为秘钥
  317. // private static key = fun_aes.CryptoJS.enc.Utf8.parse("3454345434543454");
  318. //十六位十六进制数作为秘钥偏移量
  319. // private static iv = fun_aes.CryptoJS.enc.Utf8.parse('6666666666666666');
  320. /**aes加密
  321. * @param state true 存包长 false /r/n
  322. */
  323. static Encrypt(word, tkey, appid, state = true) {
  324. let tiv = tkey.substr(0, 16)
  325. // n = Base64.Instance.encode(n)
  326. //明文拼接
  327. let newStr = ''
  328. if (state) {
  329. // let n = this.pack(word.length)
  330. // newStr = tiv + n + word + appid
  331. newStr = tiv + word + appid
  332. // console.log('明文拼接 ', word.length, " n ", n)
  333. }
  334. else {
  335. newStr = tiv + word + '\r\n' + appid
  336. }
  337. //加密后
  338. let key = CryptoJS.enc.Utf8.parse(tkey);
  339. let iv = CryptoJS.enc.Utf8.parse(tiv);
  340. newStr = CryptoJS.enc.Utf8.parse(newStr);
  341. var encrypted = CryptoJS.AES.encrypt(newStr, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  342. encrypted = encrypted.toString()
  343. // console.log('加密后 ', encrypted)
  344. let mac = hmacSha256.Instance.hex_hmac_sha256(tkey, encrypted)
  345. // console.log('----------------------------- ')
  346. // console.log('key ', tkey)
  347. // console.log('iv ', tiv)
  348. // console.log('mac ', mac)
  349. // console.log('encode ', encrypted)
  350. let newStrTwo = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(tiv + encrypted + mac));
  351. // console.log('最终密文 ', newStrTwo)
  352. return newStrTwo
  353. }
  354. /** aes解密
  355. * @param state true 存包长 false /r/n
  356. */
  357. static Decrypt(word, tkey, appid, state = true) {
  358. let en = CryptoJS.enc.Base64.parse(word).toString(CryptoJS.enc.Utf8);
  359. let newStrOne = en.substr(16)
  360. let temp = newStrOne.substr(0, newStrOne.length - 64)
  361. let de = temp
  362. let key = CryptoJS.enc.Utf8.parse(tkey);
  363. let iv = CryptoJS.enc.Utf8.parse(tkey.substr(0, 16));
  364. var decrypt = CryptoJS.AES.decrypt(de, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  365. var decryptedStr = CryptoJS.enc.Utf8.stringify(decrypt)
  366. decryptedStr = decryptedStr.toString()
  367. // console.log('decryptedStr ', decryptedStr)
  368. let newStrThree = ''
  369. if (state) {
  370. newStrThree = decryptedStr.slice(16).replace(new RegExp("(.*)" + appid), '$1')
  371. }
  372. else {
  373. newStrThree = decryptedStr.slice(16).split('\r\n')[0]
  374. }
  375. return newStrThree
  376. }
  377. /** for php pack( N , length ) */
  378. static pack(len: number) {
  379. var buf: ArrayBuffer = new ArrayBuffer(4);
  380. var dataView = new DataView(buf);
  381. dataView.setUint32(0, len)
  382. // console.log('dataView ', dataView)
  383. let str2 = this.ab2str(buf)
  384. // let utf8decoder = new TextDecoder();
  385. // let str2 = utf8decoder.decode(buf)
  386. // console.log('str2 ', str2)
  387. // let utf8encoder = new TextEncoder();
  388. // let str3 = utf8encoder.encode(str2)
  389. // console.log("str3:", str3)
  390. // let str4 = utf8decoder.decode(str3)
  391. // console.log('str4 ', str4)
  392. // let aa = fun_aes.CryptoJS.enc.Utf8.parse(str2)
  393. // console.log('aa ', aa)
  394. return str2
  395. }
  396. static Utf8ArrayToStr(array) {
  397. var out, i, len, c;
  398. var char2, char3;
  399. out = "";
  400. len = array.length;
  401. i = 0;
  402. while (i < len) {
  403. c = array[i++];
  404. switch (c >> 4) {
  405. case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
  406. // 0xxxxxxx
  407. out += String.fromCharCode(c);
  408. break;
  409. case 12: case 13:
  410. // 110x xxxx 10xx xxxx
  411. char2 = array[i++];
  412. out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
  413. break;
  414. case 14:
  415. // 1110 xxxx 10xx xxxx 10xx xxxx
  416. char2 = array[i++];
  417. char3 = array[i++];
  418. out += String.fromCharCode(((c & 0x0F) << 12) |
  419. ((char2 & 0x3F) << 6) |
  420. ((char3 & 0x3F) << 0));
  421. break;
  422. }
  423. }
  424. return out;
  425. }
  426. //UTF-16转UTF-8
  427. static utf16ToUtf8(s) {
  428. if (!s) {
  429. return;
  430. }
  431. var i, code, ret = [], len = s.length;
  432. for (i = 0; i < len; i++) {
  433. code = s.charCodeAt(i);
  434. if (code > 0x0 && code <= 0x7f) {
  435. //单字节
  436. //UTF-16 0000 - 007F
  437. //UTF-8 0xxxxxxx
  438. ret.push(s.charAt(i));
  439. } else if (code >= 0x80 && code <= 0x7ff) {
  440. //双字节
  441. //UTF-16 0080 - 07FF
  442. //UTF-8 110xxxxx 10xxxxxx
  443. ret.push(
  444. //110xxxxx
  445. String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)),
  446. //10xxxxxx
  447. String.fromCharCode(0x80 | (code & 0x3f))
  448. );
  449. } else if (code >= 0x800 && code <= 0xffff) {
  450. //三字节
  451. //UTF-16 0800 - FFFF
  452. //UTF-8 1110xxxx 10xxxxxx 10xxxxxx
  453. ret.push(
  454. //1110xxxx
  455. String.fromCharCode(0xe0 | ((code >> 12) & 0xf)),
  456. //10xxxxxx
  457. String.fromCharCode(0x80 | ((code >> 6) & 0x3f)),
  458. //10xxxxxx
  459. String.fromCharCode(0x80 | (code & 0x3f))
  460. );
  461. }
  462. }
  463. return ret.join('');
  464. }
  465. //UTF-8转UTF-16
  466. static utf8ToUtf16(s) {
  467. if (!s) {
  468. return;
  469. }
  470. var i, codes, bytes, ret = [], len = s.length;
  471. for (i = 0; i < len; i++) {
  472. codes = [];
  473. codes.push(s.charCodeAt(i));
  474. if (((codes[0] >> 7) & 0xff) == 0x0) {
  475. //单字节 0xxxxxxx
  476. ret.push(s.charAt(i));
  477. } else if (((codes[0] >> 5) & 0xff) == 0x6) {
  478. //双字节 110xxxxx 10xxxxxx
  479. codes.push(s.charCodeAt(++i));
  480. bytes = [];
  481. bytes.push(codes[0] & 0x1f);
  482. bytes.push(codes[1] & 0x3f);
  483. ret.push(String.fromCharCode((bytes[0] << 6) | bytes[1]));
  484. } else if (((codes[0] >> 4) & 0xff) == 0xe) {
  485. //三字节 1110xxxx 10xxxxxx 10xxxxxx
  486. codes.push(s.charCodeAt(++i));
  487. codes.push(s.charCodeAt(++i));
  488. bytes = [];
  489. bytes.push((codes[0] << 4) | ((codes[1] >> 2) & 0xf));
  490. bytes.push(((codes[1] & 0x3) << 6) | (codes[2] & 0x3f));
  491. ret.push(String.fromCharCode((bytes[0] << 8) | bytes[1]));
  492. }
  493. }
  494. return ret.join('');
  495. }
  496. // ArrayBuffer转为字符串,参数为ArrayBuffer对象
  497. static ab2str(buf: ArrayBuffer) {
  498. return String.fromCharCode.apply(null, new Uint8Array(buf));
  499. }
  500. static Uint8ArrayToString(fileData) {
  501. var dataString = "";
  502. for (var i = 0; i < fileData.length; i++) {
  503. dataString += String.fromCharCode(fileData[i]);
  504. }
  505. return dataString
  506. }
  507. static stringToUint8Array(str) {
  508. var arr = [];
  509. for (var i = 0, j = str.length; i < j; ++i) {
  510. arr.push(str.charCodeAt(i));
  511. }
  512. var tmpUint8Array = new Uint8Array(arr);
  513. return tmpUint8Array
  514. }
  515. // 字符串转为ArrayBuffer对象,参数为字符串
  516. static str2ab(str) {
  517. var buf = new ArrayBuffer(str.length); // 每个字符占用2个字节
  518. var bufView = new Uint8Array(buf);
  519. for (var i = 0, strLen = str.length; i < strLen; i++) {
  520. bufView[i] = str.charCodeAt(i);
  521. }
  522. return buf;
  523. }
  524. private static options = {
  525. default_key_size: 2048,
  526. default_public_exponent: new Uint8Array([0x01, 0x00, 0x01])
  527. }
  528. /*rsa加密*/
  529. static RSAEncrypt(word) {
  530. // console.log(window['JSEncrypt'])
  531. let jsb = new window['JSEncrypt'](this.options)
  532. //公钥
  533. var publicString = '-----BEGIN PUBLIC KEY-----\n' +
  534. 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwz5V8wt525dMS+A9wOd\n' +
  535. 'NAjvKgxdyoXYuZSlAJEXLhvJlaXwFCKEsUg/qBBeo4nrRnwaFAjG7ItqbCWR9Ozv\n' +
  536. '6oY5tMYQnFFK82XkMGbKm1gG0z9vYKhcNYgHZHi+QKAw4tLLWXWO/QBTGelEXptD\n' +
  537. 'azlNmdM+8wHOknTcMuIyjc9Yo5qCoNsCJpA465vnREiBezBbKB3rSw+LmrRcZcFk\n' +
  538. 's8hmGtjpabcQ8sCxco7mRzVh6/DomNWfNm7hUP6shrrJirwjQtaS51grlScj8KhN\n' +
  539. 'h+kBoiI4Ad0Xz0GHasK5hAMf3sXDsN61r0An8KTfa/nsYSJDwogPIKkeKAsmw9Df\n' +
  540. 'EQIDAQAB\n' +
  541. '-----END PUBLIC KEY-----'
  542. jsb.setPublicKey(publicString)
  543. // 加密内容
  544. let encrypted = jsb.encrypt(word)
  545. return encrypted
  546. }
  547. /*rsa解密*/
  548. // static RSADecrypt(word) {
  549. // // console.log(window['JSEncrypt'])
  550. // let jsb = new JSEncrypt(this.options)
  551. // //私钥
  552. // var privateString = '-----BEGIN RSA PRIVATE KEY-----\n' +
  553. // 'MIIEowIBAAKCAQEAuwz5V8wt525dMS+A9wOdNAjvKgxdyoXYuZSlAJEXLhvJlaXw\n' +
  554. // 'FCKEsUg/qBBeo4nrRnwaFAjG7ItqbCWR9Ozv6oY5tMYQnFFK82XkMGbKm1gG0z9v\n' +
  555. // 'YKhcNYgHZHi+QKAw4tLLWXWO/QBTGelEXptDazlNmdM+8wHOknTcMuIyjc9Yo5qC\n' +
  556. // 'oNsCJpA465vnREiBezBbKB3rSw+LmrRcZcFks8hmGtjpabcQ8sCxco7mRzVh6/Do\n' +
  557. // 'mNWfNm7hUP6shrrJirwjQtaS51grlScj8KhNh+kBoiI4Ad0Xz0GHasK5hAMf3sXD\n' +
  558. // 'sN61r0An8KTfa/nsYSJDwogPIKkeKAsmw9DfEQIDAQABAoIBAFonN6pkY5+O5uXE\n' +
  559. // '8pCbslIZGESY7z+kYT+Y8CokxBpaFD/HWb4qoO/dVakIMsT5vWcce2k6jb4GuAVl\n' +
  560. // '2kJFTKEpjnidmfXtjIVhj6jwciiLNcbtZR4eJ0s5w+5d77ywOL+qP45fhcpVNLhh\n' +
  561. // 'YK2EgesVFFzWnxl6vniCUHtJ4HnOKHJCnLNP8Jv7v8yWqRhdPv+OSnXc/f8M5Nq4\n' +
  562. // 'zXIjZIf84sQdI9MAZ4IUv3yUnhQIGCX/ilLiOb+u8Z02DnImpwrSurm4SWOl/W7F\n' +
  563. // 'jz1LHonOnFNvoICwJUlwmSHVbSxOG4dHSxs45dSHizCxIbPyHNW0sF/u5EHz2cmw\n' +
  564. // 'ZIrtmh0CgYEA91DZBmRS8f6ELIPTozOd9c9OOiW0Mn0njG2Hf59tRkUNcAVnrdT6\n' +
  565. // '1v0ziD1tnprBCQr7NKzJiU3ds4qR/Vfza2F9M894CIX3HZLZomrP+Kr0xqeogxfy\n' +
  566. // 'IVQ3n6aCIR2lKG2zBuxJJCp3UhGjS1NOOvcVqK9F+0Py6LHRG7SAoMsCgYEAwZ5l\n' +
  567. // 'Q2x/V9vDf3KMsQf/5noaPrxgoTH9py4JgCwK6ab9M8BtAsAZ4xs6RUd6XEMeGsv4\n' +
  568. // 'rLKKZhR0vMNnec/wHb3tNEFMihKsGkgCrycl4sJQIJsNX30bungrrC2XZUEAqN9g\n' +
  569. // '1IbDKAiq6l+0YQVC+742FZ6t7IgjrgV/lj7g0BMCgYEAkSeZiT/e0vvAFeR1lecY\n' +
  570. // 'wgofbs9sWOnOCYTLr2MiHskunt39QTCs3PwVf9QV/63yuF0CnaMAUp8qDVO6Zch2\n' +
  571. // 'LUM12e/eEpqWNHxZUhOA5wFn0yTaKb8nNNqaHxD6dXdR1U21cs3CDAEEsV16yx4k\n' +
  572. // '30TgKHZfC5+Q9XRQOAOUL0sCgYBcq/u78cphuwYvkhxU/4c0QW0eafu2K79ErXxO\n' +
  573. // 'pMX0X8EBbDDBCEFbukSBtFyUnGtkWAyGXE5x3YiicMSuQSCkm6tVP4vq6lUFn0Hp\n' +
  574. // 'o8s2ZdsEQDJ+adtDvRDqMEguZpZyPbiTAI2YM83asEQdy+7rn3czkeedNuwc9vTC\n' +
  575. // 'bQYdkQKBgAqApiDmh84iMQUv5DQ2ks4Ddv/jpuYp/wELTN59n+IvP7BfdkOVBcYR\n' +
  576. // 'Z1MZNo9fAIdF700ijKQKKgR1r5iOHiBo4A4DybxN3FHyS348BDbuh/dg2Z6307iS\n' +
  577. // 'cNCq6ajhNeTtMy2E14DEdinp/7l2o87OpAR2cGRFBEi+f2RRQ2p0\n' +
  578. // '-----END RSA PRIVATE KEY-----'
  579. // jsb.setPrivateKey(privateString)
  580. // // 解密内容
  581. // let encrypted = jsb.decrypt(word)
  582. // return encrypted
  583. // }
  584. static getLocalTime(nS) {
  585. return new Date(parseInt(nS) * 1000).toLocaleString().replace(/:\d{1,2}$/, ' ');
  586. }
  587. /** 遍历打印obj属性值
  588. * @param name 名称
  589. * @param obj 要遍历的对象
  590. */
  591. static logObject(name, obj) {
  592. let description = ''
  593. for (var i in obj) {
  594. var property = obj[i];
  595. description += i + " = " + property + "\n";
  596. }
  597. console.log(name + ' \n' + description)
  598. }
  599. /** 版本对比
  600. */
  601. static versionCompareHandle(versionA, versionB) {
  602. console.log("JS Custom Version Compare: version A is " + versionA + ', version B is ' + versionB);
  603. var vA = versionA.split('.');
  604. var vB = versionB.split('.');
  605. for (var i = 0; i < vA.length; ++i) {
  606. var a = parseInt(vA[i]);
  607. var b = parseInt(vB[i] || 0);
  608. if (a === b) {
  609. continue;
  610. }
  611. else {
  612. return a - b;
  613. }
  614. }
  615. if (vB.length > vA.length) {
  616. return -1;
  617. }
  618. else {
  619. return 0;
  620. }
  621. }
  622. /** 是否有apk安装包 */
  623. static checkHasApk(fileName) {
  624. var fullPath = jsb.fileUtils.getWritablePath() + fileName
  625. if (jsb.fileUtils.isFileExist(fullPath)) {
  626. return fullPath
  627. }
  628. else {
  629. return ''
  630. }
  631. }
  632. /** 下载文件
  633. * @param url 下载地址
  634. * @param fileName 存储文件名称
  635. * @param successCb 成功回调
  636. * @param failCb 失败回调
  637. * @param progressCb 下载进度回调
  638. */
  639. static downFile2Local(url, fileName, successCb, failCb, progressCb): any {
  640. var fullPath = jsb.fileUtils.getWritablePath() + fileName
  641. // showModelLoadingDialog();//显示加载中模态框
  642. if (jsb) {
  643. var downloader = new jsb.Downloader();
  644. downloader.setOnFileTaskSuccess(function () {
  645. // removeModelLoadingDialog();//删除加载中模态框
  646. console.log("DownLoadM setOnFileTaskSuccess", "")
  647. if (successCb) {
  648. console.log("DownLoadM result... ", jsb.fileUtils.isFileExist(fullPath))
  649. console.log("DownLoadM setOnFileTaskSuccess fullPath...", fullPath)
  650. successCb(fullPath);
  651. // AdM.installApp()
  652. }
  653. });
  654. downloader.setOnTaskError(function (task: any, errorCode: number, errorCodeInternal: number, errorStr: string) {
  655. // removeModelLoadingDialog();
  656. // showTips("文件下载失败!!!");
  657. console.log("DownLoadM setOnTaskError", errorCode + " ; " + errorCodeInternal + " ; " + errorStr)
  658. if (failCb) {
  659. failCb(fullPath);
  660. }
  661. });
  662. downloader.setOnTaskProgress(function (task: any, bytesReceived: number, totalBytesReceived: number, totalBytesExpected: number) {
  663. // removeModelLoadingDialog();
  664. // showTips("文件下载失败!!!");
  665. console.log("DownLoadM", bytesReceived + " ; " + totalBytesReceived + " ; " + totalBytesExpected)
  666. if (progressCb) {
  667. progressCb(bytesReceived, totalBytesReceived, totalBytesExpected)
  668. }
  669. });
  670. downloader.createDownloadFileTask(url, fullPath);//创建下载任务
  671. return downloader
  672. }
  673. }
  674. static loadResPromise(url, type: any = cc.Prefab) {
  675. return new Promise((resolve: (data) => void, reject) => {
  676. cc.loader.loadRes(url, type, (error, data): void => {
  677. if (error) {
  678. reject();
  679. }
  680. else {
  681. resolve(data);
  682. }
  683. });
  684. });
  685. }
  686. }