当前位置:   article > 正文

superset设置查看权限_如何为Superset 添加一个自定义组件

superset定义查询条件
本文所有代码和配置是基于superset Version 0.36.0

配置本地环境

首先从 Superset Github clone 代码到本地,并切换到0.36.0 分支

  1. # clone repo
  2. git clone https://github.com/apache/incubator-superset.git
  3. # checkout release 0.36.0
  4. cd incubator-superset
  5. git checkout tags/0.36.0

提前需要装好python 3.7,建议使用pyenv,不要用mac的system python

  1. brew install pyenv
  2. pyenv install 3.7.0
  3. // 在当前superset目录下,设置python版本为3.7.0,
  4. pyenv local 3.7.0

之后在根目录下 CONTIBUTING.md, 找到 Setup Local Environment for Development

根据文档,分别把后台和前端run起来

  1. 后台flask server
  1. # 安装各种依赖
  2. pip install -r requirements.txt
  3. pip install -r requirements-dev.txt
  4. pip install -e .
  5. # 创建admin用户,记得记住用户名密码,之后要登陆
  6. superset fab create-admin
  7. # 脚本初始化和迁移数据库
  8. superset db upgrade
  9. # 脚本初始化用户和组的权限
  10. superset init
  11. # 脚本加载默认的图表和面板
  12. superset load_examples
  13. # run flask server
  14. FLASK_ENV=development superset run -p 8088 --with-threads --reload --debugger

成功以后,后台会在 http://localhost:8088 运行

2. 前端

  1. cd superset-frontend
  2. # 使用package.lock 安装依赖
  3. npm ci
  4. # run dev server
  5. npm run dev-server

打开 http://localhost:9000,界面如下

cabc5235ccb35d029d5f3fccacf39766.png

如果能看到页面,说明前后台的环境都配置好了。就可以开始添加自定义图表了。

添加自定义图表

394576f33c7315b188674e7c5ccafd1e.png

首先打开一个常规的创建/编辑 图表页面,左侧为 控制面板,右侧为图表。不同的图表的配置面板会有差异。

所以要添加一个自定义图表,主要有三步

  1. 【前端】添加自定义图表的面板 Data Tab
  2. 【前端】添加自定义图表以及面板的 Customize Tab
  3. 【后台】添加后台接口返回正确的数据给前端渲染。

1. 添加自定义图表的控制面板 Data Tab

控制面板主要分为两个部分

  1. Data 控制输出给图表的数据,做一些聚合,排序,计算的操作
  2. Customize 自定义,针对图表进行主题颜色替换,以及相关的显示配置,如表格是否分页,以及每页显示几条,以及是否添加搜索框

所以如果添加一个自定义图表,前端需要添加一个自定义的图表,以及图表对应的控制面板。

例如,我需要添加一个echarts的雷达图,这个在superset中没有类似的实现。

经过分析和对比,发现现在superset的pie chart的数据结构跟雷达图类似,那么可以把复用Pie Chart的控制面板的配置文件。

在 superset-frontend/src/explore/components/controls/index.js 这个文件中有所有的控制面板的组件,例如 MetricsControl 对应的就是页面中的Metric下拉框。如果你需要添加自定义的控制组件,可以在这里添加。

找到Pie Chart的控制面板配置文件, superset-frontend/src/explore/controlPanels/Pie.js

  1. import { t } from '@superset-ui/translation';
  2. export default {
  3. controlPanelSections: [
  4. // label对应的是每个section的标题
  5. // expand对应的是改section是否可以被展开
  6. // controlSetRows 定义的是每一行有几个组件,metric,adhoc_filters对应的是组件的key
  7. // 可以在superset-frontend/src/explore/controls.jsx
  8. // 中通过这些key找到对应的配置
  9. {
  10. label: t('Query'),
  11. expanded: true,
  12. controlSetRows: [
  13. ['metric'],
  14. ['adhoc_filters'],
  15. ['groupby'],
  16. ['row_limit'],
  17. ],
  18. },
  19. {
  20. label: t('Chart Options'),
  21. expanded: true,
  22. controlSetRows: [
  23. ['pie_label_type', 'number_format'],
  24. ['donut', 'show_legend'],
  25. ['show_labels', 'labels_outside'],
  26. ['color_scheme', 'label_colors'],
  27. ],
  28. },
  29. ],
  30. controlOverrides: {
  31. row_limit: {
  32. default: 25,
  33. },
  34. number_format: {
  35. description:
  36. t('D3 format syntax: https://github.com/d3/d3-format') +
  37. ' ' +
  38. t('Only applies when the "Label Type" is not set to a percentage.'),
  39. },
  40. },
  41. };

在controlPanelSections中,controlSetRows对应的是配置面板中的layout以及对应的组件,例如,metric在superset-frontend/src/explore/controls.jsx的值为

  1. const metrics = {
  2. type: 'MetricsControl',
  3. multi: true,
  4. label: t('Metrics'),
  5. validators: [v.nonEmpty],
  6. default: c => {
  7. const metric = mainMetric(c.savedMetrics);
  8. return metric ? [metric] : null;
  9. },
  10. mapStateToProps: state => {
  11. const datasource = state.datasource;
  12. return {
  13. columns: datasource ? datasource.columns : [],
  14. savedMetrics: datasource ? datasource.metrics : [],
  15. datasourceType: datasource && datasource.type,
  16. };
  17. },
  18. description: t('One or many metrics to display'),
  19. };
  20. // label 为该组件显示在控制面板的名称
  21. // type 为对应的UI组件
  22. const metric = {
  23. ...metrics,
  24. multi: false,
  25. label: t('Metric'),
  26. description: t('Metric'),
  27. default: props => mainMetric(props.savedMetrics),
  28. };

这里metric对应的type是 MetricsControl

可以在superset-frontend/src/explore/components/controls/index.js中找到MetricsControl对应的UI组件为 superset-frontend/src/explore/components/controls/MetricsControl.jsx

这样控制面板就通过superset-frontend/src/explore/controlPanels文件夹下面的js文件,对不同类型的图表进行配置。

那么现在来添加自定义雷达图的控制面板

  1. 在这个目录 superset-frontend/src/explore/controlPanels 下创建一个新的文件 CustomTable.js, 为了防止以后superset也会支持雷达图,加了一个前缀custom防止重名。此处我直接复制Pie.js,重命名为CustomTable.js
  2. 在superset-frontend/src/setup/setupPlugins.ts 注册一下新的控制面板配置,代码如下
  1. // ... 此处省略
  2. import { getChartControlPanelRegistry } from '@superset-ui/chart';
  3. import MainPreset from '../visualizations/presets/MainPreset';
  4. import setupPluginsExtra from './setupPluginsExtra';
  5. import Area from '../explore/controlPanels/Area';
  6. // ... 此处省略
  7. // 引入自定义的控制面板配置
  8. import CustomTable from '../explore/controlPanels/CustomTable';
  9. export default function setupPlugins() {
  10. new MainPreset().register();
  11. // TODO: Remove these shims once the control panel configs are moved into the plugin package.
  12. getChartControlPanelRegistry()
  13. .registerValue('area', Area)
  14. // ... 此处省略
  15. // 注册控制面板,custom_table就是我将要引入的图表的key
  16. // 那么如果图表的key是custom_table的时候,
  17. // 页面会使用CustomRader这个配置来显示控制面板
  18. .registerValue('custom_radar', CustomRader);
  19. setupPluginsExtra();
  20. }

那么控制面板就添加好了,接下来添加雷达图

2. 添加自定义图表

  1. 在superset-frontend/src/visualizations底下新建目录 CustomRadar

也可以复制Pie Chart的目录以及文件格式,Pie Chart的实现在另一个repo

打开Pie Chart的目录

55d1402b14f3982b7559206cf11c2aba.png
  • images对应的是Pie Chart的图标,包括一大一小
  • controPanel.ts 对应的是控制面板的Customize Tab,就是自定义配置,因为每个图表的自定义配置差别比较大,所以跟图表放在了一起。
  • index.js 对应的是图表具体的实现

在 superset-frontend/src/visualizations/presets/MainPreset.js 中注册新的图表

  1. import { Preset } from '@superset-ui/core';
  2. // ...
  3. import {
  4. AreaChartPlugin,
  5. // ...
  6. } from '@superset-ui/legacy-preset-chart-nvd3';
  7. // 引入自定义图表
  8. import CustomRadar from '自定义组件的目录/custom-radar';
  9. export default class MainPreset extends Preset {
  10. constructor() {
  11. super({
  12. name: 'Legacy charts',
  13. presets: [new DeckGLChartPreset()],
  14. plugins: [
  15. new AreaChartPlugin().configure({ key: 'area' }),
  16. // ...
  17. // 注册自定义图表
  18. new CustomRadar().configure({ key: 'custom-radar' }),
  19. ],
  20. });
  21. }
  22. }

注册完以后,可以参照其他的plugin的实现来实现自定义的图表。

3. 添加对应接口

添加完自定义图表和控制面板以后,还需要配置相应的接口来拿取数据,打开python文件

superset/viz.py​github.com

里面包含了所有图表获取数据的接口,所有接口的实现都需要继承BaseViz,BaseViz的具体实现可以查看链接,例如Pie图表,定义了viz_type, verbose_name, credits, is_timeseries, 这些参数是每个图表都需要定义的。之后实现get_data这个方法就可以了。df 参数为pandas的dataFrame数据。可以对这个数据进操作之后返回。

其实BaseViz里面实现的get_json调用了get_payload,之后才调用了get_data。所以继承了BaseViz以后只需要重写get data方法就可以了。

  1. // ...
  2. class DistributionPieViz(NVD3Viz):
  3. """Annoy visualization snobs with this controversial pie chart"""
  4. viz_type = "pie"
  5. verbose_name = _("Distribution - NVD3 - Pie Chart")
  6. is_timeseries = False
  7. def get_data(self, df: pd.DataFrame) -> VizData:
  8. if df.empty:
  9. return None
  10. metric = self.metric_labels[0]
  11. df = df.pivot_table(index=self.groupby, values=[metric])
  12. df.sort_values(by=metric, ascending=False, inplace=True)
  13. df = df.reset_index()
  14. df.columns = ["x", "y"]
  15. return df.to_dict(orient="records")
  16. // ...
  17. viz_types = {
  18. o.viz_type: o
  19. for o in globals().values()
  20. if (
  21. inspect.isclass(o)
  22. and issubclass(o, BaseViz)
  23. and o.viz_type not in config["VIZ_TYPE_BLACKLIST"]
  24. )
  25. }

之后重启后台和前端就能使用自定义的图表了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/542474
推荐阅读
相关标签
  

闽ICP备14008679号