u.ts 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. import {Session} from "/@/utils/storage";
  2. const fileUrl = import.meta.env.VITE_FILE_URL
  3. const serverUrl = import.meta.env.VITE_API_URL
  4. const previewUrl = import.meta.env.VITE_PREVIEW_URL
  5. const u = {
  6. url: {
  7. file: fileUrl,
  8. server: serverUrl,
  9. preview: previewUrl
  10. },
  11. dialog: {
  12. actions: {
  13. 'add': {title: '新增', btn: '创建'},
  14. 'del': {title: '删除', btn: '确定'},
  15. 'edit': {title: '修改', btn: '修改'},
  16. 'view': {title: '详情', btn: '确定'},
  17. },
  18. },
  19. /**
  20. * 16进制颜色转rgb
  21. * @param hex
  22. */
  23. hexToRgb(hex: string) {
  24. // Remove the # character if it exists
  25. hex = hex.replace("#", "");
  26. // Convert the hex value to RGB values
  27. const r = parseInt(hex.substring(0, 2), 16);
  28. const g = parseInt(hex.substring(2, 4), 16);
  29. const b = parseInt(hex.substring(4, 6), 16);
  30. // Return the RGB values as an object
  31. return {r, g, b};
  32. },
  33. distinctByKey(elements: Array<any>, key: string) {
  34. let result:any[] = [];
  35. let keys:Array<string> = [];
  36. if (!elements || elements.length === 0) {
  37. return result;
  38. }
  39. for (let i = 0; i < elements.length; i++) {
  40. if (!elements[i][key] && elements[i][key] !== 0) {
  41. continue;
  42. }
  43. let k = elements[i][key].toString();
  44. if(!keys.includes(k)){
  45. result.push(elements[i]);
  46. keys.push(k);
  47. }
  48. }
  49. return result;
  50. },
  51. groupByKey(elements: Array<any>, key: string) {
  52. let map = {};
  53. if (!elements || elements.length === 0) {
  54. return map;
  55. }
  56. for (let i = 0; i < elements.length; i++) {
  57. if (!elements[i][key] && elements[i][key] !== 0) {
  58. continue;
  59. }
  60. let k = elements[i][key].toString();
  61. let tmp = map[k] || [];
  62. tmp.push(elements[i]);
  63. map[k] = tmp;
  64. }
  65. return map;
  66. },
  67. groupByKeyV2(elements: Array<any>, key: string) {
  68. return elements.reduce((groups, item) => {
  69. const group = item[key];
  70. if (!groups[group]) {
  71. groups[group] = [];
  72. }
  73. groups[group].push(item);
  74. return groups;
  75. }, {});
  76. },
  77. sortByArray(elements: Array<any>, key: string, sortArray: Array<any>) {
  78. if (key) {
  79. elements.sort(function (a, b) {
  80. return sortArray.indexOf(a[key]) - sortArray.indexOf(b[key]);
  81. });
  82. } else {
  83. elements.sort(function (a, b) {
  84. return sortArray.indexOf(a) - sortArray.indexOf(b);
  85. });
  86. }
  87. },
  88. sort(elements: Array<any>, key: string) {
  89. elements.sort((o1, o2) => {
  90. let value1 = o1[key];
  91. let value2 = o2[key];
  92. if (value2 > value1) {
  93. return -1;
  94. } else if (value2 < value1) {
  95. return 1;
  96. } else {
  97. return 0;
  98. }
  99. })
  100. },
  101. toMap(elements: Array<any>, fn: Function) {
  102. let ret = {};
  103. elements.forEach(item => {
  104. let key = fn.apply(null, [item]);
  105. ret[key] = item;
  106. })
  107. return ret;
  108. },
  109. /**
  110. * 浅拷贝或者一层属性的对象深拷贝
  111. * @param obj
  112. * @returns {*}
  113. */
  114. copyObject(obj: Object) {
  115. return Object.assign({}, obj);
  116. },
  117. /**
  118. * 深拷贝 支持regExp、function、null、undefined
  119. * @param target
  120. * @returns {function(*=): {}}
  121. */
  122. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  123. copyDeep(target: any) {
  124. // @ts-ignore
  125. return function deepClone(target: any) {
  126. // 定义一个变量
  127. let result;
  128. // 如果当前需要深拷贝的是一个对象的话
  129. if (typeof target === 'object') {
  130. // 如果是一个数组的话
  131. if (Array.isArray(target)) {
  132. result = []; // 将result赋值为一个数组,并且执行遍历
  133. for (let i in target) {
  134. // 递归克隆数组中的每一项
  135. result.push(deepClone(target[i]))
  136. }
  137. // 判断如果当前的值是null的话;直接赋值为null
  138. } else if (target === null) {
  139. result = null;
  140. // 判断如果当前的值是一个RegExp对象的话,直接赋值
  141. } else if (target.constructor === RegExp) {
  142. result = target;
  143. } else {
  144. // 否则是普通对象,直接for in循环,递归赋值对象的所有值
  145. result = {};
  146. for (let i in target) {
  147. result[i] = deepClone(target[i]);
  148. }
  149. }
  150. // 如果不是对象的话,就是基本数据类型,那么直接赋值
  151. } else {
  152. result = target;
  153. }
  154. // 返回最终结果
  155. return result;
  156. }
  157. },
  158. /**
  159. * 加强parse 支持function解析
  160. * @param script
  161. * @returns {any}
  162. */
  163. parseDeep(script: string) {
  164. return JSON.parse(script, function (key, value) {
  165. if (null != value && value.indexOf("function") === 0) {
  166. return eval("(function(){return " + value + "})()");
  167. }
  168. return value;
  169. });
  170. },
  171. isEmptyOrNull: function (exp: any) {
  172. return !exp || typeof (exp) == "undefined" || "undefined" === exp || exp.length === 0 || exp === '' || JSON.stringify(exp) === "{}";
  173. },
  174. pad: function (val: any, len: number, ch: string = '0') {
  175. return val.toString().padStart(len, ch);
  176. },
  177. mediaType: function (url: string) {
  178. let type = "other";
  179. url = url.toLowerCase();
  180. if (url.endsWith(".jpg") || url.endsWith(".jpeg") || url.endsWith(".png")
  181. || url.endsWith(".gif") || url.endsWith(".svg")) {
  182. type = "image";
  183. }
  184. if (url.endsWith(".mp4") || url.endsWith(".avi") || url.endsWith(".webm")
  185. || url.endsWith(".ogg")) {
  186. type = "video";
  187. }
  188. if (url.endsWith(".mp3") || url.endsWith(".amr") || url.endsWith(".wav")) {
  189. type = "audio";
  190. }
  191. if ("url".endsWith(".pdf") || "url".endsWith(".doc") || "url".endsWith(".docx")
  192. || "url".endsWith(".xls") || "url".endsWith(".xlsx") || "url".endsWith(".ppt")) {
  193. type = "wps";
  194. }
  195. return type;
  196. },
  197. contains(array: Array<any>, value: any, key = null) {
  198. if (!u.isEmptyOrNull(array)) {
  199. for (let i = 0; i < array.length; i++) {
  200. if (!key) {
  201. if (array[i] == value) {
  202. return true;
  203. }
  204. } else {
  205. if (value.constructor != Object && array[i][key] == value) {
  206. return true;
  207. } else if (value.constructor == Object && array[i][key] == value[key]) {
  208. return true;
  209. }
  210. }
  211. }
  212. }
  213. return false;
  214. },
  215. removeItem(array: Array<any>, value: any, key = null) {
  216. if (!u.isEmptyOrNull(array)) {
  217. for (let i = 0; i < array.length; i++) {
  218. if (!key) {
  219. if (array[i] == value) {
  220. array.splice(i, 1);
  221. break;
  222. }
  223. } else {
  224. if (value.constructor != Object && array[i][key] == value) {
  225. array.splice(i, 1);
  226. break;
  227. } else if (value.constructor == Object && array[i][key] == value[key]) {
  228. array.splice(i, 1);
  229. break;
  230. }
  231. }
  232. }
  233. }
  234. },
  235. randomChars(length: number, uuid = false) {
  236. let cs = "0123456789abcdef0123456789abcdef";
  237. let chars = "";
  238. for (let i = 0; i < length; i++) {
  239. chars += cs[Math.floor(Math.random() * cs.length)];
  240. if (uuid && (i === 7 || i === 11 || i === 15 || i === 19)) {
  241. chars += "-";
  242. }
  243. }
  244. return chars.toLowerCase();
  245. },
  246. randomKey(length: number, uuid = false) {
  247. let cs = "0123456789abcdef012345678ABCDEFGHIJKLMNRSTZZYAL29123";
  248. let chars = "";
  249. for (let i = 0; i < length; i++) {
  250. chars += cs[Math.floor(Math.random() * cs.length)];
  251. if (uuid && (i === 7 || i === 11 || i === 15 || i === 19)) {
  252. chars += "-";
  253. }
  254. }
  255. return chars;
  256. },
  257. getOsName() {
  258. let u = navigator.userAgent;
  259. if (!!u.match(/compatible/i) || u.match(/Windows/i)) {
  260. return 'windows';
  261. } else if (!!u.match(/Macintosh/i) || u.match(/MacIntel/i)) {
  262. return 'macOS';
  263. } else if (!!u.match(/iphone/i) || u.match(/Ipad/i)) {
  264. return 'ios';
  265. } else if (u.match(/android/i)) {
  266. return 'android';
  267. } else {
  268. return 'other';
  269. }
  270. },
  271. getBrowerName() {
  272. let u = navigator.userAgent;
  273. let bws = [{
  274. name: 'sgssapp',
  275. it: /sogousearch/i.test(u)
  276. }, {
  277. name: 'wechat',
  278. it: /MicroMessenger/i.test(u)
  279. }, {
  280. name: 'weibo',
  281. it: !!u.match(/Weibo/i)
  282. }, {
  283. name: 'uc',
  284. it: !!u.match(/UCBrowser/i) || u.indexOf(' UBrowser') > -1
  285. }, {
  286. name: 'sogou',
  287. it: u.indexOf('MetaSr') > -1 || u.indexOf('Sogou') > -1
  288. }, {
  289. name: 'xiaomi',
  290. it: u.indexOf('MiuiBrowser') > -1
  291. }, {
  292. name: 'baidu',
  293. it: u.indexOf('Baidu') > -1 || u.indexOf('BIDUBrowser') > -1
  294. }, {
  295. name: '360',
  296. it: u.indexOf('360EE') > -1 || u.indexOf('360SE') > -1
  297. }, {
  298. name: '2345',
  299. it: u.indexOf('2345Explorer') > -1
  300. }, {
  301. name: 'edge',
  302. it: u.indexOf('Edge') > -1
  303. }, {
  304. name: 'ie11',
  305. it: u.indexOf('Trident') > -1 && u.indexOf('rv:11.0') > -1
  306. }, {
  307. name: 'ie',
  308. it: u.indexOf('compatible') > -1 && u.indexOf('MSIE') > -1
  309. }, {
  310. name: 'firefox',
  311. it: u.indexOf('Firefox') > -1
  312. }, {
  313. name: 'safari',
  314. it: u.indexOf('Safari') > -1 && u.indexOf('Chrome') === -1
  315. }, {
  316. name: 'qqbrowser',
  317. it: u.indexOf('MQQBrowser') > -1 && u.indexOf(' QQ') === -1
  318. }, {
  319. name: 'qq',
  320. it: u.indexOf('QQ') > -1
  321. }, {
  322. name: 'chrome',
  323. it: u.indexOf('Chrome') > -1 || u.indexOf('CriOS') > -1
  324. }, {
  325. name: 'opera',
  326. it: u.indexOf('Opera') > -1 || u.indexOf('OPR') > -1
  327. }];
  328. for (let i = 0; i < bws.length; i++) {
  329. if (bws[i].it) {
  330. return bws[i].name;
  331. }
  332. }
  333. return 'other';
  334. },
  335. date: {
  336. /**
  337. * @description 获取需要的时间格式
  338. * @param {Date} time 时间、时间字符串、时间戳
  339. * @param {String} format 时间格式,默认'YYYY-MM-DD'。如果是'星期WW',则返回(如:'星期日')
  340. * @return {String} 格式化后的时间
  341. */
  342. format: function (time: any, format: string) {
  343. time = time ? new Date(time) : new Date()
  344. format = format || 'YYYY-MM-DD'
  345. function tf(i: any) {
  346. return (i < 10 ? '0' : '') + i
  347. }
  348. // @ts-ignore
  349. return format.replace(/YYYY|MM|DD|hh|mm|ss|WW/g, function (a: string) {
  350. switch (a) {
  351. case 'YYYY':
  352. return tf(time.getFullYear())
  353. case 'MM':
  354. return tf(time.getMonth() + 1)
  355. case 'DD':
  356. return tf(time.getDate())
  357. case 'mm':
  358. return tf(time.getMinutes())
  359. case 'hh':
  360. return tf(time.getHours())
  361. case 'ss':
  362. return tf(time.getSeconds())
  363. case 'WW':
  364. return ['日', '一', '二', '三', '四', '五', '六'][time.getDay()]
  365. }
  366. })
  367. },
  368. diff(start: Date, end: Date) {
  369. let d0 = this.begin(new Date(start));
  370. let d1 = this.begin(new Date(end));
  371. return (d1.getTime() - d0.getTime()) / (24 * 3600 * 1000)
  372. },
  373. delta(time: any = null, delta = 0, type = 'day') {
  374. let t = time || new Date();
  375. let year = t.getFullYear(), month = t.getMonth(), day = t.getDate(),
  376. hour = t.getHours(), minute = t.getMinutes(), second = t.getSeconds();
  377. let nextMonth = 0, mod = 0;
  378. switch (type) {
  379. case "day":
  380. t = new Date(t.getTime() + (delta * 24 * 3600 * 1000))
  381. break;
  382. case "week":
  383. t = new Date(t.getTime() + (delta * 7 * 24 * 3600 * 1000))
  384. break;
  385. case "month":
  386. nextMonth = month + delta;
  387. mod = Math.abs(delta) % 12;
  388. if (delta < 0) {
  389. if (nextMonth < 0) {
  390. nextMonth = nextMonth + ((mod + 1) * 12);
  391. year = year - (mod + 1);
  392. }
  393. } else if (delta > 0) {
  394. nextMonth = nextMonth - ((mod + 1) * 12);
  395. year = year + (mod + 1);
  396. }
  397. t = new Date(year, nextMonth, day, hour, minute, second);
  398. break;
  399. case "quarter":
  400. nextMonth = month + (delta * 3);
  401. mod = Math.abs(delta * 3) % 12;
  402. if (delta < 0) {
  403. if (nextMonth < 0) {
  404. nextMonth = nextMonth + ((mod + 1) * 12);
  405. year = year - (mod + 1);
  406. }
  407. } else if (delta > 0) {
  408. nextMonth = nextMonth - ((mod + 1) * 12);
  409. year = year + (mod + 1);
  410. }
  411. t = new Date(year, nextMonth, day, hour, minute, second);
  412. break;
  413. case "year":
  414. t = new Date(year + delta, month, day, hour, minute, second);
  415. break;
  416. }
  417. return t;
  418. },
  419. begin(time: any = null, type = 'day') {
  420. let t = time || new Date();
  421. let year = t.getFullYear(), month = t.getMonth(), day = t.getDate()
  422. switch (type) {
  423. case "day":
  424. t = new Date(year, month, day);
  425. break;
  426. case "week":
  427. let date = t.getDay();
  428. t = new Date(new Date(year, month, day).getTime() - (date * 24 * 3600 * 1000));
  429. break;
  430. case "month":
  431. t = new Date(year, month, 1);
  432. break;
  433. case "quarter":
  434. let nextMonth = 0;
  435. if (month >= 3 && month <= 5) {
  436. nextMonth = 3;
  437. }
  438. if (month >= 6 && month <= 8) {
  439. nextMonth = 6;
  440. }
  441. if (month >= 9 && month <= 11) {
  442. nextMonth = 9;
  443. }
  444. t = new Date(year, nextMonth, 1);
  445. break;
  446. case "year":
  447. t = new Date(year, 0, 1);
  448. break;
  449. }
  450. return t;
  451. },
  452. end(time: Date, type = 'day') {
  453. let t: Date = time || new Date();
  454. let year = t.getFullYear(), month = t.getMonth(), day = t.getDate()
  455. switch (type) {
  456. case "day":
  457. t = new Date(year, month, day, 23, 59, 59, 999);
  458. break;
  459. case "week":
  460. let date = t.getDay();
  461. t = new Date(new Date(year, month, day).getTime() + ((7 - date) * 24 * 3600 * 1000) - 1);
  462. break;
  463. case "month":
  464. let _d = this.delta(t, 1, 'month');
  465. _d = this.begin(_d, 'month');
  466. t = new Date(new Date(_d.getFullYear(), _d.getMonth(), _d.getDate()).getTime() - 1);
  467. break;
  468. case "quarter":
  469. let __d = this.delta(t, 1, 'quarter');
  470. __d = this.begin(__d, 'quarter');
  471. t = new Date(new Date(__d.getFullYear(), __d.getMonth(), __d.getDate()).getTime() - 1);
  472. break;
  473. case "year":
  474. t = new Date(year, 11, 13, 23, 59, 59, 999);
  475. break;
  476. }
  477. return t;
  478. }
  479. },
  480. validator: {
  481. required: {required: true, message: "必填项", trigger: 'blur'},
  482. requiredEnum: {type: 'number', min: 1, message: "必选项", trigger: 'blur'}, //字典类的校验规则
  483. verifyCode: {required: true, message: "请输入验证码", trigger: 'blur'},
  484. rangeDate: {type: 'array', length: 2, required: true, message: "必选项"},
  485. lengthMax2: {type: 'string', max: 2, message: "最多2个字"},
  486. lengthMax6: {type: 'string', max: 6, message: "长度最大6个字"},
  487. lengthMax10: {type: 'string', max: 10, message: "长度最大6个字"},
  488. lengthMax50: {type: 'string', max: 50, message: "长度最大50个字"},
  489. length: {type: 'string', min: 4, max: 50, message: "长度为4-50个字"},
  490. length32: {type: 'string', min: 1, max: 32, message: "不能超过32个字"},
  491. length64: {type: 'string', min: 1, max: 64, message: "不能超过64个字"},
  492. length128: {type: 'string', min: 1, max: 128, message: "不能超过128个字"},
  493. length256: {type: 'string', min: 1, max: 256, message: "不能超过256个字"},
  494. lengthShort: {min: 2, max: 20, message: "长度为4-20个字"},
  495. lengthName: {type: 'string', min: 2, max: 10, message: "长度为2-10个字"},
  496. positiveInt: {type: 'number', min: 1, message: "必须为正整数"},
  497. negativeInt: {type: 'number', max: -1, message: "必须为负数"},
  498. mobile: {type: 'string', length: 11, max: 11, pattern: '^[1][3,4,5,7,8][0-9]{9}$', message: "11位数字手机号格式错误"},
  499. email: {type: 'email', min: 6, pattern: '^(\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$', message: "邮箱格式错误"},
  500. password: {min: 8, message: "请输入8位密码", trigger: 'blur'},
  501. // password: {type: 'string', min: 6, max: 12, pattern: '(\\w){6,12}', message: '格式为6-12位数字字母组合'},
  502. idNo: {type: 'string', pattern: '(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X)$)', message: '身份证号码格式错误'},
  503. chinese: {type: 'string', pattern: '^[\\u4e00-\\u9fa5]{0,}$', message: '请输入中文字符'},
  504. num: {type: 'string', pattern: /^\d*$/, message: "只能输入数字"},
  505. letter: {type: 'string', pattern: /^[A-Za-z0-9\-]$/, message: "只能输入字母和数字"},
  506. tel: {type: 'string', pattern: /^[-\d]*$/, message: "电话只能包含数字和-"},
  507. url: {
  508. type: 'string',
  509. pattern: /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/,
  510. message: "链接地址错误"
  511. },
  512. },
  513. fmt: {
  514. fmtMoney: function (money: number) {
  515. if (!money) {
  516. return "0.00";
  517. }
  518. return (money / 100).toFixed(2);
  519. },
  520. fmtUrl: function (v: string) {
  521. let token = Session.get('accessToken')
  522. if (!v) {
  523. return '';
  524. }
  525. if (v.indexOf("http") === 0) {
  526. return v;
  527. }
  528. console.log(v, fileUrl)
  529. // return fileUrl + v;
  530. return `${fileUrl}${v}`
  531. },
  532. fmtImg(v: string) {
  533. let token = Session.get('accessToken')
  534. if (u.isEmptyOrNull(v)) {
  535. return "./image/placeholder.png";
  536. }
  537. if (v.indexOf("http") === 0) {
  538. return v;
  539. }
  540. return `${fileUrl}${v}`
  541. },
  542. fmtPreview(v: string) {
  543. let token = Session.get('accessToken')
  544. if (u.isEmptyOrNull(v)) {
  545. return "./image/placeholder.png";
  546. }
  547. if (v.indexOf("http") === 0) {
  548. return v;
  549. }
  550. return `${previewUrl}${v}?X-Token=${btoa(token)}`
  551. // return `${previewUrl}${v}`
  552. },
  553. /**
  554. * byte 单位转换
  555. * @param size
  556. */
  557. fmtSize(size: number = 0) {
  558. if (size < 1024) {
  559. return size + 'B';
  560. }
  561. size = size / 1024;
  562. if (size > 1024) {
  563. size = size / 1024;
  564. if (size > 1024) {
  565. size = size / 1024;
  566. return size.toFixed(2) + 'GB'
  567. } else {
  568. return size.toFixed(2) + 'MB'
  569. }
  570. } else {
  571. return size.toFixed(2) + 'KB'
  572. }
  573. },
  574. fmtDateTime(t: any) {
  575. if (t == null) {
  576. return "-";
  577. }
  578. let date = new Date(t);
  579. let year = date.getFullYear();
  580. let month = date.getMonth() + 1;
  581. let day = date.getDate();
  582. let hour = date.getHours();
  583. let minute = date.getMinutes();
  584. let second = date.getSeconds();
  585. return [year, month, day].map(n => {
  586. return u.pad(n, 2)
  587. }).join('-') + ' ' + [hour, minute, second].map(n => {
  588. return u.pad(n, 2)
  589. }).join(':')
  590. },
  591. fmtDate(t: any) {
  592. if (t == null) {
  593. return "-";
  594. }
  595. let date = new Date(t);
  596. let year = date.getFullYear();
  597. let month = date.getMonth() + 1;
  598. let day = date.getDate();
  599. return [year, month, day].map(n => {
  600. return u.pad(n, 2)
  601. }).join('-');
  602. },
  603. fmtMonth(t: any) {
  604. if (t == null) {
  605. return "-";
  606. }
  607. let date = new Date(t);
  608. let year = date.getFullYear();
  609. let month = date.getMonth() + 1;
  610. return [year, month].map(n => {
  611. return u.pad(n, 2)
  612. }).join('-');
  613. },
  614. fmtTime(t: any) {
  615. if (t == null) {
  616. return "-";
  617. }
  618. let date = new Date(t);
  619. let hour = date.getHours();
  620. let minute = date.getMinutes();
  621. return [hour, minute].map(n => {
  622. return u.pad(n, 2)
  623. }).join(':')
  624. },
  625. fmtServerUrl(v: any) {
  626. if (!v) {
  627. return null;
  628. }
  629. if (v.indexOf("http") === 0) {
  630. return v;
  631. }
  632. return serverUrl + v.replace(/\\/g, "/");
  633. },
  634. fmtSensitive(v: any, start: number, length: number) {
  635. if (!v) {
  636. return "";
  637. }
  638. let ret = [];
  639. ret.push(v.substring(0, start));
  640. for (let i = 0; i < length; i++) {
  641. ret.push("*");
  642. }
  643. ret.push(v.substring(start + length, v.length));
  644. return ret.join("");
  645. },
  646. fmtUrlParam(key: string) {
  647. let reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)", "i");
  648. let r = window.location.search.substr(1).match(reg);
  649. if (r != null) {
  650. return decodeURI(r[2]);
  651. } else {
  652. return null;
  653. }
  654. },
  655. fmtDict(v: number, type: string) {
  656. if (v == null) {
  657. return "";
  658. }
  659. const dicts = Session.get("dicts");
  660. if (u.isEmptyOrNull(dicts)) {
  661. return '--'
  662. }
  663. let dict = (<Dicts>dicts).find(k => k.type == type && k.code === v);
  664. if (u.isEmptyOrNull(dict)) {
  665. return "--";
  666. }
  667. return dict.value;
  668. },
  669. }
  670. }
  671. export default u;