25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

209 satır
5.5 KiB

  1. /**
  2. * @description 用于表单提交时候的验证
  3. * @param
  4. */
  5. const formRegular = {
  6. specialChart: /[^%&',;=?$\x22]+/, // 含有特殊字符
  7. password: /^[a-zA-Z]\w{5,11}$/, // 字母开头,6-12位,只能包含字符、数字和下划线
  8. phone: /^[1][2,3,4,5,6,7,8,9][0-9]{9}$/, // 电话
  9. emial: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/, // 邮箱
  10. idCard: /^\d{15}|\d{}18$/, // 身份证
  11. float: /^[0-9]+(.[0-9]{0,2})?$/, // 最多两位小数
  12. int: /^\+?[1-9][0-9]*$/ // 非0正整数
  13. }
  14. const dealRegular = (type, val) => {
  15. let isOk = true
  16. for (let key in formRegular) {
  17. if (type === key) {
  18. isOk = formRegular[key].test(val)
  19. return isOk
  20. }
  21. }
  22. }
  23. const deepCopy = (source, trimIf) => {
  24. if (!source) {
  25. return source;
  26. }
  27. let sourceCopy = source instanceof Array ? [] : {};
  28. for (let item in source) {
  29. if (typeof source[item] === 'object') {
  30. sourceCopy[item] = deepCopy(source[item])
  31. } else {
  32. sourceCopy[item] = trimIf && Object.prototype.toString.call(source[item]) == "[object String]" ? source[
  33. item].trim() : source[item];
  34. }
  35. }
  36. return sourceCopy;
  37. };
  38. /* 规范化输入
  39. validateForm通过校验时返回经过trim及空值处理的新对象,如果未通过校验则返回false
  40. rule:字段校验规则
  41. rule:{
  42. "goodsNum":[
  43. {
  44. type:'number',
  45. message:"领用数量最大为100"
  46. },
  47. {
  48. required:true,
  49. message:"领用数量最大为100"
  50. },
  51. {
  52. min:1,
  53. max:100,
  54. message:"领用数量为1-100!"
  55. }
  56. ],
  57. "goodsNum":[
  58. {
  59. type:'phone',
  60. message:"请输入正确的手机号码"
  61. }
  62. ],
  63. "remark":[
  64. {
  65. len:500,
  66. message:"备注最多支持500个字符"
  67. }
  68. ],
  69. "specialPattren":[
  70. {
  71. pattern:/^[A-Z]{1}[0-9]{9}/g,
  72. message:"请输入以大写字母开头的长度为10的字符"
  73. }
  74. ]
  75. },
  76. trimIf:是否需要去除空格
  77. removeNull:是否需要将值为undefined,null,""的属性移除,默认值为false
  78. 目前支持校验方式:
  79. 1、针对number类型支持最大值max,最小值min校验,对于字符串支持长度len校验
  80. 2、对type等于phone,email等类型进行校验
  81. 3、支持用户传入pattern进行正则扩充校验
  82. 4、对于进行规范化输入的表单默认进行trim处理
  83. 5、removeNull默认为false,false时不对对具有undefined,null,空字符等处理,为true时会从对象上面剔除相关属性
  84. */
  85. let breakIf = false;
  86. const validateForm = (data, rule = null, trimIf = true, removeNull = false) => {
  87. let newobj = Object.prototype.toString.call(data) == '[object Array]' ? [] : {}
  88. for (let key in data) {
  89. if (breakIf) {
  90. break;
  91. }
  92. let type = Object.prototype.toString.call(data[key])
  93. //针对引用类型做深拷贝处理
  94. if (type === '[object Array]' || type === '[object Object]') {
  95. newobj[key] = deepCopy(data[key], trimIf)
  96. }else if (type === '[object Date]' || data[key] ===
  97. '') {
  98. newobj[key] = data[key]
  99. } else if (data[key] === null || data[key] === undefined || data[key] === '') {
  100. //removeNull默认false,此时需要将值赋给新对象
  101. if(!removeNull){
  102. newobj[key] = data[key]
  103. }
  104. }else{
  105. newobj[key] = trimIf && type === '[object String]' ? data[key].trim() : data[key]
  106. }
  107. if (rule && rule[key]) {
  108. for (let k in rule[key]) {
  109. // 判断是否为数字
  110. if (rule[key][k].type && rule[key][k].type == "number" && isNaN(data[key])) {
  111. actionNext(rule[key][k].message)
  112. break;
  113. }
  114. // 判断手机号邮箱身份证等类型详见
  115. if (rule[key][k].type && formRegular[rule[key][k].type] && !dealRegular(rule[key][k]
  116. .type, data[key])) {
  117. actionNext(rule[key][k].message)
  118. break;
  119. }
  120. // 根据用户提供的正则表达式判断
  121. if (rule[key][k].pattern && !rule[key][k].pattern.test(data[key])) {
  122. actionNext(rule[key][k].message)
  123. break;
  124. }
  125. // 判断是否必填
  126. if (rule[key][k].required && isEmpty(data[key])) {
  127. actionNext(rule[key][k].message)
  128. break;
  129. }
  130. //判断是否超过最大值最小值
  131. if ((rule[key][k].max || rule[key][k].min) && data[key] && (data[key] > rule[key][k].max ||
  132. data[key] < rule[key][k].min)) {
  133. actionNext(rule[key][k].message)
  134. break;
  135. }
  136. //长度校验(string,Array等具有length属性的类型都支持)
  137. if (rule[key][k].len && data[key] && data[key].length > rule[key][k].len) {
  138. actionNext(rule[key][k].message)
  139. break;
  140. }
  141. }
  142. }
  143. }
  144. initBreakIf()
  145. return !breakIf ? newobj : false;
  146. }
  147. const initBreakIf = () => {
  148. setTimeout(() => {
  149. breakIf = false
  150. }, 0)
  151. }
  152. const actionNext = (message) => {
  153. wx.showToast({
  154. title: message,
  155. icon: 'none'
  156. })
  157. breakIf = true
  158. // initBreakIf()
  159. }
  160. //判断是否为空
  161. const isEmpty = (value) => {
  162. if (value === undefined || value === null || value === '') {
  163. return true
  164. }
  165. //数组
  166. if (Object.prototype.toString.call(value) == '[object Array]' && value.length == 0) {
  167. return true
  168. }
  169. //对象
  170. if (Object.prototype.toString.call(value) == '[object Object]' && Object.keys(value).length == 0) {
  171. return true
  172. }
  173. }
  174. /**
  175. * 校验字段是否为空
  176. * @param {*} params 要校验的参数
  177. * @param {*} rules 哪些字段要必传,和他要展示的错误提示内容
  178. * @returns
  179. */
  180. const checkParamsIsMust = (params, rules) => {
  181. let errMsg = ''
  182. for (let i = 0; i < rules.length; i++) {
  183. const key = rules[i].key
  184. const checkResult = isEmpty(params[key])
  185. if (checkResult) {
  186. errMsg = `请填写${rules[i].keyStr}!`
  187. break
  188. }
  189. }
  190. return errMsg
  191. }
  192. export {
  193. validateForm,
  194. deepCopy,
  195. checkParamsIsMust,
  196. formRegular
  197. }