feat:新增值联动和扩展覆盖属性
This commit is contained in:
parent
2dddab4f31
commit
10b813142b
@ -7,7 +7,7 @@ import java.lang.annotation.*;
|
|||||||
*
|
*
|
||||||
* @author wangyu
|
* @author wangyu
|
||||||
*/
|
*/
|
||||||
@Target(ElementType.FIELD)
|
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Documented
|
@Documented
|
||||||
public @interface FormItem {
|
public @interface FormItem {
|
||||||
|
@ -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 "";
|
||||||
|
}
|
@ -72,4 +72,10 @@ public @interface Property {
|
|||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
String group() default "";
|
String group() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单注解
|
||||||
|
* @return 表单注解,仅用于构造器
|
||||||
|
*/
|
||||||
|
FormItem[] form() default {};
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.flyfish.framework.domain.base;
|
package com.flyfish.framework.domain.base;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.flyfish.framework.annotations.Property;
|
import com.flyfish.framework.annotations.Property;
|
||||||
import com.flyfish.framework.domain.po.User;
|
import com.flyfish.framework.domain.po.User;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -45,6 +46,7 @@ public abstract class Domain implements Po, Serializable {
|
|||||||
* 上下文冗余,利用内存缓存上下文
|
* 上下文冗余,利用内存缓存上下文
|
||||||
*/
|
*/
|
||||||
@Transient
|
@Transient
|
||||||
|
@JsonIgnore
|
||||||
@Property(readonly = true)
|
@Property(readonly = true)
|
||||||
private User currentUser;
|
private User currentUser;
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package com.flyfish.framework.beans.meta;
|
package com.flyfish.framework.beans.meta;
|
||||||
|
|
||||||
import com.alibaba.fastjson.annotation.JSONField;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
import com.flyfish.framework.annotations.Properties;
|
import com.flyfish.framework.annotations.Properties;
|
||||||
import com.flyfish.framework.annotations.*;
|
import com.flyfish.framework.annotations.*;
|
||||||
import com.flyfish.framework.beans.enums.ValidationCandidate;
|
import com.flyfish.framework.beans.enums.ValidationCandidate;
|
||||||
@ -48,6 +46,10 @@ public class BeanProperty {
|
|||||||
// 属性标题
|
// 属性标题
|
||||||
private String title;
|
private String title;
|
||||||
|
|
||||||
|
// 旧标题
|
||||||
|
@JsonIgnore
|
||||||
|
private transient String oldTitle;
|
||||||
|
|
||||||
// 描述信息
|
// 描述信息
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
@ -75,6 +77,7 @@ public class BeanProperty {
|
|||||||
private List<BeanValidation> validation;
|
private List<BeanValidation> validation;
|
||||||
|
|
||||||
// 排序变量,用于排序
|
// 排序变量,用于排序
|
||||||
|
@JsonIgnore
|
||||||
private transient int order;
|
private transient int order;
|
||||||
|
|
||||||
// 所属分组,该分组必须在元数据中定义
|
// 所属分组,该分组必须在元数据中定义
|
||||||
@ -112,11 +115,17 @@ public class BeanProperty {
|
|||||||
// 只有存在馆建注解,才会进行初始化
|
// 只有存在馆建注解,才会进行初始化
|
||||||
String parentName = Optional.ofNullable(beanClass.getAnnotation(RestBean.class))
|
String parentName = Optional.ofNullable(beanClass.getAnnotation(RestBean.class))
|
||||||
.map(RestBean::name).orElse("");
|
.map(RestBean::name).orElse("");
|
||||||
property.setTitle(props.inherited() ? parentName + props.title() : props.title());
|
|
||||||
property.setDescription(props.description());
|
property.setDescription(props.description());
|
||||||
property.setReadonly(props.readonly());
|
property.setReadonly(props.readonly());
|
||||||
property.setInherited(props.inherited());
|
property.setInherited(props.inherited());
|
||||||
property.setGroup(props.group());
|
property.setGroup(props.group());
|
||||||
|
// 继承模式,继承名称
|
||||||
|
if (property.inherited) {
|
||||||
|
property.setOldTitle(props.title());
|
||||||
|
property.setTitle(parentName + property.oldTitle);
|
||||||
|
} else {
|
||||||
|
property.setTitle(props.title());
|
||||||
|
}
|
||||||
// 优雅地设置排序
|
// 优雅地设置排序
|
||||||
MergedAnnotation<Order> order = annotations.get(Order.class);
|
MergedAnnotation<Order> order = annotations.get(Order.class);
|
||||||
if (order.isPresent()) {
|
if (order.isPresent()) {
|
||||||
@ -127,15 +136,13 @@ public class BeanProperty {
|
|||||||
// 优雅的设置额外的属性
|
// 优雅的设置额外的属性
|
||||||
MergedAnnotation<FormItem> item = annotations.get(FormItem.class);
|
MergedAnnotation<FormItem> item = annotations.get(FormItem.class);
|
||||||
if (item.isPresent()) {
|
if (item.isPresent()) {
|
||||||
FormItem formItem = item.synthesize();
|
applyFormItem(property, 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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// 优雅的设置联动映射
|
||||||
|
MergedAnnotation<MappedTo> mapping = annotations.get(MappedTo.class);
|
||||||
|
if (mapping.isPresent()) {
|
||||||
|
property.extra.put("mapping", mapping.asMap());
|
||||||
|
MappedTo mappedTo = mapping.synthesize();
|
||||||
}
|
}
|
||||||
// 优雅的处理校验
|
// 优雅的处理校验
|
||||||
property.setValidation(ValidationCandidate.produce(annotations));
|
property.setValidation(ValidationCandidate.produce(annotations));
|
||||||
@ -300,7 +307,11 @@ public class BeanProperty {
|
|||||||
// 存在校验,替换名称文案(仅inherit)
|
// 存在校验,替换名称文案(仅inherit)
|
||||||
if (property.inherited && CollectionUtils.isNotEmpty(property.validation)) {
|
if (property.inherited && CollectionUtils.isNotEmpty(property.validation)) {
|
||||||
property.validation.forEach(validation -> validation.setMessage(validation.getMessage()
|
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();
|
property.title = prop.title();
|
||||||
@ -344,6 +355,23 @@ public class BeanProperty {
|
|||||||
return Optional.empty();
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置当前对象的键值属性
|
* 设置当前对象的键值属性
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user