开发报表文件保存数据库

目前报表文件默认时保存到服务器文件系统中,如果需要将报表文件持久化到数据库可自定义开发文件保存器。

1、开发

在开发时需要实现 `ReportStoreProvider` 接口,以下为代码示例
/**
 * @author march
 * @Date: 2024年06月20日
 * Description:
 */
@Component // 需注入Bean容器
public class CustomDatabaseProvider implements ReportStoreProvider {

    /**
     * 此处为伪代码,根据自己项目实际清空获取数据源
     */
    private final NamedParameterJdbcTemplate jdbcTemplate;

    /**
     * @param dataSource 由 Spring Bean 注入
     */
    public CustomDatabaseProvider(DataSource dataSource) {
        jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    @Override
    public InputStream loadReport(String fileName) {
        if (!fileName.endsWith(".json")) {
            fileName += ".json";
        }
        final String SQL = "SELECT content FROM report WHERE name = :name";
        String content = jdbcTemplate.queryForObject(SQL, new MapSqlParameterSource("name", fileName), String.class);
        if (content == null) {
            content = "";
        }

        return new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
    }

    @Override
    public void deleteReport(String fileName) {
        final String SQL = "DELETE FROM report WHERE name = :name";
        jdbcTemplate.update(SQL, new MapSqlParameterSource("name", fileName));
    }

    @Override
    public List<ReportFile> getReportFiles() {
        final String SQL = "SELECT name, create_time FROM report ORDER BY name ASC";
        List<Map<String, Object>> reportList = jdbcTemplate.queryForList(SQL, new MapSqlParameterSource());

        List<ReportFile> reportFiles = new ArrayList<>();
        for (Map<String, Object> fileInfo : reportList) {
            String name = (String) fileInfo.get("name");
            Date createTime = (Date) fileInfo.get("create_time");

            ReportFile reportFile = new ReportFile(name, createTime);
            reportFiles.add(reportFile);
        }
        return reportFiles;
    }

    @Override
    public void saveReport(String fileName, String content) {
        // 保存报表的 fileName 参数带 .json 后缀
        final String SQL = "INSERT INTO report (id, name, content, create_time) VALUES (null, :name, :content, now())";
        MapSqlParameterSource parameter = new MapSqlParameterSource()
                .addValue("name", fileName)
                .addValue("content", content);
        jdbcTemplate.update(SQL, parameter);
    }

    @Override
    public String getName() {
        return "数据库存储";
    }

    @Override
    public boolean enable() {
        return true;
    }

    @Override
    public String fileSign() {
        // 自定义文件储存器标识
        return "DATABASE";
    }
}

效果预览

报表列表选择存储类型

报表列表选择存储类型

报表文件保存选择存储类型

报表文件保存选择存储类型