formData.js 10 KB

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