您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

用MySQL构建一个工作跟踪流程_MySQL

2024/4/25 0:13:00发布3次查看
为了了解在node中如何使用mysql,我们来看一个需要rdbms的程序。
假设你要创建一个web程序,用来记录你是如何度过工作日的。这需要记录工作的日期,花在工作上的时间,以及工作完成情况的描述。
1. 系统分析1.1 系统流程这个程序会有个表单,用来输入工作的详细信息,如图:
? 工作信息输入后,可以被归档或删除,让它不再显示在用来输入更多工作的输入域上方,如图。 点击“archived work”链接可以把之前归档的工作项全部显示出来。
?1.2 系统任务创建程序逻辑 创建程序工作所需的辅助函数 编写让你可以用mysql添加、删除、更新和获取数据的函数 编写渲染html记录和表单的代码1.3 使用模块这个程序会用node内置的http模块实现web服务器的功能,用一个第三方模块跟mysql服务器交互。一个名为timetrack的定制模块,它是程序特有的函数,用来在mysql中存储、修改和获取数据。图5-4是这个程序的概览。
先用下面这条命令安装这个很受欢迎的mysql node模块:
npm install mysql
?
1.4 最终效果最终结果如图5-5所示,一个可以用来记录所做工作的简单web程序,还可以回顾、归档及删除工作记录。
?
2. 创建程序的逻辑接下来需要创建两个文件存放程序逻辑。这个两个文件分别是: timetrack_server.js,用来启动程序; timetrack.js,包含程序相关功能的模块。
先创建timetrack_server.js,把代码清单5-7中的代码放到里面。这段代码包含node的httpapi,程序特定的逻辑以及mysql api。根据你的mysql配置填入host、 user和password这些设定值。
var http = require( 'http' ) ;var work = require( './lib/timetrack' ) ;var mysql = require( 'mysql' ) ;var db = mysql.createconnection( { host: '127.0.0.1', user: 'root', password: 'root', database: 'timetrack'} ) ;
接下来添加代码清单5-8中的逻辑,定义web程序的行为。用这个程序可以浏览、添加和删除工作执行记录。此外还可以归档工作记录。被归档的工作记录不再出现在主页面上,但还可以在一个单独的web页面上浏览。
var server = http.createserver( function (req, res) { switch ( req.method ) { case 'post': { switch ( req.url ) { case '/': { work.add( db, req, res ) ; break ; } case '/archive': { work.archive( db, req, res ) ; break ; } case '/delete': { work.delete(db, req, res) ; break ; } } break ; } case 'get': { switch ( req.url ) { case '/': { work.show( db, res ) ; break ; } case 'http://blog.csdn.net/archived': { work.showarchived( db, res ) ; break ; } } break ; } }} ) ;
代码清单5-9是timetrack_server.js中的最后一块代码。这段代码创建了一个数据库表(如果不存在的话) , 启动http服务器,监听本机的3000端口。所有的node-mysql查询都用query函数执行。
db.query( 'create table if not exists work ( ' + 'id int(10) not null auto_increment, ' + 'hours decimal(5, 2) default 0, ' + 'date date, ' + 'archived int(1) default 0, ' + 'description longtext, ' + 'primary key(id) )', function (err) { if (err) throw err ; console.log( 'server started...' ) ; server.listen( 3000, '127.0.0.1' ) ; }) ;
3. 创建辅助函数发送html,创建表单,接收表单数据启动程序的文件已经完成,该创建定义程序其他功能的文件了。创建一个名为lib的目录,然后在这个目录下创建文件timetrack.js。把代码清单5-10中的代码放到这个文件中,其中包含node querystring api,并定义了辅助函数,用来发送web页面html,接收通过表单提交的数据。
npm install querystring
var qs = require( 'querystring' ) ;exports.sendhtml = function (res, html) { res.setheader( 'content-type', 'text/html' ) ; res.setheader( 'content-length', buffer.bytelength( html ) ) ; res.end( html ) ;} ;exports.parsereceiveddata = function (req, cb) { var body = '' ; req.setencoding( 'utf8' ) ; req.on( 'data', function (chunk) { body = chunk ; } ) ; req.on( 'end', function () { var data = qs.parse( body ) ; cb( data ) ; } ) ;} ;exports.actionform = function (id, path, label) { var html = '
' + '' + '' + '' ; return html ; } ;4. 用mysql添加数据辅助函数到位了,该编写往mysql数据库里添加工作记录的代码了。把下面代码清单里的代码添加到timetrack.js中。
exports.add = function (db, req, res) { exports.parsereceiveddata( req, function (work) { db.query( 'insert into work( hours, date, description ) ' + 'values ( ?, ?, ? )', [ work.hours, work.date, work.description ], function (err) { if (err) throw err ; exports.show( db, res ) ; } ) ; } ) ;} ;
注意上面代码中的问号(?),这是用来指明应该把参数放在哪里的占位符。在添加到查询语句中之前, query方法会自动把参数转义,以防遭受到sql注入攻击。此外还要留意一下query方法的第二个参数,是一串用来替代占位符的值。
5. 删除mysql数据exports.delete = function (db, req, res) { exports.parsereceiveddata(req, function (work) { db.query( 'delete from work where id = ?', [work.id], function (err) { if (err) throw err ; exports.show( db, res ) ; } ) ; } ) ;} ;
6. 更新mysql数据为了实现更新工作记录的逻辑,将它标记为已归档,把下面的代码添加到timetrack.js中。
exports.archive = function (db, req, res) { exports.parsereceiveddata( req, function (work) { db.query( 'update work set archived = 1 where id = ?', [work.id], function (err) { if (err) throw err ; exports.show( db, res ) ; } ) ; } ) ;} ;
7. 获取mysql数据添加、删除、更新工作记录的逻辑已经定义好了,现在可以把代码清单5-14中的逻辑添加到到timetrack中,用来获取工作记录数据(归档的或未归档的),从而把它渲染为html。在发起查询时传入了一个回调函数,它的参数rows是用来保存返回的查询结果的。
exports.show = function (db, res, showarchived) { console.log( 'in show function' ) ; var query = 'select * from work ' + 'where archived = ? ' + 'order by date desc ' ; var archivevalue = (showarchived) ? 1 : 0 ; console.log( 'archivevalue:' + archivevalue ) ; db.query( query, [archivevalue], function (err, rows) { console.log( rows ) ; if (err) throw err ; html = (showarchived) ? '' : 'archived work' ; html += exports.workhitlisthtml( rows ) ; html += exports.workformhtml() ; exports.sendhtml(res, html) ; } ) ;} ;exports.showarchived = function (db, res) { exports.show(db, res, true) ;}
8. 渲染mysql记录将下面代码清单中的代码添加到timetrack.js中。它会将工作记录渲染为html。
exports.workhitlisthtml = function (rows) { var html = '' ; for( var i in rows ) { html += '' ; html += '' html += '' html += '' if ( !rows[i].archived ) { html += '' } html += '' ; } html += '
' + rows[i].date + ' ' + rows[i].hours + ' ' + rows[i].description + ' ' + exports.workarchiveform( rows[ i ].id ) + ' ' +exports.workdeleteform( rows[i].id )+ '
' ; return html ; } ;9. 渲染html表单exports.workformhtml = function () { var html = '
' + ' date (yyyy-mm-dd):
' + ' hours worked:
' + ' description:
' + '
' + '' + '' ; return html ; } ; exports.workarchiveform = function (id) { return exports.actionform(id, '/archive', 'archive') ; } ; exports.workdeleteform = function (id) { return exports.actionform( id, '/delete', 'delete' ) ; } ;10. 试一下程序已经做完了,现在可以运行了。记得先用mysql管理工具创建名为timetrack的数据库。然后在命令行中用下面的命令启动程序:
node timetrack_server.js
最后在浏览器中访问http://127.0.0.1:3000
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录