formValidation.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /**
  2. * 表单验证
  3. * @author dingyong
  4. * @version 1.4.0
  5. **/
  6. const form = {
  7. // 当出现错误时返回错误消息,否则返回空即为验证通过
  8. /*
  9. formData:Object 表单对象。{key:value,key:value},key==rules.name
  10. rules: Array [{name:name,rule:[],msg:[]},{name:name,rule:[],msg:[]}]
  11. name:name 属性=> 元素的名称
  12. rule:字符串数组 ["required","isMobile","isEmail","isCarNo","isIdCard","isAmount","isNum","isChinese","isEnglish",isEnAndNo","isSpecial","isEmoji",""isDate","isUrl","isSame:key","range:[1,9]","minLength:9","maxLength:Number","notEmpty"]
  13. msg:数组 []。 与数组 rule 长度相同,对应的错误提示信息
  14. */
  15. validation: function(formData, rules) {
  16. for (let item of rules) {
  17. let key = item.name
  18. let rule = item.rule
  19. let msgArr = item.msg
  20. if (!key || !rule || rule.length === 0 || !msgArr || msgArr.length === 0) {
  21. continue
  22. }
  23. for (let i = 0, length = rule.length; i < length; i++) {
  24. let ruleItem = rule[i]
  25. let msg = msgArr[i]
  26. if (!ruleItem || !msg) {
  27. continue
  28. }
  29. // 数据处理
  30. let value = null
  31. if (~ruleItem.indexOf(':')) {
  32. let temp = ruleItem.split(':')
  33. ruleItem = temp[0]
  34. value = temp[1]
  35. }
  36. let isError = false
  37. switch (ruleItem) {
  38. case 'required':
  39. isError = form._isNullOrEmpty(formData[key])
  40. break
  41. case 'notEmpty':
  42. isError = form._isEmptyArray(formData[key])
  43. break
  44. case 'isMobile':
  45. isError = !form._isMobile(formData[key])
  46. break
  47. case 'isEmail':
  48. isError = !form._isEmail(formData[key])
  49. break
  50. case 'isCarNo':
  51. isError = !form._isCarNo(formData[key])
  52. break
  53. case 'isIdCard':
  54. isError = !form._isIdCard(formData[key])
  55. break
  56. case 'isAmount':
  57. isError = !form._isAmount(formData[key])
  58. break
  59. case 'isNum':
  60. isError = !form._isNum(formData[key])
  61. break
  62. case 'isChinese':
  63. isError = !form._isChinese(formData[key])
  64. break
  65. case 'isEnglish':
  66. isError = !form._isEnglish(formData[key])
  67. break
  68. case 'isEnAndNo':
  69. isError = !form._isEnAndNo(formData[key])
  70. break
  71. case 'isEnOrNo':
  72. isError = !form._isEnOrNo(formData[key])
  73. break
  74. case 'isSpecial':
  75. isError = form._isSpecial(formData[key])
  76. break
  77. case 'isEmoji':
  78. isError = form._isEmoji(formData[key])
  79. break
  80. case 'isDate':
  81. isError = !form._isDate(formData[key])
  82. break
  83. case 'isUrl':
  84. isError = !form._isUrl(formData[key])
  85. break
  86. case 'isSame':
  87. isError = !form._isSame(formData[key], formData[value])
  88. break
  89. case 'range':
  90. let range = null
  91. try {
  92. range = JSON.parse(value)
  93. if (range.length <= 1) {
  94. throw new Error('range值传入有误!')
  95. }
  96. } catch (e) {
  97. return 'range值传入有误!'
  98. }
  99. isError = !form._isRange(formData[key], range[0], range[1])
  100. break
  101. case 'minLength':
  102. isError = !form._minLength(formData[key], value)
  103. break
  104. case 'maxLength':
  105. isError = !form._maxLength(formData[key], value)
  106. break
  107. default:
  108. break
  109. }
  110. if (isError) {
  111. return msg
  112. }
  113. }
  114. }
  115. return ''
  116. },
  117. _isNullOrEmpty: function(value) {
  118. return !!((value === null || value === '' || value === undefined))
  119. },
  120. _isEmptyArray: function(value) {
  121. return !value || !Array.isArray(value) || value.length === 0
  122. },
  123. _isMobile: function(value) {
  124. return /^(?:13\d|14\d|15\d|16\d|17\d|18\d|19\d)\d{5}(\d{3}|\*{3})$/.test(value)
  125. },
  126. _isEmail: function(value) {
  127. return /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(value)
  128. },
  129. _isCarNo: function(value) {
  130. // 新能源车牌
  131. const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
  132. // 旧车牌
  133. const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
  134. if (value.length === 7) {
  135. return creg.test(value)
  136. } else if (value.length === 8) {
  137. return xreg.test(value)
  138. } else {
  139. return false
  140. }
  141. },
  142. _isIdCard: function(value) {
  143. let idCard = value
  144. if (idCard.length == 15) {
  145. return this.__isValidityBrithBy15IdCard
  146. } else if (idCard.length == 18) {
  147. let arrIdCard = idCard.split('')
  148. if (this.__isValidityBrithBy18IdCard(idCard) && this.__isTrueValidateCodeBy18IdCard(arrIdCard)) {
  149. return true
  150. } else {
  151. return false
  152. }
  153. } else {
  154. return false
  155. }
  156. },
  157. __isTrueValidateCodeBy18IdCard: function(arrIdCard) {
  158. let sum = 0
  159. let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
  160. let ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
  161. if (arrIdCard[17].toLowerCase() == 'x') {
  162. arrIdCard[17] = 10
  163. }
  164. for (let i = 0; i < 17; i++) {
  165. sum += Wi[i] * arrIdCard[i]
  166. }
  167. let valCodePosition = sum % 11
  168. if (arrIdCard[17] == ValideCode[valCodePosition]) {
  169. return true
  170. } else {
  171. return false
  172. }
  173. },
  174. __isValidityBrithBy18IdCard: function(idCard18) {
  175. let year = idCard18.substring(6, 10)
  176. let month = idCard18.substring(10, 12)
  177. let day = idCard18.substring(12, 14)
  178. let temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day))
  179. if (temp_date.getFullYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() !=
  180. parseFloat(day)) {
  181. return false
  182. } else {
  183. return true
  184. }
  185. },
  186. __isValidityBrithBy15IdCard: function(idCard15) {
  187. let year = idCard15.substring(6, 8)
  188. let month = idCard15.substring(8, 10)
  189. let day = idCard15.substring(10, 12)
  190. let temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day))
  191. if (temp_date.getYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() !=
  192. parseFloat(day)) {
  193. return false
  194. } else {
  195. return true
  196. }
  197. },
  198. _isAmount: function(value) {
  199. // 金额,只允许保留两位小数
  200. return /^([0-9]*[.]?[0-9])[0-9]{0,1}$/.test(value)
  201. },
  202. _isNum: function(value) {
  203. // 只能为数字
  204. return /^[0-9]+$/.test(value)
  205. },
  206. _isChinese: function(value) {
  207. let reg = /.*[\u4e00-\u9fa5]+.*$/
  208. return value !== '' && reg.test(value) && !form._isSpecial(value) && !form._isEmoji(value)
  209. },
  210. _isEnglish: function(value) {
  211. return /^[a-zA-Z]*$/.test(value)
  212. },
  213. _isEnAndNo: function(value) {
  214. // 8~20位数字和字母组合
  215. return /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/.test(value)
  216. },
  217. _isEnOrNo: function(value) {
  218. // 英文或者数字
  219. let reg = /.*[\u4e00-\u9fa5]+.*$/
  220. let result = true
  221. if (reg.test(value) || form._isSpecial(value) || form._isEmoji(value)) {
  222. result = false
  223. }
  224. return result
  225. },
  226. _isSpecial: function(value) {
  227. // 是否包含特殊字符
  228. let regEn = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,
  229. regCn = /[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im
  230. if (regEn.test(value) || regCn.test(value)) {
  231. return true
  232. }
  233. return false
  234. },
  235. _isEmoji: function(value) {
  236. // 是否包含表情
  237. return /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g.test(value)
  238. },
  239. _isDate: function(value) {
  240. // 2019-10-12
  241. const reg =
  242. /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/
  243. return reg.test(value)
  244. },
  245. _isUrl: function(value) {
  246. return /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/.test(value)
  247. },
  248. _isSame: function(value1, value2) {
  249. return value1 === value2
  250. },
  251. _isRange: function(value, range1, range2) {
  252. if ((!range1 && range1 != 0) && (!range2 && range2 != 0)) {
  253. return true
  254. } else if (!range1 && range1 != 0) {
  255. return value <= range2
  256. } else if (!range2 && range2 != 0) {
  257. return value >= range1
  258. } else {
  259. return value >= range1 && value <= range2
  260. }
  261. },
  262. _minLength: function(value, min) {
  263. return value.length >= Number(min)
  264. },
  265. _maxLength: function(value, max) {
  266. return value.length <= Number(max)
  267. }
  268. }
  269. module.exports = {
  270. validation: form.validation
  271. }