feat: 添加信贷客户家庭关系表单前端校验
**必填字段校验:** - 信贷客户身份证号(必填+18位格式校验) - 关系类型(必填) - 关系人姓名(必填+长度2-50+字符格式) - 性别(必填) - 关系人证件类型(必填) - 关系人证件号码(必填+动态格式校验) **格式校验:** - 身份证号:18位国家标准格式+校验位验证 - 护照:字母开头6-20位字符 - 手机号码:11位1开头格式验证 - 姓名:仅支持中英文和·符号 **业务逻辑校验:** - 出生日期:不能晚于当前日期,不能早于150年前 - 生效/失效日期:失效日期不能早于生效日期 **长度限制:** - 微信名称1/2/3:最多50字符 - 详细联系地址:最多200字符 - 关系详细描述:最多500字符
This commit is contained in:
@@ -496,19 +496,56 @@ export default {
|
|||||||
// 表单校验
|
// 表单校验
|
||||||
rules: {
|
rules: {
|
||||||
personId: [
|
personId: [
|
||||||
{ required: true, message: "信贷客户身份证号不能为空", trigger: "blur" }
|
{ required: true, message: "信贷客户身份证号不能为空", trigger: "blur" },
|
||||||
|
{ pattern: /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/, message: "请输入正确的18位身份证号", trigger: "blur" }
|
||||||
],
|
],
|
||||||
relationType: [
|
relationType: [
|
||||||
{ required: true, message: "关系类型不能为空", trigger: "change" }
|
{ required: true, message: "关系类型不能为空", trigger: "change" }
|
||||||
],
|
],
|
||||||
relationName: [
|
relationName: [
|
||||||
{ required: true, message: "关系人姓名不能为空", trigger: "blur" }
|
{ required: true, message: "关系人姓名不能为空", trigger: "blur" },
|
||||||
|
{ min: 2, max: 50, message: "关系人姓名长度在2到50个字符", trigger: "blur" },
|
||||||
|
{ pattern: /^[\u4e00-\u9fa5a-zA-Z·]+$/, message: "姓名只能包含中文、英文和·", trigger: "blur" }
|
||||||
|
],
|
||||||
|
gender: [
|
||||||
|
{ required: true, message: "性别不能为空", trigger: "change" }
|
||||||
],
|
],
|
||||||
relationCertType: [
|
relationCertType: [
|
||||||
{ required: true, message: "关系人证件类型不能为空", trigger: "change" }
|
{ required: true, message: "关系人证件类型不能为空", trigger: "change" }
|
||||||
],
|
],
|
||||||
relationCertNo: [
|
relationCertNo: [
|
||||||
{ required: true, message: "关系人证件号码不能为空", trigger: "blur" }
|
{ required: true, message: "关系人证件号码不能为空", trigger: "blur" },
|
||||||
|
{ validator: this.validateCertNo, trigger: "blur" }
|
||||||
|
],
|
||||||
|
mobilePhone1: [
|
||||||
|
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号码", trigger: "blur" }
|
||||||
|
],
|
||||||
|
mobilePhone2: [
|
||||||
|
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号码", trigger: "blur" }
|
||||||
|
],
|
||||||
|
wechatNo1: [
|
||||||
|
{ max: 50, message: "微信名称不能超过50个字符", trigger: "blur" }
|
||||||
|
],
|
||||||
|
wechatNo2: [
|
||||||
|
{ max: 50, message: "微信名称不能超过50个字符", trigger: "blur" }
|
||||||
|
],
|
||||||
|
wechatNo3: [
|
||||||
|
{ max: 50, message: "微信名称不能超过50个字符", trigger: "blur" }
|
||||||
|
],
|
||||||
|
contactAddress: [
|
||||||
|
{ max: 200, message: "详细联系地址不能超过200个字符", trigger: "blur" }
|
||||||
|
],
|
||||||
|
relationDesc: [
|
||||||
|
{ max: 500, message: "关系详细描述不能超过500个字符", trigger: "blur" }
|
||||||
|
],
|
||||||
|
birthDate: [
|
||||||
|
{ validator: this.validateBirthDate, trigger: "change" }
|
||||||
|
],
|
||||||
|
effectiveDate: [
|
||||||
|
{ validator: this.validateDateRange, trigger: "change" }
|
||||||
|
],
|
||||||
|
invalidDate: [
|
||||||
|
{ validator: this.validateDateRange, trigger: "change" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
// 导入参数
|
// 导入参数
|
||||||
@@ -564,6 +601,118 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
/**
|
||||||
|
* 校验证件号码
|
||||||
|
* 根据证件类型进行不同的校验
|
||||||
|
*/
|
||||||
|
validateCertNo(rule, value, callback) {
|
||||||
|
if (!value) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const certType = this.form.relationCertType;
|
||||||
|
|
||||||
|
if (certType === '身份证') {
|
||||||
|
// 18位身份证号码校验
|
||||||
|
const pattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/;
|
||||||
|
if (!pattern.test(value)) {
|
||||||
|
callback(new Error('请输入正确的18位身份证号码'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 校验身份证校验位
|
||||||
|
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
||||||
|
const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
|
||||||
|
let sum = 0;
|
||||||
|
for (let i = 0; i < 17; i++) {
|
||||||
|
sum += parseInt(value[i]) * weights[i];
|
||||||
|
}
|
||||||
|
const checkCode = checkCodes[sum % 11];
|
||||||
|
if (value[17].toUpperCase() !== checkCode) {
|
||||||
|
callback(new Error('身份证号码校验位错误'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (certType === '护照') {
|
||||||
|
// 护照校验:字母开头,后跟数字,总长度6-20位
|
||||||
|
const pattern = /^[a-zA-Z][0-9a-zA-Z]{5,19}$/;
|
||||||
|
if (!pattern.test(value)) {
|
||||||
|
callback(new Error('护照号码格式不正确,应为字母开头的6-20位字符'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 其他证件类型:基本长度校验
|
||||||
|
if (value.length < 6 || value.length > 50) {
|
||||||
|
callback(new Error('证件号码长度应在6-50位之间'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback();
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 校验出生日期
|
||||||
|
* 出生日期不能晚于当前日期
|
||||||
|
*/
|
||||||
|
validateBirthDate(rule, value, callback) {
|
||||||
|
if (!value) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const birthDate = new Date(value);
|
||||||
|
const today = new Date();
|
||||||
|
|
||||||
|
if (birthDate > today) {
|
||||||
|
callback(new Error('出生日期不能晚于当前日期'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验年龄不能超过150岁
|
||||||
|
const maxBirthDate = new Date();
|
||||||
|
maxBirthDate.setFullYear(maxBirthDate.getFullYear() - 150);
|
||||||
|
if (birthDate < maxBirthDate) {
|
||||||
|
callback(new Error('出生日期不能早于150年前'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback();
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 校验生效日期和失效日期
|
||||||
|
* 失效日期不能早于生效日期
|
||||||
|
*/
|
||||||
|
validateDateRange(rule, value, callback) {
|
||||||
|
if (!value) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果当前校验的是失效日期
|
||||||
|
if (rule.field === 'invalidDate' && this.form.effectiveDate) {
|
||||||
|
const effectiveDate = new Date(this.form.effectiveDate);
|
||||||
|
const invalidDate = new Date(value);
|
||||||
|
|
||||||
|
if (invalidDate < effectiveDate) {
|
||||||
|
callback(new Error('失效日期不能早于生效日期'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果生效日期和失效日期都已填写,确保失效日期晚于生效日期
|
||||||
|
if (this.form.effectiveDate && this.form.invalidDate) {
|
||||||
|
const effectiveDate = new Date(this.form.effectiveDate);
|
||||||
|
const invalidDate = new Date(this.form.invalidDate);
|
||||||
|
|
||||||
|
if (invalidDate < effectiveDate) {
|
||||||
|
if (rule.field === 'effectiveDate') {
|
||||||
|
callback(new Error('生效日期不能晚于失效日期'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback();
|
||||||
|
},
|
||||||
/** 查询信贷客户家庭关系列表 */
|
/** 查询信贷客户家庭关系列表 */
|
||||||
getList() {
|
getList() {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user