使用SQL语句生成 web图表

简单学了下nodejs web开发框架express,以及一些相关的技术…

关于express的部分主要参考:Node.js开发框架Express4.xNode.js + Express 构建网站简单示例

需要注意的是,express 4.x 构建器独立成了一个模块,如果要使用系统中的express命令,就必须安装独立的generator:

npm install -g express express-generator bower supervisor
express -e bower-express

supervisor 是个好东西,代码变更可以热加载,自动重启:supervisor app.js

(一).首先来看主文件,app.js:

var express = require(‘express‘), ejs = require(‘ejs‘), routes = require(‘./routes/index‘), users = require(‘./routes/users‘), session = require(‘express-session‘), RDBStore = require(‘express-mysql-session‘);
var app = express();
// 定义视图路径及修改ejs模板后缀名
app.set(‘views‘, ‘views‘);
app.engine(‘.html‘, ejs.__express);
app.set(‘view engine‘, ‘html‘);
app.use(require(‘body-parser‘).urlencoded({ extended: false }));
// 定义静态文件路径
app.use(express.static(‘public‘));
app.use(express.static(‘bower_components‘));
// session保存
const options = {
    host : ‘1.1.1.1‘,
    user : ‘test‘,
    port : 5029,
    password : ‘test‘,
    database : ‘test‘
};
app.use(session({
    secret : ‘test‘,
    store : new RDBStore(options),
    cookie : { maxAge: 10000 },
    resave : true,
    saveUninitialized : true
}));
// URL路由
app.get(‘/‘, routes.index).post(‘/‘, routes.index);
// 显示404错误及输出
app.use(function(req, res, next) {
    var err = new Error(‘Not Found‘);
    err.status = 404;
    next(err);
});
// 生产环境异常打印
if (app.get(‘env‘) === ‘development‘)
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render(‘error‘, {
            message: err.message,
            error: err
        });
    });
// 启动及端口
//require(‘http‘).createServer(app).listen(3000);
app.listen(3000, function() {
    console.log(‘Express server listening on 3000‘);
});

由于没装No-SQL数据库,因此就用mysql来缓存session,

进入express生成的项目后使用npm安装即可:npm install express-mysql-session

用法很简单,启动项目后会在目标库自动新建一张innodb表,可以将其改为memory引擎:

ALTER TABLE sessions MODIFY data VARCHAR(5000),ENGINE=MEMORY;

当然,使用mongos或者rethinkdb会更方便,问题是node模块太多了有点眼花缭乱不知道用哪个好(bug少)……譬如:

npm install express-session-rethinkdb connect-rethinkdb session-rethinkdb

(二).好吧,接下来看“action”,routes/index.js:

var router = require(‘express‘).Router(), mysql = require(‘mysql‘);

const options = [{ host : ‘1.1.1.1‘, user : ‘test‘, port : 5029, password : ‘test‘, database : ‘test‘, dateStrings : true }, {
{ host : ‘1.1.1.2‘, user : ‘test‘, port : 3306, password : ‘test‘, database : ‘test‘, dateStrings : true }, {
{ host : ‘1.1.1.3‘, user : ‘test‘, port : 3307, password : ‘test‘, database : ‘test‘, dateStrings : true//, multipleStatements : true
}];

module.exports.index = function(req, res) {
    var connection, sql;
    if (req.method == ‘POST‘ && req.body && req.body.host && /^[1-3]$/.test(req.body.host) && req.body.title && req.body.sql) {
        //var pool = mysql.createPool(options[2]);
        connection = mysql.createConnection(options[req.body.host]);
        sql = req.body.sql;
    } else {
        res.render(‘index‘, {
            ‘params‘ : { title : ‘‘, sql : ‘‘, host : ‘‘}, ‘x‘ : ‘[]‘, ‘y‘ : ‘[]‘
        });
        return;
    }
    connection.query(sql, function(err, rows, fields) {
        if (err) throw err;
        var x = [], y = [];
        for (var i in rows) {
            //if (rows[i].x instanceof Date) x[i] = require(‘moment‘)(rows[i].x).format(‘YYYY-MM-DD‘);
            x[i] = rows[i].x;
            y[i] = rows[i].y;
        }
        res.json({ ‘x‘ : x, ‘y‘ : y });
    });
    connection.end();
};

代码很简单,GET请求直接返回页面(当然也可以处理queryString),POST请求返回JSON数据。

一开始不知道node-mysql有个 dateStrings的参数,所以用 moment.js来转换日期格式,也很方便。

在开发页面前先使用 bower下载好所需的jQuery、BootstrapACEECharts等库:

bower install ace echarts bootstrap jquery

(三).最后来上展示页面,views/index.html:

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <title><%-params.title%></title>
    <link rel="stylesheet" href="bootstrap/dist/css/bootstrap.min.css">
</head>
<body>
    <div id="editor" style="height:60px;font-size:16px"><%-params.sql%></div>
    <form style="width:60%;height:90px;padding:10px 40px">
        <div class="form-group col-xs-4" style="padding-left:0px">
            <select class="form-control" name="host">
                <option value="">Select Host</option>
                <option value="0">1.1.1.1:5029</option>
                <option value="1">1.1.1.2:3306</option>
                <option value="2">1.1.1.3:3306</option>
            </select>
        </div>
        <div class="form-group col-xs-4" style="padding-left:0px">
            <input type="text" name="title" class="form-control" placeholder="title" value="<%-params.title%>" />
        </div>
        <button type="button" onclick="query()" class="btn btn-primary">Query</button>
    </form>
    <hr />
    <div id="main" style="height:400px"></div>
    <script src="echarts/build/dist/echarts.js"></script>
    <script type="text/javascript" src="jquery/dist/jquery.min.js"></script>
    <script type="text/javascript" src="bootstrap/dist/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="javascripts/ace/src-min-noconflict/ace.js"></script>
    <script type="text/javascript">
// js在下面  ↓↓↓↓↓
    </script>
</body>

以上的JS代码如下:

$(‘select‘).val(<%-params.host%>);
var editor = ace.edit(‘editor‘), myChart, options = {
    tooltip: { show: true },
    legend: { data : [‘<%-params.title%>‘] },
    xAxis : [{ type : ‘category‘, data : <%-x%> }],
    yAxis : [{ type : ‘value‘ }],
    series : [{ ‘name‘ : ‘<%-params.title%>‘, ‘type‘ : ‘bar‘, ‘data‘ : <%-y%> }]
};
editor.setTheme(‘ace/theme/sql‘);
editor.getSession().setUseWrapMode(true);
editor.getSession().setMode(‘ace/mode/sql‘);
// 路径配置
require.config({ paths: { echarts: ‘echarts/build/dist‘ } });
// 使用
require(
    [ ‘echarts‘, ‘echarts/chart/bar‘ ],
    function (ec) {
        myChart = ec.init($(‘#main‘).get(0));
        myChart.setOption(options);
    }
);

function query() {
    myChart.showLoading();
    $.ajax({
        url : window.location.pathname,
        cache : false,
        type : ‘POST‘,
        dataType : ‘json‘,
        data : $(‘form‘).serialize() + ‘&sql=‘ + editor.getValue(),
        success : function(obj) {
            options.legend.data[0] = $(‘:text‘).val();
            options.xAxis[0].data = obj.x;
            options.series[0].data = obj.y;
            myChart.clear();
            myChart.hideLoading();
            myChart.setOption(options);
        }
    });
}

注意:

  • echarts的 setOption 方法是更新操作,因此要先clear图表后重新绘图;
  • ACE是一个源码编辑器,同大名鼎鼎的CodeMirror类似,API也是大同小异;
  • 如果bower 下载的ACE没有编译,前往ace-builds页面下载。

至此,一个简单的web应用就诞生了,就像 ChartSQL做的那样,可以再完善ajax异常处理、node-mysql的连接池等。

好久没碰过前端相关的技术,写起来各种生疏,代码拙劣、欢迎指教。最后来一张效果图:

时间: 2024-11-04 08:42:41

使用SQL语句生成 web图表的相关文章

在线数据库表(sql语句)生成java实体类工具 - 参考手册

SQL建表语句 说明 格式良好的SQL建表语句,可以是直接从PowerDesigner.Navicat等工具中导出SQL建表语句.所谓格式良好,是指建表指令与表名必须在一行,字段名称.类型.注释必须在一行,因为这个工具是用正则实现的,并不是语法解析器,当然,以后有时间的话,会改进成解析器. 举例 -- ---------------------------- -- Table structure for t_activity -- ---------------------------- DRO

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

金蝶BOS 7.5 SQL语句生成分析

今天刚好有空,就分析下 金蝶BOS 7.5 SQL语句生成 方式.(分析环境 Oracle 11.0.2 , 金蝶BOS 7.5.0) 1 操作思路 思路是这样的,在开发环境触发SQL操作,然后在数据库中查出最近执行的SQL,对其分析. 数据库里使用SQL语句: --这里只查询JDBC操作的SQL语句 SELECT t.sql_id,        t.sql_text,        t.sql_fulltext,        to_char(t.last_active_time, 'yyy

PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换

本篇文章主要介绍了PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换 超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软件准备 软件:Navicat 11.1,Powerdesigner 15 2.安装步骤 第一步:将要生成的数据库导出为sql文件 第二步:打开PowerDesigner选择File-->Reverse Engineer --> Database... 第三步:选择MySQL5.0数据库 第四步:找到第一步生

转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类

在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个sql语句的生成类来帮助生成sql语句,当前如果不实现这个类也不会影响orm的制作,之所以要做这么一个类主要有几个目的,1.减少sql语句中拼写错误的发生.2.统一解决防sql注入的问题. 下面分别说明一下这两个类的实现方式: 1.配置类DbConfig using System; using Sys

sql语句 生成数据库表

  打开PowerDesigner,鼠标单击File菜单: 2 选择:Reverse Enginer,然后在他的子菜单选择Database...; 3 选择好DBMS(数据库管理系统)类型:然后点击确定按钮:这里演示选中的是mysql数据库,具体类型根据自己需要选择: 4 点击Add  Files 图标添加脚本: 5 找到要导入的sql脚本,鼠标单击打开按钮: 6 鼠标单击,确定按钮: 7 开始反向工程生成数据库..... 8 导入成功! 原文地址:https://www.cnblogs.com

SQL语句生成指定范围内随机数

1.生成随机实型数据 create procedure awf_RandDouble @min dec(14,2), @max dec(14,2), @result dec(14,2) output as begin set @result= cast((rand()*(@[email protected])[email protected]) as dec(14,2)) return @result end 2.生成随机整型数据 create procedure awf_RandInt @mi

MysQL第二课 sql语句生成数据库

场景 mysql 可执行程序目录:C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin 登录指令mysql.exe -u root  -p 输入密码:admin123 show databases;//s是必须,;是必须,显示所有的数据库 导入数据表的时候,必须选择一个数据库,否则出现错误提示:No database selected,使用指令 use test; 注意:创建数据库指令: create database test; 导入数据库指令:

(摘)Entity Framework Core 2.1带来更好的SQL语句生成方案

微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Core 2.1的第一个重要新增特性是将GroupBy操作符翻译成包含GROUP BY子句的SQL.缺乏这种支持被认为是EF Core 2.0中的一个重大疏漏. 同样,对延迟加载的支持也被纳入到EF Core 2.1中.为了支持延迟加载,现在实体的构造函数可以包含参数.在定义好构造函数后,EF Core可