helper.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. 'use strict';
  2. /**
  3. * 辅助方法扩展
  4. *
  5. * @author CaiAoLin
  6. * @date 2017/9/28
  7. * @version
  8. */
  9. module.exports = {
  10. /**
  11. * 内置验证器转换为前端jquery验证器
  12. *
  13. * @param {Object} rule - 后端service中的rule
  14. * @return {Object} - 返回转换后的数据
  15. */
  16. validateConvert(rule) {
  17. const result = {};
  18. if (Object.keys(rule).length <= 0) {
  19. return rule;
  20. }
  21. for (const index in rule) {
  22. result[index] = {};
  23. const type = rule[index].type !== undefined && rule[index].type !== '' ? rule[index].type : '';
  24. const stringType = ['string', 'password'];
  25. // 是否必填
  26. if (rule[index].required !== undefined) {
  27. result[index].required = rule[index].required;
  28. }
  29. // 最小长度
  30. if (stringType.indexOf(type) >= 0 && rule[index].min !== undefined) {
  31. result[index].minlength = rule[index].min;
  32. }
  33. // 最大长度
  34. if (stringType.indexOf(type) >= 0 && rule[index].max !== undefined) {
  35. result[index].maxlength = rule[index].max;
  36. }
  37. // 密码相关
  38. if (type === 'password' && rule[index].compare !== undefined) {
  39. result[index].equalTo = '#' + rule[index].compare;
  40. }
  41. // 最小值
  42. const integerType = ['integer', 'int', 'Number'];
  43. if (integerType.indexOf(type) >= 0 && rule[index].min !== undefined) {
  44. result[index].min = rule[index].min;
  45. }
  46. // 最大值
  47. if (integerType.indexOf(type) >= 0 && rule[index].max !== undefined) {
  48. result[index].max = rule[index].max;
  49. }
  50. // 自定义判断
  51. if (rule[index] === 'isMobile' || rule[index] === 'isIP') {
  52. result[index] = rule[index];
  53. }
  54. }
  55. return result;
  56. },
  57. /**
  58. * 生成随机字符串
  59. *
  60. * @param {Number} length - 需要生成字符串的长度
  61. * @param {Number} type - 1为数字和字符 2为纯数字 3为纯字母
  62. * @return {String} - 返回生成结果
  63. */
  64. generateRandomString(length, type = 1) {
  65. length = parseInt(length);
  66. length = isNaN(length) ? 1 : length;
  67. let randSeed = [];
  68. let numberSeed = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  69. let stringSeed = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  70. 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
  71. 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  72. switch (type) {
  73. case 1:
  74. randSeed = stringSeed.concat(numberSeed);
  75. stringSeed = numberSeed = null;
  76. break;
  77. case 2:
  78. randSeed = numberSeed;
  79. break;
  80. case 3:
  81. randSeed = stringSeed;
  82. break;
  83. default:
  84. break;
  85. }
  86. const seedLength = randSeed.length - 1;
  87. let result = '';
  88. for (let i = 0; i < length; i++) {
  89. const index = Math.ceil(Math.random() * seedLength);
  90. result += randSeed[index];
  91. }
  92. return result;
  93. },
  94. /**
  95. * 显示排序符号
  96. *
  97. * @param {String} field - 字段名称
  98. * @return {String} - 返回字段排序的符号
  99. */
  100. showSortFlag(field) {
  101. const sort = this.ctx.sort;
  102. if (!(sort instanceof Array) || sort.length !== 2) {
  103. return '';
  104. }
  105. sort[1] = sort[1].toUpperCase();
  106. return (sort[0] === field && sort[1] === 'DESC') ? '' : '-';
  107. },
  108. /**
  109. * 判断是否为ajax请求
  110. *
  111. * @param {Object} request - 请求数据
  112. * @return {boolean} 判断结果
  113. */
  114. isAjax(request) {
  115. let headerInfo = request.headers['x-requested-with'] === undefined ? '' : request.headers['x-requested-with'];
  116. headerInfo = headerInfo.toLowerCase();
  117. return headerInfo === 'xmlhttprequest';
  118. },
  119. /**
  120. * 模拟发送请求
  121. *
  122. * @param {String} url - 请求地址
  123. * @param {Object} data - 请求数据
  124. * @param {String} type - 请求类型(POST) POST | GET
  125. * @return {Object} - 请求结果
  126. */
  127. async sendRequest(url, data, type = 'POST') {
  128. // 发起请求
  129. const response = await this.ctx.curl(url, {
  130. method: type,
  131. data,
  132. dataType: 'json',
  133. });
  134. if (response.status !== 200) {
  135. throw '请求失败';
  136. }
  137. return response.data;
  138. },
  139. /**
  140. * 转换面包屑导航数据
  141. *
  142. * @param {Object} breadCrumb - 面包屑数据
  143. * @param {String} mode - 模式 append 为追加型模式 \ replace 为全部替换模式
  144. * @return {String} - 转换为字符串数据
  145. */
  146. convertBreadCrumb(breadCrumb, mode = 'append') {
  147. let result = '';
  148. if (!breadCrumb instanceof Array || breadCrumb.length <= 0) {
  149. return result;
  150. }
  151. if (mode === 'append') {
  152. const tmpBreadCrumb = [];
  153. tmpBreadCrumb.push({ name: this.ctx.topPermission.name });
  154. tmpBreadCrumb.push.apply(tmpBreadCrumb, breadCrumb);
  155. tmpBreadCrumb.push({ name: this.ctx.currentName });
  156. breadCrumb = tmpBreadCrumb;
  157. }
  158. const tmpList = [];
  159. for (const data of breadCrumb) {
  160. if (data.name === undefined) {
  161. continue;
  162. }
  163. const tmp = data.url === undefined || data.url === '' ?
  164. data.name : '<a href="/' + data.url + '">' + data.name + '</a>';
  165. tmpList.push(tmp);
  166. }
  167. result = tmpList.join(' / ');
  168. return result;
  169. },
  170. };