tool.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. import moment from 'moment';
  2. // import Schema from 'async-validator';
  3. const BaseTool = {};
  4. BaseTool.UserUtil = {
  5. transImg(imgArr = []) {
  6. const temp = []
  7. if (BaseTool.Object.isBlank(imgArr)) {
  8. return temp
  9. }
  10. imgArr.forEach(item => {
  11. if (item.url.substr(0, 4) !== 'http') {
  12. item.url = BaseTool.UserUtil.getFileServerUrl() + item.url
  13. }
  14. temp.push(item)
  15. })
  16. return temp
  17. },
  18. getUploadUrl: () => {
  19. return BaseTool.UserUtil.getBaseUrl() + '/upms/files/upload';
  20. },
  21. getUploadUrlIgnores: () => {
  22. return BaseTool.UserUtil.getBaseUrl() + '/ignores/files/upload';
  23. },
  24. getFileUrl: url => {
  25. // #ifdef H5
  26. if (process.env.NODE_ENV === 'development') {
  27. return 'http://localhost:5000'+ url;
  28. } else if (process.env.NODE_ENV === 'production') {
  29. return 'https://xiamen.m.litian2017.com/api'+ url;
  30. }
  31. // #endif
  32. // #ifndef H5
  33. // eslint-disable-next-line no-unreachable
  34. return BaseTool.UserUtil.getBaseUrl() + url;
  35. // #endif
  36. },
  37. getImageCode: () => {
  38. return BaseTool.UserUtil.getBaseUrl() + '/verify/captcha/';
  39. },
  40. NOT_LOGIN: ['/verify/sms/code/send',
  41. '/upms/users/register',
  42. '/upms/users/check/',
  43. '/ignores/'],
  44. /**
  45. * /ignores 免登录通道中的写操作接口
  46. * 这些接口后端 permitAll,但已登录时必须携带 token,
  47. * 否则后端 checkAndGetUser 取不到登录人,只能拿设备保管人/表单姓名兜底留痕
  48. */
  49. WRITE_IGNORES: [
  50. '/ignores/sb/status-logs',
  51. '/ignores/sb/status/',
  52. '/ignores/sb/images/',
  53. '/ignores/check/jobs/execute',
  54. '/ignores/check/jobs/finish'],
  55. isLogin: () => {
  56. return !!uni.getStorageSync('accessToken');
  57. },
  58. getUserInfo: () => {
  59. return uni.getStorageSync('userInfo').userInfo;
  60. },
  61. /**
  62. * 判断当前登录用户是否拥有指定角色码之一
  63. * 基于 userInfo.roleCodes 完整列表,不依赖单一 roleName 字符串(多角色账号 roleName 只取排序最前的一个,易误判)
  64. * @param {Array|String} codes 角色码,如 ['Maintenance','MM']
  65. */
  66. hasRoleCode: codes => {
  67. const info = uni.getStorageSync('userInfo').userInfo;
  68. if (info == null) {
  69. return false;
  70. }
  71. const roleCodes = info.roleCodes || [];
  72. const list = Array.isArray(codes) ? codes : [codes];
  73. return list.some(code => roleCodes.indexOf(code) !== -1);
  74. },
  75. isRepairRole: () => {
  76. // 维修人员(Maintenance) 或 维修主管(MM):与后端接单权限保持一致
  77. return BaseTool.UserUtil.hasRoleCode(['Maintenance', 'MM']);
  78. },
  79. isManagerRole: () => {
  80. const info = uni.getStorageSync('userInfo').userInfo;
  81. if (info == null) {
  82. return false;
  83. }
  84. // 超级管理员:优先用 superAdmin 标记,兼容旧的 roleName 判断
  85. return info.superAdmin === 1 || info.superAdmin === true || info.roleName === '超级管理员';
  86. },
  87. isExamineRole: () => {
  88. // 维修审核(REPAIR_EXAMINE):手机端“审核任务”入口
  89. return BaseTool.UserUtil.hasRoleCode(['REPAIR_EXAMINE']);
  90. },
  91. isUseRole: () => {
  92. if (uni.getStorageSync('userInfo').userInfo == null) {
  93. return false;
  94. } else if (uni.getStorageSync('userInfo').userInfo.roleName === '使用人员') {
  95. return true;
  96. } else {
  97. return false;
  98. }
  99. },
  100. getStateUserInfo: (that) => {
  101. return that.$store.state.userInfo.userInfo;
  102. },
  103. getToken: url => {
  104. // 写操作接口不在免 token 名单内:登录后携带 token,便于后端留痕真实操作人
  105. const isWriteApi = (url || '').indexOf('/ignores/') !== -1
  106. && BaseTool.UserUtil.WRITE_IGNORES.some(item => url.indexOf(item) !== -1);
  107. if (!isWriteApi) {
  108. for (const notUrl of BaseTool.UserUtil.NOT_LOGIN) {
  109. if (url.indexOf(notUrl) !== -1) {
  110. return '';
  111. }
  112. }
  113. }
  114. let token = '';
  115. const storeToken = uni.getStorageSync('accessToken');
  116. if (url.indexOf('/oauth/token') !== -1) {
  117. token = 'Basic ZnJvbnQ6ZnJvbnQ=';
  118. } else if (url.indexOf('/alipay') !== -1) {
  119. return false;
  120. } else if (storeToken) {
  121. token = 'Bearer ' + storeToken;
  122. }
  123. console.log(11221)
  124. console.log(token)
  125. return token;
  126. },
  127. getBaseUrl: () => {
  128. // #ifdef H5
  129. return '/api';
  130. },
  131. getFileServerUrl: () => {
  132. // #ifdef H5
  133. return '/api';
  134. }
  135. };
  136. // BaseTool.Validator = {
  137. // getParams: (dataMap = {}) => {
  138. // const params = {};
  139. // Object.keys(dataMap).forEach(key => {
  140. // params[key] = dataMap[key].value;
  141. // });
  142. // return params;
  143. // },
  144. // getListParams: (dataList = []) => {
  145. // const params = {};
  146. // dataList.forEach(item => {
  147. // params[item.name] = item.value;
  148. // });
  149. // return params;
  150. // },
  151. // getSchemaParams: (dataMap = {}) => {
  152. // return dataMap;
  153. // },
  154. // getListSchemaParams: (dataList = []) => {
  155. // const schemaParams = {};
  156. // dataList.forEach(item => {
  157. // schemaParams[item.name] = item;
  158. // });
  159. // return schemaParams;
  160. // },
  161. // validateRules: (dataMap = {}) => {
  162. // return new Promise((resolve, reject) => {
  163. // const schemaData = {};
  164. // const params = {};
  165. // Object.keys(dataMap).forEach(key => {
  166. // schemaData[key] = dataMap[key].rules;
  167. // params[key] = dataMap[key].value;
  168. // });
  169. // const validator = new Schema(schemaData);
  170. // validator
  171. // .validate(params, (errors, fields) => {
  172. // if (errors) {
  173. // uni.showToast({ icon: 'none', title: errors[0].message });
  174. // reject(errors);
  175. // } else {
  176. // resolve(params);
  177. // }
  178. // })
  179. // .then(
  180. // r => {},
  181. // ({ errors, fields }) => {}
  182. // );
  183. // });
  184. // },
  185. // validateParamsRules: (params = {}, rules = {}) => {
  186. // return new Promise((resolve, reject) => {
  187. // const validator = new Schema(rules);
  188. // validator
  189. // .validate(params, (errors, fields) => {
  190. // if (errors) {
  191. // uni.showToast({ icon: 'none', title: errors[0].message });
  192. // reject(errors);
  193. // } else {
  194. // resolve(params);
  195. // }
  196. // })
  197. // .then(
  198. // r => {},
  199. // ({ errors, fields }) => {}
  200. // );
  201. // });
  202. // },
  203. // validate: (dataMap = {}) => {
  204. // return new Promise((resolve, reject) => {
  205. // const validator = new Schema(dataMap);
  206. // const params = BaseTool.Validator.getParams(dataMap);
  207. // validator
  208. // .validate(params, (errors, fields) => {
  209. // if (errors) {
  210. // console.log(111111, errors);
  211. // uni.showToast({ icon: 'none', title: errors[0].message });
  212. // reject(errors);
  213. // } else {
  214. // resolve(params);
  215. // }
  216. // })
  217. // .then(
  218. // r => {},
  219. // ({ errors, fields }) => {}
  220. // );
  221. // });
  222. // },
  223. // validateListRules: (dataList = []) => {
  224. // return new Promise((resolve, reject) => {
  225. // const schemaData = {};
  226. // const params = {};
  227. // dataList.forEach(item => {
  228. // params[item.name] = item.value;
  229. // schemaData[item.name] = item.rules;
  230. // });
  231. // const validator = new Schema(schemaData);
  232. // validator
  233. // .validate(params, (errors, fields) => {
  234. // if (errors) {
  235. // uni.showToast({ icon: 'none', title: errors[0].message });
  236. // reject(errors);
  237. // } else {
  238. // resolve(params);
  239. // }
  240. // })
  241. // .then(
  242. // r => {},
  243. // ({ errors, fields }) => {}
  244. // );
  245. // });
  246. // },
  247. // validateList: (dataList = []) => {
  248. // return new Promise((resolve, reject) => {
  249. // const validator = new Schema(BaseTool.Validator.getListSchemaParams(dataList));
  250. // const params = BaseTool.Validator.getListParams(dataList);
  251. // validator
  252. // .validate(params, (errors, fields) => {
  253. // if (errors) {
  254. // uni.showToast({ icon: 'none', title: errors[0].message });
  255. // reject(errors);
  256. // } else {
  257. // resolve(params);
  258. // }
  259. // })
  260. // .then(
  261. // r => {},
  262. // err => {}
  263. // );
  264. // });
  265. // }
  266. // };
  267. /**
  268. * 时间对象
  269. * 转换时使用这个方法,因为moment暂用的空间还是有点大,小程序从936k->1.22M
  270. * h5:也多了100-200k
  271. */
  272. BaseTool.Date = {
  273. PICKER_NORM_YEAR: 'YYYY',
  274. PICKER_NORM_MONTH: 'MM',
  275. PICKER_NORM_YEAR_MONTH: 'YYYY-MM',
  276. PICKER_NORM_DATE_PATTERN: 'YYYY-MM-DD',
  277. PICKER_NORM_TIME_PATTERN: 'HH:mm:ss',
  278. PICKER_NORM_DATETIME_PATTERN: 'YYYY-MM-DD HH:mm:ss',
  279. /**
  280. * 将字符串日期格式化
  281. * @param date
  282. * @param pattern
  283. * @returns {string}
  284. */
  285. formatter(date, pattern) {
  286. if (BaseTool.Object.isBlank(date)) {
  287. return '';
  288. } else {
  289. return moment(date, BaseTool.Date.PICKER_NORM_DATETIME_PATTERN).format(pattern);
  290. }
  291. },
  292. getCountBetween(date1, date2, type = 1) {
  293. const startTime = new Date(date1); // 开始时间
  294. const endTime = new Date(date2); // 结束时间
  295. const usedTime = endTime - startTime; // 相差的毫秒数
  296. const days = Math.floor(usedTime / (24 * 3600 * 1000)); // 计算出天数
  297. const leavel = usedTime % (24 * 3600 * 1000); // 计算天数后剩余的时间
  298. const hours = Math.floor(leavel / (3600 * 1000)); // 计算剩余的小时数
  299. const leavel2 = leavel % (3600 * 1000); // 计算剩余小时后剩余的毫秒数
  300. const minutes = Math.floor(leavel2 / (60 * 1000)); // 计算剩余的分钟数
  301. if (type === 1) {
  302. return days;
  303. }
  304. if (type === 2) {
  305. return hours;
  306. }
  307. if (type === 2) {
  308. return minutes;
  309. }
  310. }
  311. };
  312. BaseTool.String = {
  313. isBlank(text) {
  314. return text === null || text === undefined || text === 'undefined' || text === '';
  315. },
  316. isNotBlank(text) {
  317. return !this.isBlank(text);
  318. }
  319. };
  320. BaseTool.Object = {
  321. isBlank(text) {
  322. if (typeof text === 'string') {
  323. return BaseTool.String.isBlank(text);
  324. }
  325. return text === null || text === undefined;
  326. },
  327. isNotBlank(text) {
  328. return !this.isBlank(text);
  329. },
  330. /**
  331. * 获取对象属性
  332. * @param obj
  333. * @param field
  334. * @returns {*}
  335. */
  336. getField(obj, field) {
  337. if (BaseTool.String.isBlank(obj) || BaseTool.String.isBlank(field)) {
  338. return '';
  339. }
  340. return obj[field];
  341. },
  342. /**
  343. * 深克隆
  344. * @param data
  345. * @returns {{}|any}
  346. */
  347. copy: function (data) {
  348. if (BaseTool.Object.isBlank(data)) {
  349. return {};
  350. }
  351. return JSON.parse(JSON.stringify(data));
  352. }
  353. };
  354. BaseTool.Amount = {
  355. /**
  356. * 元换算为万元
  357. * @param num :
  358. * @returns {number} :
  359. */
  360. divTenThousand(num) {
  361. if (num == null) {
  362. return 0;
  363. }
  364. return BaseTool.Number.div(num, 10000, 3);
  365. // return num
  366. },
  367. /**
  368. * 元换算为万元,并格式化
  369. * @param num :
  370. * @returns {string} :
  371. */
  372. divTenThousandFormatter(num) {
  373. if (BaseTool.String.isBlank(num)) {
  374. return num;
  375. }
  376. return this.formatter(this.divTenThousand(num));
  377. },
  378. /**
  379. * 格式化金额
  380. * @param value
  381. * @returns {string}
  382. */
  383. formatter: value => {
  384. if (BaseTool.String.isBlank(value)) {
  385. return '';
  386. }
  387. return `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  388. },
  389. /**
  390. * 格式化利率
  391. * @param value
  392. * @returns {string|*}
  393. */
  394. formatterRate: value => {
  395. if (BaseTool.String.isBlank(value)) {
  396. return value;
  397. }
  398. return value + '%';
  399. },
  400. /**
  401. * 去掉格式化金额
  402. * @param value
  403. * @returns {*}
  404. */
  405. parser: value => value.replace(/\$\s?|(,*)/g, ''),
  406. /**
  407. * 万元换算为元
  408. * @param num
  409. * @returns {*}
  410. */
  411. mulTenThousand(num) {
  412. if (BaseTool.String.isBlank(num)) {
  413. return 0;
  414. }
  415. return BaseTool.Number.mul(num, 10000, 6);
  416. // return num
  417. },
  418. /**
  419. * 元换算为万元,并格式化
  420. * @param num :
  421. * @returns {string} :
  422. */
  423. default(value) {
  424. if (BaseTool.String.isBlank(value) || value === 0) {
  425. return '0.00';
  426. }
  427. return value;
  428. },
  429. /**
  430. * 元换算为万元,并格式化
  431. * @param num :
  432. * @returns {string} :
  433. */
  434. defaultDivTenThousandFormatter(num) {
  435. if (BaseTool.String.isBlank(num) || num === 0) {
  436. return '0.00';
  437. }
  438. return this.formatter(this.divTenThousand(num));
  439. }
  440. };
  441. BaseTool.Number = {
  442. add(arg1, arg2) {
  443. if (BaseTool.String.isBlank(arg1)) {
  444. arg1 = 0;
  445. }
  446. if (BaseTool.String.isBlank(arg2)) {
  447. arg2 = 0;
  448. }
  449. let r1, r2;
  450. try {
  451. r1 = arg1.toString().split('.')[1].length;
  452. } catch (e) {
  453. r1 = 0;
  454. }
  455. try {
  456. r2 = arg2.toString().split('.')[1].length;
  457. } catch (e) {
  458. r2 = 0;
  459. }
  460. const m = Math.pow(10, Math.max(r1, r2));
  461. const n = r1 >= r2 ? r1 : r2;
  462. return ((arg1 * m + arg2 * m) / m).toFixed(n);
  463. },
  464. sub(arg1, arg2) {
  465. if (BaseTool.String.isBlank(arg1)) {
  466. arg1 = 0;
  467. }
  468. if (BaseTool.String.isBlank(arg2)) {
  469. arg2 = 0;
  470. }
  471. let re1, re2;
  472. try {
  473. re1 = arg1.toString().split('.')[1].length;
  474. } catch (e) {
  475. re1 = 0;
  476. }
  477. try {
  478. re2 = arg2.toString().split('.')[1].length;
  479. } catch (e) {
  480. re2 = 0;
  481. }
  482. const m = Math.pow(10, Math.max(re1, re2));
  483. const n = re1 >= re2 ? re1 : re2;
  484. return ((arg1 * m - arg2 * m) / m).toFixed(n);
  485. },
  486. mul(arg1, arg2) {
  487. if (BaseTool.String.isBlank(arg1)) {
  488. arg1 = 0;
  489. }
  490. if (BaseTool.String.isBlank(arg2)) {
  491. arg2 = 0;
  492. }
  493. let m = 0;
  494. const s1 = arg1.toString();
  495. const s2 = arg2.toString();
  496. try {
  497. m += s1.split('.')[1].length;
  498. } catch (e) {}
  499. try {
  500. m += s2.split('.')[1].length;
  501. } catch (e) {}
  502. return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m);
  503. },
  504. /**
  505. * 除法 注意如果整除了 小数点将无效
  506. * @param arg1 : 被除数
  507. * @param arg2 : 除数
  508. * @param digit :精确位数
  509. * @returns {number}
  510. */
  511. div(arg1, arg2, digit) {
  512. if (BaseTool.String.isBlank(arg1)) {
  513. arg1 = 0;
  514. }
  515. if (BaseTool.String.isBlank(arg2)) {
  516. arg2 = 1;
  517. }
  518. let t1 = 0;
  519. let t2 = 0;
  520. try {
  521. t1 = arg1.toString().split('.')[1].length;
  522. } catch (e) {}
  523. try {
  524. t2 = arg2.toString().split('.')[1].length;
  525. } catch (e) {}
  526. const r1 = Number(arg1.toString().replace('.', ''));
  527. const r2 = Number(arg2.toString().replace('.', ''));
  528. // 获取小数点后的计算值
  529. const result = ((r1 / r2) * Math.pow(10, t2 - t1)).toString();
  530. let result2 = result.split('.')[1];
  531. if (result2 !== undefined) {
  532. result2 = result2.substring(0, digit > result2.length ? result2.length : digit);
  533. } else {
  534. result2 = '';
  535. }
  536. while (result2.length < digit) {
  537. result2 = result2 + '0';
  538. }
  539. if (digit === 0) {
  540. return Number(result.split('.')[0]);
  541. }
  542. return Number(result.split('.')[0] + '.' + result2);
  543. }
  544. };
  545. BaseTool.Util = {
  546. isPhone: value => {
  547. const reg = /^1[3456789]\d{9}$/;
  548. return reg.test(value);
  549. },
  550. isIdCard: value => {
  551. const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  552. return reg.test(value);
  553. },
  554. isBankCard: value => {
  555. const reg = /^\d+$/;
  556. return reg.test(value);
  557. },
  558. isAmount: value => {
  559. const reg = /((^[1-9]\d*)|^0)(\.\d{0,2})?$/;
  560. return reg.test(value);
  561. },
  562. isDev: () => {
  563. return process.env.NODE_ENV === 'development';
  564. },
  565. isProd: () => {
  566. return process.env.NODE_ENV === 'production';
  567. },
  568. isIOS: () => {
  569. const ua = navigator.userAgent;
  570. const isiOS = !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
  571. if (isiOS) {
  572. return true;
  573. } else {
  574. return false;
  575. }
  576. }
  577. };
  578. export default BaseTool;