mi-assessment/uniapp/utils/validate.js
zpc 4387b15de0 feat(mine): 完成我的页面改造
- 实现未登录/已登录两种状态样式
- 添加常用功能入口:我的订单、往期测评、联系我们、邀请新用户
- 添加其他功能入口:关于、用户协议、隐私政策、退出登录
- 实现退出登录二次确认弹窗
- 修复 uni.scss 中 SCSS 导入路径问题
- 整理 .gitignore 文件,移除 unpackage 构建目录
2026-02-10 00:12:01 +08:00

198 lines
4.4 KiB
JavaScript

/**
* 表单验证工具函数
*/
/**
* 验证手机号
* @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
}