u.ts 24 KB

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