vue中如何自定义Form表单rules校验方法(手机号/座机号、身份证号/社会统一信代码校验,支持多个,以英文逗号分隔)

news/2024/10/21 18:30:25/
  • 需求描述:
    1.相对方联系方式需要支持手机号、座机号填入保存,可能会填写多个都需要校验是否能通过
    2.相对方统一社会信用代码/身份证号码填入,可以是身份证号码也可以是社会统一信用代码,都得支持校验通过,并且容许填入多个以英文逗号分隔

1.首先定义一个js文件,用来编写上方对应代码(validateFromRules.js)

// 验证手机号/座机号
// isMultiple区分多个/一个 true为多个 false为一个
// isSingleType 是否只验证一种类型的证件号 默认为 false
// type 验证的证件号类型,可以是 'phone'(手机号码)、'landline'(座机号码)或 'both'(两者都验证),默认为 'both'
export function validatePhone(isMultiple = true, isSingleType = false, type = 'both') {return function (rule, value, callback) {if (!value) {callback(new Error("相对方(经办人联系电话)不能为空"));return;}const phonePattern = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;const landlinePattern = /^(\d{3,4}-)?\d{7,8}$/;if (isMultiple) {const phones = value.split(",").map((v) => v.trim());const errors = [];phones.forEach((phone) => {if (type === 'phone' && !phonePattern.test(phone)) {errors.push(`值 "${phone}" 无效: 请输入正确的手机号码`);} else if (type === 'landline' && !landlinePattern.test(phone)) {errors.push(`值 "${phone}" 无效: 请输入正确的座机号码`);} else if (type === 'both') {if (!phonePattern.test(phone) && !landlinePattern.test(phone)) {errors.push(`值 "${phone}" 无效: 请输入正确的手机号码或座机号码`);}}});if (errors.length > 0) {callback(new Error(errors.join("\n")));} else {callback();}} else {if (type === 'phone' && !phonePattern.test(value)) {callback(new Error("请输入正确的手机号码"));} else if (type === 'landline' && !landlinePattern.test(value)) {callback(new Error("请输入正确的座机号码"));} else if (type === 'both') {if (!phonePattern.test(value) && !landlinePattern.test(value)) {callback(new Error("请输入正确的手机号码或座机号码"));} else {callback();}}}};
}// 社会统一信代码/身份证号
// isMultiple区分多个/一个 true为多个 false为一个
// isSingleType 是否只验证一种类型的证件号 默认为 false
// type 验证的证件号类型,可以是 'idCard'(身份证号)、'socialCreditCode'(统一社会信用代码)或 'both'(两者都验证),默认为 'both'
export function validateSocialId(isMultiple = true, isSingleType = false, type = 'both') {return function (rule, value, callback) {if (!value) {callback(new Error("统一社会信用代码/身份证号码不能为空!"));return;}const values = isMultiple ? value.split(",").map((v) => v.trim()) : [value];const errors = [];values.forEach((val) => {if (type === 'idCard' && !isIDCard(val)) {errors.push(`值 "${val}" 无效: 不符合身份证号码的格式`);} else if (type === 'socialCreditCode' && !isSocialCreditCode(val)) {errors.push(`值 "${val}" 无效: 不符合统一社会信用代码的格式`);} else if (type === 'both') {if (isIDCard(val)) {validateIDCard({}, val, (error) => {if (error) {errors.push(`值 "${val}" 无效: ${error.message}`);}});} else if (isSocialCreditCode(val)) {CheckSocialCreditCode({}, val, (error) => {if (error) {errors.push(`值 "${val}" 无效: ${error.message}`);}});} else {errors.push(`值 "${val}" 无效: 不符合统一社会信用代码或身份证号码的格式`);}}});if (errors.length > 0) {callback(new Error(errors.join("\n")));} else {callback();}};
}function isSocialCreditCode(code) {return code.length === 18 && /^[0-9A-Z]+$/.test(code);
}function isIDCard(idCard) {return idCard.length === 18 && /^[0-9Xx]+$/.test(idCard);
}function CheckSocialCreditCode(rule, Code, callback) {if (Code.length !== 18) {callback(new Error("不是有效的统一社会信用代码!"));return;}const validChars = /^[0-9A-Z]+$/;if (!validChars.test(Code)) {callback(new Error("统一社会信用代码包含无效字符!"));return;}let total = 0;const weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28,];const str = "0123456789ABCDEFGHJKLMNPQRTUWXY";for (let i = 0; i < Code.length - 1; i++) {const Ancodevalue = str.indexOf(Code.charAt(i));total += Ancodevalue * weightedfactors[i];}let logiccheckcode = 31 - (total % 31);if (logiccheckcode === 31) {logiccheckcode = 0;}const checkCode = str.charAt(logiccheckcode);const inputCheckCode = Code.charAt(17);if (inputCheckCode !== checkCode) {callback(new Error("不是有效的统一社会信用代码!"));} else {callback();}
}function validateIDCard(rule, idCard, callback) {if (idCard.length !== 18) {callback(new Error("不是有效的身份证号码!"));return;}const validIdCardChars = /^[0-9Xx]+$/;if (!validIdCardChars.test(idCard)) {callback(new Error("身份证号码包含无效字符!"));return;}const weightFactors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,];const verifyCodes = "10X98765432";let sum = 0;for (let i = 0; i < 17; i++) {sum += parseInt(idCard.charAt(i), 10) * weightFactors[i];}const checkCode = verifyCodes[sum % 11];if (idCard.charAt(17).toUpperCase() !== checkCode) {callback(new Error("不是有效的身份证号码!"));} else {callback();}
}

2.在main.js中引入并注册成全局方法

// 验证表单rules的js文件
import {validatePhone,validateSocialId
} from './utils/validateFromRules'; // 引入封装的验证方法Vue.prototype.$validatePhone = validatePhone;
Vue.prototype.$validateSocialId  = validateSocialId ;

3.在对应的vue界面中使用,方法支持传入三个参数

  • 3.1第一个参数 isMultiple 是否容许传入多个参数,true:传入多个 false:只容许有一个

  • 3.2第二个参数 isSingleType 是否只验证一种类型 默认为 false,可以选择两种都验证,比如同时填入手机号和座机号

  • 3.3第三个参数 type 验证的证件号类型,可以是 ‘phone’(手机号码)、‘landline’(座机号码)或 ‘both’(两者都验证),默认为 ‘both’

   rules: {partyBPhone: [{required: true,message: "相对方(经办人联系电话)不能为空",trigger: "blur",},{validator: this.$validatePhone(true, false, "both"),trigger: "blur",},],partyBSocialId: [{required: true,message: "统一社会信用代码/身份证号码不能为空",trigger: "blur",},{validator: this.$validateSocialId(true, false, "both"),trigger: "blur",},],},

http://www.ppmy.cn/news/1540866.html

相关文章

ComfyUI绘画|文生图基础工作流搭建

学好 AI绘画 不论是就业还是做副业赚钱都不错&#xff0c;但要学会 AI绘画 还是要有一个学习规划。最后大家分享一份全套的 AI绘画 学习资料&#xff0c;给那些想学习 AI绘画 的小伙伴们一点帮助&#xff01; 设置中文界面 方式一 这份完整版的AI绘画全套学习资料已经上传CSD…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

【JavaEE初阶】深入理解TCP协议中的封装分用以及UDP和TCP在网络编程的区别

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】入门视角-网络原理的基础理论的了解-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; …

危化品经营单位(生产管理人员)考试试题及答案

危化品经营单位&#xff08;生产管理人员&#xff09;考试试题及答案 76.生产经营单位应当组织开展本单位的&#xff08; &#xff09;,使有关人员了解应急预案内容,熟悉应急职责、应急程序和岗位应急处置方案。 A.应急预案培训活动 B.应急预案编制 C.应急预案演练 答案:A…

六、LogicFlow 自定义业务边 Edge

前言 经过前面的文章讲解&#xff0c;目前已经实现了节点拖拽到画布中&#xff0c;并且也实现了节点之间的基础连线&#xff0c;到这里也算是入了门&#xff0c;接下来继续探究新学习新的功能&#xff0c;以满足新的需求&#xff0c;那么这一章就会学习如何更改两节点之间的连…

Verilator——最简单、最细节上手教程

目录 前言工具安装Verilator 安装GTKwave 安装 Verilator 基础用法fst格式和vcd格式的wave文件Verilator 的使用 Verilator 的进阶使用与GDB搭配与makefile搭配 Verilator 的高阶用法访问模块内部数据 前言 此教程会以ubuntu22.04为例 从如何安装&#xff0c;到如何使用 全程帮…

oracle中的exists 和not exists 用法

exists &#xff08;sql 返回结果集为真&#xff09; not exists (sql 不返回结果集为真&#xff09; exists 与 in 意思相同&#xff0c;语法不同&#xff0c;效率高于in not exists 与 not in 意思相同&#xff0c;语法不同&#xff0c;效率高于in 基本概念&#xff1a; se…

WPF入门_03路由事件

1、如何定义路由事件 1)事件定义 public static readonly RoutedEvent ClickEvent; 2)事件注册,Button按钮的Click事件是继承于ButtonBase基类的 ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEven…