Redmine Dashboards
Dashboards用你现有的自定义查询直接搭出仪表板 —— 可拖拽的网格里放 KPI 卡片、表格和十五种图表,聚合在 SQL 里完成,并且只统计当前用户有权看到的数据。
多台服务器: $399

- 部件类型
- 23
- 图表变体
- 15
- Redmine
- 4 · 5 · 6 · 7
- 数据库
- MySQL、MariaDB、PostgreSQL
- 核心改动
- 无
拖拽式搭建
可缩放、可重排的网格,一边摆一边自动保存。把 KPI、图表和表格摆到这块板子讲清楚你要讲的事为止 —— 不用改布局文件,也不用刷新页面。
十五种图表
柱状图、条形图、堆叠柱状图、折线图、多折线、面积图、饼图、环形图、雷达图、极坐标、仪表盘、漏斗图、热力图、矩形树图和进度环 —— 由 Apache ECharts 绘制,浅色深色皆可。
把自定义查询画出来
让部件指向一个已保存的查询,它就继承那份筛选条件,自定义字段、关注者和子项目都在内。也可以一键把这个查询变成整块仪表板。
在 SQL 里聚合
GROUP BY、COUNT、SUM 和 AVG 都在数据库里执行,十万条问题是被统计而不是被实例化。结果按用户、部件和当前筛选条件缓存。
按观看者裁剪
每一次读取都从 Issue.visible(user)、TimeEntry.visible(user) 和 Query.visible(user) 出发,因此任何图表都不可能汇总出一个观看者并非成员的项目。
筛选、刷新与下钻
一条筛选栏即可重置整块板子,每块仪表板可设自己的刷新间隔以适合挂在墙上,而每根柱子、每块扇形和每个单元格都能点进背后的问题列表。
看它在 Redmine 里运行
这里的每张截图都来自一个标准的 Redmine 6 安装,插件直接放进 plugins/ 即可。仪表板就在 Redmine 自己的页头和菜单之下,因为它本来就运行在那里。
搭建一块板


部件


共享与切换


查询本身就是报表
这里不会要求你把数据再描述一遍。像平时那样筛选问题列表并保存,这个已保存的查询就成为部件聚合的范围 —— 正是 Redmine 渲染该列表时所用的同一个关系。
| 步骤 | 你要做的 | 你得到的 |
|---|---|---|
| 1. 保存查询 | 照常筛选问题列表 —— 自定义字段、关注者、子项目 —— 然后点击保存 | 一个命名查询,对你共享过的人可见 |
| 2. 让部件指向它 | 在部件对话框里选择该查询 | 数据源和一个合理的默认分组,系统替你推导 |
| 3. 或者直接生成整块板 | 点击「从查询生成」 | 一块绑定该查询的仪表板,KPI 卡片和图表一次请求全部生成 |
用下拉框配置,而不是写 SQL
一个部件由数据源、维度、度量和聚合方式组成。可按状态、优先级、跟踪标签、指派人,或任意日期字段按天、周、月、年分桶来分组问题;统计条数、求和预估工时,或取完成度的平均值。团队里没人需要为了一张图去写 SQL —— 而既然没有 SQL 可写,也就不存在能越过阅读者权限的查询。

一张表单,配置所有部件
无论是 KPI、柱状图还是环形图,每个部件都用同一张简短的表单配置:标题和类型、数据源、用于筛选的可选已保存查询、度量,以及带 Top-N 的分组。切换类型,表单随之调整。




管理员只需一个设置页
在 管理 › 插件 › Redmine Charts 中,可以设置按用户的结果缓存、缓存 TTL(5–86400 秒,默认 300)、默认的浅色或深色主题,以及默认自动刷新间隔(0 表示关闭)。这个页面就是 Redmine 自己的插件设置页。
23 种部件类型,也给你自己的留了位置
每种类型都是注册表里的元数据,配置界面依据部件自身的声明自动生成,而不是为每张图手写一个表单。
| 类别 | 类型 | 配置方式 |
|---|---|---|
| 图表 | 柱状图、条形图、堆叠柱状图、折线图、多折线、面积图、饼图、环形图、雷达图、极坐标、仪表盘、漏斗图、热力图、矩形树图、进度环 | 数据源、维度、度量、聚合 |
| KPI / 数字 | 一个带独立筛选条件的聚合数值 | count · sum · avg · min · max |
| 表格 | 基于同一份受权限约束数据的分页表格 | 列选择器与筛选条件 |
| 内容 | Markdown、备注、HTML、iframe、动态订阅、最近问题 | 自由文本,或 Redmine 自带的订阅源 |
由 Apache ECharts 绘制
十五种变体,为浅色和深色分别设计,尺寸变化时重绘,挂在墙上的大屏也依然清晰。安装包内已附带编译好的前端产物,因此安装既不需要 Node,也不需要构建步骤。
每一段都能下钻
点击一根柱子、一块扇形或热力图的一个格子,就会打开按这些问题精确筛选后的 Redmine 问题列表。数字始终可核对,因为你随时能落到它背后的那些行上。
全局筛选与自动刷新
一条筛选栏同时重置整块板上的所有部件,每块仪表板可设自己的刷新间隔,让走廊里的屏幕保持最新。设为零即关闭刷新。
模板与蓝图
把一块板存成可复用的模板、按团队复制,或导出为 JSON 蓝图再导入另一个实例 —— 从预发布到生产,不必手工重搭一遍。
一个插件,每个团队都有自己的板
交付负责人、支持团队和一位独立开发者,各自用手头已有的已保存查询,几分钟就搭好了这些仪表板。





内置两个数据源,你的可以并排放
问题和工时都自带已注册好的维度与度量,二者都在 Redmine 自己的可见性范围之后。另一个插件添加的数据源会得到完全相同的待遇。
| 数据源 | 维度 | 度量 |
|---|---|---|
| 问题 | 状态、优先级、跟踪标签、项目、指派人、作者、类别、版本、创建时间、更新时间、完成日期 | 问题数、预估工时、完成度 |
| 工时 | 项目、用户、活动、日期 | 小时数、记录条数 |
| 你自己的 | 你注册什么就是什么 | 你注册什么就是什么 |
扩展靠注册,而不是打补丁
一个数据源就是一个类:有名称、维度、度量,以及一个受权限约束的 base_scope;一种部件类型则是一个 hash。在你自己插件的 init.rb 里用 RedmineCharts.register_data_source 或 register_widget_type 注册,它会立刻出现在配置界面里,并继承筛选、缓存和下钻。为此不需要改动本插件的任何代码。
看不到的数据,谁也聚合不出来
仪表板是让数字外泄的一条捷径,所以每次读取都从观看者自身的可见范围出发,而不是在最后补一次检查。
先可见性,后分组
Issue.visible(user)、TimeEntry.visible(user) 和 Query.visible(user) 会在统计任何一行之前就约束好关系。来自你并非成员的项目的合计,不可能出现在任何部件里,因为那些行从来就不在集合中。
四项细粒度权限
查看仪表板、创建仪表板、管理全部仪表板、管理模板 —— 每一项都可按角色分配。而且在有人为该项目启用「仪表板」模块之前,一切都处于关闭状态。
共享走成员关系
可以把一块板授予用户、用户组、角色或整个项目。每次请求都会通过 Redmine 自己的成员关系重新判定 viewable_by? 与 editable_by?,而不是依赖一份迟早会走样的平行权限表。
数据不出服务器
前端只与你自己 Redmine 上本插件的 JSON 接口通信,用的是已有的会话和 CSRF 令牌。没有外部服务,没有许可证回调,没有遥测。
为大型实例而造
统计十万条问题,不应该意味着加载十万个对象。在这里确实不需要。
| 关注点 | 处理方式 |
|---|---|
| 聚合 | GROUP BY、COUNT、SUM 和 AVG 都在 SQL 中执行 —— 绝不会仅仅为了计数而实例化数据行 |
| 取值极多的维度 | 当一个维度有成千上万个取值时,Top-N 折叠让返回结果保持精简 |
| 重复查看 | 结果通过 Rails.cache 按用户、部件修改时间和当前筛选条件缓存;TTL 是一项设置,Redis 可直接使用 |
| 某个部件很慢 | 各部件独立加载,一条重查询不会拖住整块板 |
| 前端产物缺失 | Rails 会在服务端渲染每个部件的数据作为兜底,页面只会降级,而不会变成一片空白 |
可移植是设计出来的,不是碰巧
跨版本、跨数据库的支持是从设计之初就考虑的 —— 迁移、JSON 存储和日期分桶,都是为了经受住这些差异而写的。
| 关注点 | 支持范围 | 实现方式 |
|---|---|---|
| Redmine | 4.x、5.x、6.x、7.x | 声明 requires_redmine version_or_higher 4.0.0,且没有任何会随版本过时的核心覆盖 |
| Rails | 5.2 → 8.0 | 迁移以 5.2 为基线,直到 8.0 的每个版本都能理解 |
| Ruby | 2.5+ | 与 Redmine 4 的最低要求一致 |
| 数据库 | MySQL、MariaDB、PostgreSQL | JSON 存放在普通 text 列中 —— 各处 DDL 完全相同 —— 序列化器会按 Rails 版本选择正确的写法 |
| 日期分组 | 天、周、月、年 | 先按可移植的 CAST(col AS DATE) 分组,再在 Ruby 中折叠成分桶 —— 没有任何厂商专用 SQL |
| 重复执行迁移 | 安全 | 以防御方式编写,升级中断后可以重跑 |
第一天就能脚本化
所有接口都在 /redmine_charts/api 之下,返回 JSON,并执行与界面完全一致的权限 —— 因此仪表板可以从 CI 里创建,也可以按团队批量生成。
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /dashboards | 调用者可见的全部仪表板 |
| POST | /dashboards | 创建一块仪表板 |
| GET | /dashboards/:id | 获取一块仪表板及其部件 |
| PATCH | /dashboards/:id | 修改名称、布局或设置 |
| POST | /dashboards/:id/duplicate | 克隆,连同部件一起 |
| GET | /dashboards/:id/export | 导出 JSON 蓝图 |
| POST | /dashboards/import | 由蓝图创建一块仪表板 |
| POST | /dashboards/:id/widgets | 添加一个部件 |
| GET | /widgets/:id/data | 聚合后的、受权限约束的部件数据 |
| GET | /meta/data_sources | 数据源、维度、度量以及可用的已保存查询 |
今天已经交付的,以及接下来的
路线图上的内容在设计上都是增量的 —— 新的数据源、部件类型和导出服务 —— 因此没有一项会要求你迁移任何东西。它们被列为路线图而非功能,让你按今天盒子里真正有的东西来决定是否购买。
| 能力 | 状态 |
|---|---|
| 仪表板:创建、复制、设为默认、导出和导入 | 已上线 |
| 可拖拽、可调整大小的网格,自动保存 | 已上线 |
| KPI、表格以及完整的 ECharts 图表集 | 已上线 |
| 可视化、无需 SQL 的部件配置 | 已上线 |
| 复用已保存查询,一键生成整块板 | 已上线 |
| 刷新整块板的全局筛选 | 已上线 |
| 从图表下钻到问题列表 | 已上线 |
| 按用户、受权限约束的 SQL 聚合与缓存 | 已上线 |
| 共享、模板、浅色与深色主题 | 已上线 |
| 跨版本、跨数据库、服务端兜底渲染 | 已上线 |
| PDF、PNG 和 Excel 导出 | 计划中 |
| 用于超重报表的后台任务 | 计划中 |
| 基于 WebSocket 的实时更新 | 计划中 |
| 定时生成并邮件发送快照 | 计划中 |
| 看板大屏模式 | 计划中 |
| AI 自然语言报表生成器 | 计划中 |
| 日历、燃尽图和甘特摘要部件 | 计划中 |
三步完成安装
需要 shell 访问权限并能执行 rake 任务。安装插件前请务必备份。
cd /path/to/redmine # unzip the package from your email or download link unzip redmine_charts-1.0.0.zip -d plugins/ bundle install
bundle exec rake redmine:plugins:migrate NAME=redmine_charts RAILS_ENV=production # optional: the built-in dashboard templates bundle exec rake redmine_charts:seed_templates RAILS_ENV=production touch tmp/restart.txt
# Project → Settings → Modules → Charts & Dashboards # then grant the dashboard permissions to the roles that need them # a Dashboards entry appears in the top menu for anyone who holds one