/** * 表单验证工具函数 */ /** * 验证手机号 * @param {string} phone - 手机号 * @returns {boolean} */ export function isPhone(phone) { if (!phone) return false const reg = /^1[3-9]\d{9}$/ return reg.test(phone) } /** * 验证邮箱 * @param {string} email - 邮箱 * @returns {boolean} */ export function isEmail(email) { if (!email) return false const reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ return reg.test(email) } /** * 验证身份证号 * @param {string} idCard - 身份证号 * @returns {boolean} */ export function isIdCard(idCard) { if (!idCard) return false const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ return reg.test(idCard) } /** * 验证是否为空 * @param {*} value - 值 * @returns {boolean} */ export function isEmpty(value) { if (value === null || value === undefined) return true if (typeof value === 'string') return value.trim() === '' if (Array.isArray(value)) return value.length === 0 if (typeof value === 'object') return Object.keys(value).length === 0 return false } /** * 验证是否为数字 * @param {*} value - 值 * @returns {boolean} */ export function isNumber(value) { return !isNaN(parseFloat(value)) && isFinite(value) } /** * 验证是否为正整数 * @param {*} value - 值 * @returns {boolean} */ export function isPositiveInteger(value) { const reg = /^[1-9]\d*$/ return reg.test(String(value)) } /** * 验证字符串长度 * @param {string} str - 字符串 * @param {number} min - 最小长度 * @param {number} max - 最大长度 * @returns {boolean} */ export function isLengthBetween(str, min, max) { if (!str) return min === 0 const len = str.length return len >= min && len <= max } /** * 验证中文姓名 * @param {string} name - 姓名 * @returns {boolean} */ export function isChineseName(name) { if (!name) return false const reg = /^[\u4e00-\u9fa5]{2,10}$/ return reg.test(name) } /** * 验证URL * @param {string} url - URL * @returns {boolean} */ export function isUrl(url) { if (!url) return false const reg = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/ return reg.test(url) } /** * 表单验证器 * @param {Object} rules - 验证规则 * @param {Object} data - 表单数据 * @returns {{valid: boolean, errors: Object}} */ export function validate(rules, data) { const errors = {} let valid = true for (const field in rules) { const fieldRules = rules[field] const value = data[field] for (const rule of fieldRules) { // 必填验证 if (rule.required && isEmpty(value)) { errors[field] = rule.message || `${field}不能为空` valid = false break } // 手机号验证 if (rule.type === 'phone' && !isEmpty(value) && !isPhone(value)) { errors[field] = rule.message || '请输入正确的手机号' valid = false break } // 邮箱验证 if (rule.type === 'email' && !isEmpty(value) && !isEmail(value)) { errors[field] = rule.message || '请输入正确的邮箱' valid = false break } // 长度验证 if (rule.min !== undefined || rule.max !== undefined) { const len = value ? String(value).length : 0 if (rule.min !== undefined && len < rule.min) { errors[field] = rule.message || `长度不能少于${rule.min}个字符` valid = false break } if (rule.max !== undefined && len > rule.max) { errors[field] = rule.message || `长度不能超过${rule.max}个字符` valid = false break } } // 自定义验证 if (rule.validator && typeof rule.validator === 'function') { const result = rule.validator(value, data) if (result !== true) { errors[field] = result || rule.message || '验证失败' valid = false break } } } } return { valid, errors } } /** * 显示验证错误提示 * @param {Object} errors - 错误对象 */ export function showValidateError(errors) { const firstError = Object.values(errors)[0] if (firstError) { uni.showToast({ title: firstError, icon: 'none' }) } } export default { isPhone, isEmail, isIdCard, isEmpty, isNumber, isPositiveInteger, isLengthBetween, isChineseName, isUrl, validate, showValidateError }