From 10b813142b194e4ad8a9fb04c06ef427d008674e Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Mon, 27 Sep 2021 17:09:36 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=80=BC?= =?UTF-8?q?=E8=81=94=E5=8A=A8=E5=92=8C=E6=89=A9=E5=B1=95=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/annotations/FormItem.java | 2 +- .../framework/annotations/MappedTo.java | 30 +++++++++++ .../framework/annotations/Property.java | 6 +++ .../flyfish/framework/domain/base/Domain.java | 2 + .../framework/beans/meta/BeanProperty.java | 54 ++++++++++++++----- 5 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/annotations/MappedTo.java diff --git a/flyfish-data/src/main/java/com/flyfish/framework/annotations/FormItem.java b/flyfish-data/src/main/java/com/flyfish/framework/annotations/FormItem.java index b358d65..ac2a755 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/annotations/FormItem.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/annotations/FormItem.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; * * @author wangyu */ -@Target(ElementType.FIELD) +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FormItem { diff --git a/flyfish-data/src/main/java/com/flyfish/framework/annotations/MappedTo.java b/flyfish-data/src/main/java/com/flyfish/framework/annotations/MappedTo.java new file mode 100644 index 0000000..96625fc --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/annotations/MappedTo.java @@ -0,0 +1,30 @@ +package com.flyfish.framework.annotations; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * 字段映射 + * + * @author wangyu + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface MappedTo { + + /** + * 映射到字段,复制值 + * + * @return 字段名 + */ + String value() default ""; + + /** + * 表达式,支持js,json。支持表达式占位value + * + * @return 表达式 + */ + String expression() default ""; +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/annotations/Property.java b/flyfish-data/src/main/java/com/flyfish/framework/annotations/Property.java index 1dd9a0f..ca31816 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/annotations/Property.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/annotations/Property.java @@ -72,4 +72,10 @@ public @interface Property { * @return 结果 */ String group() default ""; + + /** + * 表单注解 + * @return 表单注解,仅用于构造器 + */ + FormItem[] form() default {}; } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java index b4622b9..795aca4 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java @@ -1,5 +1,6 @@ package com.flyfish.framework.domain.base; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.flyfish.framework.annotations.Property; import com.flyfish.framework.domain.po.User; import lombok.Getter; @@ -45,6 +46,7 @@ public abstract class Domain implements Po, Serializable { * 上下文冗余,利用内存缓存上下文 */ @Transient + @JsonIgnore @Property(readonly = true) private User currentUser; diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java index 6403564..8cca4d1 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java @@ -1,9 +1,7 @@ package com.flyfish.framework.beans.meta; -import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; import com.flyfish.framework.annotations.Properties; import com.flyfish.framework.annotations.*; import com.flyfish.framework.beans.enums.ValidationCandidate; @@ -48,6 +46,10 @@ public class BeanProperty { // 属性标题 private String title; + // 旧标题 + @JsonIgnore + private transient String oldTitle; + // 描述信息 private String description; @@ -75,6 +77,7 @@ public class BeanProperty { private List validation; // 排序变量,用于排序 + @JsonIgnore private transient int order; // 所属分组,该分组必须在元数据中定义 @@ -112,11 +115,17 @@ public class BeanProperty { // 只有存在馆建注解,才会进行初始化 String parentName = Optional.ofNullable(beanClass.getAnnotation(RestBean.class)) .map(RestBean::name).orElse(""); - property.setTitle(props.inherited() ? parentName + props.title() : props.title()); property.setDescription(props.description()); property.setReadonly(props.readonly()); property.setInherited(props.inherited()); property.setGroup(props.group()); + // 继承模式,继承名称 + if (property.inherited) { + property.setOldTitle(props.title()); + property.setTitle(parentName + property.oldTitle); + } else { + property.setTitle(props.title()); + } // 优雅地设置排序 MergedAnnotation order = annotations.get(Order.class); if (order.isPresent()) { @@ -127,15 +136,13 @@ public class BeanProperty { // 优雅的设置额外的属性 MergedAnnotation item = annotations.get(FormItem.class); if (item.isPresent()) { - FormItem formItem = item.synthesize(); - // 设置额外属性 - property.extra.put("component", formItem.component()); - property.layout = formItem.layout(); - if (ArrayUtils.isNotEmpty(formItem.props())) { - for (FormItem.Prop prop : formItem.props()) { - property.prop(prop.key(), prop.value()); - } - } + applyFormItem(property, item.synthesize()); + } + // 优雅的设置联动映射 + MergedAnnotation mapping = annotations.get(MappedTo.class); + if (mapping.isPresent()) { + property.extra.put("mapping", mapping.asMap()); + MappedTo mappedTo = mapping.synthesize(); } // 优雅的处理校验 property.setValidation(ValidationCandidate.produce(annotations)); @@ -300,7 +307,11 @@ public class BeanProperty { // 存在校验,替换名称文案(仅inherit) if (property.inherited && CollectionUtils.isNotEmpty(property.validation)) { property.validation.forEach(validation -> validation.setMessage(validation.getMessage() - .replace(property.title, prop.title()))); + .replace(property.oldTitle, prop.title()))); + } + // 处理额外的表单属性 + if (ArrayUtils.isNotEmpty(prop.form())) { + applyFormItem(property, prop.form()[0]); } // 设置标题 property.title = prop.title(); @@ -344,6 +355,23 @@ public class BeanProperty { return Optional.empty(); } + /** + * 将formItem注解赋值到目标属性上 + * + * @param property 目标属性 + * @param item 注解元 + */ + private static void applyFormItem(BeanProperty property, FormItem item) { + // 设置额外属性 + property.extra.put("component", item.component()); + property.layout = item.layout(); + if (ArrayUtils.isNotEmpty(item.props())) { + for (FormItem.Prop prop : item.props()) { + property.prop(prop.key(), prop.value()); + } + } + } + /** * 设置当前对象的键值属性 *