validate.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /**
  2. * 表单通用验证
  3. * <pre>
  4. * 作者:hugh zhuang
  5. * 邮箱:3378340995@qq.com
  6. * 日期:2018-07-02-下午3:29:34
  7. * 版权:广州流辰信息技术有限公司
  8. * </pre>
  9. */
  10. import i18n from '@/utils/i18n'
  11. import utils from '@/utils/util'
  12. /**
  13. * 验证手机号
  14. * @param {*} phone
  15. */
  16. export function validateMobile(phone) {
  17. const rtn = {
  18. result: true,
  19. msg: ''
  20. }
  21. let result = true
  22. let msg = ''
  23. const isPhone = /^0\d{2,3}-?\d{7,8}$/
  24. if (utils.isNotEmpty(phone)) {
  25. if (phone.length === 11) {
  26. if (isPhone.test(phone)) {
  27. msg = 'format' // '手机号码格式不正确'
  28. result = false
  29. }
  30. } else {
  31. msg = 'length'// '手机号码长度不为11位'
  32. result = false
  33. }
  34. } else {
  35. msg = 'empty'
  36. result = false
  37. }
  38. rtn.result = result
  39. rtn.msg = msg
  40. return rtn
  41. }
  42. /**
  43. * 字段验证
  44. * 首字符为字母,其它只允许为字母、数字或下划线,并且长度不超过18字符"
  45. * @param {*} value
  46. * @param {*} callback
  47. */
  48. export function testField(rule, value, callback) {
  49. const res = /^[A-Za-z]{1}([a-zA-Z0-9_]{1,17})$/
  50. if (!res.test(value) && value.length < 19) {
  51. callback(new Error('首字符为字母,其它只允许为字母、数字或下划线!'))
  52. } else if ((!res.test(value) || res.test(value)) && value.length > 19) {
  53. callback(new Error('长度不超过18字符'))
  54. } else {
  55. callback()
  56. }
  57. }
  58. /**
  59. * 判断校验为空的
  60. * @param {*} rule
  61. * @param {*} value
  62. * @param {*} callback
  63. */
  64. export function validateEmpty(rule, value, callback) {
  65. const pattern = /\s/
  66. if (rule.required) {
  67. callback(new Error(rule.message || i18n.t('validate.required')))
  68. } else {
  69. if (pattern.test(value)) {
  70. callback(new Error('字符请勿携带空格'))
  71. return
  72. }
  73. callback()
  74. }
  75. }
  76. /**
  77. * 判断校验为必填
  78. * @param {*} rule
  79. * @param {*} value
  80. * @param {*} callback
  81. */
  82. export function validateRequired(rule, value, callback) {
  83. if (utils.isEmpty(utils.trim(value))) {
  84. callback(new Error(rule.message || i18n.t('validate.required')))
  85. return
  86. }
  87. callback()
  88. }
  89. /**
  90. * 整数验证
  91. * @param {*} value
  92. */
  93. export function isNumber(value) {
  94. if (isNaN(value)) {
  95. return false
  96. }
  97. return typeof value === 'number'
  98. }
  99. /**
  100. * 验证整数
  101. * @param {*} rule
  102. * @param {*} value
  103. * @param {*} callback
  104. */
  105. export const validateInteger = (rule, value, callback) => {
  106. if (utils.isEmpty(value)) {
  107. return validateEmpty(rule, value, callback)
  108. }
  109. value = Number(value)
  110. if (isNumber(value) && parseInt(value, 10) === value && value <= 2147483647) {
  111. callback()
  112. } else {
  113. callback(new Error(rule.message || i18n.t('validate.integer')))
  114. }
  115. }
  116. export const validateFloat = (rule, value, callback) => {
  117. if (utils.isEmpty(value)) {
  118. return validateEmpty(rule, value, callback)
  119. }
  120. const re = /^-?\d*\.\d+$/
  121. if (!re.test(value) || !isNumber(Number(value))) {
  122. callback(new Error('填写只能为浮点型'))
  123. } else {
  124. callback()
  125. }
  126. }
  127. /**
  128. * 验证key或者变量
  129. * 只能为字母开头,允许字母、数字和下划线
  130. * @param {*} str
  131. */
  132. export function testKey(str) {
  133. const reg = /^[a-zA-Z][a-zA-Z0-9_]*$/
  134. return reg.test(str)
  135. }
  136. /**
  137. * 验证业务组键key
  138. * 只能为字母开头,允许字母、数字、下划线和横线
  139. * @param {*} str
  140. */
  141. export function testBizKey(str) {
  142. const reg = /^[a-zA-Z][a-zA-Z0-9_-]*$/
  143. return reg.test(str)
  144. }
  145. /**
  146. * 验证类名key
  147. * 只能为大写字母开头,允许字母、数字
  148. * @param {*} str
  149. */
  150. export function testUpperCaseKey(str) {
  151. const reg = /^[A-Z][a-zA-Z0-9]*$/
  152. return reg.test(str)
  153. }
  154. /**
  155. * 验证类名key
  156. * @param {*} rule
  157. * @param {*} value
  158. * @param {*} callback
  159. */
  160. export const validateUpperCaseKey = (rule, value, callback) => {
  161. if (utils.isEmpty(value)) {
  162. return validateEmpty(rule, value, callback)
  163. }
  164. if (!testUpperCaseKey(value)) {
  165. callback(new Error('规则不合法,只能以大写字母开头,允许字母、数字!'))
  166. } else {
  167. callback()
  168. }
  169. }
  170. /**
  171. * 验证key
  172. * @param {*} rule
  173. * @param {*} value
  174. * @param {*} callback
  175. */
  176. export const validateKey = (rule, value, callback) => {
  177. if (utils.isEmpty(value)) {
  178. return validateEmpty(rule, value, callback)
  179. }
  180. if (!testKey(value)) {
  181. callback(new Error(rule.message || i18n.t('validate.key')))
  182. } else {
  183. callback()
  184. }
  185. }
  186. /* 合法url */
  187. export function testURL(textval) {
  188. const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  189. return urlregex.test(textval)
  190. }
  191. /**
  192. * 验证url
  193. * @param {*} rule
  194. * @param {*} value
  195. * @param {*} callback
  196. */
  197. export const validateURL = (rule, value, callback) => {
  198. if (utils.isEmpty(value)) {
  199. return validateEmpty(rule, value, callback)
  200. }
  201. if (!testURL(value)) {
  202. callback(new Error(rule.message || i18n.t('validate.url')))
  203. } else {
  204. callback()
  205. }
  206. }
  207. /* 小写字母 */
  208. export function testLowerCase(str) {
  209. const reg = /^[a-z]+$/
  210. return reg.test(str)
  211. }
  212. /**
  213. * 验证小写字母
  214. * @param {*} rule
  215. * @param {*} value
  216. * @param {*} callback
  217. */
  218. export const validateLowerCase = (rule, value, callback) => {
  219. if (utils.isEmpty(value)) {
  220. return validateEmpty(rule, value, callback)
  221. }
  222. if (!testLowerCase(value)) {
  223. callback(new Error(rule.message || i18n.t('validate.lowerCase')))
  224. } else {
  225. callback()
  226. }
  227. }
  228. /* 大写字母 */
  229. export function testUpperCase(str) {
  230. const reg = /^[A-Z]+$/
  231. return reg.test(str)
  232. }
  233. /**
  234. * 验证大写字母
  235. * @param {*} rule
  236. * @param {*} value
  237. * @param {*} callback
  238. */
  239. export const validateUpperCase = (rule, value, callback) => {
  240. if (utils.isEmpty(value)) {
  241. return validateEmpty(rule, value, callback)
  242. }
  243. if (!testUpperCase(value)) {
  244. callback(new Error(rule.message || i18n.t('validate.upperCase')))
  245. } else {
  246. callback()
  247. }
  248. }
  249. /* 大小写字母 */
  250. export function testAlphabets(str) {
  251. const reg = /^[A-Za-z]+$/
  252. return reg.test(str)
  253. }
  254. /**
  255. * 验证大小写字母
  256. * @param {*} rule
  257. * @param {*} value
  258. * @param {*} callback
  259. */
  260. export const validatAlphabets = (rule, value, callback) => {
  261. if (utils.isEmpty(value)) {
  262. return validateEmpty(rule, value, callback)
  263. }
  264. if (!testAlphabets(value)) {
  265. callback(new Error(rule.message || i18n.t('validate.alphabets')))
  266. } else {
  267. callback()
  268. }
  269. }
  270. /**
  271. * 多少选项
  272. * @param {*} rule
  273. * @param {*} value
  274. * @param {*} callback
  275. */
  276. export const validateOptions = (rule, value, callback) => {
  277. if (utils.isEmpty(value)) {
  278. return validateEmpty(rule, value, callback)
  279. }
  280. const arrayValue = value.split(',') || []
  281. const item = arrayValue.length
  282. const min = rule.min
  283. const max = rule.max
  284. if (min && !max && item < min) {
  285. callback(new Error(rule.message || `至少选择 ${min}项`))
  286. } else if (max && !min && item > max) {
  287. callback(new Error(rule.message || `最多选择 ${max}项`))
  288. } else if (min && max && (item < min || item > max)) {
  289. callback(new Error(rule.message || `选择选项${min}至${max}项`))
  290. } else {
  291. callback()
  292. }
  293. }
  294. /**
  295. * 验证字符长度
  296. * @param {*} rule
  297. * @param {*} value
  298. * @param {*} callback
  299. */
  300. export const validateLengthRange = (rule, value, callback) => {
  301. const min = typeof rule.min === 'number'
  302. const max = typeof rule.max === 'number'
  303. if (utils.isEmpty(value)) {
  304. callback()
  305. return
  306. }
  307. let val = value
  308. if (rule.format) {
  309. val = rule.format(val, rule)
  310. }
  311. const length = val.length
  312. if (min && !max && length < rule.min) {
  313. callback(new Error(rule.message || `最少填写${rule.min}个字符`))
  314. } else if (max && !min && length > rule.max) {
  315. callback(new Error(rule.message || `最多填写${rule.max}个字符`))
  316. } else if (min && max && (length < rule.min || length > rule.max)) {
  317. callback(new Error(rule.message || `填写字符个数在 ${rule.min} - ${rule.max}之间`))
  318. } else {
  319. callback()
  320. }
  321. }
  322. export const validateNumberRange = (rule, value, callback) => {
  323. const min = typeof rule.min === 'number'
  324. const max = typeof rule.max === 'number'
  325. if (utils.isEmpty(value)) {
  326. callback()
  327. return
  328. }
  329. if (!utils.isNum(value)) {
  330. callback(new Error('无效数字'))
  331. return
  332. }
  333. const val = Number(value)
  334. if (min && !max && val < rule.min) {
  335. callback(new Error(rule.message || `必须大于或等于${rule.min}`))
  336. } else if (max && !min && val > rule.max) {
  337. callback(new Error(rule.message || `必须小于或等于${rule.max}`))
  338. } else if (min && max && (val < rule.min || val > rule.max)) {
  339. callback(new Error(rule.message || `必须在 ${rule.min} 到 ${rule.max}之间`))
  340. } else {
  341. callback()
  342. }
  343. }
  344. /**
  345. * 验证小数位
  346. * @param {*} rule
  347. * @param {*} value
  348. * @param {*} callback
  349. */
  350. export const validateDecimal = (rule, value, callback) => {
  351. if (utils.isEmpty(value)) {
  352. return validateEmpty(rule, value, callback)
  353. }
  354. const len = (value + '').replace(/^[^.]*[.]*/, '').length
  355. if (len > rule.decimal) {
  356. callback(new Error(rule.message || `小数位不能超过${rule.decimal}位`))
  357. } else {
  358. callback()
  359. }
  360. }
  361. export const validateDateBetween = (rule, value, callback) => {
  362. if (utils.isEmpty(value)) {
  363. return validateEmpty(rule, value, callback)
  364. }
  365. callback()
  366. }