一、由于数据包含机密信息,因此得本身搭建图表导出服务器;在后台生成对应Highcharts图表、以图片的形式导出保存。
二、图表个性化程度较高,如一些图列是Highchart没有的,但在前端能够利用css实现。
三、每周定时执行上述生成图表的任务,保存到指定位置。
四、需求已经上线一个月,生产上运行良好,时间有限,只能在这简单记录下,理一下思路也方便之后查阅。css
一、通过一番了解,发现Puppeteer,PhantomJs等能够实现上述Highchart图表以图片形式导出的功能,它们也经常用于:前端
二、这个需求选用了Puppeteer去完成,缘由以下:node
三、定时任务的需求则用了Cron实现;在设定的时间点,在后台用Puppeteer打开咱们网页,实现特定区域截图。linux
一、 安装,安装puppeteer同时,也会下载Chromium,安装地址为外国网站,下载失败的话多尝试几回、切换到cnpm或者手动下载。若是是部署再Linux上的话,还得安装依赖包才能启动Chromium,具体操做能够查看下面。git
# 安装 npm i puppeteer --save
二、任意区域截图github
第一张图为图表的HTML页面,第二张图是指定区域的截图,代码以下:chrome
const express = require('express'); const puppeteer = require('puppeteer'); const app = express(); app.use(express.static('public')); async function screenshot() { try { // 添加启动参数'--no-sandbox', '--disable-setuid-sandbox' // 解决Linux环境下"no use sandbox"报错 const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'], headless: true }); const page = await browser.newPage(); await page.goto('http://localhost:3008/'); let clip = await page.evaluate(() => { // 获取指定容器的坐标信息 let { x, y, width, height } = document.getElementById('container').getBoundingClientRect(); return { x, y, width, height }; }); await page.screenshot({ path:'chart.png', clip:clip //设置clip 属性 }); await page.close(); await browser.close(); } catch (error) { throw error; } } // 访问http://localhost:3008/screenshot进行截图 app.get('/screenshot', (req, res) => { screenshot() .then(data => res.json('clip successed')) .catch(err => res.json('clip failed')); }); app.listen(3008);
const CronJob = require('cron').CronJob; // 天天9点钟执行定时任务,其余时间可查找corn表达是或者使用corn表达式生成工具 new CronJob({ cronTime: '0 0 9 * * *', onTick: function () { screenshot(); }, start: true });
至此,咱们实现了导出Highcharts图表的功能,可是这只是在windows系统的开发机上把这个流程跑通,部署到linux机器上是仍需解决如下几点问题express