目錄
1. 系统分析
1.1 系统流程
1.2 系统任务
1.3 使用模块
1.4 最终效果
2. 创建程序的逻辑
3. 创建辅助函数发送HTML,创建表单,接收表单数据
4. 用MySQL添加数据
5. 删除MySQL数据
6. 更新MySQL数据
7. 获取MySQL数据
8. 渲染MySQL记录
9. 渲染HTML表单
10. 试一下
首頁 資料庫 mysql教程 用MySQL构建一个工作跟踪流程_MySQL

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

May 27, 2016 pm 01:45 PM
流程

为了了解在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模块:

<code class="language-npm hljs cmake">npm install mysql</code>
登入後複製

这里写图片描述
?

1.4 最终效果

最终结果如图5-5所示,一个可以用来记录所做工作的简单Web程序,还可以回顾、归档及删除工作记录。
这里写图片描述
?

2. 创建程序的逻辑

接下来需要创建两个文件存放程序逻辑。这个两个文件分别是: timetrack_server.js,用来启动程序; timetrack.js,包含程序相关功能的模块。
先创建timetrack_server.js,把代码清单5-7中的代码放到里面。这段代码包含Node的HTTPAPI,程序特定的逻辑以及MySQL API。根据你的MySQL配置填入host、 user和password这些设定值。

<code class="language-javascript hljs ">var http = require( &#39;http&#39; ) ;
var work = require( &#39;./lib/timetrack&#39; ) ;
var mysql = require( &#39;mysql&#39; ) ;

var db = mysql.createConnection( {
    host: &#39;127.0.0.1&#39;,
    user: &#39;root&#39;,
    password: &#39;root&#39;,
    database: &#39;timetrack&#39;
} ) ;</code>
登入後複製

接下来添加代码清单5-8中的逻辑,定义Web程序的行为。用这个程序可以浏览、添加和删除工作执行记录。此外还可以归档工作记录。被归档的工作记录不再出现在主页面上,但还可以在一个单独的Web页面上浏览。

<code class="language-javascript hljs ">var server = http.createServer( function (req, res) {
    switch ( req.method ) {
        case &#39;POST&#39;: {
            switch ( req.url ) {
                case &#39;/&#39;: {
                    work.add( db, req, res ) ;
                    break ;
                }
                case &#39;/archive&#39;: {
                    work.archive( db, req, res ) ;
                    break ;
                }
                case &#39;/delete&#39;: {
                    work.delete(db, req, res) ;
                    break ;
                }
            }
            break ;
        }

        case &#39;GET&#39;: {
            switch ( req.url ) {
                case &#39;/&#39;: {
                    work.show( db, res ) ;
                    break ;
                }
                case &#39;http://blog.csdn.net/archived&#39;: {
                    work.showArchived( db, res ) ;
                    break ;
                }
            }
            break ;
        }
    }
} ) ;</code>
登入後複製

代码清单5-9是timetrack_server.js中的最后一块代码。这段代码创建了一个数据库表(如果不存在的话) , 启动HTTP服务器,监听本机的3000端口。所有的node-mysql查询都用query函数执行。

<code class="language-javascript hljs ">db.query(
    &#39;create table if not exists work ( &#39; +
    &#39;id int(10) not null auto_increment, &#39; +
    &#39;hours decimal(5, 2) default 0, &#39; +
    &#39;date date, &#39; +
    &#39;archived int(1) default 0, &#39; +
    &#39;description longtext, &#39; +
    &#39;primary key(id) )&#39;,
    function (err) {
        if (err) throw err ;
        console.log( &#39;Server started...&#39; ) ;
        server.listen( 3000, &#39;127.0.0.1&#39; ) ;
    }
) ;</code>
登入後複製

3. 创建辅助函数发送HTML,创建表单,接收表单数据

启动程序的文件已经完成,该创建定义程序其他功能的文件了。创建一个名为lib的目录,然后在这个目录下创建文件timetrack.js。把代码清单5-10中的代码放到这个文件中,其中包含Node querystring API,并定义了辅助函数,用来发送Web页面HTML,接收通过表单提交的数据。

<code class="language-npm hljs cmake">npm install querystring</code>
登入後複製
<code class="language-javascript hljs ">var qs = require( &#39;querystring&#39; ) ;

exports.sendHtml = function (res, html) {
    res.setHeader( &#39;Content-Type&#39;, &#39;text/html&#39; ) ;
    res.setHeader( &#39;Content-Length&#39;, Buffer.byteLength( html ) ) ;
    res.end( html ) ;
} ;

exports.parseReceivedData = function (req, cb) {
    var body = &#39;&#39; ;
    req.setEncoding( &#39;utf8&#39; ) ;
    req.on( &#39;data&#39;, function (chunk) {
        body = chunk ;
    } ) ;
    req.on( &#39;end&#39;, function () {
        var data = qs.parse( body ) ;
        cb( data ) ;
    } ) ;
} ;

exports.actionForm = function (id, path, label) {
    var html = &#39;</code>
登入後複製
&#39; + &#39;<input name="id" type="hidden" value="' + id + '" />&#39; + &#39;<input type="submit" value="' +label+ '" />&#39; + &#39;
&#39; ; return html ; } ;

4. 用MySQL添加数据

辅助函数到位了,该编写往MySQL数据库里添加工作记录的代码了。把下面代码清单里的代码添加到timetrack.js中。

<code class="language-javascript hljs ">exports.add = function (db, req, res) {
    exports.parseReceivedData( req, function (work) {
        db.query(
            &#39;insert into work( hours, date, description ) &#39; +
            &#39;values ( ?, ?, ? )&#39;,
            [ work.hours, work.date, work.description ],
            function (err) {
                if (err) throw err ;
                exports.show( db, res ) ;
            }
        ) ;
    } ) ;
} ;</code>
登入後複製

注意上面代码中的问号(?),这是用来指明应该把参数放在哪里的占位符。在添加到查询语句中之前, query方法会自动把参数转义,以防遭受到SQL注入攻击。此外还要留意一下query方法的第二个参数,是一串用来替代占位符的值。

5. 删除MySQL数据

<code class="language-javascript hljs ">exports.delete = function (db, req, res) {
    exports.parseReceivedData(req, function (work) {
        db.query(
            &#39;delete from work where id = ?&#39;,
            [work.id],
            function (err) {
                if (err) throw err ;
                exports.show( db, res ) ;
            }
        ) ;
    } ) ;
} ;</code>
登入後複製

6. 更新MySQL数据

为了实现更新工作记录的逻辑,将它标记为已归档,把下面的代码添加到timetrack.js中。

<code class="language-javascript hljs ">exports.archive = function (db, req, res) {
    exports.parseReceivedData( req, function (work) {
        db.query(
            &#39;update work set archived = 1 where id = ?&#39;,
            [work.id],
            function (err) {
                if (err) throw err ;
                exports.show( db, res ) ;
            }
        ) ;
    } ) ;
} ;</code>
登入後複製

7. 获取MySQL数据

添加、删除、更新工作记录的逻辑已经定义好了,现在可以把代码清单5-14中的逻辑添加到到timetrack中,用来获取工作记录数据(归档的或未归档的),从而把它渲染为HTML。在发起查询时传入了一个回调函数,它的参数rows是用来保存返回的查询结果的。

<code class="language-javascript hljs ">exports.show = function (db, res, showArchived) {
    console.log( &#39;in show function&#39; ) ;
    var query = &#39;select * from work &#39; +
       &#39;where archived = ? &#39; +
       &#39;order by date desc &#39; ;
    var archiveValue = (showArchived) ? 1 : 0 ;
    console.log( &#39;archiveValue:&#39; + archiveValue ) ;
    db.query(
        query,
        [archiveValue],
        function (err, rows) {
            console.log( rows ) ;
            if (err) throw err ;
            html = (showArchived)
                ? &#39;&#39;
                : &#39;Archived Work
&#39; ;
            html += exports.workHitlistHtml( rows ) ;
            html += exports.workFormHtml() ;
            exports.sendHtml(res, html) ;
        }
    ) ;
} ;

exports.showArchived = function (db, res) {
    exports.show(db, res, true) ;
}</code>
登入後複製

8. 渲染MySQL记录

将下面代码清单中的代码添加到timetrack.js中。它会将工作记录渲染为HTML。

<code class="language-javascript hljs ">exports.workHitlistHtml = function (rows) {
    var html = &#39;&#39; ;
    for( var i in rows ) {
        html += &#39;&#39; ;
        html += &#39;&#39;
        html += &#39;&#39;
        html += &#39;&#39;
        if ( !rows[i].archived ) {
            html += &#39;&#39;
        }
        html += &#39;&#39; ;
    }
    html += &#39;</code>
登入後複製
&#39; + rows[i].date + &#39; &#39; + rows[i].hours + &#39; &#39; + rows[i].description + &#39; &#39; + exports.workArchiveForm( rows[ i ].id ) + &#39; &#39; +exports.workDeleteForm( rows[i].id )+ &#39;
&#39; ; return html ; } ;

9. 渲染HTML表单

<code class="language-javascript hljs ">exports.workFormHtml = function () {
   var html = &#39;</code>
登入後複製
&#39; + &#39;

Date (YYYY-MM-DD):<br /> <input name="date" type="text" />

&#39; + &#39;

Hours worked:<br /> <input name="hours" type="text" />

&#39; + &#39;

Description:
&#39; + &#39;

&#39; + &#39;&#39; + &#39;
&#39; ; 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的数据库。然后在命令行中用下面的命令启动程序:

<code class="language-node hljs avrasm">node timetrack_server.js</code>
登入後複製

最后在浏览器中访问http://127.0.0.1:3000

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

怎麼開多個頭條帳號?申請頭條號小號的流程是什麼? 怎麼開多個頭條帳號?申請頭條號小號的流程是什麼? Mar 22, 2024 am 11:00 AM

隨著行動互聯網的普及,今日頭條已成為我國最受歡迎的新聞資訊平台之一。許多用戶希望在頭條平台上擁有多個帳號,以滿足不同的需求。那麼,如何開立多個頭條帳號呢?本文將詳細介紹開設多個頭條帳號的方法和申請流程。一、怎麼開多個頭條帳號?開設多個頭條帳號的方法如下:在頭條平台上,用戶可以透過不同的手機號碼註冊帳號。每個手機號只能註冊一個頭條帳號,這表示用戶可以利用多個手機號註冊多個帳號。 2.郵箱註冊:使用不同的郵箱地址註冊頭條帳號。與手機號碼註冊類似,每個郵箱地址也可以註冊一個頭條帳號。 3.第三方帳號登入

抖音睡眠主播有收益嘛?睡眠直播的具體流程有哪些? 抖音睡眠主播有收益嘛?睡眠直播的具體流程有哪些? Mar 21, 2024 pm 04:41 PM

在當今這個快節奏的社會,睡眠品質問題困擾著越來越多的人。為了改善用戶的睡眠質量,抖音平台上出現了一群特殊的睡眠主播。他們透過直播與用戶互動,分享睡眠技巧,提供放鬆的音樂和聲音,幫助觀眾安然入睡。那麼,這些睡眠主播是否有收益呢?本文將圍繞這一問題展開探討。一、抖音睡眠主播有收益嘛?抖音睡眠主播確實能夠獲得一定的效益。首先,他們可以透過直播間的打賞功能獲得禮物和轉賬,這些收益取決於他們的粉絲數量和觀眾滿意度。其次,抖音平台會依照直播的觀看量、按讚量、分享量等數據,給予主播一定的分成。一些睡眠主播還會

崩壞星穹鐵道行過死蔭之地任務攻略流程 崩壞星穹鐵道行過死蔭之地任務攻略流程 Mar 28, 2024 pm 01:10 PM

崩壞星穹鐵道行過死蔭之地怎麼做?行過死蔭之地是主線任務【鴿群中的貓】其中一環,也是主線的最後階段,下面小編帶來崩壞星穹鐵道行過死蔭之地任務詳解,感興趣的小伙伴們快來看看。 1.過完上一階段劇情後,會自動傳送到下圖位置,和三月七對話後進入副本,記得組好隊2.備用方案是要打【石心十人】詭異砂金,隊伍四個角色戰術和終結技最好都是群攻,最好帶上盾和奶,這個【石心十人】詭異砂金不好打,搖骰子的時候,如果你的點數大於砂金就不會被打,且結束後回滿終結技能量,小於就會被打,所以盡量帶群攻角色打點數。在boss

崩壞星穹鐵道所有悲傷的故事任務攻略流程 崩壞星穹鐵道所有悲傷的故事任務攻略流程 Mar 28, 2024 pm 01:26 PM

崩壞星穹鐵道所有悲傷的故事怎麼做?所有悲傷的故事是主線任務【鴿群中的貓】其中一環,此階段流程比較長,下面小編帶來崩壞星穹鐵道所有悲傷的故事任務詳解,各位朋友們來看看吧。 1.完成前一階段之後,會自動傳送到第2個新地圖【克勞克影視樂園】,一路追蹤任務從1【彈珠機】去2位置跟著第3位角色發揮,完成劇情後,前往第4位位置和小孩對話,完成小遊戲【速度與堅果】,類似天天酷跑的小遊戲很簡單。 3.接著追蹤任務從下圖1位置【彈珠機】飛到2位置4.到下圖位置後,需要走迷宮,從左邊進去後,一直靠右走即可到達1任務點5

php-fpm請求處理流程詳解與最佳化策略 php-fpm請求處理流程詳解與最佳化策略 Jul 07, 2023 pm 01:52 PM

php-fpm請求處理流程詳解與最佳化策略一、引言在Web應用開發中,PHP是一種非常流行的伺服器端腳本語言。而php-fpm(FastCGIProcessManager)則是PHP的一種管理器,用來處理PHP請求。本文將詳細介紹php-fpm的請求處理流程,並探討如何最佳化php-fpm,提升Web應用的效能。二、php-fpm請求處理流程客戶端發起請求當

Vue開發經驗分享:優化開發流程與工作效率的經驗 Vue開發經驗分享:優化開發流程與工作效率的經驗 Nov 22, 2023 am 10:53 AM

Vue.js是一種流行的JavaScript框架,用於建立使用者介面和單頁面應用程式。其簡潔的語法、靈活性和強大的功能使得它成為了許多開發者的首選。在最近的專案開發中,我和我的團隊累積了一些優化開發流程和工作效率的經驗,特此分享給大家。首先,作為Vue.js開發的基礎,我們要充分了解Vue.js的生態系統和核心概念。 Vue.js的核心概念包括資料驅動、元件系統

Java語言中的軟體開發流程介紹 Java語言中的軟體開發流程介紹 Jun 10, 2023 am 11:07 AM

Java語言是一種使用廣泛的物件導向程式語言,被廣泛應用於企業級軟體開發。在Java語言中,軟體開發流程是一個非常重要的部分,它能夠幫助開發團隊更有效率地完成軟體開發任務。本文將會介紹Java語言中的軟體開發流程,並探討其各階段所要完成的任務。需求分析階段軟體開發的第一步是進行需求分析,該階段旨在確定軟體需求。在Java語言中的需求分析階段,開發團隊需要

使用PHP建立大數據應用的基本流程 使用PHP建立大數據應用的基本流程 May 11, 2023 pm 04:58 PM

近年來,隨著資料量的爆炸性成長,大數據應用的需求越來越大。 PHP作為一門廣受歡迎的程式語言,被廣泛應用於Web開發中,同時也可以用來建立大數據應用。本文將介紹使用PHP建構大數據應用的基本流程,包括資料處理、儲存與分析三個面向。一、資料處理資料處理是大數據應用的第一步,其目的是將資料從各個來源收集過來,並進行初步處理和清洗,以便儲存和分析使用。 PHP可以使用

See all articles