# 公共属性

# 基础

# ID

ID作为控件的唯一标识符,系统会为每个控件在拖动到画布上的时候##自动产生##。ID在整个页面设计及运行的过程中保持不变,在页面运行过程中,或者代码控制页面的时候,用来寻找控件的最佳的属性。

# Text & Text ID

该项用来定义某个控件的显示标题信息。

Text用于显示标题,Text ID用于显示标题的国际化设定。在实际使用中,两者至少要设定一个,否则控件将没有标题。在同时设定的情况下,ID的优先级将高于Text。如果从ID中无法获取到标题,才会从Text中获取值。

# 主题变量

主题是CSS中定义的一些样式,会影响到控件的显示效果。

Meper会为每个控件提供一些标准的主题,供用户设定。用户也可以自己在CSS中自己书写主题,然后在这里进行设定。

每种控件所有的主题是不一样的,具体可以根据依次点击主题进行查看。

# 布局 & 外观 & 文本 & 图标

由于该部分属性比较常见,与大家常用的office组件的设定一致,所见即所得,并无特别之处,所以这里不再描述。

# 权限

权限主要用于在项目部署的时候,生成对应的按钮权限,所以该属性为按钮独有的。

系统共有两个设置权限的地方,一个是在按钮上,一个是在菜单编辑的地方。通过菜单按钮中“一键生成权限”, 系统会根据菜单的结构,自动扫描所有的页面设计,并生成权限对象,供用户在用户组或者角色中进行配置。

# 代码中如何定义某个组件参与权限管控

1.以按钮为例,平台定义了一个接口 IComponentHasPermission ,当某个组件需要加入权限的时候,首先需要实现此接口

LumosButton

public class LumosButton extends Button implements IHasData , IComponentHasPermission {

    private static final long serialVersionUID = -2034119229329555787L;

    private Object data = null;

    @Override
    public Object getData() {
        return data;
    }

    @Override
    public void setData(Object data) {
        this.data = data;
    }

}

2.另外,当给组件写Render的时候,还是以按钮为例,代码如下:

LumosButton

public class ButtonRender extends WidgetWithPermissionRender implements IInputWidgetRender, IDataLoadableWidgetRender {

    private static final long serialVersionUID = -3834818069891154783L;

    private Button com = new LumosButton();
}

可以看到上述代码中,继承了WidgetWithPermissionRender,WidgetWithPermissionRender的类图如下:

也就是说如下方代码所示,如需要实现权限管控,需要实现getComponentWithPermission()方法注册需要控制权限的组件

WidgetWithPermissionRender

public abstract class WidgetWithPermissionRender extends WidgetRender {

    @Override
    public void applyProperties() {
        super.applyProperties();
        Component component = getComponentWithPermission();
        if (display.getWidgetRunningModel().equals(WidgetRunningModel.RUNNING)) {
            WidgetPropertiesHolder property = widgetData.getProperty(WidgetPropertyNameConstant.BUTTON_PERMISSION);
            if (property != null) {
                String permissionName = (String) property.getValue();
                if (!Strings.isNullOrEmpty(permissionName)) {
                    SecuredInfo securedInfo = new SecuredInfo();
                    securedInfo.setRequiredAuthentication(true);
                    securedInfo.setRequiredPermission(permissionName);
                    component.setVisible(SecuredUtils.isSecure(securedInfo));
                }
            }
        }
    }


    /**
     * 需要控制权限的具体组件
     *
     * @return
     */
    protected abstract Component getComponentWithPermission();
}

# Java代码写的界面如何加入权限

  1. 继承BasePcView 或 BaseMobileView 并添加进二次开发的菜单中
  2. 还是继续沿用@Secured注解(注意:不能有循环依赖的情况)

# 属性扩展

除了内置的属性, 平台也提供了扩展。 如需扩展,创建一个enum并实现IWidgetProperty接口即可。

IWidgetProperty接口定义

public interface IWidgetProperty {

    String getName();

    String getNameKey();

    default ComponentGroup getGroup() {
        return ComponentGroup.EXTEND;
    }

    default int getOrder() {
        return 100;
    }

    String getId();
}

以Mes中的Route添加“是否可读”属性为例:

继承IWidgetProperty:

public enum MesWidgetPropertyNameConstant implements IWidgetProperty {
    ROUTE_WIDGET_READONLY("lumos.designer.basic.type.routegraph.readonly", "Readonly", ComponentGroup.COMPONENT, 1);

    private String name;
    private ComponentGroup group;
    private String nameKey;
    private int order;

    MesWidgetPropertyNameConstant(String nameKey, String name, ComponentGroup group, int order) {
        this.name = name;
        this.nameKey = nameKey;
        this.group = group;
        this.order = order;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String getNameKey() {
        return this.nameKey;
    }

    @Override
    public ComponentGroup getGroup() {
        return this.group;
    }

    @Override
    public int getOrder() {
        return this.order;
    }

    @Override
    public String getId() {
        return name();
    }

}