一、由於數據包含機密信息,因此得本身搭建圖表導出服務器;在後臺生成對應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