效果

自主准备静态文件

   Admin::js('static/daterangepicker/moment.min.js');
    Admin::js('static/daterangepicker/daterangepicker.js');
    Admin::css('static/daterangepicker/daterangepicker.css');
	

代码

<?php

namespace App\Admin\Widgets\ECharts;

use Dcat\Admin\Widgets\Widget;
use Illuminate\Contracts\Support\Renderable;
use Dcat\Admin\Admin;

class EChartsWithTimePicker extends Widget implements Renderable
{
    protected $id;
    protected $dataUrl;
    protected $option;
    protected $from;
    protected $to;
    protected $width;
    protected $height;
    protected $fields;

    public function __construct($dataUrl, $option = [], $from = '', $to = '', $width = '100%', $height = '400px', $fields = [],$id=null)
    {
//        $this->id = 'echarts_'.uniqid();
        $this->id = 'echarts_dgyun_v1'.($id ?? '');
        $this->dataUrl = $dataUrl;
        $this->option = $option;
        $this->from = $from;
        $this->to = $to;
        $this->width = $width;
        $this->height = $height;
        $this->fields = $fields;
    }

    function staticFile()
    {
        Admin::js('static/daterangepicker/moment.min.js');
        Admin::js('static/daterangepicker/daterangepicker.js');
        Admin::css('static/daterangepicker/daterangepicker.css');

    }

    public function render()
    {

        $this->staticFile();

        $option = json_encode($this->option, JSON_UNESCAPED_UNICODE);
        $dataUrl = $this->dataUrl;
        $from = $this->from;
        $to = $this->to;

        $fieldsHtml = '';
        foreach($this->fields as $f){
            $k = htmlspecialchars($f['key']);
            $ph = isset($f['placeholder']) ? htmlspecialchars($f['placeholder']) : '';
            $fieldsHtml .= "<input type='text' id=\"{$this->id}_{$k}\" class='form-control' style='width:140px;' placeholder='{$ph}'> ";
        }
        $html = <<<HTML
<div class="form-inline mb-3">
    {$fieldsHtml}
    <input type="text" id="{$this->id}_date" value="{$from} - {$to}" class="form-control" style="width:230px;">
    <button class="btn btn-primary" id="{$this->id}_refresh">查询</button>
</div>
<div id="{$this->id}" style="width:{$this->width}; height:{$this->height};"></div>
HTML;

        $fieldsJs = '';
        foreach($this->fields as $f){
            $k = addslashes($f['key']);
            $fieldsJs .= "params['{$k}'] = $('#{$this->id}_{$k}').val();";
        }

        $js = <<<JS

Dcat.triggerReady();

Dcat.ready(function(){

            var option_{$this->id} = {$option};
            if (document.getElementById('{$this->id}')){
                  var chart_{$this->id} = echarts.init(document.getElementById('{$this->id}'));
                  chart_{$this->id}.setOption(option_{$this->id});
            }


            // 初始化daterange
            if (document.getElementById('{$this->id}_date')){
                   $('#{$this->id}_date').daterangepicker({
                    ranges: {
                        '今天': [moment(), moment()],
                        '昨天': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                        '最近7天': [moment().subtract(6, 'days'), moment()],
                        '最近30天': [moment().subtract(29, 'days'), moment()],
                        '本月': [moment().startOf('month'), moment().endOf('month')],
                        '上月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
                    },
                    autoApply: true,
                    locale: {
                        format: 'YYYY-MM-DD',
                        applyLabel: '确定',
                        cancelLabel: '取消',
                        fromLabel: '起始时间',
                        toLabel: '结束时间',
                        customRangeLabel: '自定义',
                        daysOfWeek: ['日', '一', '二', '三', '四', '五', '六'],
                        monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
                        firstDay: 1
                    },
                    maxDate: moment(),

                    startDate: '{$from}',
                    endDate: '{$to}'
            });
            }


            $('#{$this->id}_refresh').click(function(){

              var params = {};
                var range = $('#{$this->id}_date').val().split(' - ');
                params['from'] = range[0];
                params['to'] = range[1];
                {$fieldsJs}

                 var q = Object.keys(params).map(function(key){return key+'='+encodeURIComponent(params[key]);}).join('&');
                var url = '{$dataUrl}' + (q ? ('?' + q) : '');
                fetch(url)
                    .then(response => response.json())
                    .then(res => {
                        if (res.option) {
                             console.log('ajax返回.option', res.option);
                            chart_{$this->id}.setOption(res.option, true);
                        } else {
                            Dcat.error('没有获取到数据');
                        }
                    })
                    .catch(err => {
                        Dcat.error('请求失败');
                    });
                });

        });
JS;
            Admin::script($js);

            return $html;
        }


    }


使用方法

    public function index(Content $content)
    {
        $from = now()->format('Y-m-d');
        $to = now()->format('Y-m-d');


        $option =[
                'title' => ['text' => ''],
                'tooltip' => ['trigger' => 'axis'],
                'legend' => ['data' => []],
                'xAxis' => [
                    'type' => 'category',
                    'boundaryGap' => false,
                    'data' => [],
                ],
                'yAxis' => ['type' => 'value'],
                'series' => [],
            ];


        $widget = new EChartsWithTimePicker(
            admin_url('/you_api'),
            $option, $from, $to,  '100%', '600px',[
                ['key'=>'ip', 'placeholder'=>'IP'],
                ['key'=>'name', 'placeholder'=>'名称'],
            ],'my_id'
        );

        return $content->header('图表')->body($widget);

    }