Commit f576da6c authored by 郭志伟's avatar 郭志伟

fix: 华贵表单验证完善

parent 20e7c738
...@@ -40,6 +40,7 @@ export default { ...@@ -40,6 +40,7 @@ export default {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
z-index: 9999;
.loading { .loading {
padding: 6px; padding: 6px;
border-radius: 6px; border-radius: 6px;
......
...@@ -69,6 +69,15 @@ export function isIdNo(str) { ...@@ -69,6 +69,15 @@ export function isIdNo(str) {
return false; return false;
} }
// 判断输入的字符是否为中文姓名最少两个中文字符
export function isChineseName(str) {
if (!isNull(str)) {
const reg = /^[\u0391-\uFFE5]{2,}$/;
return reg.test(str);
}
return false;
}
// 判断输入的字符是否以数字开头 // 判断输入的字符是否以数字开头
export function isStartWithInteger(str) { export function isStartWithInteger(str) {
if (!isNull(str)) { if (!isNull(str)) {
...@@ -258,6 +267,15 @@ export function isBankNumber(str) { ...@@ -258,6 +267,15 @@ export function isBankNumber(str) {
return false; return false;
} }
// 判断中文地址不能少于5个汉字,且必须有一位数字
export function isChnAddress(str) {
if (!isNull(str)) {
const reg = /^(\d|[\u4e00-\u9fa5]){5,10}$/;
return reg.test(str);
}
return false;
}
// 判断微信环境 // 判断微信环境
export const isWeixinBrower = window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == "micromessenger"; export const isWeixinBrower = window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == "micromessenger";
// 判断信用钱包环境 // 判断信用钱包环境
......
...@@ -109,60 +109,6 @@ export default { ...@@ -109,60 +109,6 @@ export default {
{ title: "重疾险", price: "50万" }, { title: "重疾险", price: "50万" },
{ title: "意外险", price: "60万" }, { title: "意外险", price: "60万" },
{ title: "寿险", price: "350万" } { title: "寿险", price: "350万" }
],
overviewList: [
{
id: 1,
goods: "国民保·百万医疗险",
type: "mi",
title: "医疗险",
amount: "600万",
range: "1年",
way: "趸交",
price: "350元",
goodsPirce: "3000",
goodsUnit: "元/每年",
reason: "推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由"
},
{
id: 2,
goods: "康惠保2020终身重疾险",
type: "cii",
title: "重疾险",
amount: "50万",
range: "终身",
way: "20年",
price: "6000元",
goodsPirce: "6000",
goodsUnit: "元/每年",
reason: "推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由"
},
{
id: 3,
goods: "国民保·百万意外险",
type: "ai",
title: "意外险",
amount: "50万",
range: "1年",
way: "趸交",
price: "350元",
goodsPirce: "3000",
goodsUnit: "元/每年",
reason: "推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由"
},
{
id: 4,
goods: "国民保·百万寿险",
type: "li",
title: "寿险",
amount: "350万",
range: "保至70岁",
way: "20年",
price: "3725元",
goodsPirce: "3000",
goodsUnit: "元/每年",
reason: "推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由推荐理由"
}
] ]
}; };
}, },
......
...@@ -15,9 +15,15 @@ ...@@ -15,9 +15,15 @@
v-model="formData.holderUserInfo.name" v-model="formData.holderUserInfo.name"
name="holderUserInfo_name" name="holderUserInfo_name"
label="姓名" label="姓名"
placeholder="请输入投保人姓名" placeholder="请填写投保人姓名"
:readonly="selfInfoReadonly" :readonly="selfInfoReadonly"
:rules="[{ required: true, message: '请输入投保人姓名' }]" :rules="[
{ required: true, message: '请填写投保人姓名' },
{
validator: isChineseName,
message: '请填写正确的投保人姓名,最少2个中文字符'
}
]"
@click.native="inputClick" @click.native="inputClick"
/> />
<cr-field <cr-field
...@@ -26,7 +32,13 @@ ...@@ -26,7 +32,13 @@
label="身份证号" label="身份证号"
placeholder="请填写投保人身份证号" placeholder="请填写投保人身份证号"
:readonly="selfInfoReadonly" :readonly="selfInfoReadonly"
:rules="[{ required: true, message: '请填写投保人身份证号' }]" :rules="[
{ required: true, message: '请填写投保人身份证号' },
{
validator: isIdNo,
message: '请填写正确的投保人身份证号'
}
]"
@click.native="inputClick" @click.native="inputClick"
/> />
<cr-field <cr-field
...@@ -36,7 +48,13 @@ ...@@ -36,7 +48,13 @@
label="手机号" label="手机号"
placeholder="请填写投保人手机号" placeholder="请填写投保人手机号"
:readonly="selfInfoReadonly" :readonly="selfInfoReadonly"
:rules="[{ required: true, message: '请填写投保人手机号' }]" :rules="[
{ required: true, message: '请填写投保人手机号' },
{
validator: isPhone,
message: '请填写正确的投保人手机号'
}
]"
@click.native="inputClick" @click.native="inputClick"
/> />
<cr-field <cr-field
...@@ -45,15 +63,21 @@ ...@@ -45,15 +63,21 @@
type="email" type="email"
label="电子邮箱" label="电子邮箱"
placeholder="用户接收电子保单" placeholder="用户接收电子保单"
:rules="[{ required: true, message: '请填写电子邮箱' }]" :rules="[
{ required: true, message: '请填写电子邮箱' },
{
validator: isEmail,
message: '请填写正确的电子邮箱'
}
]"
/> />
<cr-field <cr-field
v-model="formData.holderUserInfo.annualIncome" v-model="formData.holderUserInfo.annualIncome"
name="holderUserInfo_annualIncome" name="holderUserInfo_annualIncome"
label="年收入" label="年收入"
type="digit" type="digit"
placeholder="请输入投保人年收入" placeholder="请填写投保人年收入"
:rules="[{ required: true, message: '请输入投保人年收入' }]" :rules="[{ required: true, message: '请填写投保人年收入' }]"
/> />
<cr-field <cr-field
v-model="formData.holderUserInfo.addressCode" v-model="formData.holderUserInfo.addressCode"
...@@ -72,8 +96,14 @@ ...@@ -72,8 +96,14 @@
v-model="formData.holderUserInfo.addressDetail" v-model="formData.holderUserInfo.addressDetail"
name="holderUserInfo_addressDetail" name="holderUserInfo_addressDetail"
label="详细地址" label="详细地址"
placeholder="请输入居住详细地址" placeholder="请填写居住详细地址"
:rules="[{ required: true, message: '请输入居住详细地址' }]" :rules="[
{ required: true, message: '请填写投保人居住详细地址' },
{
validator: isChnAddress,
message: '请填写正确的地址,至少于5个汉字,且必须有1位数字'
}
]"
/> />
<cr-field <cr-field
v-model="formData.holderUserInfo.occupation" v-model="formData.holderUserInfo.occupation"
...@@ -92,7 +122,7 @@ ...@@ -92,7 +122,7 @@
v-model="formData.holderUserInfo.longTerm" v-model="formData.holderUserInfo.longTerm"
name="holderUserInfo_longTerm" name="holderUserInfo_longTerm"
label="身份证有效期" label="身份证有效期"
:rules="[{ required: true, message: '请选择身份证有效期' }]" :rules="[{ required: true, message: '请选择投保人身份证有效期' }]"
> >
<template #input> <template #input>
<cr-radio-btn <cr-radio-btn
...@@ -106,7 +136,13 @@ ...@@ -106,7 +136,13 @@
v-model="formData.holderUserInfo.validEnd" v-model="formData.holderUserInfo.validEnd"
name="holderUserInfo_validEnd" name="holderUserInfo_validEnd"
label="有效期至" label="有效期至"
:rules="[{ required: true, message: '请选择您的证件有效止期' }]" :rules="[
{ required: true, message: '请选择投保人身份证止期' },
{
validator: isFutureDate,
message: '投保人身份证止期必须大于当前日期'
}
]"
> >
<template #input> <template #input>
<popup-date-picker <popup-date-picker
...@@ -151,7 +187,13 @@ ...@@ -151,7 +187,13 @@
label="身高" label="身高"
type="number" type="number"
placeholder="请填写被保人身高" placeholder="请填写被保人身高"
:rules="[{ required: true, message: '请填写被保人身高' }]" :rules="[
{ required: true, message: '请填写被保人身高' },
{
validator: isIntegerHeight,
message: '请填写正确的被保人身高,最多3个数字'
}
]"
> >
<div class="form-unit" slot="button">厘米</div> <div class="form-unit" slot="button">厘米</div>
</cr-field> </cr-field>
...@@ -161,7 +203,13 @@ ...@@ -161,7 +203,13 @@
label="体重" label="体重"
type="number" type="number"
placeholder="请填写被保人体重" placeholder="请填写被保人体重"
:rules="[{ required: true, message: '请填写被保人体重' }]" :rules="[
{ required: true, message: '请填写被保人体重' },
{
validator: isIntegerHeight,
message: '请填写正确的被保人体重,最多3个数字'
}
]"
> >
<div class="form-unit" slot="button">公斤</div> <div class="form-unit" slot="button">公斤</div>
</cr-field> </cr-field>
...@@ -170,44 +218,62 @@ ...@@ -170,44 +218,62 @@
v-model="formData.insuredUserInfo.name" v-model="formData.insuredUserInfo.name"
name="insuredUserInfo_name" name="insuredUserInfo_name"
label="姓名" label="姓名"
placeholder="请输入投保人姓名" placeholder="请填写被保人姓名"
:readonly="infoReadonly" :readonly="infoReadonly"
:rules="[{ required: true, message: '请输入投保人姓名' }]" :rules="[
{ required: true, message: '请填写投保人姓名' },
{
validator: isChineseName,
message: '请填写正确的被保人姓名,最少2个中文字符'
}
]"
/> />
<cr-field <cr-field
v-model="formData.insuredUserInfo.idNo" v-model="formData.insuredUserInfo.idNo"
name="insuredUserInfo_idNo" name="insuredUserInfo_idNo"
label="身份证号" label="身份证号"
placeholder="请填写保人身份证号" placeholder="请填写保人身份证号"
:readonly="infoReadonly" :readonly="infoReadonly"
:rules="[{ required: true, message: '请填写投保人身份证号' }]" :rules="[
{ required: true, message: '请填写被保人身份证号' },
{
validator: isIdNo,
message: '请填写正确的被保人身份证号'
}
]"
/> />
<cr-field <cr-field
v-model="formData.insuredUserInfo.phoneNo" v-model="formData.insuredUserInfo.phoneNo"
name="insuredUserInfo_phoneNo" name="insuredUserInfo_phoneNo"
label="手机号" label="手机号"
type="tel" type="tel"
placeholder="请填写投保人手机号" placeholder="请填写被保人手机号"
:rules="[{ required: true, message: '请填写投保人手机号' }]" :rules="[
{ required: true, message: '请填写被保人手机号' },
{
validator: isPhone,
message: '请填写正确的被保人手机号'
}
]"
/> />
<cr-field <cr-field
v-model="formData.insuredUserInfo.annualIncome" v-model="formData.insuredUserInfo.annualIncome"
name="insuredUserInfo_annualIncome" name="insuredUserInfo_annualIncome"
label="年收入" label="年收入"
type="digit" type="digit"
placeholder="请输入投保人年收入" placeholder="请填写被保人年收入"
:rules="[{ required: true, message: '请输入投保人年收入' }]" :rules="[{ required: true, message: '请填写被保人年收入' }]"
/> />
<cr-field <cr-field
v-model="formData.insuredUserInfo.addressCode" v-model="formData.insuredUserInfo.addressCode"
name="insuredUserInfo_addressCode" name="insuredUserInfo_addressCode"
label="居住省市" label="居住省市"
:rules="[{ required: true, message: '请选择保人居住省市' }]" :rules="[{ required: true, message: '请选择保人居住省市' }]"
> >
<template #input> <template #input>
<popup-area-picker <popup-area-picker
v-model="formData.insuredUserInfo.addressCode" v-model="formData.insuredUserInfo.addressCode"
placeholder="请选择保人居住省市" placeholder="请选择保人居住省市"
/> />
</template> </template>
</cr-field> </cr-field>
...@@ -215,8 +281,14 @@ ...@@ -215,8 +281,14 @@
v-model="formData.insuredUserInfo.addressDetail" v-model="formData.insuredUserInfo.addressDetail"
name="insuredUserInfo_weigaddressDetailht" name="insuredUserInfo_weigaddressDetailht"
label="详细地址" label="详细地址"
placeholder="请输入居住详细地址" placeholder="请填写被保人居住详细地址"
:rules="[{ required: true, message: '请输入居住详细地址' }]" :rules="[
{ required: true, message: '请填写被保人居住详细地址' },
{
validator: isChnAddress,
message: '请填写正确的地址,至少于5个汉字,且必须有1位数字'
}
]"
/> />
<cr-field <cr-field
v-model="formData.insuredUserInfo.occupation" v-model="formData.insuredUserInfo.occupation"
...@@ -236,7 +308,7 @@ ...@@ -236,7 +308,7 @@
v-model="formData.insuredUserInfo.longTerm" v-model="formData.insuredUserInfo.longTerm"
name="insuredUserInfo_longTerm" name="insuredUserInfo_longTerm"
label="身份证有效期" label="身份证有效期"
:rules="[{ required: true, message: '请选择身份证有效期' }]" :rules="[{ required: true, message: '请选择被保人身份证有效期' }]"
> >
<template #input> <template #input>
<cr-radio-btn <cr-radio-btn
...@@ -250,7 +322,13 @@ ...@@ -250,7 +322,13 @@
v-model="formData.insuredUserInfo.validEnd" v-model="formData.insuredUserInfo.validEnd"
name="insuredUserInfo_validEnd" name="insuredUserInfo_validEnd"
label="有效期至" label="有效期至"
:rules="[{ required: true, message: '请选择您的证件有效止期' }]" :rules="[
{ required: true, message: '请选择被保人身份证止期' },
{
validator: isFutureDate,
message: '被保人身份证止期必须大于当前日期'
}
]"
> >
<template #input> <template #input>
<popup-date-picker <popup-date-picker
...@@ -312,8 +390,8 @@ ...@@ -312,8 +390,8 @@
v-model="formData.holderUserInfo.bankCardName" v-model="formData.holderUserInfo.bankCardName"
name="insuredUserInfo_bankCardName" name="insuredUserInfo_bankCardName"
label="持卡人" label="持卡人"
placeholder="请输入持卡人姓名" placeholder="请填写持卡人姓名"
:rules="[{ required: true, message: '请输入持卡人姓名' }]" :rules="[{ required: true, message: '请填写持卡人姓名' }]"
/> />
<cr-field <cr-field
v-model="formData.holderUserInfo.bankCardCode" v-model="formData.holderUserInfo.bankCardCode"
...@@ -334,8 +412,14 @@ ...@@ -334,8 +412,14 @@
name="insuredUserInfo_bankCardNo" name="insuredUserInfo_bankCardNo"
label="银行卡号" label="银行卡号"
type="digit" type="digit"
placeholder="请输入银行卡号" placeholder="请填写银行卡号"
:rules="[{ required: true, message: '请输入银行卡号' }]" :rules="[
{ required: true, message: '请填写银行卡号' },
{
validator: isBankNumber,
message: '请填写正确的银行卡号'
}
]"
/> />
</cr-cell-group> </cr-cell-group>
<good-action @leftClick="goInsureState = true" :content="goodActionInfo" /> <good-action @leftClick="goInsureState = true" :content="goodActionInfo" />
...@@ -393,7 +477,15 @@ import Detail from "@/api/detail.huagui.shouxian"; ...@@ -393,7 +477,15 @@ import Detail from "@/api/detail.huagui.shouxian";
import { list, trail } from "@/api/product"; import { list, trail } from "@/api/product";
import { getFamilyList } from "@/api/user"; import { getFamilyList } from "@/api/user";
import { parseTime } from "@/service/utils"; import { parseTime } from "@/service/utils";
import { isIdNo } from "@/service/validation"; import {
isIdNo,
isChineseName,
isPhone,
isEmail,
isInteger,
isBankNumber,
isChnAddress
} from "@/service/validation";
const AUTO_SAVE_KEY = "PolicyFormData"; const AUTO_SAVE_KEY = "PolicyFormData";
const AUTO_SAVE_TARGET = "formData"; const AUTO_SAVE_TARGET = "formData";
...@@ -556,6 +648,23 @@ export default { ...@@ -556,6 +648,23 @@ export default {
this.getFamilyList(); this.getFamilyList();
}, },
methods: { methods: {
isIdNo,
isChineseName,
isPhone,
isEmail,
isBankNumber,
isChnAddress,
isIntegerHeight(str) {
return isInteger(str) && str.length <= 3;
},
isFutureDate(str) {
if (str) {
const currentTimestamp = new Date().valueOf();
const selectTimestamp = new Date(str).valueOf();
return selectTimestamp > currentTimestamp;
}
return false;
},
...mapActions(["setAuthXyqb"]), ...mapActions(["setAuthXyqb"]),
...mapActions("user", ["setUserInfo"]), ...mapActions("user", ["setUserInfo"]),
inputClick() { inputClick() {
...@@ -567,6 +676,7 @@ export default { ...@@ -567,6 +676,7 @@ export default {
this.goInsureState = true; this.goInsureState = true;
}, },
onFormFailed(errorInfo) { onFormFailed(errorInfo) {
console.log(errorInfo);
const { errors } = errorInfo; const { errors } = errorInfo;
this.$notify({ type: "warning", message: errors[0].message }); this.$notify({ type: "warning", message: errors[0].message });
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment