- 实现未登录/已登录两种状态样式 - 添加常用功能入口:我的订单、往期测评、联系我们、邀请新用户 - 添加其他功能入口:关于、用户协议、隐私政策、退出登录 - 实现退出登录二次确认弹窗 - 修复 uni.scss 中 SCSS 导入路径问题 - 整理 .gitignore 文件,移除 unpackage 构建目录
198 lines
4.4 KiB
JavaScript
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
|
|
}
|