lycfr commented on issue #20454:
URL: https://github.com/apache/echarts/issues/20454#issuecomment-2865649456

   找AI帮我修复了一下这个问题:
   1、记录页面不可见的时间长度
   2、当页面重新可见时,生成这段时间内缺失的数据点
   3、平滑地将缺失的数据添加到图表中
   可以参考一下修改后的代码:
   ```
   <!DOCTYPE html>
   <html>
        <head>
                <meta charset="utf-8">
                <title>Echarts Demo</title>
                <!-- 引入Echarts库 -->
                <script 
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js";></script>
        </head>
        <body>
                <!-- 用于渲染图表的div -->
                <div id="chart" style="width: 600px; height: 400px;"></div>
                <div id="avg">
                        <div id="app_avg">app平均值:</div>
                        <div id="system_avg">system平均值:</div>
                </div>
                <div>
                        <button onclick="exportData()">获取区间数据</button>
                </div>
                <script>
                        // 初始化图表
                        var myChart = 
echarts.init(document.getElementById('chart'));
                        // 生成随机数
                        function generateRandomValue() {
                                return Math.floor(Math.random() * 100);
                        }
                        // 设置图表的配置项和数据
                        var option = {
                                title: {
                                        name: 'CPU',
                                        left: 'center'
                                },
                                legend: {
                                        orient: 'horizontal',
                                        x: 'right',
                                        y: 'top',
                                        data: ['app', 'system']
                                },
                                tooltip: {
                                        trigger: 'axis',
                                        axisPointer: {
                                                animation: false
                                        },
                                },
                                xAxis: {
                                        type: 'time',
                                        axisLabel: {
                                                formatter: function(value) {
                                                        var date = new 
Date(value);
                                                        var hours = 
date.getHours();
                                                        var minutes = "0" + 
date.getMinutes();
                                                        var seconds = "0" + 
date.getSeconds();
                                                        return hours + ':' + 
minutes.substr(-2) + ':' + seconds.substr(-2);
                                                }
                                        }
                                },
                                yAxis: {
                                        type: 'value'
                                },
                                dataZoom: [{
                                                type: 'slider',
                                                show: true,
                                                xAxisIndex: [0],
                                                start: 0,
                                                end: 100,
                                        },
                                        {
                                                type: 'inside',
                                                show: true,
                                                xAxisIndex: [0],
                                                start: 0,
                                                end: 100,
                                        }
                                ],
                                series: [{
                                                name: 'app',
                                                data: [],
                                                type: 'line',
                                        },
                                        {
                                                name: 'system',
                                                data: [],
                                                type: 'line'
                                        }
                                ]
                        };
                        // 使用配置项和数据显示图表
                        myChart.setOption(option);
                        let app_data = [];
                        let system_data = [];
                        let lastUpdateTime = Date.now();
                        let pageHiddenTime = null; // 记录页面隐藏的时间
                        let intervalId = null; // 存储定时器ID
   
                        // 更新数据函数 - 支持批量生成缺失的数据
                        function updateData(time, isBatch = false) {
                                var now = time || new Date();
                                
                                // 生成一个数据点
                                var app_value = {
                                        name: now.toString(),
                                        value: [
                                                now,
                                                generateRandomValue(),
                                        ]
                                };
                                
                                var system_value = {
                                        name: now.toString(),
                                        value: [
                                                now,
                                                generateRandomValue(),
                                        ]
                                };
                                
                                app_data.push(app_value);
                                system_data.push(system_value);
                                
                                // 非批量更新时才更新图表,批量更新会在最后统一处理
                                if (!isBatch) {
                                        updateChart();
                                        lastUpdateTime = Date.now();
                                }
                        }
                        
                        // 批量生成缺失的数据
                        function generateMissingData() {
                                if (pageHiddenTime) {
                                        // 计算页面隐藏的时间长度(毫秒)
                                        var hiddenDuration = Date.now() - 
pageHiddenTime;
                                        // 计算应该生成多少个数据点(每秒一个)
                                        var dataPointsToGenerate = 
Math.floor(hiddenDuration / 1000);
                                        
                                        
console.log(`生成${dataPointsToGenerate}个缺失的数据点`);
                                        
                                        // 生成缺失的数据点
                                        for (let i = 1; i <= 
dataPointsToGenerate; i++) {
                                                // 计算每个数据点的时间
                                                let time = new 
Date(pageHiddenTime + i * 1000);
                                                // 批量生成数据(不立即更新图表)
                                                updateData(time, true);
                                        }
                                        
                                        // 全部生成后统一更新图表
                                        updateChart();
                                        
                                        // 重置隐藏时间记录
                                        pageHiddenTime = null;
                                }
                        }
                        
                        // 更新图表显示
                        function updateChart() {
                                myChart.setOption({
                                        series: [{
                                                        name: 'app',
                                                        data: app_data,
                                                        markPoint: {
                                                                data: 
app_data.length != 0 ? [{
                                                                                
type: 'max',
                                                                                
name: '最大值'
                                                                        },
                                                                        {
                                                                                
type: 'min',
                                                                                
name: '最小值'
                                                                        },
                                                                        {
                                                                                
type: 'point',
                                                                                
name: '当前值',
                                                                                
value: app_data[app_data.length-1].value[1],
                                                                                
xAxis: app_data[app_data.length-1].value[0],
                                                                                
yAxis: app_data[app_data.length-1].value[1]
                                                                        }
                                                                ] : [],
                                                                label: {
                                                                        
position: 'inside',
                                                                        
formatter: function(param) {
                                                                                
if (param.data.type != 'point') {
                                                                                
        return param.data.type + ":" + param.value
                                                                                
}
                                                                        }
                                                                }
                                                        },
                                                        markLine: {
                                                                data: [{
                                                                        type: 
'average',
                                                                        name: 
'平均值'
                                                                }],
                                                                label: {
                                                                        
formatter: function(param) {
                                                                                
return "avg:" + param.value
                                                                        }
                                                                }
                                                        }
                                                },
                                                {
                                                        name: 'system',
                                                        data: system_data,
                                                        markPoint: {
                                                                data: 
system_data.length != 0 ? [{
                                                                                
type: 'max',
                                                                                
name: '最大值'
                                                                        },
                                                                        {
                                                                                
type: 'min',
                                                                                
name: '最小值'
                                                                        },
                                                                        {
                                                                                
type: 'point',
                                                                                
name: '当前值',
                                                                                
value: system_data[system_data.length-1].value[1],
                                                                                
xAxis: system_data[system_data.length-1].value[0],
                                                                                
yAxis: system_data[system_data.length-1].value[1]
                                                                        }
                                                                ] : [],
                                                                label: {
                                                                        
position: 'inside',
                                                                        
formatter: function(param) {
                                                                                
if (param.data.type != 'point') {
                                                                                
        return param.data.type + ":" + param.value
                                                                                
}
                                                                        }
                                                                }
                                                        },
                                                        markLine: {
                                                                data: [{
                                                                        type: 
'average',
                                                                        name: 
'平均值'
                                                                }],
                                                                label: {
                                                                        
formatter: function(param) {
                                                                                
return "avg:" + param.value
                                                                        }
                                                                }
                                                        }
                                                }
                                        ]
                                });
                        }
                        
                        // 启动数据更新定时器
                        function startDataUpdate() {
                                if (intervalId) clearInterval(intervalId);
                                intervalId = setInterval(updateData, 1000);
                        }
                        
                        // 监听数据缩放事件
                        function listen_dataZoom(chart) {
                                chart.on('dataZoom', function(params) {
                                        let startIndex = 
Math.floor(params.start * chart.getOption().series[0].data.length / 100);
                                        let endIndex = Math.floor(params.end * 
chart.getOption().series[0].data.length / 100);
                                        
chart.getOption().series.forEach(function(series) {
                                                let sum = 0;
                                                let count = endIndex - 
startIndex;
                                                for (var i = startIndex; i < 
endIndex; i++) {
                                                        sum += 
series.data[i].value[1];
                                                }
                                                let avg = sum / count;
                                                if (series.name === 'app') {
                                                        
document.getElementById('app_avg').innerHTML = "app平均值:" + avg.toFixed(2);
                                                } else if (series.name === 
'system') {
                                                        
document.getElementById('system_avg').innerHTML = "system平均值:" + avg.toFixed(2);
                                                }
                                        })
                                });
                        };
                        
                        // 实现获取区间数据功能
                        function exportData() {
                                var option = myChart.getOption();
                                var appData = option.series[0].data;
                                var systemData = option.series[1].data;
                                
                                var start = option.dataZoom[0].start;
                                var end = option.dataZoom[0].end;
                                
                                var startIndex = Math.floor(start * 
appData.length / 100);
                                var endIndex = Math.floor(end * appData.length 
/ 100);
                                
                                var selectedAppData = appData.slice(startIndex, 
endIndex);
                                var selectedSystemData = 
systemData.slice(startIndex, endIndex);
                                
                                var exportData = {
                                        app: selectedAppData.map(item => ({
                                                time: new 
Date(item.value[0]).toISOString(),
                                                value: item.value[1]
                                        })),
                                        system: selectedSystemData.map(item => 
({
                                                time: new 
Date(item.value[0]).toISOString(),
                                                value: item.value[1]
                                        }))
                                };
                                
                                var jsonStr = JSON.stringify(exportData, null, 
2);
                                var blob = new Blob([jsonStr], {type: 
'application/json'});
                                var url = URL.createObjectURL(blob);
                                
                                var a = document.createElement('a');
                                a.href = url;
                                a.download = 'chart_data_' + new 
Date().toISOString().slice(0,19).replace(/:/g,'-') + '.json';
                                document.body.appendChild(a);
                                a.click();
                                document.body.removeChild(a);
                        }
                        
                        // 页面可见性变化处理
                        document.addEventListener('visibilitychange', function 
() {
                            if (document.hidden) {
                                // 页面被隐藏时
                                pageHiddenTime = Date.now(); // 记录隐藏时间
                                localStorage.setItem('appData', 
JSON.stringify(app_data));
                                localStorage.setItem('systemData', 
JSON.stringify(system_data));
                                clearInterval(intervalId); // 清除定时器
                            } else {
                                // 页面重新可见时
                                var savedAppData = 
JSON.parse(localStorage.getItem('appData'));
                                var savedSystemData = 
JSON.parse(localStorage.getItem('systemData'));
                                
                                if (savedAppData && savedSystemData) {
                                    app_data = savedAppData;
                                    system_data = savedSystemData;
                                }
                                
                                generateMissingData(); // 生成缺失的数据
                                startDataUpdate(); // 重新启动定时器
                            }
                        });
                        
                        // 初始化
                        startDataUpdate();
                        listen_dataZoom(myChart);
                </script>
        </body>
   </html>
   ```
   我本地可以正常运行~


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to