由于公司之前开发的系统是采用若依框架单体架构,采用的是多数据源,因为之前的报表速度慢,所以使用新的报表,发现积木报表是不错的选择,但是在网上搜了一圈都是分离版和微服务版的配置教程,只能是自己一步一步摸索了,以下是我分享的一些经验希望可以帮助更多人,在集成积木报表时也要对数据进行分隔所以采用积木报表的多租户模式

1.因为要做出数据区分,所以这里采用了分库处理,将积木报表的数据另外读取进来,新建JiMuDataSourceConfig,在application.yml中配置积木的数据源及相关属性

jeecg:jmreport:#多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)saasMode: tenant#上线开启安全模式firewall:# 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并且不允许查询数据库)dataSourceSafe: true## 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)lowCodeMode: devminidao-datasource:jdbc-url: jdbc:mysql://localhost:3306/jimureport?autoReconnect=true&failOverReadOnly=false&maxReconnects=1000&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=trueusername: rootpassword: sdkjdriver-class-name: com.mysql.cj.jdbc.Driver
@Configurationpublic class JiMuDataSourceConfig {/** *1、bean的名称必须为minidaoDataSource,否则不生效 *2、jeecg.minidao-datasource对应的是yml中的jeecg下的minidao-datasource,可自定义 */@Bean(name="minidaoDataSource")@ConfigurationProperties(prefix = "jeecg.minidao-datasource")public DataSource dataSource(){return DataSourceBuilder.create().build();}}

2.要实现数据源分类首先要开启多租户模式,设置为tenant,则在JimuReportTokenService传入我们数据源的名称作为tenantId,同一数据源下的操作用户都可以看到设计报表,同时也要传入getRoles根据角色赋予一些权限,如果不传入可能会导致一些功能无法访问(无论是tenantId还是created)

#多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)saasMode: tenant

3.设置为created的话,则在JimuReportTokenService中需要实现getToken与getUsername的方法,因为这个框架是使用jwt验证的,所以这里的token获取不到,因为这个请求里面没有使用,所以这里我按照自己的想法去获取当前用户使用的数据源名称作为token传入积木报表发现也没有报错

public class TokenUtils {/** * 获取 request 里传递的 token * * @param request * @return */public static String getTokenByRequest(HttpServletRequest request) {String parameter = request.getParameter("token");String header = request.getHeader("token");HttpSession session = request.getSession();Object object = session.getAttribute("serverNo");Object object1 = session.getAttribute("serverName");if (parameter == null && header == null ) {parameter = request.getHeader("Authorization");}if (parameter == null&& object!=null){parameter = object.toString();}else{parameter="sdkj001";}return parameter != null ? parameter : header;}}

当然这里的Token也可以传入其他的,由于这里是使用创建人隔离,也就是说两个数据源下同名的用户数据是共同的,但是我们可以在传入用户名称时在传入数据源作为前缀则也可以实现多数据源隔离

JimuReportTokenService完整代码:

package com.propertymana.framework.jimu;import com.propertymana.common.core.domain.entity.SysUser;import com.propertymana.common.utils.ShiroUtils;import com.propertymana.common.utils.TokenUtils;import org.apache.shiro.session.Session;import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;import org.springframework.http.HttpHeaders;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import java.util.HashMap;import java.util.Map;/** * @author chenjianshu * @version 1.0 * @date 2024/1/5 10:06 */@Componentpublic class JimuReportTokenService implements JmReportTokenServiceI {@Overridepublic String getUsername(String token) {String Username = ShiroUtils.getLoginName();return Username;}//只有管理员可以编辑报表@Overridepublic String[] getRoles(String s) {if (ShiroUtils.getLoginName().equals("admin")) {String[] roles = new String[1];// 创建一个包含一个元素的数组roles[0] = "admin";// 为数组第一个元素赋值return roles;}return new String[0];}@Overridepublic Boolean verifyToken(String token) {return true;}//可以不传这里,不传的话管理员没有收藏的功能@Overridepublic String getToken(HttpServletRequest request) {return TokenUtils.getTokenByRequest(request);//return null;}@Overridepublic Map getUserInfo(String token) {SysUser user = ShiroUtils.getSysUser();HashMap var2 = new HashMap(5);var2.put("sysUserCode", user.getLoginName());return var2;//return null;}@Overridepublic HttpHeaders customApiHeader() {return JmReportTokenServiceI.super.customApiHeader();}//区分数据源@Overridepublic String getTenantId() {Session session = ShiroUtils.getSession();session.getAttribute("serverNo");String tenantId = (String) session.getAttribute("serverNo");if(tenantId==null){tenantId="sdkj001";}return tenantId;}}

4.模板案例中展示的报表都是全数据源共享的(全系统的人都可以看到),这里并没有做出区分,收藏操作只有是积木报表这边配了管理员角色才可以(收藏类似于将报表移动过去),如果要删除模板案例中的数据则需要先取消收藏,然后再删除,再清理回收站即可,
有趣的是(A数据源的admin将报表收藏到模板案例中,B数据源的admin也可以操作这个报表,取消这个报表的收藏后会保存在B数据源下了,A数据源的admin是看不到的)

5.数据源安全模式,开启一次以后就无法关闭了,不知道是积木报表的bug还是什么

#上线开启安全模式firewall:#数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并且不允许查询数据库) dataSourceSafe: true

6.低代码开发模式,也可以说是积木报表的安全模式,开启发布模式后,除了管理员之外其他人只可以对报表进行预览导出操作,而且还会拦截一些操作比如模板上传图片会被拦截,涉及到分配角色的问题可以参照我上面的JimuReportTokenService中的getRoles

# # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制) lowCodeMode: prod

7.导出excel,有导出excel和大数据excel,大数据excel时内容会变精简没有样式

8.全属性配置说明yml配置

spring: datasource:hikari: #设置数据库超时时间 connection-timeout: 100000 #池中维护的最小连接数 minimum-idle:5 #池中最大连接数 maximum-pool-size: 15 #连接最长闲置时间 idle-timeout: 30000 #池中连接最长生命周期 max-lifetime: 30000jeecg : jmreport:#多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)saasMode: created# 平台上线安全配置(v1.6.2+ 新增)firewall: # 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并且不允许查询数据库) dataSourceSafe: true # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制) lowCodeMode: prod#是否 禁用导出PDF和图片的按钮 默认为falseexportDisabled: false#是否自动保存autoSave: true#自动保存间隔时间毫秒interval: 20000# 列数(设计页面展示多少列)col: 100#自定义项目前缀customPrePath:# 自定义API接口的前缀 #{api_base_path}和#{domainURL}的值apiBasePath: http://localhost:8080/jeecg-boot#数据源标识(作废参数)datasource: master#预览分页自定义pageSize: - 10 - 20 - 30 - 40#打印纸张自定义printPaper: - title: A5纸size: - 148 - 210 - title: B4纸size: - 250 - 353#接口超时设置(毫秒)connect-timeout: 300000#Excel导出模式(fast/快、primary/精致模式,默认fast)export-excel-pattern: fast#Excel导出数据每个sheet的行数,每个sheet最大1048576行page-size-number: 10000#设计页面表格的线是否显示 默认trueline: true#只看自己创建数据 (v1.6.2+删除)saas: false#是否开启租户模式 (v1.6.2+删除)openTenant: false#sql数据源不写字典下拉框显示条数 (v1.4.2+删除)select-show-total: 10#是否启用签名校验,默认不开启,对执行sql的接口参数校验(v1.6.2+删除)safeMode: true

注:本人小白一枚,代码质量可能不是很高