Skip to content

Luck-Report 业务系统集成

本小节介绍如何将 Luck-Report 报表功能集成到现有业务系统中,分为后端和前端两个部分

参考

集成案例:https://gitee.com/LuckyPools/luck-report-demo

后端集成

1.1 安装依赖包

首先需要对 luck-report-server 执行 Maven install 操作,打包安装到本地 Maven 仓库。

bash
# 进入 luck-report-server 目录
cd luck-report-server

# 执行 Maven install
mvn clean install -DskipTests

1.2 引入 Maven 依赖

在业务系统项目的 pom.xml 中引入 Luck-Report 依赖:

xml
<dependency>
    <groupId>com.luck.cloud</groupId>
    <artifactId>luck-report-web</artifactId>
    <version>1.0.0</version>
</dependency>

1.3 添加自定义数据源配置

创建数据源配置类,实现 BuildinDatasource 接口,用于报表数据查询。

java
package com.luck.product.boot.config;

import com.luck.report.core.definition.datasource.BuildinDatasource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * 内置数据源配置
 */
@Configuration
public class DatasourceConfig implements BuildinDatasource {
    @Resource
    DataSource dataSource;
    private final Logger log = LoggerFactory.getLogger(getClass());

    @Override
    public String name() {
        return "myUReportDatasource";
    }

    @Override
    public Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            log.error("数据源获取连接失败!");
        }
        return null;
    }
}

1.4 引入基础配置

创建报表配置类,导入 Luck-Report 的主配置。

java
package com.luck.product.boot.config;

import com.luck.report.web.config.LuckReportMainConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({
        LuckReportMainConfig.class
})
public class ReportConfig {
}

1.5 启动类添加扫描路径

在业务系统启动类上添加 scanBasePackages 属性,扫描 Luck-Report 相关包路径。

java
package com.luck.product.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 应用服务
 */
@SpringBootApplication(
        scanBasePackages = {"com.xxx.product", "com.luck.report"}
)
public class XXXApplication {
    public static void main(String[] args) {
        SpringApplication.run(XXXApplication.class, args);
    }
}

1.6 配置文件

application.yml 中添加 Luck-Report 和 数据源配置:

yaml
luck-report:
  servletPrefix: report
  # 报表文件存储目录,请根据您的实际存储路径修改,确保该目录存在且有读写权限
  fileStoreDir: E:/luckStudio/IO/report
  debug: true

spring:
  datasource:
    # 数据库用户名,根据您的数据库账号修改
    username: root
    # 数据库密码,根据您的数据库密码修改
    password: root
    # 数据库连接地址,根据您的数据库地址修改
    url: jdbc:mysql://localhost:3306/luck_report?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver

配置说明:

配置项说明
servletPrefix报表接口前缀
fileStoreDir报表文件存储目录,需确保有读写权限
debug是否开启调试模式

前端集成

2.1 打包 Luck-Report-UI

首先对 luck-report-ui 执行打包操作:

bash
# 进入前端项目目录
cd luck-report-ui

# 执行 lib 打包命令
npm run build:lib

打包完成后,会在项目目录下生成 dist 文件夹。

2.2 复制文件到业务系统

在业务系统前端项目的 public 目录下新建 libs\luck-report 文件夹:

public/
└── libs/
    └── luck-report/
        ├── luck-report-lib.umd.min.js
        └── assets/

复制 dist 目录中的以下文件到 libs\luck-report 文件夹:

  • luck-report-lib.umd.min.js
  • assets 文件夹

2.3 引入脚本文件

在业务系统前端项目 public\index.html 中引入 Luck-Report 脚本:

html
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
      
    <!-- Luck-Report 配置开始 -->
    <script>
      window.__luck_report_public_path__ = '<%= BASE_URL %>libs/luck-report/';
    </script>
    <script src="<%= BASE_URL %>libs/luck-report/luck-report-lib.umd.min.js"></script>
    <!-- Luck-Report 配置结束 -->
      
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

2.4 创建页面组件

设计器页面 src/views/report/designer/index.vue

vue
<template>
  <div class="report-designer-container">
    <luck-designer
      ref="designer"
      :report-path="reportPath"
      :locale="locale"
      class="designer-wrapper"
    />
  </div>
</template>

<script>
export default {
  name: 'ReportDesigner',
  computed: {
    reportPath() {
      return this.$route.query.reportPath || '';
    },
    locale() {
      return this.$route.query.locale || 'zh';
    }
  }
};
</script>

<style scoped>
.report-designer-container {
  width: 100%;
  height: 100vh;
  overflow: hidden;
}

.designer-wrapper {
  display: block;
  width: 100%;
  height: 100%;
}
</style>

预览页面 src/views/report/preview/index.vue

vue
<template>
  <div class="report-preview-container">
    <luck-preview
      ref="preview"
      :report-path="reportPath"
      :mode="mode"
      :locale="locale"
      :page-index="pageIndex"
      :tools-info="toolsInfo"
      :params="paramsValue"
      class="preview-wrapper"
    />
  </div>
</template>

<script>
export default {
  name: 'ReportPreview',
  computed: {
    reportPath() {
      return this.$route.query.reportPath || this.$route.query.fileName || '';
    },
    paramsValue() {
      const query = { ...this.$route.query };
      delete query.reportPath;
      delete query.fileName;
      delete query.mode;
      delete query.locale;
      delete query.pageIndex;
      delete query.toolsInfo;
      return Object.keys(query).length > 0 ? JSON.stringify(query) : undefined;
    },
    mode() {
      return this.$route.query.mode || '';
    },
    locale() {
      return this.$route.query.locale || 'zh';
    },
    pageIndex() {
      const idx = this.$route.query.pageIndex;
      return idx ? parseInt(idx, 10) : undefined;
    },
    toolsInfo() {
      const info = this.$route.query.toolsInfo;
      return info ? parseInt(info, 10) : undefined;
    }
  }
};
</script>

<style scoped>
.report-preview-container {
  width: 100%;
  height: 100vh;
  overflow: hidden;
}

.preview-wrapper {
  display: block;
  width: 100%;
  height: 100%;
}
</style>

2.5 添加路由配置

在路由配置文件中添加设计器和预览页的路由,例如:

javascript
import ReportDesigner from '@/views/report/designer/index.vue'
import ReportPreview from '@/views/report/preview/index.vue'

const routes = [
  {
    path: '/report/designer',
    name: 'ReportDesigner',
    component: ReportDesigner
  },
  {
    path: '/report/preview',
    name: 'ReportPreview',
    component: ReportPreview
  }
]

2.6 配置 LuckReportLib

创建配置文件 src/luckReportLib.js

javascript
import router from './router';

function configureLuckReportLib() {
    const LuckReportLib = window['luck-report-lib'];
    
    // 必须先设置 lib 模式
    LuckReportLib.setLibMode(true);

    // 配置请求 baseURL,按业务系统接口地址调整
    LuckReportLib.requestAdapter.setBaseURL('/api/report');

    // 配置请求拦截器,按业务系统认证逻辑调整
    LuckReportLib.requestAdapter.addRequestInterceptor(
        (config) => {
            const token = "认证信息";
            if (token) {
                config.headers['Authorization'] = 'Bearer ' + token;
            }
            return config;
        },
        (error) => {
            return Promise.reject(error);
        }
    );

    // 配置 Vue Router(导航适配器需要)
    LuckReportLib.navigationAdapter.setVueRouter(router);

    // 配置路由映射,按业务系统路由名称调整
    LuckReportLib.navigationAdapter.setRouteMapping({
        Preview: 'ReportPreview',
        Designer: 'ReportDesigner'
    });

    window.LuckReportLib = LuckReportLib;
}

export { configureLuckReportLib };

main.js 中引入并执行配置:

javascript
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import {configureLuckReportLib} from './luckReportLib';

// 配置 luck-report-lib
configureLuckReportLib();

new Vue({
    el: '#app',
    router,
    store,
    render: h => h(App)
});

配置说明:

配置项说明
setLibMode(true)设置为 lib 模式,必须首先调用
setBaseURL配置后端接口地址前缀
addRequestInterceptor配置请求拦截器,用于添加认证信息等
setVueRouter配置 Vue Router 实例,用于导航
setRouteMapping配置路由映射,将内部导航目标映射到业务系统路由

验证集成

完成以上配置后,启动后端服务和前端项目,根据您配置的路由地址访问验证集成是否成功:

  • 设计器页面:访问 http://localhost:端口/report/designer
  • 预览页面:访问 http://localhost:端口/report/preview?reportPath=报表路径

若能正确展示报表设计器和预览界面,则表明集成成功。


常见问题

  1. 文件写入权限问题:如果提示当前权限不足,无法写入文件,请检查配置文件中的 fileStoreDir 路径是否有可读可写权限。

  2. 前端打包依赖问题:前端打包时如果遇到依赖问题,可以尝试删除 node_modules 文件夹和 package-lock.json 文件,重新运行 npm i

  3. 路由跳转问题:确保 setRouteMapping 中配置的路由名称与实际路由定义的 name 一致。

  4. 接口请求问题:检查 setBaseURL 配置的接口地址是否正确,以及请求拦截器中的认证信息是否正确添加。

如遇到无法解决的问题,请到项目仓库 Issues 或群聊中反馈,会不定时进行解答。

Luck-Report 报表引擎