开源UReport 整合到产品中实践简要:(四)UReport 自定义mysql数据库表的存储器

一、默认报表存储器:

UReport2默认提供的名为“服务器文件系统”的报表存储机制,实际上是实现了UReport2提供的com.bstek.ureport.provider.report.ReportProvider接口。接口源码如下:

import java.io.InputStream;
import java.util.List;
/**
 * @author Jacky.gao
 * @since 2016年12月4日
 */
public interface ReportProvider {
    /**
     * 根据报表名加载报表文件
     * @param file 报表名称
     * @return 返回的InputStream
     */
    InputStream loadReport(String file);
    /**
     * 根据报表名,删除指定的报表文件
     * @param file 报表名称
     */
    void deleteReport(String file);
    /**
     * 获取所有的报表文件
     * @return 返回报表文件列表
     */
    List<ReportFile> getReportFiles();
    /**
     * 保存报表文件
     * @param file 报表名称
     * @param content 报表的XML内容
     */
    void saveReport(String file,String content);
    /**
     * @return 返回存储器名称
     */
    String getName();
    /**
     * @return 返回是否禁用
     */
    boolean disabled();
    /**
     * @return 返回报表文件名前缀
     */
    String getPrefix();
}

 

实现了ReportProvider接口后,只需要将实现类配置到Spring中,让其成为一个标准的Spring Bean,这样UReport2就会检测到它而将其加载。

如果想要禁用系统提供的默认报表存储器,只需要把 ureport2-core 包下的 ureport.properties 文件拷贝一份放到自己的根目录下:

 

 配置文件内容如下:

ureport.disableHttpSessionReportCache=false ureport.disableFileProvider=true ureport.fileStoreDir=/WEB-INF/ureportfiles ureport.debug=true

将ureport.disableFileProvider改成true,即可禁用默认报表存储器。

二、自定义mysql 报表存储器

如果想要定义自己的报表存储器,只需要实现了ReportProvider接口后,并将实现类配置到Spring中,让其成为一个标准的Spring Bean,这样UReport2就会检测到它而将其加载。

同时设计一个表结构,具体可以参考(转载,这里要感谢作者):https://github.com/wanghaoren1/Ureport2,我的代码也借鉴了他们的做法。

 

三、表结构(id是雪花主键)

四、代码结构:(把ureport定义内部数据源和自定义存储器放在同一个模块中,形成ureport报表公用模块)

五、核心代码:

package com.zjm.gwork.ureport.reportProvider.provider;


import com.bstek.ureport.provider.report.ReportFile;
import com.bstek.ureport.provider.report.ReportProvider;
import com.zjm.gwork.ureport.reportProvider.model.SysUreportfile;
import com.zjm.gwork.ureport.reportProvider.service.UReportFileService;
import com.zjm.gwork.utils.KeyWorker;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

// 作者 热水 2020.2.2 3:30
@Setter
@Component
// 该注解可以利用其 prefix属性值 + 类的属性名 在yml中配置属性值
@ConfigurationProperties(prefix = "ureport.mysql.provider")
public class MySQLProvider implements ReportProvider {
    // 自定义存储器的名称(相当于中文名称)
    private static final String NAME = "mysql-provider";
    // 自定义存储器的code(相当于英文名称), 特定前缀,ureport底层会调用 getPrefix 方法来获取报表操作的Provider类
       // 即为了前端时调用:这里的报表名称要以其ReportProvider中要求的前缀开始,比如http://localhost:8080/ureport2-demo/ureport/preview?_u=mysql:test.ureport.xml等。
     private String prefix = "mysql:"; // 声明的全局变量,当appliction中的ureport.mysql.provider.prefix 这个属性没有设置时,用这个作为前缀,否则以ureport.mysql.provider.prefix中的内容作为前缀。

    // 是否禁用
    private boolean disabled = false;

    @Autowired
    private UReportFileService uReportFileService;

    @Override
    public InputStream loadReport(String file) {
        // 这时候的file它有前缀,所以要去掉
        //System.out.println("报表物理文件名:" + file);
        SysUreportfile ureportFileEntity = uReportFileService.getReportFileByName(getCorrectName(file));
        byte[] content =ureportFileEntity.getXmlcontent();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(content);
        return inputStream;

    }

    @Override
    public void deleteReport(String file) {
        uReportFileService.removeReportFileByName(getCorrectName(file));
    }

    @Override
    public List<ReportFile> getReportFiles() {
        List<SysUreportfile> list = uReportFileService.listAllReportFile();
        List<ReportFile> reportList = new ArrayList<>();
        for (SysUreportfile ureportFileEntity : list) {
            reportList.add(new ReportFile(ureportFileEntity.getReportname(), ureportFileEntity.getGmtModified()));
        }
        return reportList;
    }

    @Override
    public void saveReport(String file, String content) {
        file = getCorrectName(file);
        SysUreportfile ureportFileEntity = uReportFileService.getReportFileByName(file);
        Date currentDate = new Date();
        if(ureportFileEntity == null){
            ureportFileEntity = new SysUreportfile();
            System.out.println("id:" + ureportFileEntity.getId());
           // ureportFileEntity.setId(UUID.randomUUID().toString());
            ureportFileEntity.setId(KeyWorker.getInstance().getNextId());
            ureportFileEntity.setReportname(file);
            ureportFileEntity.setXmlcontent(content.getBytes());
            ureportFileEntity.setGmtCreate(currentDate);
            ureportFileEntity.setGmtModified(currentDate);
            uReportFileService.saveReportFile(ureportFileEntity);
        }else{
            ureportFileEntity.setXmlcontent(content.getBytes());
            ureportFileEntity.setGmtModified(currentDate);
            uReportFileService.updateReportFile(ureportFileEntity);
        }
    }

    @Override
    public String getName() {
        return NAME;
    }

    @Override
    public boolean disabled() {
        return disabled;
    }

    @Override
    public String getPrefix() {
        return prefix;
    }

    /**
     * 获取没有前缀的文件名
     * @param name
     * @return
     */
    private String getCorrectName(String name){
        //System.out.println("prefix:" + prefix);
        if(name.startsWith(prefix)){
            name = name.substring(prefix.length(), name.length());
        }
        return name;
    }

}
### 回答1: Spring Cloud是一个用于构建分布式系统的开源框架,它提供了一套用于构建微服务架构的解决方案。UReport是一个开源的Java报引擎,它能够帮助开发人员快速、方便地生成丰富多样的报。 要实现Spring Cloud与UReport整合,可以按照以下步骤进行: 1. 添加依赖:在Spring Cloud的项目,需要添加UReport的依赖,以便使用UReport提供的报服务。 2. 配置UReport:在项目的配置文件,需要配置UReport的相关参数,例如数据库连接信息、报上传路径等。这些配置信息将用于UReport的初始化和运行。 3. 定义报模板:使用UReport提供的设计工具,设计报模板,并将模板上传到UReport服务。在设计报模板时,可以使用UReport的丰富功能,例如图格、公式等。 4. 编写控制器:在Spring Cloud项目,编写一个控制器来处理报相关的请求。在控制器,可以使用UReport提供的API来实现报数据的查询、导出等操作。 5. 集成报:将UReport提供的报集成到Spring Cloud的其他模块。例如,可以在前端模块嵌入报,让用户可以直接在系统查看和操作报。 通过以上步骤,就可以实现Spring Cloud与UReport整合。在实际使用,可以根据具体需求进行更详细的配置和定制。整合后,就可以在Spring Cloud的微服务架构使用UReport提供的强大报功能,方便地生成和管理报。 ### 回答2: Spring Cloud是一个用于构建分布式系统的开发框架,它提供了一系列的组件和工具,用于简化、快速地构建云原生应用。而UReport是一个开源的Java报库,它支持动态生成各种格式的报,如PDF、Excel等。 要实现Spring Cloud整合UReport,首先需要在项目的依赖添加UReport的相关依赖。可以在pom.xml文件加入如下配置: ``` <dependency> <groupId>com.bst</groupId> <artifactId>ureport2-spring-boot-starter</artifactId> <version>2.9.11</version> </dependency> ``` 接下来,需要配置UReport的相关参数。可以在application.properties或application.yml文件添加如下配置: ``` # UReport配置 ureport: reportHome: file:/path/to/report/home storeDir: file:/path/to/store/dir ueruntime.home: file:/path/to/ureport/home preview: html ``` 其,reportHome指定报模板文件的根目录,storeDir指定生成的报文件存放的目录,ueruntime.home指定UReport运行时文件的存放目录,preview指定报预览的方式,默认为html。 接下来,可以在Spring Cloud的应用使用UReport来生成报。可以通过注入UReport的ReportManager来调用相应的方法,如下所示: ```java @Controller public class ReportController { @Autowired private ReportManager reportManager; @RequestMapping("/report") public void generateReport(HttpServletResponse response) throws IOException { // 生成报 byte[] reportBytes = reportManager.createPDFReport("reportTemplate.ureport.xml", new HashMap<String, Object>()); // 设置响应头 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=report.pdf"); // 输出报 response.getOutputStream().write(reportBytes); } } ``` 在上述代码,generateReport方法会调用ReportManager的createPDFReport方法生成PDF格式的报文件。然后,设置响应头并将报文件输出到响应流,以实现文件下载。 以上就是Spring Cloud整合UReport的基本步骤。通过配置相关参数和调用相应的方法,我们可以在Spring Cloud的应用使用UReport来生成各种格式的报。 ### 回答3: Spring Cloud是一个用于构建分布式系统的开源框架,它提供了一系列的工具和服务,使得开发和部署微服务变得更加简单和高效。而uReport是一个开源的报引擎,可以用于生成各种类型的报,包括PDF、Excel、Word等格式。 要实现Spring Cloud与uReport整合,可以按照以下步骤进行: 1. 创建一个Spring Cloud的项目,可以选择使用Spring Boot来简化项目的搭建过程。 2. 在项目的pom.xml文件添加uReport的依赖,以引入uReport的相关功能。 3. 配置uReport的相关参数,如报存储路径、数据库连接等。 4. 创建一个Controller来接收前端请求并处理报生成的逻辑。可以使用uReport提供的API来实现报的生成和导出功能。可以根据需要,将生成的报保存到本地磁盘或者输出给前端。 5. 配置Spring Cloud的网关或者负载均衡器,以实现对报服务的访问和调用。 6. 在前端页面调用报服务,传入相应的参数,发起报生成请求,并将生成的报展示给用户。 整合完成后,可以通过Spring Cloud的服务发现和注册功能,轻松地管理和扩展报服务,将其无缝地集成到整个分布式系统。同时,由于uReport本身提供了丰富的报生成功能,使得开发者可以便捷地生成各种类型的报,在项目广泛应用于数据分析、统计和展示等方面。 总之,通过整合Spring Cloud与uReport,可以实现一个高性能、可扩展的报服务,为分布式系统带来更多的数据分析和展示能力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值