react 鏈式寫法校驗數據

使用方法

try {
	new Joi()
	.data('李四', '姓名').required().chinese()
	.data('張三', '姓名').required().chinese('名字只能夠是中文哦!')
	.data('1', '性別').required().enum(['1', '2'])
	// 這裏寫正常邏輯
} catch (error) {
	// 這裏提示錯誤消息
	console.log(error)
}
複製代碼

源碼, 使用了moment

⚠️沒怎麼測試哦bash

import moment from 'moment'
export default class Joi {
	value = ''
	name = ''

	// 數據輸入
	data(value, name = '') {
		this.value = value
		this.name = name
		return this
	}

	// 必填,不能爲空
	required(message = `${this.name}不能爲空`) {
		if (
			/^\s*$/g.test(this.value) ||
			this.value === null ||
			this.value === undefined
		) {
			throw message
		}
		return this
	}

	// 最小長度
	minLength(length = 6, message = `${this.name}長度不能小於${length}位`) {
		if (this.value.length < length) {
			throw message
		}
		return this
	}

	// 最大長度
	maxLength(length = 6, message = `${this.name}長度不能超過${length}位`) {
		if (this.value.length > length) {
			throw message
		}
		return this
	}

	// 固定長度
	length(length = 6, message = `${this.name}長度必須爲${length}位`) {
		if (this.value.length !== length) {
			throw message
		}
		return this
	}

	// 整數
	integet(message = `${this.name}必須爲整數`) {
		if (Number(this.value) === 'NaN') {
			throw message
		}
		return this
	}

	// 數字
	number(message = `${this.name}要是數字格式`) {
		if (!/^\+?[1-9][0-9]+.?[0-9]*$/.test(this.value)) {
			throw message
		}
		return this
	}

	// 不等於
	not(num = 0, message = `${this.name}不能夠等於${num}`) {
		if (Number(this.value) === num) {
			throw message
		}
		return this
	}

	// 等於
	eq(num = 0, message = `${this.name}要等於${num}`) {
		if (Number(this.value) !== num) {
			throw message
		}
		return this
	}

	// 相等
	equals(value, message = '兩次密碼不一致') {
		if (this.value !== value) {
			throw message
		}
		return this
	}

	// 大於
	gt(num = 0, message = `${this.name}要大於${num}`) {
		if (Number(this.value) <= num) {
			throw message
		}
		return this
	}

	// 大於或等於
	gte(num = 0, message = `${this.name}要大於或等於${num}`) {
		if (Number(this.value) < num) {
			throw message
		}
		return this
	}

	// 小於
	lt(num = 0, message = `${this.name}要小於${num}`) {
		if (Number(this.value) >= num) {
			throw message
		}
		return this
	}

	// 小於或等於
	lte(num = 0, message = `${this.name}要小於或等於${num}`) {
		if (Number(this.value) > num) {
			throw message
		}
		return this
	}

	// 之間, 大於並小於
	between(nums = [0, 100], message = `${this.name}要在${nums[0]}${nums[1]}之間`) {
		let num = Number(this.value)
		if (num >= nums[0] && num <= nums[0]) {
			return this
		}
		throw message
	}

	// 最小
	min(num = 0, message = `${this.name}最小值爲${num}`) {
		if (Number(this.value) < num) {
			throw message
		}
		return this
	}

	// 最大
	max(num = 100, message = `${this.name}最大值爲${num}`) {
		if (Number(this.value) > num) {
			throw message
		}
		return this
	}

	// 手機號
	mobile(message = "手機號不正確") {
		if (!/^1[3-9]\d{9}$/.test(this.value)) {
			throw message
		}
		return this
	}

	// 年齡
	age(arr = [0, 129], message = "年齡不正確") {
		let age = parseInt(this.value, 10)
		if (age > arr[1] || age < arr[0]) {
			throw message
		}
		return this
	}

	// 日期
	date(format = 'YYYY-MM-DD', message = `${this.name || '日期'}不正確`) {
		if (this.value.length !== format.length) {
			throw message
		}
		if (!moment(this.value, format).isValid()) {
			throw message
		}
		return this
	}

	// 日期是否以前
	isBefore(date, message = `${this.name || '日期'}請選擇${date}以前的日期`) {
		if (!moment(this.value).isBefore(date)) {
			throw message
		}
		return this
	}

	// 日期是否以後
	isAfter(date, message = `${this.name || '日期'}請選擇${date}以後的日期`) {
		if (!moment(this.value).isAfter(date)) {
			throw message
		}
		return this
	}

	// 日期是否相同
	isSame(date, message = `${this.name || '日期'}請選擇${date}`) {
		if (!moment(this.value).isSame(date)) {
			throw message
		}
		return this
	}

	// 日期是否之間
	isBetween(dates = [moment().format('YYYY-MM-DD'), moment().add('day', 1).format('YYYY-MM-DD')], message = `${this.name || '日期'}請選擇${dates[0]}${dates[1]}`) {
		if (!moment(this.value).isBetween(dates[0], dates[1])) {
			throw message
		}
		return this
	}

	// 字母
	letter(message = `${this.name}必須爲英文`) {
		if (!/^[A-Za-z]+$/g.test(this.value)) {
			throw message
		}
		return this
	}

	// 中文
	chinese(message = `${this.name}必須爲中文`) {
		if (!/^[\u4e00-\u9fa5]+$/g.test(this.value)) {
			throw message
		}
		return this
	}

	// 枚舉
	enum(arr = [], message = `${this.name}值必須爲${arr.join(',')}中的一個`) {
		if (arr.indexOf(this.value) === -1) {
			throw message
		}
		return this
	}

	// 身份證
	idCard(message = '身份證不合法') {
		if (this.value.length !== 18) {
			throw message
		}
		let city = ["11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91"]
		if (!/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(this.value)) {
			throw message
		}
		if (city.indexOf(this.value.substr(0, 2)) === -1) {
			throw message
		}
		let id_array = [...this.value]
		//加權因子
		let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
		//校驗位
		let parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
		let sum = 0
		for (let i = 0; i < 17; i++) {
			sum += parseInt(id_array[i], 10) * parseInt(factor[i], 10)
		}
		if (id_array[17].toUpperCase() !== parity[sum % 11].toUpperCase()) {
			throw message
		}
		return this
	}

	// 郵箱
	email(message = '郵箱不合法') {
		if (!/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(this.value)) {
			throw message
		}
		return this
	}

	// 自定義正則
	regexp(reg, message = `${this.name}格式不正確`) {
		if (!reg.test(this.value)) {
			throw message
		}
		return this
	}
}
複製代碼
相關文章
相關標籤/搜索