readerstacks/reportmanager

使用 Laravel 报告生成器轻松创建任何报告,就像 metabase 一样

1.453.3 2024-04-30 10:26 UTC

README

Metabase 的 Laravel 报告生成器由 abnosoftwares.com 提供


Screenshot 2023-05-04 at 12 09 50 PM

Screenshot 2023-05-04 at 12 56 58 PM

Screenshot 2023-05-04 at 12 57 05 PM

使用 Laravel 报告生成器轻松创建任何报告,就像 metabase 一样。

有关许可证信息,请查看 LICENSE-文件。

功能

  • 像 metabase 一样,轻松以图表、表格格式生成任何报告。
  • 分享 URL。
  • 分享受密码保护的报告 URL。
  • 创建运行时变量以用于条件语句。
  • 根据需要添加自定义布局。
  • 添加自定义输入过滤器。
  • 在保存到数据库之前运行查询。
  • 保存报告以供外部或将来使用。
  • 自定义内置过滤器和布局。
  • 使用多个数据库进行报告。

安装

1 - 依赖

第一步是使用 composer 安装软件包并自动更新您的 composer.json 文件,您可以通过运行以下命令来完成此操作:

composer require readerstacks/reportmanager

注意:如果您正在使用 Laravel 5.5,步骤 2(提供者和别名)是不必要的。QieryMigrations 支持 Laravel 新的 软件包发现

2 - 提供者

您需要更新应用程序配置以注册软件包,以便它可以由 Laravel 加载,只需更新您的 config/app.php 文件,在 'providers' 部分的末尾添加以下代码

config/app.php

<?php

return [
    // ...
    'providers' => [
        Aman5537jains\ReportBuilder\ReportBuilderServiceProvider::class,
        // ...
    ],
    // ...
];

Lumen

转到 /bootstrap/app.php 文件并添加此行

<?php
// ...

$app = new Laravel\Lumen\Application(
    dirname(__DIR__)
);

// ...

$app->register(Aman5537jains\ReportBuilder\ReportBuilderServiceProvider::class);

// ...

return $app;

3 配置

发布配置

在您的终端中键入

php artisan vendor:publish --provider="Aman5537jains\ReportBuilder\ReportBuilderServiceProvider"

运行迁移

在您的终端中键入

php artisan migrate

用法

Laravel 用法

直接访问 https:///report-manager/builder

如果您想在代码中任何地方使用它,则

  (new \Aman5537jains\ReportBuilder\ReportGenerator())->render();

定制

添加新布局

您可以通过在 reportconfig.php 文件中注册类来创建任何自定义布局

 
return [
  "layouts"=>[
        "table"=>["class"=>"\Aman5537jains\ReportBuilder\Layouts\TableLayout\TableLayout"],
        "table2"=>["class"=>"\Aman5537jains\ReportBuilder\Layouts\TableLayout\TableLayout"],
        "Number"=>["class"=>"\Aman5537jains\ReportBuilder\Layouts\NumberViewLayout"],
        'Chart'=>["class"=>"\Aman5537jains\ReportBuilder\Layouts\ChartLayout","settings"=>    ["type"=>"pie","chart_label"=>"Users","label_column"=>"labels","data_column"=>"data","colors_column"=>"colors"]],
        'CanvasChart'=>["class"=>"\Aman5537jains\ReportBuilder\Layouts\CanvasChartLayout","settings"=>["type"=>"pie","chart_label"=>"Users","label_column"=>"labels","data_column"=>"data","colors_column"=>"colors"]],
        
         
        
    ],
...

和类

如果您查看类 \Aman5537jains\ReportBuilder\Layouts\TableLayout\TableLayout,则可以自定义它,或者您可以按以下方式注册您的类:

<?php
namespace Aman5537jains\ReportBuilder\Layouts\TableLayout;

use Aman5537jains\ReportBuilder\Layouts\BaseLayout;

class TableLayout extends BaseLayout
{
   
    function scripts(){
        
        $script = <<<SCRIPT
             new DataTable('.tbl_report');
        SCRIPT;

        return [
            'datatable'=>[
                "src"=>'https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js'
            ],
            'script'=>[
                'text'=>$script
                ]
        ];
    }

    function styles(){
        return [
            'datatable'=>[
                "src"=>"https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css"
            ]
            ];
    }

    function render(){
        if($this->reportBuilder->error==''){
        $table=' ';
        // foreach($this->reportBuilder->report->variables  as $name=>$var){
        //     $table.=$var['obj']->render();

        // }
        $table .=  ' 
        <style>
        .tbl_report{
            border-collapse: collapse;
            width: 100%;
        }
         .tbl_report td,  .tbl_report th {
            border: 1px solid #ddd;
            padding: 8px;
          }
          .tbl_report th {
            padding-top: 12px;
            padding-bottom: 12px;
            text-align: center;
            background-color: #000;
            color: white;
          }
        </style>
        
        <table id="tbl_report" class="tbl_report">';
        $table .=  '<thead><tr>';
  
        foreach($this->reportBuilder->columns as $column){

            $table.=   '<th>'.$column->render().' </th>';
        }
        $table .=  '</tr><thead><tbody>';
        foreach($this->reportBuilder->rows as $row){
            $table.=   '<tr>';
            foreach($this->reportBuilder->columns as $column){

                $table.=   '<td>'.$row->render($column->name()).' </td>';
            }
            $table.=   '</tr>';
        }
        
        $table.= "</tbody></table>";
        

        
        return $table ;
        }
        else{
            return "<span style='color:red'>".$this->reportBuilder->error."</span>";
        }
    }
    

}

添加新输入过滤器

您可以通过在 reportconfig.php 文件中注册类来创建任何过滤器输入布局

 
return [
 "filter_inputs"=>[
        "Input"=>["class"=>\Aman5537jains\ReportBuilder\Inputs\TextInput::class,"settings"=>["type"=>"text"]],
        "Number"=>["class"=>\Aman5537jains\ReportBuilder\Inputs\TextInput::class,"settings"=>["type"=>"number"]],
        "Date Range"=>["class"=>\Aman5537jains\ReportBuilder\Inputs\DateFilterInput::class,"settings"=>["column"=>"created_at"]],
        "Select 2 Picker"=>["class"=>\Aman5537jains\ReportBuilder\Inputs\Select2PickerFilterInput::class,"settings"=>["url"=>"https://api.github.com/search/repositories?term=sel&_type=query&q=sel"]]
        
    ],
    
    ],
...

和类

如果您查看类 \Aman5537jains\ReportBuilder\Inputs\TextInput::class,则可以自定义它,或者您可以按以下方式注册您的类:

<?php
namespace Aman5537jains\ReportBuilder\Inputs;
 
use Illuminate\Support\Facades\Log;

class TextInput extends ReportInputs
{

     
       function render(){
 
           return  "  <span>{$this->config['title']} :</span><input type='{$this->settings['type']}' name='{$this->name}' value='{$this->value}'   />";
       } 

} 


?>

以及更复杂的日期过滤器

<?php
namespace Aman5537jains\ReportBuilder\Inputs;
 
use Illuminate\Support\Facades\Log;

class DateFilterInput extends ReportInputs
{ 

      function queryValue(){
          if($this->value!=''){
            $value = explode(" - ",$this->value);
            $start= trim($value[0])." 00:00:00";
            $end= trim($value[1])." 23:59:59";
            return "{$this->settings['column']} >= '{$start}' and  {$this->settings['column']} <= '{$end}'  ";

          }
          return  $this->value;
      }
       function scripts(){
        return [
          
          'moment'=>[
              'src'=>'https://cdn.jsdelivr.net.cn/momentjs/latest/moment.min.js'
          ],
          'daterangepicker'=>[
              'src'=>'https://cdn.jsdelivr.net.cn/npm/daterangepicker/daterangepicker.min.js'
          ],
          'daterangepicker'=>[
              'src'=>'https://cdn.jsdelivr.net.cn/npm/daterangepicker/daterangepicker.min.js'
          ],
          'script'=>[
            'text'=>"  
            
              $('.datefilter_{$this->name}').daterangepicker({
                autoUpdateInput: false,   
                showDropdowns: true,
                ranges: {
                  'Today': [moment(), moment()],
                  'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                  'Last 7 Days': [moment().subtract(6, 'days'), moment()],
                  'Last 30 Days': [moment().subtract(29, 'days'), moment()],
                  'This Month': [moment().startOf('month'), moment().endOf('month')],
                  'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
               },       
                locale: {
                  'format': 'YYYY-MM-DD',
                },
                opens: 'left'
              }, function(start, end, label) {
                $('.datefilter_{$this->name}').val(start.format('YYYY-MM-DD')+' - '+ end.format('YYYY-MM-DD'))
                console.log( start.format('YYYY-MM-DD')  , end.format('YYYY-MM-DD'));
              });
            "
          ]
          
        ];
      
       }

       function styles(){
         return [
            'daterangepicker'=>[
                'src'=>'https://cdn.jsdelivr.net.cn/npm/daterangepicker/daterangepicker.css'
            ]
            ];
       }
     
       function html(){
           $html ="<span>{$this->config['title']} </span>:<input type='text' class='datefilter_{$this->name}' name='{$this->name}' value='{$this->value}' />";
           return  $html;
       } 

} 


?>