readerstacks / reportmanager
使用 Laravel 报告生成器轻松创建任何报告,就像 metabase 一样
Requires
- paquettg/php-html-parser: ^2.2
- dev-main
- 1.453.3
- 1.452.2
- 1.451.1
- 1.450.1
- 1.45.0
- 1.44.1
- 1.44.0
- 1.43.0
- 1.42.0
- 1.41
- 1.40.0
- 1.39.0
- 1.38.0
- 1.37.1
- 1.37.0
- 1.36.0
- 1.35.0
- 1.34.0
- 1.33.0
- 1.32.0
- 1.31.0
- 1.30.0
- 1.29.0
- 1.28.0
- 1.27.0
- 1.26.0
- 1.25.0
- 1.24.0
- 1.23.0
- 1.22.0
- 1.21.0
- 1.20.0
- 1.19.0
- 1.18.0
- 1.17.0
- 1.16.0
- 1.15.0
- 1.14.0
- 1.13.0
- 1.12.0
- 1.11.0
- 1.10.0
- 1.9.0
- 1.8.0
- 1.7.0
- 1.6.0
- 1.5.0
- 1.4.0
- 1.3.0
- 1.2.0
- 1.1.0
- 1.0.0
- dev-hotfix-table
- dev-analysis-kYpj7y
- dev-master
This package is auto-updated.
Last update: 2024-09-30 11:20:46 UTC
README
Metabase 的 Laravel 报告生成器由 abnosoftwares.com 提供
使用 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; } } ?>


