springboot 自定义注解实现数据唯一性和数据是否存在的校验

一、编写需要validate验证的自定义注解 CommonFieldValidate

import com.anglin.common.validate.CommonFieldValidator;
import com.anglin.common.validate.enums.CommonFieldValidateOperatesEnum;
import com.anglin.common.validate.enums.CommonFieldValidateOptionEnum;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解--字段验证
 *
 * @author zhuzhibin
 * @date 2023/5/16 14:25
 **/
@Target({ElementType.TYPE})
//使用validator时必须添加,指定与CommonFieldValidator自定义校验器配合使用
@Constraint(validatedBy = CommonFieldValidator.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface CommonFieldValidate {

    String message() default "输入的内容验证不通过";

    /**
     * 选项类型 用 AND 或者 OR 进行连接
     */
    CommonFieldValidateOptionEnum option() default CommonFieldValidateOptionEnum.AND;

    CommonFieldValidateOperatesEnum [] operates() default {CommonFieldValidateOperatesEnum.UNIQUE};

    Class<?>[] groups() default {};

    Class<? extends Payload>[]  payload() default {};
}

二、编写自定义唯一性注解 和 数据是否存在的注解

import com.baomidou.mybatisplus.extension.activerecord.Model;

import java.lang.annotation.*;

/**
 * 自定义注解验证字段唯一性
 *
 * @author zhuzhibin
 * @date 2023/5/16 14:25
 **/
//仅仅用于请求字段的非空校验
@Target({ElementType.FIELD})
//需要jvm运行时使用
@Retention(RetentionPolicy.RUNTIME)
public @interface CommonFieldUniqueValidate {
    /**exist
     * 验证的字段
     */
    String fieldName() default "";
    /**
     * 错误提示
     */
    String message() default "输入的内容验证失败";

    /**
     *  别名 同一个别名下的字段进行联合查询
     */
    String alias() default "";

    Class<? extends Model> clazz();

}
package com.anglin.common.annotation;

import com.baomidou.mybatisplus.extension.activerecord.Model;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解验证 --字段--数据是否存在
 *
 * @author zhuzhibin
 * @date 2023/5/16 14:25
 **/
//仅仅用于请求字段的非空校验
@Target({ElementType.FIELD})
//需要jvm运行时使用
@Retention(RetentionPolicy.RUNTIME)
public @interface CommonFieldYNExistValidate {
    /**exist
     * 验证的字段
     */
    String fieldName() default "";
    /**
     * 错误提示
     */
    String message() default "输入的内容验证失败";

    /**
     *  别名 同一个别名下的字段进行联合查询
     */
    String alias() default "";

    Class<? extends Model> clazz();

}

三、编写注解解析器

package com.anglin.common.validate;

import com.anglin.common.annotation.CommonFieldValidate;
import com.anglin.common.util.FieldValidatorUtil;
import com.anglin.common.validate.enums.CommonFieldValidateOperatesEnum;
import com.anglin.common.validate.enums.CommonFieldValidateOptionEnum;
import org.springframework.beans.factory.annotation.Autowired;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @Title: FieldUniqueValidator
 * @ProjectName online-plus
 * @Description: 字段校验
 * @Author ZhuZhiBin
 * @Version
 * @Date 2023/5/16 11:44
 */
public class CommonFieldValidator implements ConstraintValidator<CommonFieldValidate,Object> {

    @Autowired
    FieldValidatorUtil validatorUtil;

    private String message;
    private CommonFieldValidateOperatesEnum[] operates;
    private CommonFieldValidateOptionEnum option;

    @Override
    public void initialize(CommonFieldValidate validator) {
        this.message = validator.message();
        this.operates = validator.operates();
        this.option = validator.option();
    }

    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        if(operates != null && operates.length == 0){
            return true;
        }
        return validatorUtil.validator(message, operates, option, o);
    }
}

四、编写注解中使用的枚举类

package com.anglin.common.validate.enums;

import com.anglin.common.exception.CommonException;
import lombok.Getter;

/**
 * 字段验证
 *
 * @date 2023/5/17 14:02
 **/
@Getter
public enum CommonFieldValidateOperatesEnum {

    /** 唯一性 */
    UNIQUE("UNIQUE"),

    /** 是否存在 */
    YN_EXIST("YN_EXIST");

    private final String value;


    CommonFieldValidateOperatesEnum(String value) {
        this.value = value;
    }

    public static void validate(String value) {
        boolean flag = UNIQUE.getValue().equals(value) || YN_EXIST.getValue().equals(value);
        if(!flag) {
            throw new CommonException("不支持该验证方式:{}", value);
        }
    }
}
package com.anglin.common.validate.enums;

import com.anglin.common.exception.CommonException;
import lombok.Getter;

/**
 * 验证字段选项是and 还是 or
 *
 * @date 2023/5/17 14:02
 **/
@Getter
public enum CommonFieldValidateOptionEnum {

    /** 关联 **/
    AND("AND"),

    /** 非关联 **/
    OR("OR");

    private final String value;


    CommonFieldValidateOptionEnum(String value) {
        this.value = value;
    }

    public static void validate(String value) {
        boolean flag = AND.getValue().equals(value) || OR.getValue().equals(value);
        if(!flag) {
            throw new CommonException("不支持该验证方式:{}", value);
        }
    }
}

五、编写验证的Util

package com.anglin.common.util;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.anglin.common.annotation.CommonFieldUniqueValidate;
import com.anglin.common.annotation.CommonFieldYNExistValidate;
import com.anglin.common.validate.enums.CommonFieldValidateOperatesEnum;
import com.anglin.common.validate.enums.CommonFieldValidateOptionEnum;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;

import javax.validation.ValidationException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Title: FieldUniqueUtils
 * @ProjectName online-plus
 * @Description: 字段唯一性校验工具类
 * @Author ZhuZhiBin
 * @Version
 * @Date 2023/5/16 11:48
 */
@Slf4j
@Component
public class FieldValidatorUtil {

    /**
     * 实体类中id字段
     */
    private String idColumnName;

    /**
     * 实体类中id的值
     */
    private Object idColumnValue;

    private final String declaredField = "memberValues";
    private final String annotateAttribute = "fieldName";
    private final String objKey = "obj";
    private final String msgKey = "msg";

    /**
     * 首先通过遍历获取vo或者dto上 自定义注解 不同选项下的列表
     * 空值字段上的注解 不进行下一步的判断
     * @param message
     * @param operates
     * @param option
     * @param o
     * @return
     */
    public boolean validator(String message, CommonFieldValidateOperatesEnum[] operates, CommonFieldValidateOptionEnum option, Object o) {
        Field[] fields = ReflectUtil.getFields(o.getClass());
        List<CommonFieldUniqueValidate> commonFieldUniqueValidateList = new LinkedList<>();
        List<CommonFieldYNExistValidate> commonFieldYNExistValidateList = new LinkedList<>();

        Map<String,Object> queryUniqueValidateMap = new HashMap<>();
        Map<String,Object> queryYNExistValidateMap = new HashMap<>();

        boolean unique = ArrayUtil.contains(operates, CommonFieldValidateOperatesEnum.UNIQUE);
        boolean ynExist = ArrayUtil.contains(operates, CommonFieldValidateOperatesEnum.YN_EXIST);

        for (Field f : fields) {
            Object fieldValue = ReflectUtil.getFieldValue(o, f);
            //排除空值字段
            if (ObjectUtil.isNull(fieldValue)) {
                continue;
            }
            //唯一性验证
            if(unique){
                uniqueBuilder(f, fieldValue, commonFieldUniqueValidateList, queryUniqueValidateMap);
            }
            //是否存在验证
            if(ynExist){
                ynExistBuilder(f, fieldValue, commonFieldYNExistValidateList, queryYNExistValidateMap);
            }
        }
        boolean res = true;
        if(ArrayUtil.contains(operates, CommonFieldValidateOperatesEnum.UNIQUE) && CollectionUtil.isNotEmpty(commonFieldUniqueValidateList)){
            res = uniqueValidator(CommonFieldValidateOperatesEnum.UNIQUE, message, option, commonFieldUniqueValidateList, queryUniqueValidateMap, o);
        }
        if(ArrayUtil.contains(operates, CommonFieldValidateOperatesEnum.YN_EXIST) && CollectionUtil.isNotEmpty(commonFieldYNExistValidateList)){
            res = yNExistValidator(CommonFieldValidateOperatesEnum.YN_EXIST, message, option,commonFieldYNExistValidateList, queryYNExistValidateMap, o);
        }
        return res;
    }

    /**
     * 是否存在
     * 将我们的属性和值组装在map中,方便后续拼接条件
     * @param f
     * @param fieldValue
     * @param commonFieldYNExistValidateList
     * @param queryYNExistValidateMap
     */
    private void ynExistBuilder(Field f, Object fieldValue, List<CommonFieldYNExistValidate> commonFieldYNExistValidateList, Map<String, Object> queryYNExistValidateMap) {
        CommonFieldYNExistValidate commonFieldYNExistValidate = f.getAnnotation(CommonFieldYNExistValidate.class);
        if(commonFieldYNExistValidate != null){
            String fieldName = StrUtil.isEmpty(commonFieldYNExistValidate.fieldName()) ? StrUtil.toUnderlineCase(f.getName())
                    : commonFieldYNExistValidate.fieldName();
            dynamicAnnotateAttribute(commonFieldYNExistValidate, fieldName);
            commonFieldYNExistValidateList.add(commonFieldYNExistValidate);
            queryYNExistValidateMap.put(fieldName, fieldValue);
        }
    }


    /**
     * 唯一性
     * 将我们的属性和值组装在map中,方便后续拼接条件
     * 动态给注解属性赋值 代码处理 主要是怕 注解在后期的使用过程中不规范的问题
     * @param f
     * @param fieldValue
     * @param commonFieldUniqueValidateList
     * @param queryUniqueValidateMap
     */
    private void uniqueBuilder(Field f, Object fieldValue, List<CommonFieldUniqueValidate> commonFieldUniqueValidateList, Map<String, Object> queryUniqueValidateMap) {
        CommonFieldUniqueValidate commonFieldUniqueValidate = f.getAnnotation(CommonFieldUniqueValidate.class);
        if(commonFieldUniqueValidate != null){
            String fieldName = StrUtil.isEmpty(commonFieldUniqueValidate.fieldName()) ? StrUtil.toUnderlineCase(f.getName())
                    : commonFieldUniqueValidate.fieldName();
            dynamicAnnotateAttribute(commonFieldUniqueValidate, fieldName);
            commonFieldUniqueValidateList.add(commonFieldUniqueValidate);
            queryUniqueValidateMap.put(fieldName, fieldValue);
        }
    }

    /**
     * 动态调整自定义注解的fieldName属性值
     *
     * @param annotate 注解
     * @param fieldName
     */
    private void dynamicAnnotateAttribute(Object annotate, String fieldName) {
        //获取 foo 这个代理实例所持有的 InvocationHandler
        InvocationHandler h = Proxy.getInvocationHandler(annotate);
        // 获取 AnnotationInvocationHandler 的 memberValues 字段
        Field hField = null;
        try {
            hField = h.getClass().getDeclaredField(declaredField);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        // 因为这个字段事 private final 修饰,所以要打开权限
        hField.setAccessible(true);
        // 获取 memberValues
        Map memberValues = null;
        try {
            memberValues = (Map) hField.get(h);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        // 修改 value 属性值
        memberValues.put(annotateAttribute, fieldName);
    }


    /**
     * 字段信息唯一性验证
     * 根据自定义注解上的属性信息 进行逻辑处理
     * 根据class 获取对象 根据mybatis-plus active-record操作进行后续持久化等操作
     *
     *
     * @param unique
     * @param option
     * @param commonFieldUniqueValidates
     * @param queryUniqueValidateMap
     * @param o
     * @return
     */
    public boolean uniqueValidator(CommonFieldValidateOperatesEnum unique, String message, CommonFieldValidateOptionEnum option, List<CommonFieldUniqueValidate> commonFieldUniqueValidates, Map<String, Object> queryUniqueValidateMap, Object o){
        //别名进行分组
        Map<String, List<CommonFieldUniqueValidate>> collect =
                commonFieldUniqueValidates.stream().collect(Collectors.groupingBy(CommonFieldUniqueValidate::alias));
        boolean res = true;
        for (String key : collect.keySet()) {

            if(CommonFieldValidateOptionEnum.AND.equals(option)) {
                Map<String, Object> stringObjectMap = uniqueValidatorBuilder(collect.get(key).get(0), message, o);
                checkUpdateOrSave(stringObjectMap.get(objKey));
                Object msg = stringObjectMap.get(msgKey);
                res = checkBuilder(unique, queryUniqueValidateMap, stringObjectMap.get(objKey), msg.toString());
            } else {
                List<CommonFieldUniqueValidate> commonFieldUniqueValidateList = collect.get(key);
                for (CommonFieldUniqueValidate commonFieldUniqueValidate : commonFieldUniqueValidateList) {
                    Map<String,Object> queryMap = new HashMap<>();
                    Map<String, Object> stringObjectMap = uniqueValidatorBuilder(commonFieldUniqueValidate, message, o);
                    checkUpdateOrSave(stringObjectMap.get(objKey));
                    Object msg = stringObjectMap.get(msgKey);
                    queryMap.put(commonFieldUniqueValidate.fieldName(), queryUniqueValidateMap.get(commonFieldUniqueValidate.fieldName()));
                    res = checkBuilder(unique, queryMap, stringObjectMap.get(objKey), msg.toString());
                    if(!res){
                        return res;
                    }
                }
            }
        }
        return res;
    }

    private Map<String,Object> uniqueValidatorBuilder(CommonFieldUniqueValidate commonFieldUniqueValidate, String message, Object o) {
        Map<String,Object> map = new HashMap();
        Object obj = null;
        if(ObjectUtil.isNotNull(commonFieldUniqueValidate.clazz())){
            try {
                obj = commonFieldUniqueValidate.clazz().newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        String msg = commonFieldUniqueValidate.message();
        if (null == obj) {
            obj = o;
        } else {
            BeanUtils.copyProperties(o, obj);
        }
        msg = StrUtil.isEmpty(msg) ? message : msg;
        map.put(objKey, obj);
        map.put(msgKey, msg);
        return map;
    }

    /**
     * 字段信息唯一性验证
     * 根据自定义注解上的属性信息 进行逻辑处理
     * 根据class 获取对象 根据mybatis-plus active-record操作进行后续持久化等操作
     *
     *
     * @param ynExist
     * @param option
     * @param commonFieldYNExistValidates
     * @param queryYNExistValidateMap
     * @param o
     * @return
     */
    public boolean yNExistValidator(CommonFieldValidateOperatesEnum ynExist, String message, CommonFieldValidateOptionEnum option, List<CommonFieldYNExistValidate> commonFieldYNExistValidates, Map<String, Object> queryYNExistValidateMap, Object o){
        //别名进行分组
        Map<String, List<CommonFieldYNExistValidate>> collect =
                commonFieldYNExistValidates.stream().collect(Collectors.groupingBy(CommonFieldYNExistValidate::alias));
        boolean res = true;
        for (String key : collect.keySet()) {
            if(CommonFieldValidateOptionEnum.AND.equals(option)) {
                Map<String, Object> stringObjectMap = yNExistValidatorBuilder(collect.get(key).get(0), message, o);
                checkUpdateOrSave(stringObjectMap.get(objKey));
                Object msg = stringObjectMap.get(msgKey);
                res = checkBuilder(ynExist, queryYNExistValidateMap, stringObjectMap.get(objKey), msg.toString());
            } else {
                for (CommonFieldYNExistValidate commonFieldYNExistValidate : collect.get(key)) {
                    Map<String,Object> queryMap = new HashMap<>();
                    Map<String, Object> stringObjectMap = yNExistValidatorBuilder(commonFieldYNExistValidate, message, o);
                    checkUpdateOrSave(stringObjectMap.get(objKey));
                    Object msg = stringObjectMap.get(msgKey);
                    queryMap.put(commonFieldYNExistValidate.fieldName(), queryYNExistValidateMap.get(commonFieldYNExistValidate.fieldName()));
                    res =  checkBuilder(ynExist, queryMap, stringObjectMap.get(objKey), msg.toString());
                    if(!res){
                        return res;
                    }
                }
            }
        }
        return res;
    }

    private Map<String, Object> yNExistValidatorBuilder(CommonFieldYNExistValidate commonFieldYNExistValidate, String message, Object o) {

        Map<String,Object> map = new HashMap();
        Object obj = null;
        if(ObjectUtil.isNotNull(commonFieldYNExistValidate.clazz())){
            try {
                obj = commonFieldYNExistValidate.clazz().newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        String msg = commonFieldYNExistValidate.message();
        if (null == obj) {
            obj = o;
        } else {
            BeanUtils.copyProperties(o, obj);
        }
        msg = StrUtil.isEmpty(msg) ? message : msg;
        map.put(objKey, obj);
        map.put(msgKey, msg);
        return map;
    }


    /**
     * 通过传入的实体类中 @TableId 注解的值是否为空,来判断是更新还是保存
     * 将值id值和id列名赋值
     * id的值不为空 是更新 否则是插入
     * @param o 被注解修饰过的实体类
     * @return
     */
    public void checkUpdateOrSave(Object o){
        Field[] fields = getAllFields(o.getClass());
        for (Field f:fields) {
            // 设置私有属性可读
            f.setAccessible(true);
            if(f.isAnnotationPresent(TableId.class)){
                TableId tableId = f.getAnnotation(TableId.class);
                idColumnName = tableId.value();
                try {
                    idColumnValue = f.get(o);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 获取本类及其父类的属性的方法
     * @param clazz 当前类对象
     * @return 字段数组
     */
    private static Field[] getAllFields(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        while (clazz != null){
            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
            clazz = clazz.getSuperclass();
        }
        Field[] fields = new Field[fieldList.size()];
        return fieldList.toArray(fields);
    }


    /**
     * 通过传入的字段值获取数据是否重复
     * @param operate
     * @param queryMap
     * @param o
     * @param message
     * @return
     */
    public boolean checkBuilder(CommonFieldValidateOperatesEnum operate, Map<String, Object> queryMap, Object o, String message){
        Model model = (Model) o;
        QueryWrapper queryWrapper = new QueryWrapper();
        for(String key : queryMap.keySet()){
            queryWrapper.eq(key,queryMap.get(key));
        }
        if(operate.equals(CommonFieldValidateOperatesEnum.UNIQUE)){
            if(idColumnValue != null){
                //更新的话,那条件就要排除自身
                queryWrapper.ne(idColumnName,idColumnValue);
            }
            if (model.selectCount(queryWrapper) > 0){
                log.error(message);
                throw new ValidationException(message);
            }
        } else  if(operate.equals(CommonFieldValidateOperatesEnum.YN_EXIST) && model.selectCount(queryWrapper) < 0){
            log.error(message);
            throw new ValidationException(message);
        }
        return true;
    }


}

六、编写验证的dto

package com.anglin.biz.modular.user.param;

import com.anglin.biz.modular.user.entity.BizUser;
import com.anglin.common.annotation.CommonFieldUniqueValidate;
import com.anglin.common.annotation.CommonFieldValidate;
import com.anglin.common.annotation.CommonPhoneOrEmail;
import com.anglin.common.validate.enums.CommonFieldValidateOperatesEnum;
import com.anglin.common.validate.enums.CommonFieldValidateOptionEnum;
import com.anglin.common.validate.enums.CommonPhoneOrEmailTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;

/**
 * 人员添加参数
 *
 * @date 2022/7/26 15:36
 **/
@Getter
@Setter
@CommonFieldValidate(operates = {CommonFieldValidateOperatesEnum.UNIQUE}, option = CommonFieldValidateOptionEnum.OR, message = "用户数据验证失败,请重新输入")
public class BizUserAddParam {

    /** 账号 */
    @ApiModelProperty(value = "账号", required = true, position = 1)
    @NotBlank(message = "account不能为空")
    @CommonFieldUniqueValidate(fieldName = "account", message = "存在重复的账号,请重新输入", clazz = BizUser.class, alias = "bizUser")
    private String account;

    /** 姓名 */
    @ApiModelProperty(value = "姓名", required = true, position = 2)
    @NotBlank(message = "name不能为空")
    private String name;

    /** 机构id */
    @ApiModelProperty(value = "机构id", required = true, position = 3)
    @NotBlank(message = "orgId不能为空")
    private String orgId;

    /** 岗位id */
    @ApiModelProperty(value = "岗位id", required = true, position = 4)
    @NotBlank(message = "positionId不能为空")
    private String positionId;

    /** 岗级 */
    @ApiModelProperty(value = "岗级", position = 5)
    private String positionLevel;

    /** 主管id */
    @ApiModelProperty(value = "主管id", position = 6)
    private String directorId;

    /** 头像 */
    @ApiModelProperty(value = "头像,图片base64", position = 7)
    private String avatar;

    /** 签名 */
    @ApiModelProperty(value = "签名,图片base64", position = 8)
    private String signature;

    /** 昵称 */
    @ApiModelProperty(value = "昵称", position = 9)
    private String nickname;

    /** 性别 */
    @ApiModelProperty(value = "性别", position = 10)
    private String gender;

    /** 年龄 */
    @ApiModelProperty(value = "年龄", position = 11)
    private String age;

    /** 出生日期 */
    @ApiModelProperty(value = "出生日期", position = 12)
    private String birthday;

    /** 民族 */
    @ApiModelProperty(value = "民族", position = 13)
    private String nation;

    /** 籍贯 */
    @ApiModelProperty(value = "籍贯", position = 14)
    private String nativePlace;

    /** 家庭住址 */
    @ApiModelProperty(value = "家庭住址", position = 15)
    private String homeAddress;

    /** 通信地址 */
    @ApiModelProperty(value = "通信地址", position = 16)
    private String mailingAddress;

    /** 证件类型 */
    @ApiModelProperty(value = "证件类型", position = 17)
    private String idCardType;

    /** 证件号码 */
    @ApiModelProperty(value = "证件号码", position = 18)
    private String idCardNumber;

    /** 文化程度 */
    @ApiModelProperty(value = "文化程度", position = 19)
    private String cultureLevel;

    /** 政治面貌 */
    @ApiModelProperty(value = "政治面貌", position = 20)
    private String politicalOutlook;

    /** 毕业院校 */
    @ApiModelProperty(value = "毕业院校", position = 21)
    private String college;

    /** 学历 */
    @ApiModelProperty(value = "学历", position = 22)
    private String education;

    /** 学制 */
    @ApiModelProperty(value = "学制", position = 23)
    private String eduLength;

    /** 学位 */
    @ApiModelProperty(value = "学位", position = 24)
    private String degree;

    /** 手机 */
    @ApiModelProperty(value = "手机", position = 25)
    @CommonPhoneOrEmail(message = "手机号格式不正确", type = CommonPhoneOrEmailTypeEnum.PHONE)
    @CommonFieldUniqueValidate(fieldName = "phone", message = "存在重复的手机号,请重新输入", clazz = BizUser.class, alias = "bizUser")
    private String phone;

    /** 邮箱 */
    @ApiModelProperty(value = "邮箱", position = 26)
    @CommonPhoneOrEmail(message = "邮箱格式不正确", type = CommonPhoneOrEmailTypeEnum.EMAIL)
    @CommonFieldUniqueValidate(fieldName = "email", message = "存在重复的邮箱,请重新输入", clazz = BizUser.class, alias = "bizUser")
    private String email;

    /** 家庭电话 */
    @ApiModelProperty(value = "家庭电话", position = 27)
    private String homeTel;

    /** 办公电话 */
    @ApiModelProperty(value = "办公电话", position = 28)
    private String officeTel;

    /** 紧急联系人 */
    @ApiModelProperty(value = "紧急联系人", position = 29)
    private String emergencyContact;

    /** 紧急联系人电话 */
    @ApiModelProperty(value = "紧急联系人电话", position = 30)
    private String emergencyPhone;

    /** 紧急联系人地址 */
    @ApiModelProperty(value = "紧急联系人地址", position = 31)
    private String emergencyAddress;

    /** 员工编号 */
    @ApiModelProperty(value = "员工编号", position = 32)
    private String empNo;

    /** 入职日期 */
    @ApiModelProperty(value = "员工编号", position = 33)
    private String entryDate;

    /** 兼任信息 */
    @ApiModelProperty(value = "兼任信息", position = 34)
    private String positionJson;

    /** 排序码 */
    @ApiModelProperty(value = "排序码", position = 35)
    private Integer sortCode;

    /** 扩展信息 */
    @ApiModelProperty(value = "扩展信息", position = 36)
    private String extJson;
}

七、编写controller

/**
     * 添加人员
     *
     * @date 2022/4/24 20:47
     */
    @ApiOperationSupport(order = 2)
    @ApiOperation("添加人员")
    @CommonLog("添加人员")
    @SaCheckPermission("/biz/user/add")
    @PostMapping("/biz/user/add")
    public CommonResult<String> add(@RequestBody @Valid BizUserAddParam bizUserAddParam) {
        bizUserService.add(bizUserAddParam);
        return CommonResult.ok();
    }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值