【7.1.6】

1.@ChinesDescription注解迁移到rule包下,方便调用
2.ResponseData改为泛型形式,因为接口扫描需要读取字段
3.从新整理类字段解析的方法,考虑多种情况
pull/25/head
fengshuonan 2022-01-14 19:25:07 +08:00
parent 7945745ac5
commit 3f7ea50f84
62 changed files with 599 additions and 366 deletions

View File

@ -22,7 +22,7 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.scanner.api.annotation.field;
package cn.stylefeng.roses.kernel.rule.annotation;
import java.lang.annotation.*;

View File

@ -35,7 +35,7 @@ import lombok.EqualsAndHashCode;
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ErrorResponseData extends ResponseData {
public class ErrorResponseData<T> extends ResponseData<T> {
/**
*
@ -58,7 +58,7 @@ public class ErrorResponseData extends ResponseData {
super(Boolean.FALSE, code, message, null);
}
public ErrorResponseData(String code, String message, Object object) {
public ErrorResponseData(String code, String message, T object) {
super(Boolean.FALSE, code, message, object);
}

View File

@ -24,6 +24,7 @@
*/
package cn.stylefeng.roses.kernel.rule.pojo.response;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
/**
@ -33,32 +34,36 @@ import lombok.Data;
* @date 2020/10/17 17:33
*/
@Data
public class ResponseData {
public class ResponseData<T> {
/**
*
*/
@ChineseDescription("请求是否成功")
private Boolean success;
/**
*
*/
@ChineseDescription("响应状态码")
private String code;
/**
*
*/
@ChineseDescription("响应信息")
private String message;
/**
*
*/
private Object data;
@ChineseDescription("响应对象")
private T data;
public ResponseData() {
}
public ResponseData(Boolean success, String code, String message, Object data) {
public ResponseData(Boolean success, String code, String message, T data) {
this.success = success;
this.code = code;
this.message = message;

View File

@ -32,17 +32,17 @@ import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
* @author fengshuonan
* @date 2020/10/16 16:23
*/
public class SuccessResponseData extends ResponseData {
public class SuccessResponseData<T> extends ResponseData<T> {
public SuccessResponseData() {
super(Boolean.TRUE, RuleConstants.SUCCESS_CODE, RuleConstants.SUCCESS_MESSAGE, null);
}
public SuccessResponseData(Object object) {
public SuccessResponseData(T object) {
super(Boolean.TRUE, RuleConstants.SUCCESS_CODE, RuleConstants.SUCCESS_MESSAGE, object);
}
public SuccessResponseData(String code, String message, Object object) {
public SuccessResponseData(String code, String message, T object) {
super(Boolean.TRUE, code, message, object);
}
}

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.auth.api.pojo.auth;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -26,7 +26,7 @@ package cn.stylefeng.roses.kernel.auth.api.pojo.auth;
import cn.hutool.core.bean.BeanUtil;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
/**

View File

@ -30,8 +30,8 @@ import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

View File

@ -27,7 +27,7 @@ package cn.stylefeng.roses.kernel.scanner.api.enums;
import lombok.Getter;
/**
*
*
*
* @author fengshuonan
* @date 2022/1/13 16:37
@ -41,19 +41,44 @@ public enum FieldTypeEnum {
BASIC(1),
/**
* javaCollection
* javalong[]
*/
ARRAY(2),
BASE_ARRAY(2),
/**
* java
* SysUser[]
*/
OBJECT(3),
ARRAY_WITH_OBJECT(3),
/**
* CollectionList
*/
BASE_COLLECTION(4),
/**
* CollectionList<SysUser>List<String>
*/
COLLECTION_WITH_OBJECT(5),
/**
* SysUser
*/
OBJECT(6),
/**
* ResponseData<SysUser>
*/
OBJECT_WITH_GENERIC(7),
/**
* TSomeEntity<T>List<T>T
*/
WITH_UNKNOWN_GENERIC(8),
/**
*
*/
OTHER(4);
OTHER(9);
FieldTypeEnum(Integer code) {
this.code = code;

View File

@ -0,0 +1,137 @@
package cn.stylefeng.roses.kernel.scanner.api.factory;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.factory.description.ClassDescriptionUtil;
import cn.stylefeng.roses.kernel.scanner.api.factory.description.FieldDescriptionUtil;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata;
import cn.stylefeng.roses.kernel.scanner.api.util.ClassTypeUtil;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.LinkedHashSet;
import java.util.Set;
/**
*
*
* @author fengshuonan
* @date 2022/1/13 13:49
*/
@Slf4j
public class ClassDetailMetadataFactory {
/**
*
*
* @author fengshuonan
* @date 2022/1/14 14:31
*/
public static Set<FieldMetadata> createFieldDetailMetadataSet(Type fieldType) {
// 获取参数的类型枚举
FieldTypeEnum classFieldType = ClassTypeUtil.getClassFieldType(fieldType);
// 设置响应结果
Set<FieldMetadata> fieldMetadata = null;
// 根据字段类型的不同进行响应的处理
switch (classFieldType) {
case BASIC:
// 基本类型不需要填充子类型信息
fieldMetadata = null;
break;
case BASE_ARRAY:
// 如果是简单数组类型,则描述一下这个基本类型的信息
Class<?> baseArrayFieldClazz = (Class<?>) fieldType;
Class<?> baseArrayComponentType = baseArrayFieldClazz.getComponentType();
FieldMetadata baseMetadata = ClassDescriptionUtil.createClassMetadata(baseArrayComponentType, FieldTypeEnum.BASIC);
fieldMetadata = new LinkedHashSet<>();
fieldMetadata.add(baseMetadata);
break;
case ARRAY_WITH_OBJECT:
// 如果是带实体的数组,则加上实体对应的字段信息
Class<?> objArrayClass = (Class<?>) fieldType;
Class<?> objArrayComponentType = objArrayClass.getComponentType();
fieldMetadata = ClassDetailMetadataFactory.createFieldDetailMetadataSet(objArrayComponentType);
break;
case BASE_COLLECTION:
// 如果是基础集合因为不确定集合的内容所以使用Object来描述一下集合的具体内容
FieldMetadata collectionFieldMetadata = ClassDescriptionUtil.createClassMetadata(Object.class, FieldTypeEnum.OBJECT);
fieldMetadata = new LinkedHashSet<>();
fieldMetadata.add(collectionFieldMetadata);
break;
case COLLECTION_WITH_OBJECT:
// 如果是集合里带的具体实体对象,则描述一下具体实体的数据结构
ParameterizedType collectionParameterizedType = (ParameterizedType) fieldType;
Type[] actualTypeArguments = collectionParameterizedType.getActualTypeArguments();
fieldMetadata = ClassDetailMetadataFactory.createFieldDetailMetadataSet(actualTypeArguments[0]);
break;
case OBJECT:
// 如果是实体对象,则描述实体对象的所有字段信息
Class<?> objectClass = (Class<?>) fieldType;
Field[] fields = objectClass.getDeclaredFields();
fieldMetadata = new LinkedHashSet<>();
for (Field field : fields) {
// 获取字段的具体属性
FieldMetadata fieldInfo = FieldDescriptionUtil.createFieldMetadata(field);
fieldMetadata.add(fieldInfo);
}
break;
case OBJECT_WITH_GENERIC:
// 如果是带泛型的Object实体类型
ParameterizedType objWithGenericParameterizedType = (ParameterizedType) fieldType;
// 先获取主体类型
Type rawType = objWithGenericParameterizedType.getRawType();
// 获取具体泛型
Type genericType = objWithGenericParameterizedType.getActualTypeArguments()[0];
// 获取主体的所有字段信息
fieldMetadata = getEntityWithGenericFieldMetadataList(rawType, genericType);
default:
}
return fieldMetadata;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/14 18:51
*/
public static Set<FieldMetadata> getEntityWithGenericFieldMetadataList(Type fieldType, Type genericType) {
if (fieldType instanceof Class<?>) {
Class<?> clazz = (Class<?>) fieldType;
// 获取主类型的所有带泛型的属性
Set<FieldMetadata> fieldDetailMetadataSet = createFieldDetailMetadataSet(clazz);
for (FieldMetadata fieldMetadata : fieldDetailMetadataSet) {
// 如果是带泛型集合如下情况List<T>,又或是直接 T 这种形式
if (FieldTypeEnum.COLLECTION_WITH_OBJECT.getCode().equals(fieldMetadata.getFieldType())
|| FieldTypeEnum.WITH_UNKNOWN_GENERIC.getCode().equals(fieldMetadata.getFieldType())) {
// 设置这个字段的子字段描述
fieldMetadata.setGenericFieldMetadata(createFieldDetailMetadataSet(genericType));
}
// 如果T在携带在一个实体类上例如ResponseData<T>这种形式
else if (FieldTypeEnum.OBJECT_WITH_GENERIC.getCode().equals(fieldMetadata.getFieldType())) {
// 设置这个字段的子字段描述
Set<FieldMetadata> current = null;
try {
current = getEntityWithGenericFieldMetadataList(Class.forName(fieldMetadata.getFieldClassPath()), genericType);
} catch (ClassNotFoundException e) {
log.error("类无法找到" + fieldMetadata.getFieldClassPath(), e);
continue;
}
fieldMetadata.setGenericFieldMetadata(current);
}
}
return fieldDetailMetadataSet;
} else {
log.info("带泛型的实体主题rawType非Class类型" + fieldType);
return null;
}
}
}

View File

@ -0,0 +1,70 @@
package cn.stylefeng.roses.kernel.scanner.api.factory;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.factory.description.ClassDescriptionUtil;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata;
import cn.stylefeng.roses.kernel.scanner.api.util.ClassTypeUtil;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Set;
/**
*
*
* @author fengshuonan
* @date 2022/1/13 13:49
*/
@Slf4j
public class ClassMetadataFactory {
/**
* ClassParameterizedType
*
* @param type
* @return
* @author fengshuonan
* @date 2022/1/13 13:51
*/
public static FieldMetadata beginCreateFieldMetadata(Type type) {
// 获取类型的枚举
FieldTypeEnum classFieldType = ClassTypeUtil.getClassFieldType(type);
// 设置响应结果
FieldMetadata fieldMetadata = null;
// 组装类的基本信息
if (type instanceof Class<?>) {
Class<?> clazz = (Class<?>) type;
// 创建类型的基本信息
fieldMetadata = ClassDescriptionUtil.createClassMetadata(clazz, classFieldType);
// 补充类型的子信息
Set<FieldMetadata> fieldDetailMetadataSet = ClassDetailMetadataFactory.createFieldDetailMetadataSet(clazz);
fieldMetadata.setGenericFieldMetadata(fieldDetailMetadataSet);
}
// 如果是带泛型的
else if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
// 创建类型的基本信息
FieldMetadata baseMetadata = ClassDescriptionUtil.createParameterizedMetadata(parameterizedType, classFieldType);
// 补充类型的子信息
Set<FieldMetadata> fieldDetailMetadataSet = ClassDetailMetadataFactory.createFieldDetailMetadataSet(type);
baseMetadata.setGenericFieldMetadata(fieldDetailMetadataSet);
}
// 其他情况
else {
log.info("未知类型的处理既不是class也不是ParameterizedType打印出类的信息如下{}", type.getTypeName());
}
return fieldMetadata;
}
}

View File

@ -1,279 +0,0 @@
package cn.stylefeng.roses.kernel.scanner.api.factory;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.IdUtil;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldMetadataTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata;
import cn.stylefeng.roses.kernel.scanner.api.util.ClassReflectUtil;
import lombok.extern.slf4j.Slf4j;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
/**
*
*
* @author fengshuonan
* @date 2022/1/13 13:49
*/
@Slf4j
public class FieldMetadataFactory {
private List<String> entityScanPackage = ListUtil.list(false, "cn.stylefeng");
/**
* ClassParameterizedType
*
* @param type
* @return
* @author fengshuonan
* @date 2022/1/13 13:51
*/
public FieldMetadata beginCreateFieldMetadata(Type type) {
if (type instanceof Class) {
return this.processClass((Class<?>) type);
} else if (type instanceof ParameterizedType) {
return this.processParameterizedType((ParameterizedType) type);
}
// 其他情况,暂不处理
return new FieldMetadata();
}
/**
* class
*
* @author fengshuonan
* @date 2022/1/13 13:56
*/
private FieldMetadata processClass(Class<?> clazz) {
// 如果是基本类型
if (ClassUtil.isSimpleValueType(clazz)) {
return createClassMetadata(clazz, FieldTypeEnum.BASIC);
}
// 如果是基本数组类型
else if (clazz.isArray()) {
FieldMetadata classMetadata = createClassMetadata(clazz, FieldTypeEnum.ARRAY);
// 数组元素真实类型
Class<?> componentType = clazz.getComponentType();
FieldMetadata fieldMetadata = processClass(componentType);
classMetadata.addOneSubFieldMetadata(fieldMetadata);
return classMetadata;
}
// 如果是集合类型,纯集合类型,不带泛型
else if (Collection.class.isAssignableFrom(clazz)) {
return createClassMetadata(clazz, FieldTypeEnum.ARRAY);
}
// 如果是实体对象类型
else if (this.ensureEntityFlag(clazz)) {
FieldMetadata classMetadata = createClassMetadata(clazz, FieldTypeEnum.OBJECT);
// 获取每个字段的元数据信息,开始组装
Field[] fields = clazz.getFields();
HashSet<FieldMetadata> fieldMetadataSet = new HashSet<>();
for (Field field : fields) {
// 获取字段的具体属性
FieldMetadata fieldMetadata = this.createFieldMetadata(field);
fieldMetadataSet.add(fieldMetadata);
}
classMetadata.setGenericFieldMetadata(fieldMetadataSet);
}
// 其他类型,暂不处理
else {
log.info("未知类型的处理,打印出类的信息如下:{}", clazz.toGenericString());
}
return null;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/13 13:56
*/
private FieldMetadata processParameterizedType(ParameterizedType parameterizedType) {
// 获取泛型的主体
Type rawType = parameterizedType.getRawType();
// 获取泛型的具体参数,只处理带一个泛型的
Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0];
return null;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/13 17:49
*/
private boolean ensureEntityFlag(Class<?> clazz) {
for (String packageName : entityScanPackage) {
if (clazz.getName().startsWith(packageName)) {
return true;
}
}
return false;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/14 0:25
*/
private FieldTypeEnum getClassFieldType(Class<?> clazz) {
// 如果是基本类型
if (ClassUtil.isSimpleValueType(clazz)) {
return FieldTypeEnum.BASIC;
}
// 如果是基本数组类型
else if (clazz.isArray()) {
return FieldTypeEnum.ARRAY;
}
// 如果是集合类型,纯集合类型,不带泛型
else if (Collection.class.isAssignableFrom(clazz)) {
return FieldTypeEnum.ARRAY;
}
// 如果是实体对象类型
else if (this.ensureEntityFlag(clazz)) {
return FieldTypeEnum.OBJECT;
}
// 其他类型,暂不处理
else {
log.info("未知类型的处理,打印出类的信息如下:{}", clazz.toGenericString());
return FieldTypeEnum.OTHER;
}
}
/**
*
*
* @author fengshuonan
* @date 2022/1/13 18:06
*/
private FieldMetadata createClassMetadata(Class<?> clazz, FieldTypeEnum fieldTypeEnum) {
FieldMetadata fieldMetadataItem = new FieldMetadata();
// 设置唯一id
fieldMetadataItem.setMetadataId(IdUtil.fastSimpleUUID());
// 设置字段中文含义
fieldMetadataItem.setChineseName(clazz.getSimpleName());
// 设置字段类类型
fieldMetadataItem.setFieldClassType(clazz.getSimpleName());
// 设置类的全路径
fieldMetadataItem.setFieldClassPath(clazz.getName());
// 设置对应字段名称,无字段名称则填写类的简称
fieldMetadataItem.setFieldName(clazz.getSimpleName());
// 设置是否带泛型
fieldMetadataItem.setGenericFieldMetadataType(FieldMetadataTypeEnum.FIELD.getCode());
// 设置字段类型基本、数组、还是object
fieldMetadataItem.setFieldType(fieldTypeEnum.getCode());
// 设置字段
return fieldMetadataItem;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/13 18:06
*/
private FieldMetadata createFieldMetadata(Field field) {
FieldMetadata fieldMetadataItem = new FieldMetadata();
// 设置唯一id
fieldMetadataItem.setMetadataId(IdUtil.fastSimpleUUID());
// 设置字段中文含义
ChineseDescription annotation = field.getAnnotation(ChineseDescription.class);
if (annotation != null) {
fieldMetadataItem.setChineseName(annotation.value());
}
// 设置字段类类型
Class<?> fieldType = field.getType();
fieldMetadataItem.setFieldClassType(fieldType.getSimpleName());
// 设置类的全路径
fieldMetadataItem.setFieldClassPath(fieldType.getName());
// 设置对应字段名称
fieldMetadataItem.setFieldName(field.getName());
// 处理注解信息
parsingAnnotation(field, fieldMetadataItem);
// 设置是否带泛型
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
fieldMetadataItem.setGenericFieldMetadataType(FieldMetadataTypeEnum.GENERIC.getCode());
} else {
fieldMetadataItem.setGenericFieldMetadataType(FieldMetadataTypeEnum.FIELD.getCode());
}
// 设置字段类型基本、数组、还是object
fieldMetadataItem.setFieldType(getClassFieldType(fieldType).getCode());
// 处理本字段的子字段信息
fieldMetadataItem.setGenericFieldMetadata(getFieldSubMetadataSet(field));
// 设置字段
return fieldMetadataItem;
}
/**
* null
*
* @author fengshuonan
* @date 2022/1/14 0:45
*/
private static Set<FieldMetadata> getFieldSubMetadataSet(Field field) {
Type genericType = field.getGenericType();
if (genericType instanceof Class<?>) {
} else if (genericType instanceof ParameterizedType) {
}
}
/**
*
*
* @author majianguo
* @date 2022/1/7 18:26
**/
private static void parsingAnnotation(Field declaredField, FieldMetadata fieldDescription) {
Annotation[] annotations = declaredField.getAnnotations();
if (annotations != null && annotations.length > 0) {
// 设置字段的所有注解
fieldDescription.setAnnotations(ClassReflectUtil.annotationsToStrings(annotations));
// 遍历字段上的所有注解找到带groups属性的按group分类组装注解
Map<String, Set<String>> groupAnnotations = new HashMap<>();
for (Annotation annotation : annotations) {
Class<?>[] validateGroupsClasses = ClassReflectUtil.invokeAnnotationMethodIgnoreError(annotation, "groups", Class[].class);
if (validateGroupsClasses != null) {
for (Class<?> validateGroupsClass : validateGroupsClasses) {
ClassReflectUtil.addGroupValidateAnnotation(annotation, validateGroupsClass, groupAnnotations);
}
}
}
// 设置分组注解
fieldDescription.setGroupValidationMessage(groupAnnotations);
}
}
public static void main(String[] args) {
}
}

View File

@ -0,0 +1,55 @@
package cn.stylefeng.roses.kernel.scanner.api.factory.description;
import cn.hutool.core.util.IdUtil;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldMetadataTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata;
import java.lang.reflect.ParameterizedType;
/**
*
*
* @author fengshuonan
* @date 2022/1/14 10:59
*/
public class ClassDescriptionUtil {
/**
*
*
* @author fengshuonan
* @date 2022/1/13 18:06
*/
public static FieldMetadata createClassMetadata(Class<?> clazz, FieldTypeEnum fieldTypeEnum) {
FieldMetadata fieldMetadataItem = new FieldMetadata();
// 设置唯一id
fieldMetadataItem.setMetadataId(IdUtil.fastSimpleUUID());
// 设置字段中文含义
fieldMetadataItem.setChineseName(clazz.getSimpleName());
// 设置字段类类型
fieldMetadataItem.setFieldClassType(clazz.getSimpleName());
// 设置类的全路径
fieldMetadataItem.setFieldClassPath(clazz.getName());
// 设置对应字段名称,无字段名称则填写类的简称
fieldMetadataItem.setFieldName(null);
// 设置是否带泛型
fieldMetadataItem.setGenericFieldMetadataType(FieldMetadataTypeEnum.FIELD.getCode());
// 设置字段类型基本、数组、还是object
fieldMetadataItem.setFieldType(fieldTypeEnum.getCode());
// 设置字段
return fieldMetadataItem;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/13 18:06
*/
public static FieldMetadata createParameterizedMetadata(ParameterizedType parameterizedType, FieldTypeEnum fieldTypeEnum) {
Class<?> rawType = (Class<?>) parameterizedType.getRawType();
return createClassMetadata(rawType, fieldTypeEnum);
}
}

View File

@ -0,0 +1,96 @@
package cn.stylefeng.roses.kernel.scanner.api.factory.description;
import cn.hutool.core.util.IdUtil;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldMetadataTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.factory.ClassDetailMetadataFactory;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata;
import cn.stylefeng.roses.kernel.scanner.api.util.ClassReflectUtil;
import cn.stylefeng.roses.kernel.scanner.api.util.ClassTypeUtil;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*
*
* @author fengshuonan
* @date 2022/1/14 10:59
*/
public class FieldDescriptionUtil {
/**
*
*
* @author fengshuonan
* @date 2022/1/13 18:06
*/
public static FieldMetadata createFieldMetadata(Field field) {
FieldMetadata fieldMetadataItem = new FieldMetadata();
// 设置唯一id
fieldMetadataItem.setMetadataId(IdUtil.fastSimpleUUID());
// 设置字段中文含义
ChineseDescription annotation = field.getAnnotation(ChineseDescription.class);
if (annotation != null) {
fieldMetadataItem.setChineseName(annotation.value());
}
// 设置字段类类型
Class<?> classType = field.getType();
fieldMetadataItem.setFieldClassType(classType.getSimpleName());
// 设置类的全路径
fieldMetadataItem.setFieldClassPath(classType.getName());
// 设置对应字段名称
fieldMetadataItem.setFieldName(field.getName());
// 处理注解信息
parsingAnnotation(field, fieldMetadataItem);
// 设置是否带泛型
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
fieldMetadataItem.setGenericFieldMetadataType(FieldMetadataTypeEnum.GENERIC.getCode());
} else {
fieldMetadataItem.setGenericFieldMetadataType(FieldMetadataTypeEnum.FIELD.getCode());
}
// 设置字段类型基本、数组、还是object
FieldTypeEnum classFieldType = ClassTypeUtil.getClassFieldType(genericType);
fieldMetadataItem.setFieldType(classFieldType.getCode());
// 根据情况,获取字段的具体子数据描述
Set<FieldMetadata> fieldDetailMetadataSet = ClassDetailMetadataFactory.createFieldDetailMetadataSet(genericType);
fieldMetadataItem.setGenericFieldMetadata(fieldDetailMetadataSet);
return fieldMetadataItem;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/14 11:57
*/
private static void parsingAnnotation(Field declaredField, FieldMetadata fieldDescription) {
Annotation[] annotations = declaredField.getAnnotations();
if (annotations != null && annotations.length > 0) {
// 设置字段的所有注解
fieldDescription.setAnnotations(ClassReflectUtil.annotationsToStrings(annotations));
// 遍历字段上的所有注解找到带groups属性的按group分类组装注解
Map<String, Set<String>> groupAnnotations = new HashMap<>();
for (Annotation annotation : annotations) {
Class<?>[] validateGroupsClasses = ClassReflectUtil.invokeAnnotationMethodIgnoreError(annotation, "groups", Class[].class);
if (validateGroupsClasses != null) {
for (Class<?> validateGroupsClass : validateGroupsClasses) {
ClassReflectUtil.addGroupValidateAnnotation(annotation, validateGroupsClass, groupAnnotations);
}
}
}
// 设置分组注解
fieldDescription.setGroupValidationMessage(groupAnnotations);
}
}
}

View File

@ -24,11 +24,9 @@
*/
package cn.stylefeng.roses.kernel.scanner.api.pojo.resource;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@ -112,20 +110,4 @@ public class FieldMetadata {
@ChineseDescription("泛型或object类型的字段的描述")
private Set<FieldMetadata> genericFieldMetadata;
/**
*
*
* @author fengshuonan
* @date 2022/1/14 0:02
*/
public void addOneSubFieldMetadata(FieldMetadata fieldMetadata) {
if (ObjectUtil.isEmpty(this.genericFieldMetadata)) {
HashSet<FieldMetadata> subMetadataSet = new HashSet<>();
subMetadataSet.add(fieldMetadata);
this.genericFieldMetadata = subMetadataSet;
} else {
this.genericFieldMetadata.add(fieldMetadata);
}
}
}

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.scanner.api.pojo.resource;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.scanner.api.pojo.resource;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
/**

View File

@ -29,7 +29,7 @@ import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.TypeUtil;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldMetadataTypeEnum;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata;

View File

@ -0,0 +1,145 @@
package cn.stylefeng.roses.kernel.scanner.api.util;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ClassUtil;
import cn.stylefeng.roses.kernel.scanner.api.enums.FieldTypeEnum;
import lombok.extern.slf4j.Slf4j;
import sun.reflect.generics.reflectiveObjects.TypeVariableImpl;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
*
*
* @author fengshuonan
* @date 2022/1/14 16:42
*/
@Slf4j
public class ClassTypeUtil {
/**
*
*/
public static List<String> entityScanPackage = ListUtil.list(false, "cn.stylefeng");
/**
*
*
* @author fengshuonan
* @date 2022/1/13 17:49
*/
public static boolean ensureEntityFlag(Class<?> clazz) {
for (String packageName : entityScanPackage) {
if (clazz.getName().startsWith(packageName)) {
return true;
}
}
return false;
}
/**
*
*
* @author fengshuonan
* @date 2022/1/14 0:25
*/
public static FieldTypeEnum getClassFieldType(Type type) {
// 如果是具体类,不带泛型
if (type instanceof Class) {
Class<?> clazz = (Class<?>) type;
// 判断是否是基本类型如果是Map或者Object也认定为基本类型不解析他们的字段
if (ClassUtil.isSimpleValueType(clazz)) {
return FieldTypeEnum.BASIC;
}
// 判断是否是数组类型
else if (clazz.isArray()) {
// 获取array的具体类型
Class<?> componentType = clazz.getComponentType();
if (ClassUtil.isSimpleValueType(componentType)) {
return FieldTypeEnum.BASE_ARRAY;
} else {
return FieldTypeEnum.ARRAY_WITH_OBJECT;
}
}
// 如果是集合类型,纯集合类型,不带泛型
else if (Collection.class.isAssignableFrom(clazz)) {
return FieldTypeEnum.BASE_COLLECTION;
}
// 如果是实体对象类型
else if (ClassTypeUtil.ensureEntityFlag(clazz)) {
return FieldTypeEnum.OBJECT;
}
// 如果是Object类型则认定为基本类型不解析他的具体内容
else if (Object.class.equals(clazz)) {
return FieldTypeEnum.BASIC;
}
// 其他类型,暂不处理
else {
log.info("类型是Class但有处理不到的情况打印出类的信息如下{}", clazz.toGenericString());
return FieldTypeEnum.OTHER;
}
}
// 如果带具体泛型的类
else if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
// 泛型类的主体
Type rawType = parameterizedType.getRawType();
if (rawType instanceof Class<?>) {
Class<?> rawTypeClass = (Class<?>) rawType;
// 如果泛型主体是集合
if (Collection.class.isAssignableFrom(rawTypeClass)) {
return FieldTypeEnum.COLLECTION_WITH_OBJECT;
}
// 如果泛型的主体是实体包装类
else if (ClassTypeUtil.ensureEntityFlag(rawTypeClass)) {
return FieldTypeEnum.OBJECT_WITH_GENERIC;
}
// 如果是map类型则认定为基本类型不做处理不解析他的元数据
else if (Map.class.isAssignableFrom(rawTypeClass)) {
return FieldTypeEnum.BASIC;
}
// 泛型的主体情况不确定,不处理
else {
log.info("泛型的主体情况不确定不处理打印出rawTypeClass{}", rawTypeClass.getName());
return FieldTypeEnum.OTHER;
}
} else {
// 泛型的主体是别的类型
log.info("rawType为非Class类型打印出rawType{}", rawType.getTypeName());
return FieldTypeEnum.OTHER;
}
}
// 带T的参数例如解析到ResponseData<T>中的data字段是带T的
else if (type instanceof TypeVariableImpl<?>) {
return FieldTypeEnum.WITH_UNKNOWN_GENERIC;
}
// 其他情况既不是class也不是ParameterizedType
else {
log.info("未知类型的处理既不是class也不是ParameterizedType打印出类的信息如下{}", type.getTypeName());
return FieldTypeEnum.OTHER;
}
}
}

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.security.api.pojo;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Builder;
import lombok.Data;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.customer.modular.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.customer.modular.request;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.app;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.status.StatusValue;
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
import lombok.Data;

View File

@ -25,7 +25,7 @@
package cn.stylefeng.roses.kernel.system.api.pojo.app;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.login;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import java.util.List;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.flag.FlagValue;
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
import lombok.Data;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu.antd;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import java.math.BigDecimal;

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu.antd;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
import java.util.List;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.menu.layui;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import java.util.List;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.notice;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.organization;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.status.StatusValue;
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
import lombok.Data;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.organization;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.status.StatusValue;
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
import lombok.Data;

View File

@ -24,9 +24,9 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.organization;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.rule.tree.xmtree.base.AbstractXmSelectNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import java.util.List;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.resource;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import java.util.HashMap;

View File

@ -24,10 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.resource;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -25,8 +25,8 @@
package cn.stylefeng.roses.kernel.system.api.pojo.role.dto;
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.role.request;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.api.pojo.theme;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.api.pojo.theme;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.api.pojo.theme;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.api.pojo.theme;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.user;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
import java.util.Date;

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.user;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

View File

@ -25,9 +25,9 @@
package cn.stylefeng.roses.kernel.system.api.pojo.user;
import cn.hutool.core.collection.IterUtil;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.enums.TreeNodeEnum;
import cn.stylefeng.roses.kernel.rule.tree.factory.node.DefaultTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -24,7 +24,7 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.user.request;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
import javax.validation.constraints.NotBlank;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.api.pojo.user.request;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.validator.api.validators.date.DateValue;
import cn.stylefeng.roses.kernel.validator.api.validators.phone.PhoneValue;
import cn.stylefeng.roses.kernel.validator.api.validators.status.StatusValue;

View File

@ -25,7 +25,7 @@
package cn.stylefeng.roses.kernel.system.modular.app.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -25,8 +25,8 @@
package cn.stylefeng.roses.kernel.system.modular.menu.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -25,7 +25,7 @@
package cn.stylefeng.roses.kernel.system.modular.menu.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -25,7 +25,7 @@
package cn.stylefeng.roses.kernel.system.modular.menu.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

View File

@ -26,7 +26,7 @@ package cn.stylefeng.roses.kernel.system.modular.notice.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.dict.api.serializer.DictValueSerializer;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -25,14 +25,13 @@
package cn.stylefeng.roses.kernel.system.modular.organization.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.ibatis.annotations.Insert;
import java.math.BigDecimal;

View File

@ -25,8 +25,8 @@
package cn.stylefeng.roses.kernel.system.modular.organization.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.xmtree.base.AbstractXmSelectNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -25,7 +25,7 @@
package cn.stylefeng.roses.kernel.system.modular.resource.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

View File

@ -24,8 +24,8 @@
*/
package cn.stylefeng.roses.kernel.system.modular.resource.pojo;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import lombok.Data;
import java.util.List;

View File

@ -25,7 +25,7 @@
package cn.stylefeng.roses.kernel.system.modular.role.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.modular.theme.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import cn.stylefeng.roses.kernel.system.modular.theme.pojo.AntdvFileInfo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.modular.theme.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.modular.theme.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -1,7 +1,7 @@
package cn.stylefeng.roses.kernel.system.modular.theme.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;