初衷

增删改查是web开发最常见的操作,那么接下来这篇文章将演示如何用node + mysql做一个简易的网站。

需要的知识

本教程不涉及express等web框架,但请确保您对node + mysql等有基本了解。

需求分析

本网站共有二个页面,主页和副页。

  • 主页

如下图,主页最上面是一个查看存档的按钮,点击会进入副页。上半部分是一个表格,有日期,耗时,描述三个字段,每一列有二个操作,可以存档和删除,存档的记录会从主页中消失,而会在副页中显示,点击删除会彻底删除该列。下半部分是一个表单,由用户输入并提交,提交后的记录出现在上半部分的表格中。

  • 副页

如下图,副页上部是一个表格,有日期,耗时,描述三个字段,每一列只有一个操作,点击删除会彻底删除该列。下部有一个返回按钮,点击会回到主页。

项目目录

  1. 在根目录下创建app.js,app.js负责创建http服务器,页面路由控制,登录数据库等功能
  2. 在根目录下创建lib文件夹,在lib下新建timetrack.js,其负责解析post请求,与数据库交互(添加,删除,查看,更新),将服务端渲染的html返回到客户端等功能
  3. 安装node的mysql数据库,命令如下:npm install mysql --save

最终,目录如下所示:

工具准备

mysql数据库:5.7.22
node版本:10.4.1
workbench:6.3 community

数据库部分

首先,打开workbench,登录进去后,新建一个数据库worklist

新建一个sql tab,输入如下命令,创建一个表,用于存储本项目所涉及的数据。

-- sql脚本
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));

这样,数据库部分就准备好了。

编码

首先,在app.js中输入如下代码:

let http = require('http')
let work = require('./lib/timetrack')
let mysql = require('mysql')var db = mysql.createConnection({host: '127.0.0.1',user: '@your username', // 你的数据库用户名password: '@your password',  // 你的数据库密码database: 'worklist'
})var server = http.createServer((req, res) => {switch (req.method) {case 'POST':switch(req.url) {case '/':work.add(db, req, res)breakcase '/archive':work.archive(db, req, res)breakcase '/delete':work.delete(db, req, res)break}breakcase 'GET':switch (req.url) {case '/':work.show(db, res)breakcase '/archived':work.showArchived(db, res)break}break}
})console.log('Server started...')
server.listen(3000, '127.0.0.1')

接着,在lib目录下的timetrack.js中输入如下代码:


var qs = require('querystring')// 1 show
exports.show = function (db, res, showArchived) {let archiveValue = (showArchived) ? 1 : 0db.query('SELECT * FROM work WHERE archived = ? ORDER BY date DESC',[archiveValue],function (err, rows) {if (err) {throw err}if (showArchived) { // 副页html = (showArchived) ? '' : '<a href="/archived">查看存档</a><br/>'html += exports.workHitlistHtml(rows)html += '<a href="/">返回</a>'} else { // 主页html = (showArchived) ? '' : '<a href="/archived">查看存档</a><br/>'html += exports.workHitlistHtml(rows)html += exports.workFormHtml()}exports.sendHtml(res, html)})
}// 显示上半部分--列表
exports.workHitlistHtml = function (rows) {var html = '<table>'for(var i in rows) {html += '<tr>'html += '<td>' + rows[i].date + '</td>'html += '<td>' + rows[i].hours + '</td>'html += '<td>' + rows[i].description + '</td>'if (!rows[i].archived) {html += '<td>' + exports.workArchiveForm(rows[i].id) + '</td>'}html += '<td>' + exports.workDeleteForm(rows[i].id) + '</td>'html += '</tr>'}html += '</table>'return html
}
// 显示下半部分--提交
exports.workFormHtml = function () {var html = '<form method="POST" action="/">' +'<p>日期 (YYYY-MM-DD):<br/><input name="date" type="text"><p/>' +'<p>耗时:<br/><input name="hours" type="text"><p/>' +'<p>描述:<br/>' +'<textarea name="description"></textarea></p>' +'<input type="submit" value="添加" />' +'</form>'return html
}// 返回到浏览器
exports.sendHtml = function (res, html) {res.setHeader('Content-Type', 'text/html; charset=UTF-8')res.setHeader('Content-Length', Buffer.byteLength(html))res.end(html)
}// 渲染二个操作 -- 存档和删除
exports.workArchiveForm = function (id) {return exports.actionForm(id, '/archive', '存档')
}
exports.workDeleteForm = function (id) {return exports.actionForm(id, '/delete', '删除')
}
exports.actionForm = function (id, path, label) {var html = '<form method="POST" action="' + path + '">' +'<input type="hidden" name="id" value="' + id + '">' +'<input type="submit" value="' + label + '" />' +'</form>'return html
}// 2 add
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 errexports.show(db, res)})})
}// 解析post请求
exports.parseReceivedData = function (req, cb) {var body = ''req.setEncoding('utf8')req.on('data', chunk => {body += chunk})req.on('end', () => {var data = qs.parse(body)cb(data)})
}// 3 存档
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 errexports.show(db, res)})})
}// 4 删除
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 errexports.show(db, res)})})
}// 5 查看存档
exports.showArchived = function (db, res) {exports.show(db, res, true)
}

运行

终端中输入如下命令:node app 开启http服务器,然后在浏览器URL中输入http://localhost:3000/ 即可

注意

1 在运行http服务器之前,请确保数据库服务已经开启,否则会报错。
2 在主页中输入日期时,请确保格式如:2017-03-06,而不是其他格式,否则,数据库会报错:Incorrect date value

参考

mysql5.7文档 https://dev.mysql.com/doc/ref...
workbench基本操作 https://blog.csdn.net/souland...
SQL基础教程 https://book.douban.com/subje...
Node.js实战 https://book.douban.com/subje...
mysql模块 https://github.com/mysqljs/mysql

用mysql + node搭建一个简易工作列表网站相关推荐

  1. 使用Django+MySQL快速搭建一个属于自己的网站

    使用Django+MySQL快速搭建一个属于自己的网站 Hello小伙伴们,你们好啊~~ 又是日常get新技能的一天, 今天,咱们来整理一下如何使用VMware Workstation上进行openE ...

  2. 【Python Django Web项目】利用 Python+Django+Pycharm+MySQL 搭建一个自己的Web网站项目的步骤(详细图文)上集

    今天我们要来介绍一下, 利用 Python+Django+Pycharm+MySQL 搭建一个自己的Web网站项目的步骤 首先我们要建立一个专门放项目的文件夹 如下 E:\Projects , 我们建 ...

  3. 如何搭建一个简易的Web框架

    Web框架本质 什么是Web框架, 如何自己搭建一个简易的Web框架?其实, 只要了解了HTTP协议, 这些问题将引刃而解. 简单的理解:  所有的Web应用本质上就是一个socket服务端, 而用户 ...

  4. 快速搭建一个简易的HTTP服务器用于文件分享与下载

    需要快速搭建一个简易的HTTP服务器进行文件的分享与下载.主要有以下两种方法: 1. 使用python 来实现 import http.server import socketserverPORT = ...

  5. 使用python搭建一个简易的本地局域网

    使用python搭建一个简易的本地局域网 1.设置python路径为环境变量// python3 2.命令行输入python -m http.server 8888// 或python2 2.命令行输 ...

  6. 如何从零搭建一个hexo博客网站01

    title: 如何从零搭建一个hexo博客网站01 #文章標題 categories: "Hexo教程" #文章分類目錄 可以省略 categories: "Hexo教程 ...

  7. 如何搭建一个属于自己的网站

    想搭建一个属于自己的网站,不知道怎么办?现在都0202年了,任何人都可以在不了解Web开发,设计或编码的情况下建立和设计网站.无论您是想为自己还是为企业创建网站,都可以使用正确的工具和资源轻松地做到这 ...

  8. 如何从零搭建一个hexo博客网站02

    title: 如何从零搭建一个hexo博客网站02 categories: "Hexo教程" #文章分類目錄 可以省略 简介:此教程分为两部分,云服务器篇和本地pc机篇 tags: ...

  9. 【网站开发】搭建一个属于自己的网站

    概述 搭建一个属于自己的网站 1.购买域名 主机屋http://www.zhujiwu.com/ 购买的域名:TechShare.xyz 2.购买虚拟主机(空间) http://www.zhujiwu ...

最新文章

  1. Nginx搭建负载均衡集群
  2. Unity 3D学习视觉脚本无需编码即可创建高级游戏
  3. 独家|测量、建议、快速上手!你所使用的Python对象占用了多少内存?(附代码)...
  4. OPK修改操作系统信息 --oobe.xml
  5. java元婴期(20)----java进阶(spring(4)---spring aop编程(全自动)AspectJ)
  6. 界限的应用开发 HTML5,更高效地到达更多设备和用户
  7. nginx的脚本引擎(一)
  8. Python 列表 reverse( )方法
  9. 简单选择排序及其优化
  10. HDU1576 A/B【扩展欧几里得算法+试探法】
  11. 高可用集群HA基本知识概述
  12. #1062 – Duplicate entry ‘1’ for key ‘PRIMARY’
  13. nginx中的的ip_hash机制
  14. Zynq7000硬件开发之总体硬件架构设计
  15. 阿里云视频点播配置步骤
  16. 目标跟踪 OP,CLE,DP,AUC的概念和计算
  17. uni-app checkbox和switch组件checked属性无效的解决方案
  18. scipy.misc.imresize改为Image.resize方法
  19. 海思高校合作——QA培训资料
  20. 邪恶心理学-真实面对谎言的本质

热门文章

  1. 抽象类继承多个抽象类_多重继承?抽象类?C++的内存布局并不复杂
  2. 无名轻聊V1.1在线聊天室源码
  3. 创业公司引导页html5模板
  4. 博客杂志CMS模板,wpdx3.6破解版源码WordPress主题
  5. html在线消息,HTML5之消息通知的使用(Web Notification)
  6. vue 使用 better-scroll
  7. Matrix响应式软件应用类型博客模板
  8. Win7系统忘记登入密码的解决方法
  9. 并行编程走下神坛 将成为开发者基本技能?
  10. 分享十五个最佳jQuery幻灯插件和教程