formVerify.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const fieldCheck_1 = __importDefault(require("./fieldCheck"));
  7. let hasOwnProperty = Object.prototype.hasOwnProperty;
  8. function hasOwn(obj, key) {
  9. return hasOwnProperty.call(obj, key);
  10. }
  11. /**
  12. * @class FormItem 表单验证类
  13. * @description 表单项
  14. * @param {formObject} formObject 表单项数据
  15. * @param {FieldCheck} [fieldCheck] 字段验证对象
  16. * @param {object} [option] 配置项
  17. */
  18. class FormVerify {
  19. constructor(formObject, fieldCheck, option) {
  20. this.formData = null;
  21. this.defaultOption = {
  22. isMustMatchRule: false,
  23. };
  24. this.option = {
  25. isMustMatchRule: false,
  26. };
  27. this.formState_default = 0;
  28. this.formState_pass = 1;
  29. this.formState_notPass = 2;
  30. this.fieldCheck = fieldCheck || new fieldCheck_1.default();
  31. // 合并配置项
  32. this.option = Object.assign(this.defaultOption, option);
  33. let errMsg;
  34. // 拿出其中的每一项来构建对应的表单项
  35. for (let key in formObject) {
  36. // this.formData[key] = object[key];
  37. // 验证表单项是否符合要求,不符合要求则抛出错误
  38. errMsg = FormVerify.buildFormItem(formObject, key, formObject[key], this.fieldCheck, this.option.isMustMatchRule);
  39. if (errMsg) {
  40. throw new Error(`表单项${key}不符合要求,err:${errMsg}`);
  41. }
  42. }
  43. this.formData = formObject;
  44. }
  45. static isObject(obj) {
  46. return obj !== null && typeof obj === 'object';
  47. }
  48. /**
  49. * 检查表单项是否符合要求
  50. * @param object 表单项数据
  51. * @param field 字段名
  52. * @param formItemData 表单项数据
  53. * @param fieldCheck 字段验证对象
  54. * @param isMustMatchRule 表单字段是否必须匹配到验证规则
  55. * @returns errMsg 错误信息
  56. */
  57. static buildFormItem(object, field, formItemData, fieldCheck, isMustMatchRule) {
  58. if (!FormVerify.isObject(formItemData)) {
  59. return `form item ${field} must be object`;
  60. }
  61. // 是否需要从验证规则表中查找对应的验证规则
  62. let isNeedMatchRule = true;
  63. // 用于匹配的字段
  64. let checkFieldStr = field;
  65. let disables = formItemData.disables;
  66. // 设置默认值
  67. formItemData.val = formItemData.val || formItemData.init || '';
  68. // 设置默认提示词
  69. formItemData.msg = formItemData.msg || '';
  70. // 设置默认状态
  71. formItemData.state = formItemData.state || FormVerify.formState_default;
  72. // 设置默认显示文本
  73. formItemData.label = formItemData.label || '';
  74. // 判断是否有 options 选项有则判断是否有 init 选项,没有则设置第一个为 init
  75. if (formItemData.options) {
  76. if (!formItemData.options.length || !formItemData.options[0]) {
  77. return `form item ${field} options must be array and has item`;
  78. }
  79. if (!formItemData.init) {
  80. formItemData.init = formItemData.options[0].key;
  81. }
  82. // 判断 val 与 init 是否存在于 options 中
  83. let hasInit = false;
  84. for (let i = 0; i < formItemData.options.length; i++) {
  85. let option = formItemData.options[i];
  86. if (option.key === formItemData.init) {
  87. hasInit = true;
  88. }
  89. // 判断该options是否为禁用项
  90. if (disables && disables.indexOf(option.key) !== -1) {
  91. option.disabled = true;
  92. }
  93. }
  94. if (!hasInit) {
  95. return `form item ${field} init value must be in options`;
  96. }
  97. }
  98. // 判断是否有 depend 依赖字段 有依赖字段则依据依赖字段中的 option 中的 checkField 字段进行判断
  99. if (formItemData.depend && formItemData.reCheckField) {
  100. return `form item ${field} has depend and reCheckField, but depend and reCheckField can not exist at the same time`;
  101. }
  102. // 判断是否有 depend 依赖字段 有依赖字段则依据依赖字段中的 option 中的 checkField 字段进行判断
  103. if (formItemData.depend) {
  104. let hasCheckField = false;
  105. let dependStr = formItemData.depend;
  106. let dependOptions = [];
  107. // 判断object 是否为 formObject 并且不为undefined
  108. if (!object) {
  109. return `form item ${field} depend field ${dependStr} but the field not exist`;
  110. }
  111. // 设置 object 不为undefined
  112. object = object;
  113. // 判断依赖字段是否存在
  114. if (!object[dependStr]) {
  115. return `form item ${field} depend field ${dependStr} but the field not exist`;
  116. }
  117. // 判断依赖字段的 option 是否存在
  118. if (!object[dependStr].options) {
  119. return `form item ${field} depend field ${dependStr} has no options`;
  120. }
  121. // 判断依赖字段的 options 中是否有 checkField 字段
  122. dependOptions = object[dependStr].options;
  123. for (let i = 0; i < dependOptions.length; i++) {
  124. let option = object ? dependOptions[i] : null;
  125. if (option === null || option === void 0 ? void 0 : option.checkField) {
  126. hasCheckField = true;
  127. checkFieldStr = option.checkField;
  128. break;
  129. }
  130. }
  131. if (!hasCheckField) {
  132. return `form item ${field} depend field ${dependStr} has no checkField`;
  133. }
  134. }
  135. // 判断是否有 reCheckField 有则使用该字段的值进行规则验证
  136. if (formItemData.reCheckField) {
  137. checkFieldStr = formItemData.reCheckField;
  138. }
  139. // 判断是否有 rules 规则
  140. if (isMustMatchRule) {
  141. if (fieldCheck.getRuleItem(checkFieldStr)) {
  142. return `form item ${field} has no rules`;
  143. }
  144. }
  145. return '';
  146. }
  147. /**
  148. * 初始化表单项数据
  149. * @param { formObject } formObject 表单对象
  150. */
  151. static initFormItemData(formObject) {
  152. let keys = Object.keys(formObject);
  153. for (let i = 0; i < keys.length; i++) {
  154. let key = keys[i];
  155. formObject[key].val = formObject[key].init;
  156. formObject[key].msg = '';
  157. formObject[key].state = FormVerify.formState_default;
  158. formObject[key].showText = '';
  159. }
  160. }
  161. /**
  162. * 检查表单项是否符合要求
  163. * @param form 表单对象
  164. * @param isMustMatch 是否必须全部匹配到验证规则
  165. * @returns {boolean}
  166. */
  167. checkForm(form, isMustMatch) {
  168. let r = true;
  169. let n_checkPass = 0, n_checkTotal = 0;
  170. let msg = '';
  171. for (const fieldKey in form) {
  172. let formItem = form[fieldKey];
  173. if (!formItem) {
  174. continue;
  175. }
  176. let depend = form[formItem.depend || ''];
  177. let checkField = fieldKey;
  178. let tmpInd = -1;
  179. n_checkTotal++;
  180. if (formItem.reCheckField) {
  181. checkField = formItem.reCheckField;
  182. }
  183. // 禁用值判断 array
  184. if (formItem.disables) {
  185. if (formItem.disables.indexOf(formItem.val || '') !== -1) {
  186. formItem.msg = '该项内容不合法';
  187. r = false;
  188. }
  189. }
  190. // 枚举值判断
  191. if (formItem.options) {
  192. // 有枚举字段,只判断是否在枚举中
  193. // console.log(`检测枚举字段:${checkField},值:${formItem.val}`);
  194. tmpInd = formItem.options.findIndex(item => item.value == formItem.val);
  195. if (tmpInd === -1) {
  196. console.log(`检测枚举字段:${checkField},值:${formItem.val}不在范围内`);
  197. formItem.msg = '选项不在范围内';
  198. formItem.state = 1;
  199. r = false;
  200. }
  201. else {
  202. // 判断值是否为禁用项
  203. if (formItem.options[tmpInd].disabled) {
  204. formItem.msg = '该选项已经被禁用';
  205. r = false;
  206. }
  207. }
  208. // 枚举值判断完毕,继续下一个字段
  209. n_checkPass++;
  210. continue;
  211. }
  212. // 依赖字段判断
  213. if (depend) {
  214. depend = depend;
  215. if (depend.options) {
  216. // 依赖的对象有枚举类型,检查该枚举类型是否有有检测值
  217. let optionItem = depend.options.find(item => item.value == formItem.val);
  218. if (!optionItem) {
  219. depend.msg = '选项不在范围内';
  220. formItem.msg = '该值依赖项输入异常';
  221. r = false;
  222. // continue;
  223. }
  224. optionItem = optionItem;
  225. if (optionItem.checkField) {
  226. // console.log(`采用依赖项的检测字段${optionItem.checkField}`)
  227. checkField = optionItem.checkField;
  228. }
  229. }
  230. else {
  231. r = false;
  232. }
  233. if (!r) {
  234. depend.msg = '该项依赖项输入异常';
  235. formItem.msg = '该值依赖项输入异常';
  236. }
  237. }
  238. // 使用验证规则进行
  239. formItem.msg = this.fieldCheck.verify({
  240. [checkField]: formItem.val,
  241. });
  242. if (formItem.msg)
  243. r = false;
  244. if (r) {
  245. n_checkPass++;
  246. formItem.state = this.formState_pass;
  247. }
  248. else {
  249. formItem.state = this.formState_notPass;
  250. }
  251. }
  252. msg = `检查表单项通过率:${n_checkPass}/${n_checkTotal}`;
  253. console.log(msg);
  254. return r;
  255. }
  256. }
  257. exports.default = FormVerify;
  258. //# sourceMappingURL=formVerify.js.map