Team 报表系统定制——基于 Redash 的二次开发


简介

Redash 是团队查询,可视化和协作的一款开源 BI 工具,提供了基于 web 的数据库查询和数据可视化功能。

Redash 基于 Python 和 AngularJS 编写,使用 Flask web 框架,可快速轻便的访问大量数据。支持多种数据来源,包括:Redshift, Google BigQuery, PostgreSQL, MySQL, Graphite, Presto, Google Spreadsheets, Cloudera Impala, Hive等等。

在数据运维人员的日常工作中,常会遇到需要将数据库中的数据查询并展示出来的问题,可能总是需要让前端开发人员来做 web 页面帮助完成这些需求。Redash 提供了这么一种简单便捷的方式将这些工作标准化:在 web 页面上输入 sql 语句,使用查询返回的结果构造数据可视化图表,用户可以将这些图表结果拖动构造成自己需要的数据面板,在很大程度上可以缓解数据运维人员对前端开发人员的需求。

  • Redash 由两部分组成:
    • 查询编辑器:用于保存和在组织内分享查询语句;
    • 控制面板/可视化工具: 提供了多种图表可视化和组织方式来构造自己的控制面板。

升级 Redash 分享 Dashboard 的机制

  • 现在 Redash 的分享机制:
    • 为每个对象生成一个 ApiKey,分享该对象时由它的 ApiKey 构成一个 public url,被分享的用户通过该链接查看。
  • 升级后的分享机制:
    • 管理员和 Dashboard 的创建者可以管理分享的用户,定向的分享而不是分享给所有用户(包括未登录用户)。
    • 被分享的用户登录后可以在 Dashboard List 以及主页看到分享的 Dashboard。
    • 根据不同用户的权限的不同,可以对 Dashboard 做不同的操作。
    • 没有数据库权限的用户也可以对 Dashboard 中的 Query Result 做刷新、下载操作。

安装

  1. Install Docker, Docker Compose and Node.js
  2. 下载源码

在 Docker 上启 redash 后端服务

在 redash 目录里运行 :

  • 产品版

    $ docker-compose -f docker-compose.production.yml run --rm server create_db
    # create tables
    $ docker-compose -f docker-compose.production.yml up
    

    访问 ip:80

  • 开发版

    $ docker-compose run --rm server create_db
    # create tables
    $ docker-compose up
    

    访问网址 ip:5000

启 redash 前端服务:

$ npm install
$ npm run build
$ npm run start

如果要启开发版:
将 package.json 中的 build 那行改为:

"build": "rm -rf ./client/dist/ && NODE_ENV=development node node_modules/.bin/webpack"

如果报错:

  • Module build failed: TypeError: Cannot read property 'length' of undefined
    at Traverser.traverse (/Users/lingling/repos/redash/node_modules/estraverse/estraverse.js:411:37)
    ...
    
    问题可能出在 estraverse 的版本上:
    $ npm install --upgrade estraverse
    
  • Module build failed: TypeError: loaderUtils.getOptions is not a function
    
    可以通过在 package.json 中加以下语句来解决:
    "loader-utils": "^1.0.2"
    

Models

梳理了一下 redash 的表结构(线条太杂就失去了梳理的初衷,所以省略了一些箭头)。

Team 报表系统定制——基于 Redash 的二次开发_第1张图片
models

Redash 源码中数据库工具使用 SQLAlchemy,数据库使用 PostgreSQL。


后端实现

  • models
    • 为每个对象的每个分享用户生成一个 ApiKey:在 ApiKey 中加上 ForeignKey owner_id,代表该 ApiKey 的 owner user
  • permission
    • 在每次判权时加入被分享的人也可见的条件:通过 ApiKey 确定是否被分享
  • 增加 api
    • 通过 Dashboard name 查找该 Dashboard 的分享成员列表的 api
    • 通过 Query id,Dashboard id 下载 Query result 文件的 api
    • 通过 Query result id,Dashboard id 查找 Query result 的 api
    • 通过 Dashboard id 重跑 Query 得到 Query result 的 api
    • 通过 Dashboard id,User id 获取 Dashboard 的 api
    • 通过 Dashboard id,User id 将 Dashboard 分享给 User 的 api

前端实现

  • 增加 service
    • dashboard-query-result.js(仿照原有的 query-result.js 写,增加 dashboard_id 参数)
    • dashboard-share.js(调用通过 Dashboard name 查找该 Dashboard 的分享成员列表的 api)
    • 在 query.js 中仿照 Query.prototype.getQueryResult 增加 Query.prototype.getDashboardQueryResult(增加 dashboard_id 参数)
  • 修改 page
    • 修改 share-dashboard 的 dialog 页面
    • 在 ShareDashboardComponent 增加 share-dashboard 的 dialog 页面所需函数
    • 将 Dashboard 的所有页面中调用 query-result.js 中的 service,改为调用 dashboard-query-result.js 中的 service


先挖坑,以后再慢慢补充



参考资料:

  • https://www.oschina.net/p/redash

你可能感兴趣的:(Team 报表系统定制——基于 Redash 的二次开发)