Highcharts+NodeJS搭建数据可视化平台示例


Posted in NodeJs onJanuary 01, 2017

前一段时间完成了一个数据可视化项目,由后台NodeJS+Highcharts框架进行搭建。下面分享一下整个开发过程的流程,以及使用Highcharts框架的经验。

一、数据的读取

由于数据库使用的是MySQL数据库,在NodeJS中,可以使用NodeJS中的mysql模块进行mysql数据库的相关操作,通过npm安装即可。

1.数据库基本配置

为了方便,我们最好先进行一个数据库连接的基本配置,mysql模块需要的配置信息如下:

var connection = mysql.createConnection({ 
 host   : '127.0.0.1', 
 user   : 'root', 
 password : 'root', 
 database : 'Your_Database', 
 port : 3306 
});

tips:当我们在本地开发时,可以先将线上数据库中的数据拷贝一部分到本地,如利用php myadmin,然后通过读取本地数据进行开发。

 2.数据库连接

我们可以设定,当访问到某个url后,自动建立mysql连接,代码如下:

router.get('/test', function (req, res, next) { 
 var username = req.cookies.username; 
 if(typeof username === "undefined" || username != "yidianzixun@163.com"){ 
  res.redirect('/'); 
 }else{ 
  if(connection.threadId){ 
   return; 
  }else{ 
   connection.connect(function(err) { 
    if (err) { 
     console.error('error connecting: ' + err.stack); 
     return; 
    } 
    console.log('connected as id ' + connection.threadId); 
   }); 
  } 
 } 
})

 注意这里面的验证。我们这里的项目比较简单,仅使用cookie做身份验证。当我们要建立数据库连接时,首先一定要进行身份验证,否则任何人发送请求就都可以和我们的数据库进行连接了,会造成很严重的安全隐患。

通过调用mysql中的connect方法,进行mysql数据库的连接。这里注意,数据库的连接不能并行,否则会报错。因此为了安全,我们首先必须要先判断一下当前是否已经连接了数据库,这里可以使用connection.threadId判断其是否定义,从而判断其是否已经建立连接。如果已经建立了连接,则不要再次建立连接。

 3.执行查询语句

通过调用query()方法,即可处理语句查询操作,输入的内容可以是任何正确的mysql查询语句,也可以嵌套其他变量,最后只要拼接出一个字符串即可。实例如下:

router.post('/test', function (req, res, next) { 
 var startDate = req.body.startDate; 
 var endDate = req.body.endDate; 
 connection.query('SELECT `date`, COUNT(DISTINCT `idea_id`) AS num,  
  SUM(`view`) AS view, SUM(`click`) AS click,  
  SUM(`cost`) AS cost FROM `idea_report_all`  
  where `date` BETWEEN "' + startDate + '" AND "' + endDate +  
  '" GROUP BY `date` ORDER BY `date` ASC', function(err, rows, fields) { 
  if (err) throw err; 
  var rows = calculate(rows); 
  res.send(JSON.stringify(rows)); 
 }); 
})

这里我们根据获取到的开始日期和截止日期,拼接成一个query语句,查询出我们需要的数据,最后可以在回调函数中调用(rows参数),是一个数组。

 最后,将这个数据反回给前台即可,前台进行数据的处理和可视化。

二、HighCharts使用

Highcharts的使用可以在官方API上查看各个方法,而且有在线演示,非常方便(推荐Highcharts中文网)。其中最麻烦的就是要绘制的图表的配置项所需要的各个参数所组成的对象。建议设定一个构造这个对象的构造器,根据传入的各个参数构造出对应需要的HighCharts配置项。因为传入的参数过多,我们要使用对象的形式进行构建。关于HighCharts框架的更多使用,将在以后博客中更新,可以先看一下下面这个构造的例子。

function greateOptions (id, text, xAxisTitle, date, yAxisTitle1, yAxisTitle2, k1,unit1, k2,unit2, series, color, tooltip) { 
  var data = new Object(); 
  data.chart = { 
    renderTo: id, 
  marginLeft: 50, 
  marginTop: 70 
  }; 
 data.colors = color; 
  data.title = { 
    text: text, 
    align: "left" 
  }; 
 data.tooltip = { 
  crosshairs: true, 
  shared: true, 
  useHTML: true, 
  style: { 
   padding: 10 
  }, 
  headerFormat: '<table><tr><td>' + tooltip + ':</td><td>{point.key}</td></tr>', 
  pointFormat: '<tr><td style="color: {series.color}">{series.name}: </td>' + 
         '<td style="text-align: left"><b>{point.y}</b></td></tr>', 
  footerFormat: '</table>' 
 }; 
 data.noData = { 
  style: { 
   fontWeight: 'bold', 
   fontSize: '15px', 
   color: '#303030' 
  } 
 }; 
 data.lang = { 
  noData: "正在为您加载数据......" 
 }; 
 data.credits = { 
  enabled: false 
 }; 
  data.xAxis = { 
    tickPosition: 'outside', 
  title : { 
    text: xAxisTitle || '' 
  }, 
  categories: date 
  }; 
  data.yAxis = [{ 
    lineWidth: 1, 
    title: { 
      text: yAxisTitle1 || '' 
    }, 
    labels: { 
      formatter: function(){ 
        return this.value/k1 + unit1; 
      } 
    } 
  },{ 
    lineWidth: 1, 
    opposite: true, 
    title: { 
      text: yAxisTitle2 || '' 
    }, 
    labels: { 
      formatter: function(){ 
        return this.value/k2 + unit2; 
      } 
    } 
  }]; 
  data.series = series; 
  return data; 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
跟我学Nodejs(三)--- Node.js模块
May 25 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 #NodeJs
浅谈Nodejs中的作用域问题
Dec 26 #NodeJs
nodeJS删除文件方法示例
Dec 25 #NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 #NodeJs
详解Nodejs的timers模块
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 #NodeJs
You might like
php木马攻击防御之道
2008/03/24 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP curl使用实例
2015/07/02 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
强制设为首页代码
2006/06/19 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
计算机专业毕业生求职信分享
2013/12/24 职场文书
标准化管理实施方案
2014/02/25 职场文书
趣味运动会策划方案
2014/06/02 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
活动总结书怎么写
2015/05/11 职场文书
大学副班长竞选稿
2015/11/21 职场文书
《春酒》教学反思
2016/02/22 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python