开源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;
    }

}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值