formVerify.js 12 KB

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