跳到主内容

手撸开源报表工具本地部署:我从一台空服务器到第一张报表的全过程

先说结论:这套开源报表能不能本地跑起来

能,而且比想象中快——前提是别在版本上自作主张。我照着官方流程从零走了一遍积木报表(JimuReport)的本地部署:引依赖、执行初始化 SQL、放权、起服务,一路下来十几分钟能看到报表工作台。真正把我卡住的不是某条命令,而是版本不匹配带来的验签失败。这也是我写这篇的原因。

先把话说在前面:下面每一条命令、每一个版本号,都来自官方文档和仓库说明,不是我凭印象写的。开源项目迭代很快,你动手前请再核一遍官方快速集成文档,一切以仓库最新说明为准。

为什么非要本地部署?站里那篇讲舆情监测的文章有句话说得很实在:如果客户是金融机构、有数据不得离境的硬要求,这一点几乎没得选(微博指数做品牌舆情监测踩坑实录)。报表系统天天连着业务库,把表结构和明细数据推到别人的云上,很多团队过不了合规评审这一关。这是本地部署最硬的理由,比"省钱"硬得多。

准备:环境与前置条件,先把这三样钉死

官方仓库的 jimureport-example 模块把环境要求写得很清楚,我照着对了一遍自己的机器:

  • JDK 17 及以上——注意这是针对官方示例工程的,它的架构已经是 Spring Boot 4。你要是还在 Spring Boot 2 上,要求不一样,去文档里对号入座,别想当然。
  • MySQL 5.7+——初始化脚本叫 jimureport.mysql5.7.create.sql,名字里就带着版本号,执行时会自动创建 jimureport 这个库。
  • Redis——官方标的是"可选"。我的建议是先把 Redis 摘掉跑通,跑通了再加,少一个变量就少一处排查成本。

项目配置文件在 src/main/resources/application-dev.yml,数据源地址、端口都改这里。

版本不匹配这个坑,站里讲运行库那篇说得比我透彻:电脑里没有对应版本的运行库,依赖它的程序就表现为报错或闪退(常见问题 - Visual C++ 运行库)。Java 生态里同一个道理,只是报错信息换成了验签失败和数据源连不上,更绕。

不想碰 Maven 的话,官方还有 Docker 快速运行和绿色免安装版两条路。想先看效果再决定要不要集成,走这两条更划算。

步骤一:依赖与版本,别让一次签名升级坑到你

这是整篇文章最该划重点的一段。官方仓库 README 顶部直接挂了一条警告:

v2.5.4 签名机制有重大变更,以下模块必须同步升级:积木报表 2.5.4 + 积木BI大屏/仪表盘 2.5.4 + 积木问数 JimuChatBI 1.2.0。三者签名与加密方案同源,版本不匹配会出现验签失败、数据源连不上等问题。

我第一次就是只升了报表没升 BI,工作台能进,一保存图表就报验签错,日志还不含"版本"两个字,查了小半天。

Maven 依赖按你的 Spring Boot 版本选一个(版本号以官方最新为准):

<!-- Spring Boot 3 -->
<dependency>
  <groupId>org.jeecgframework.jimureport</groupId>
  <artifactId>jimureport-spring-boot3-starter</artifactId>
  <version>2.5.4</version>
</dependency>

<!-- Spring Boot 2 -->
<artifactId>jimureport-spring-boot-starter</artifactId>

<!-- Spring Boot 4 -->
<artifactId>jimureport-spring-boot4-starter</artifactId>

还有两个按需引入的增量包:jimureport-nosql-starter(Mongo、Redis 和文件数据集支持)、jimureport-echarts-starter(后台导出接口导出 ECharts 图表)。不需要就别引,依赖越少越省心。源码仓库在 github.com/jeecgboot/JimuReport,集成细节以它为准。

步骤二:初始化数据库与放权,这两步最容易漏

数据库这一步没有捷径:手工执行 db/jimureport.mysql5.7.create.sql。脚本会自己建库,你只要确认连的那个 MySQL 账号有建库权限。

放权才是真正常漏的一步。积木报表自带权限控制,所以你必须把自己项目框架对它的拦截放开,否则表现是登录进去一片空白或者反复跳登录页,很难一眼看出是拦截器的问题。官方给的是 Shiro 的写法:

// 积木报表排除
filterChainDefinitionMap.put("/jmreport/**", "anon");
// 积木仪表盘排除
filterChainDefinitionMap.put("/drag/**", "anon");
filterChainDefinitionMap.put("/jimubi/**", "anon");

用 Spring Security 的同理,把这三个前缀加进白名单就行。

再往下是"对接"这一步,也是很多人以为装完就完事、结果卡死的地方:报表要跟你自己的用户体系打通,得实现官方的扩展接口 JmReportTokenServiceI(仪表盘是 IOnlDragExternalService),用来接登录 token、操作权限、角色权限和字典。不实现,报表能跑,但谁都能看,等于埋了个数据泄露的口子。

步骤三:起服务,接上第一个数据源

启动之后,报表工作台地址是 {项目前缀}/jmreport/list,BI 工作台是 {项目前缀}/drag/list。绿色免安装版的默认账号密码是 admin / 123456——这个密码上线前必须改,官方文档里也专门列了改密码的条目。

接数据源时我建议分两阶段验证,别一口气全上。这个思路和站里讲批量采集那篇是一样的:复杂采集要拆成两阶段,否则数据全废(择云软件百度指数批量采集实战)。换成报表就是——先用一个最简单的单表 SQL 跑出一张列表,确认字段类型、日期格式、中文编码都对;通了再上多表关联、参数查询、表达式合计。

还有个容易忽略的取舍:功能不是都要上。站里讲快手指数那篇有个标准我很认同——试错成本低、场景又熟,就只留首尾两步(快手和抖音的指数到底差在哪)。小团队做报表同理,先把"列表 + 导出 + 打印"做扎实,大屏留到真有人看再说。

结果校验:怎么才算真的部署成功了

工作台能打开不算成功。我给自己列的验收清单是四条:

  • 用一张真实业务表跑出报表,中文不乱码、金额小数位正确;
  • 导出 Excel / PDF 各一次,文件能正常打开;
  • 换一个低权限账号登录,确认看不到不该看的报表——这条验的是你实现的 token 接口有没有真的生效;
  • 重启一次服务,确认报表配置还在(配置在库里,所以要确认数据卷或数据库没被清掉)。

顺带提一个调度上的坑:站里那篇外卖流量复盘里提到,他们一开始用免费版工具每 5 分钟采一次,第三天就被限流了(微信指数深夜暴增时,我们这样抢外卖流量)。报表刷新也是一个道理,别把定时刷新设成分钟级去打业务库,尤其是主库。要近实时就走从库,要么就老老实实按小时。

顺手说授权:官方仓库写的是开源版遵循 LGPL 发布,商用又不想保留"Powered by 积木报表"这类版权标识和链接,需购买商业授权。另外几个镜像站标注的协议并不一致,这种事别信二手,认准官方仓库的 LICENSE 文件。

常见问题

一定要 JDK 17 吗?我在 JDK 8 上能不能跑?

官方示例工程要求 JDK 17+,因为它的架构是 Spring Boot 4。Spring Boot 2 的版本要求不同,具体看官方文档对应章节。不要拿示例工程的要求硬套到老版本上,也不要反过来。

工作台打不开,一直跳回登录页,是哪里的问题?

八成是权限拦截没放开。检查 /jmreport/**、/drag/**、/jimubi/** 这三个前缀有没有加进你框架的匿名访问白名单。其次是 JmReportTokenServiceI 没实现,token 拿不到。

保存图表时报验签失败,怎么办?

先查版本。v2.5.4 之后签名机制变了,积木报表、积木BI、JimuChatBI 三个模块必须同步升级到配套版本,混搭就会在保存、连数据源这类环节报验签错。

MySQL 8 能直接用那个 5.7 的建库脚本吗?

官方脚本文件名标的是 MySQL 5.7。想稳妥就按官方要求准备 5.7+ 的环境;要用 8.0,先在开发库试跑,重点看字符集和排序规则,别直接上生产。

相关阅读

分享到:

本文链接:https://www.biyeyuanma.cn/post/260.html

服务热线

加我微信

加我微信