js_validator.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. 'use strict';
  2. /**
  3. * egg内置验证器与jquery验证器结合
  4. *
  5. * @author CaiAoLin
  6. * @date 2018/2/7
  7. * @version
  8. */
  9. class JSValidator {
  10. /**
  11. * 构造函数
  12. *
  13. * @param {Object} ctx - egg全局变量
  14. * @return {void}
  15. */
  16. constructor(ctx) {
  17. this.rule = {};
  18. // 模板
  19. this.template = 'layout/validator_template.ejs';
  20. // 表单元素
  21. this.selector = 'form';
  22. this.ctx = ctx;
  23. this.message = {};
  24. }
  25. /**
  26. * 设置选择器
  27. *
  28. * @param {String} selectorName - 选择器名称
  29. * @return {Object} - 返回自身类以便链式操作
  30. */
  31. setSelector(selectorName) {
  32. this.selector = selectorName;
  33. return this;
  34. }
  35. /**
  36. * 转换格式
  37. *
  38. * @param {Object} rule - egg中的规则
  39. * @return {Object} - 返回自身类以便链式操作
  40. */
  41. convert(rule) {
  42. const result = {};
  43. const messageResult = {};
  44. if (Object.keys(rule).length <= 0) {
  45. return rule;
  46. }
  47. for (const index in rule) {
  48. result[index] = {};
  49. const type = rule[index].type !== undefined && rule[index].type !== '' ? rule[index].type : '';
  50. const stringType = ['string', 'password'];
  51. // 是否必填
  52. if (rule[index].required !== undefined) {
  53. result[index].required = rule[index].required;
  54. }
  55. // 最小长度
  56. if (stringType.indexOf(type) >= 0 && rule[index].min !== undefined) {
  57. result[index].minlength = rule[index].min;
  58. }
  59. // 最大长度
  60. if (stringType.indexOf(type) >= 0 && rule[index].max !== undefined) {
  61. result[index].maxlength = rule[index].max;
  62. }
  63. // 密码相关
  64. if (type === 'password' && rule[index].compare !== undefined) {
  65. result[index].equalTo = '#' + rule[index].compare;
  66. }
  67. // 最小值
  68. const integerType = ['integer', 'int', 'Number'];
  69. if (integerType.indexOf(type) >= 0 && rule[index].min !== undefined) {
  70. result[index].min = rule[index].min;
  71. }
  72. // 最大值
  73. if (integerType.indexOf(type) >= 0 && rule[index].max !== undefined) {
  74. result[index].max = rule[index].max;
  75. }
  76. // 自定义判断
  77. const customType = ['mobile', 'ip'];
  78. // 自定义且带参数
  79. if (customType.indexOf(type) >= 0) {
  80. result[index][type] = true;
  81. if (rule[index].allowEmpty !== undefined) {
  82. result[index].required = !rule[index].allowEmpty;
  83. }
  84. }
  85. // 密码值判断
  86. if (type === 'password' && rule[index].compare !== undefined) {
  87. result[index].equalTo = '#' + rule[index].compare;
  88. }
  89. // 提示语
  90. if (rule[index].message !== undefined) {
  91. messageResult[index] = rule[index].message;
  92. }
  93. }
  94. this.rule = result;
  95. this.message = messageResult;
  96. return this;
  97. }
  98. /**
  99. * 构建js
  100. *
  101. * @return {String} - 返回js
  102. */
  103. async build() {
  104. if (Object.keys(this.rule).length <= 0) {
  105. return '';
  106. }
  107. const renderData = {
  108. selector: this.selector,
  109. rule: this.rule,
  110. message: this.message,
  111. };
  112. return await this.ctx.renderView(this.template, renderData);
  113. }
  114. }
  115. module.exports = JSValidator;