前端
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body><el-form ref="form" :model="form" :rules="rules" label-width="120px"><el-row><el-col :span="12"><el-form-item label="姓名/名稱" prop="userName"><el-input v-model="form.userName" placeholder="請輸入姓名/名稱"/></el-form-item></el-col><el-col :span="12"><el-form-item label="手機號碼" prop="mobile"><el-input v-model="form.mobile" placeholder="請輸入手機號碼"/></el-form-item></el-col></el-row><el-row><el-col :span="12"><el-form-item label="郵箱" prop="email"><el-input v-model="form.email" placeholder="請輸入郵箱"/></el-form-item></el-col><el-col :span="12"><el-form-item label="性別" prop="gender"><el-radio v-model="form.gender":label="dict.value"v-for="dict in dict.type.gender":key="dict.value">{{ dict.label }}</el-radio></el-form-item></el-col></el-row><el-row><el-row><el-col :span="12"><el-form-item label="密碼" prop="password"><el-input v-model="form.password" placeholder="請輸入密碼" type="password" maxlength="20"show-password/><password-strength v-model="form.password" style="padding-top: 10px;"></password-strength></el-form-item></el-col><el-col :span="12"><el-form-item label="確認密碼" prop="confirmPassword"><el-input v-model="form.confirmPassword" placeholder="請輸入確認密碼" type="password" maxlength="20"show-password/></el-form-item></el-col></el-row></el-row><el-row><el-col :span="12"><el-form-item label="所屬地域" prop="areaCode"><treeselect v-model="form.areaCode" :options="tzSysTreeDictOptions":normalizer="normalizer" placeholder="請所屬地域"/></el-form-item></el-col><el-col :span="12"><el-form-item label="領域" prop="domain"><el-select v-model="form.domain" placeholder="請選擇領域" style="width:100%"><el-optionv-for="dict in dict.type.tzLyUserDomain":key="dict.value":label="dict.label":value="dict.value"></el-option></el-select></el-form-item></el-col></el-row><el-row><el-col :span="12"><el-form-item label="證件類型" prop="idType"><el-select v-model="form.idType" placeholder="請選擇證件類型" style="width:100%"><el-optionv-for="dict in dict.type.certType":key="dict.value":label="dict.label":value="dict.value"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="證件號碼" prop="idCard"><el-input v-model="form.idCard" placeholder="請輸入證件號碼" style="width:100%"/></el-form-item></el-col></el-row><el-row><el-col :span="12"><el-form-item label="民族" prop="ethnicity"><el-select v-model="form.ethnicity" placeholder="請選擇民族" style="width:100%"><el-optionv-for="dict in dict.type.ethnicity":key="dict.value":label="dict.label":value="dict.value"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="政治面貌" prop="politicalStatus"><el-select v-model="form.politicalStatus" placeholder="請選擇政治面貌" style="width:100%"><el-optionv-for="dict in dict.type.politicalStatus":key="dict.value":label="dict.label":value="dict.value"></el-option></el-select></el-form-item></el-col></el-row><el-row><el-col :span="12"><el-form-item label="職業" prop="occupation"><el-select v-model="form.occupation" placeholder="請選擇職業" style="width:100%"><el-optionv-for="dict in dict.type.trade":key="dict.value":label="dict.label":value="dict.value"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="工作單位(公司)" prop="unit"><el-input v-model="form.unit" placeholder="請輸入工作單位(公司)"/></el-form-item></el-col></el-row><el-row><el-col :span="12"><el-form-item label="職務" prop="job"><el-input v-model="form.job" placeholder="請輸入職務"/></el-form-item></el-col><el-col :span="12"><el-form-item label="個人介紹" prop="introduction"><el-input v-model="form.introduction" placeholder="請輸入個人介紹"/></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm">確 定</el-button><el-button @click="cancel">取 消</el-button></div></el-dialog>
// 表單校驗rules: {userName: [{ required: true, message: '姓名/名稱不能為空', trigger: 'blur' }],mobile: [{ required: true, trigger: 'blur', validator: this.validatePhoneNumber }],password: [{ trigger: 'blur', validator: this.validatePassword }],confirmPassword: [{ trigger: 'blur', validator: this.validateConfirmPassword }],email: [{ required: true, message: '郵箱不能為空', trigger: 'blur' },{pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,message: '請輸入正確的郵箱地址',trigger: ['blur', 'change']}],areaCode: [{ required: true, message: '所屬地域不能為空', trigger: 'blur' }],domain: [{ required: true, message: '領域不能為空', trigger: 'blur' }],idType: [{ required: true, message: '證件類型不能為空', trigger: 'blur' }],idCard: [{ required: true, validator: this.validateChineseIDCard, trigger: 'blur' }]},
//校驗確認密碼validateConfirmPassword(rule, value, callback) {if (!this.isInsert) {callback()}if (value !== this.form.password) {callback(new Error('密碼和確認密碼不一致'))} else {callback()}},//校驗身份證號碼validateChineseIDCard(rule, value, callback) {if (this.form.idType!=='1'){callback()}const reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/if (!value) {callback(new Error('身份證號碼不能為空'))} else if (!reg.test(value)) {callback(new Error('身份證號碼格式不正確'))} else {callback()}},//校驗密碼validatePassword(rule, value, callback) {if (!this.isInsert) {callback()}// 密碼必須包含數字、小寫字母、大寫字母和特殊字符中的至少三種const reg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).{6,20}$/if (!value) {callback(new Error('密碼長度要在 6 到 20 個字符'))} else if (value.length < 6 || value.length > 20) {callback(new Error('密碼長度要在 6 到 20 個字符'))} else if (!reg.test(value)) {callback(new Error('密碼必須包含數字、小寫字母、大寫字母和特殊字符中的至少三種'))} else {callback()}},//校驗手機號碼validatePhoneNumber(rule, value, callback) {const reg = /^1[3-9]\d{9}$/if (!value) {callback(new Error('手機號不能為空'))} else if (!reg.test(value)) {callback(new Error('手機號格式不正確'))} else {callback()}},
后端
枚舉
package com.huida.common.valid;import javax.validation.groups.Default;public interface ValidParameterTzLyUser extends Default {interface User {}interface Group {}
}
實體
/*** 密碼* 不傳遞密碼給前端,但是后端數據庫查出來使用,允許前端傳密碼過來*/@Size(min = 1, max = 30, message = "密碼長度不能超過30個字符",groups = {ValidParameterTzLyUser.User.class, ValidParameterTzLyUser.Group.class})@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)private String password;/*** 統一社會信用代碼,企業賬號要校驗統一社會信用代碼*/@Size(min = 1, max = 32, message = "統一社會信用代碼不能為空,統一社會信用代碼長度不大于32",groups = {ValidParameterTzLyUser.User.class, ValidParameterTzLyUser.Group.class})private String shxydm;
/*** springboot自帶參數校驗*/private static final javax.validation.Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();public static void validate(TzLyUser tzLyUser) {//校驗參數Set<ConstraintViolation<TzLyUser>> validate = null;if (TzLyConstants.IDENTITY_REGISTER_USERS.equals(tzLyUser.getIdentity())) {validate = VALIDATOR.validate(tzLyUser, ValidParameterTzLyUser.User.class);} else if (TzLyConstants.IDENTITY_AUTH_GROUP.equals(tzLyUser.getIdentity())) {validate = VALIDATOR.validate(tzLyUser, ValidParameterTzLyUser.Group.class);}if (ObjectUtils.isNotEmpty(validate)) {StringBuilder sb =new StringBuilder();for (ConstraintViolation<TzLyUser> violation : validate) {sb.append(violation.getMessage());sb.append("\n");System.out.println(violation.getMessage());System.out.println(violation);}throw new TipUserException(sb.toString());}if (!PhoneUtil.isMobile(tzLyUser.getMobile())) {throw new TipUserException("手機號碼格式不正確");}if (!tzLyUserService.checkMobileUnique(tzLyUser)) {throw new TipUserException("注冊失敗,手機號碼已存在");}String msg = PasswdUtils.verifyPassLevel(tzLyUser.getPassword());if (StringUtils.isNotBlank(msg)) {throw new TipUserException(msg);}}