supersetDashboard superset 仪表盘

此组件需要安装免费的 Superset 扩展组件。

supersetDashboard 可以在应用程序视图中嵌入 Apache Superset 配置的仪表盘。

XML 元素

dashboard

Java 类

SupersetDashboard

基本用法

在视图的 XML 中声明 superset 命名空间:

<view xmlns="http://jmix.io/schema/flowui/view"
      xmlns:superset="http://jmix.io/schema/superset/ui"
      title="msg://dashboardView.title">

当使用顶部操作面板中的 Add Component 操作添加组件时,Studio 会自动添加该命名空间。请参见 组件面板。

然后将 supersetDashboard 添加到视图,并指定 id、大小以及从 Apache Superset 获取的 embeddedId:

<superset:dashboard id="dashboard" width="100%" height="100%"
                    embeddedId="b6f53731-1da2-4768-b545-fff4fd2659c6"/>

此外,还可以将组件注入控制器以编程方式交互:

@ViewComponent
private SupersetDashboard dashboard;

@Subscribe
public void onInit(final InitEvent event) {
    dashboard.setEmbeddedId("1aec5c74-f143-4051-818b-fcf9d77c8501");
}

数据集约束

Superset 中的仪表盘可以包含多个图表,显示来自不同数据集的数据。SupersetDashboard 组件可以对这些数据集设置约束。约束可以在组件的 XML 元素中静态定义,也可以在运行时动态计算。

如需使用约束,先定义数据集的 ID,再编写一个原生 SQL 条件,该条件将追加到数据集查询的 WHERE 子句中。

无法直观地从 Superset UI 中找到数据集 ID。当从数据集列表打开数据集时,可以从地址栏显示的 URL 的 datasource_id 参数中获取。

静态约束

考虑在 superset 入门 部分创建的 Employees' salaries 仪表盘中使用静态数据集约束。它使用的数据集加载员工、部门和薪资。假设需要限制薪资的下限,例如薪资 80,000 及以上员工。

约束在 dashboard 组件的 datasetConstraint 内部元素定义。可以在 Studio 中通过组件的 Add 操作添加,也可以在 XML 中手动添加。

所需的约束定义如下所示:

<superset:dashboard id="dashboard"
                    width="100%"
                    height="100%"
                    embeddedId="940f36ff-6c97-4a35-a4ff-4e4aeee3a9c7">
    <superset:datasetConstraints>
        <superset:datasetConstraint datasetId="24">
            <![CDATA[salary >= 80000]]>
        </superset:datasetConstraint>
    </superset:datasetConstraints>
</superset:dashboard>

这里的 salary 是数据集的列。

约束 provider

数据集约束还可以在运行时动态计算,并在 Jmix 应用中打开仪表盘时传递给 Superset。通过这种方式可以根据当前用户权限或其他条件过滤仪表盘数据。

数据集约束由 DatasetConstraint Java 类表示。可以通过下列方式为 SupersetDashboard 组件提供约束列表:

  • 在视图中创建 datasetConstraintsProvider 处理器并返回约束列表。

  • 创建一个实现 DatasetConstraintsProvider 接口的 Spring bean,并使用 setDatasetConstraintsProvider() 方法将其传递给组件。

假设现在有一个需求:部门经理只能查看自己部门的薪资信息。数据集约束可以使用分配给当前用户的行级角色。

在下面的示例中,使用第一种方法,在视图中定义 datasetConstraintsProvider 处理器,但逻辑被提取到 Spring bean 中:

package com.company.supersetsample.app;

import com.company.supersetsample.entity.Department;
import com.company.supersetsample.entity.User;
import com.company.supersetsample.security.DepartmentConstraintRole;
import io.jmix.core.security.CurrentAuthentication;
import io.jmix.security.SecurityProperties;
import io.jmix.supersetflowui.component.dataconstraint.DatasetConstraint;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class DepartmentDatasetConstraintProvider {

    private final CurrentAuthentication currentAuthentication;
    private final SecurityProperties securityProperties;

    public DepartmentDatasetConstraintProvider(CurrentAuthentication currentAuthentication,
                                               SecurityProperties securityProperties) {
        this.currentAuthentication = currentAuthentication;
        this.securityProperties = securityProperties;
    }

    public List<DatasetConstraint> getConstraints() {
        Department department = getDepartment();
        if (hasDepartmentConstraintRole() && department != null) {
            return List.of(new DatasetConstraint(24, "department_name = '" + department.getName() + "'"));
        }
        return List.of();
    }

    private boolean hasDepartmentConstraintRole() {
        Authentication authentication = currentAuthentication.getAuthentication();
        return authentication.getAuthorities().stream()
                .anyMatch(grantedAuthority ->
                        grantedAuthority.getAuthority().equals(
                                securityProperties.getDefaultRowLevelRolePrefix() + DepartmentConstraintRole.CODE));
    }

    private Department getDepartment() {
        User user = (User) currentAuthentication.getUser();
        return user.getDepartment();
    }
}

然后在视图的 datasetConstraintsProvider 处理器中使用上面定义的 bean,该处理器 方法可以通过 Jmix UI 组件属性面板生成:

@Autowired
private DepartmentDatasetConstraintProvider departmentDatasetConstraintProvider;

@Install(to = "dashboard", subject = "datasetConstraintsProvider")
private List<DatasetConstraint> dashboardDatasetConstraintsProvider() {
    return departmentDatasetConstraintProvider.getConstraints();
}

XML 属性

下面是 dashboard 的特殊属性:

名称 描述 默认值

chartControlsVisible

设置图表控件是否可见。

chart controls example

false

embeddedId

设置 Superset 的嵌入式仪表盘 ID。请参见 创建仪表盘。

获取访客令牌和加载仪表盘需要该 ID。如果更改会重新加载仪表盘;没有配置 ID 时,组件会显示一个占位图像。

按照 嵌入式仪表盘 中的说明启用 EMBEDDED_SUPERSET 标志。

—

filtersExpanded

设置过滤器栏是否展开。

false

titleVisible

设置标题栏是否可见。

title visible example

false

下面是 dashboard 支持的其他通用属性:

事件和处理器

下面是 dashboard 的特殊事件和处理器:

在 Jmix Studio 生成处理器桩代码时,可以使用 Jmix UI 组件面板的 Handlers 标签页或者视图类顶部面板的 Generate Handler 添加,也可以通过 Code → Generate 菜单(Alt+Insert / Cmd+N)生成。

名称 描述

datasetConstraintsProvider

当仪表盘请求访客令牌时动态提供数据集约束。请参见 约束 provider。

下面是 dashboard 支持的其他通用事件:

元素

一个 dashboard 可以包含 datasetConstraints 元素,其中包含零个或多个 datasetConstraint 元素。每个 datasetConstraint 需要一个 datasetId 属性,并将其中的文本内容作为 SQL 条件。请参见 静态数据集约束。