validate.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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 =
  189. /^(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.,?'\\+&%$#=~_-]+))*$/
  190. return urlregex.test(textval)
  191. }
  192. /**
  193. * 验证url
  194. * @param {*} rule
  195. * @param {*} value
  196. * @param {*} callback
  197. */
  198. export const validateURL = (rule, value, callback) => {
  199. if (utils.isEmpty(value)) {
  200. return validateEmpty(rule, value, callback)
  201. }
  202. if (!testURL(value)) {
  203. callback(new Error(rule.message || i18n.t('validate.url')))
  204. } else {
  205. callback()
  206. }
  207. }
  208. /* 小写字母 */
  209. export function testLowerCase(str) {
  210. const reg = /^[a-z]+$/
  211. return reg.test(str)
  212. }
  213. /**
  214. * 验证小写字母
  215. * @param {*} rule
  216. * @param {*} value
  217. * @param {*} callback
  218. */
  219. export const validateLowerCase = (rule, value, callback) => {
  220. if (utils.isEmpty(value)) {
  221. return validateEmpty(rule, value, callback)
  222. }
  223. if (!testLowerCase(value)) {
  224. callback(new Error(rule.message || i18n.t('validate.lowerCase')))
  225. } else {
  226. callback()
  227. }
  228. }
  229. /* 大写字母 */
  230. export function testUpperCase(str) {
  231. const reg = /^[A-Z]+$/
  232. return reg.test(str)
  233. }
  234. /**
  235. * 验证大写字母
  236. * @param {*} rule
  237. * @param {*} value
  238. * @param {*} callback
  239. */
  240. export const validateUpperCase = (rule, value, callback) => {
  241. if (utils.isEmpty(value)) {
  242. return validateEmpty(rule, value, callback)
  243. }
  244. if (!testUpperCase(value)) {
  245. callback(new Error(rule.message || i18n.t('validate.upperCase')))
  246. } else {
  247. callback()
  248. }
  249. }
  250. /* 大小写字母 */
  251. export function testAlphabets(str) {
  252. const reg = /^[A-Za-z]+$/
  253. return reg.test(str)
  254. }
  255. /**
  256. * 验证大小写字母
  257. * @param {*} rule
  258. * @param {*} value
  259. * @param {*} callback
  260. */
  261. export const validatAlphabets = (rule, value, callback) => {
  262. if (utils.isEmpty(value)) {
  263. return validateEmpty(rule, value, callback)
  264. }
  265. if (!testAlphabets(value)) {
  266. callback(new Error(rule.message || i18n.t('validate.alphabets')))
  267. } else {
  268. callback()
  269. }
  270. }
  271. /**
  272. * 多少选项
  273. * @param {*} rule
  274. * @param {*} value
  275. * @param {*} callback
  276. */
  277. export const validateOptions = (rule, value, callback) => {
  278. if (utils.isEmpty(value)) {
  279. return validateEmpty(rule, value, callback)
  280. }
  281. const arrayValue = value.split(',') || []
  282. const item = arrayValue.length
  283. const min = rule.min
  284. const max = rule.max
  285. if (min && !max && item < min) {
  286. callback(new Error(rule.message || `至少选择 ${min}项`))
  287. } else if (max && !min && item > max) {
  288. callback(new Error(rule.message || `最多选择 ${max}项`))
  289. } else if (min && max && (item < min || item > max)) {
  290. callback(new Error(rule.message || `选择选项${min}至${max}项`))
  291. } else {
  292. callback()
  293. }
  294. }
  295. /**
  296. * 验证字符长度
  297. * @param {*} rule
  298. * @param {*} value
  299. * @param {*} callback
  300. */
  301. export const validateLengthRange = (rule, value, callback) => {
  302. const min = typeof rule.min === 'number'
  303. const max = typeof rule.max === 'number'
  304. if (utils.isEmpty(value)) {
  305. callback()
  306. return
  307. }
  308. let val = value
  309. if (rule.format) {
  310. val = rule.format(val, rule)
  311. }
  312. const length = val.length
  313. if (min && !max && length < rule.min) {
  314. callback(new Error(rule.message || `最少填写${rule.min}个字符`))
  315. } else if (max && !min && length > rule.max) {
  316. callback(new Error(rule.message || `最多填写${rule.max}个字符`))
  317. } else if (min && max && (length < rule.min || length > rule.max)) {
  318. callback(
  319. new Error(rule.message || `填写字符个数在 ${rule.min} - ${rule.max}之间`)
  320. )
  321. } else {
  322. callback()
  323. }
  324. }
  325. export const validateNumberRange = (rule, value, callback) => {
  326. const min = typeof rule.min === 'number'
  327. const max = typeof rule.max === 'number'
  328. if (utils.isEmpty(value)) {
  329. callback()
  330. return
  331. }
  332. if (!utils.isNum(value)) {
  333. callback(new Error('无效数字'))
  334. return
  335. }
  336. const val = Number(value)
  337. if (min && !max && val < rule.min) {
  338. callback(new Error(rule.message || `必须大于或等于${rule.min}`))
  339. } else if (max && !min && val > rule.max) {
  340. callback(new Error(rule.message || `必须小于或等于${rule.max}`))
  341. } else if (min && max && (val < rule.min || val > rule.max)) {
  342. callback(new Error(rule.message || `必须在 ${rule.min} 到 ${rule.max}之间`))
  343. } else {
  344. callback()
  345. }
  346. }
  347. /**
  348. * 验证小数位
  349. * @param {*} rule
  350. * @param {*} value
  351. * @param {*} callback
  352. */
  353. export const validateDecimal = (rule, value, callback) => {
  354. if (utils.isEmpty(value)) {
  355. return validateEmpty(rule, value, callback)
  356. }
  357. const len = (value + '').replace(/^[^.]*[.]*/, '').length
  358. if (len > rule.decimal) {
  359. callback(new Error(rule.message || `小数位不能超过${rule.decimal}位`))
  360. } else {
  361. callback()
  362. }
  363. }
  364. export const validateDateBetween = (rule, value, callback) => {
  365. if (utils.isEmpty(value)) {
  366. return validateEmpty(rule, value, callback)
  367. }
  368. callback()
  369. }