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

news/2024/5/5 17:34:41/文章来源:https://blog.csdn.net/weixin_34204057/article/details/88792785

初衷

增删改查是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_709757.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都SEO企业网站品牌运营推广优化及粉丝运营_成都辰星建站

为什么80%的码农都做不了架构师&#xff1f;>>> 成都SEO企业网站品牌打造运营推广及粉丝运营方法成都辰星建站,企业网站做好品牌运营及粉丝能大大增加网站的曝光率及网站品牌覆盖&#xff0c;提升网站品牌知名度获得更多流量及转化成都辰星建站&#xff0c;企业网站…

爬虫演练-动态的抓取cp网站数据的演练-注意要反爬

练习接口地址 一分一变 https://50085cp.com/plan/api.do?codeog1k3&plan0&size20&planSize20&_t1582603607接口返回结构 主要的数据结构 操作思路 得到有用的数据逆序遍历取出字典统计胜负得出胜负的规律&#xff08;最大连错数是多少&#xff09;

快速建站-html基础-0223

主要结构 网页标题标签 title 文章标题标签 h 段落标签 p 链接标签 a 图片标签 img 换行标签 br 表格标签 table tr td

php pjax数据返回,如何将Pjax整合进网站,实现全站无刷新加载?

摘要&#xff1a;pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称&#xff0c;综合这两个技术可以实现在不刷新页面的情况下载入HTML网页&#xff0c;带给你超快速的浏览器体验&#xff0c;而且有固定链接、标题以及后退按钮都是有效的。pjax工作原理用大白话来说&#xff0…

建站利器 | 阿里巴巴上线静态开源站点搭建工具 Docsite

2019独角兽企业重金招聘Python工程师标准>>> 近日&#xff0c;阿里巴巴在Github上线了静态开源站点搭建工具Docsite&#xff0c;这是一款集官网、文档、博客和社区为一体的静态开源站点的解决方案&#xff0c;具有简单易上手、上手不撒手的特质&#xff0c;同时支持…

阿里云服务器ECS挑选什么样的网站环境

2019独角兽企业重金招聘Python工程师标准>>> 我一直使用阿里云云服务器ECS作为搭建网站的服务器&#xff0c;然后用写一个高效的WordPress主题搭建自己的网站&#xff0c;网站环境自然就是LAMP或者LNMP了。 我使用的LAMP/LNMP 作为HTTP SERVER运维&#xff0c;自然非…

Serverless 实战 —— 基于 Serverless 的 VuePress 极简静态网站

基于 Serverless 的 VuePress 极简静态网站 作者: Aceyclee 之前用过 Docsify Serverless Framework 快速创建个人博客系统&#xff0c;虽然 docsify 也是基于 Vue&#xff0c;然而它是完全的运行时驱动&#xff0c;因此对 SEO 不够友好。所以这次尝试使用 VuePress 来搭建一…

Serverless 实战 —— Serverless 架构揭秘与静态网站部署实战

Serverless 架构揭秘与静态网站部署实战 讲师简介 陈涛 Serverless Framework 社区专家 参与 Serverless 社区及开源的相关研发工作。拥有丰富前端、JavaScript 技术经验&#xff0c;以及网站及小程序等项目开发经验&#xff0c;腾讯云 Serverless 系列课程特约讲师。 课程简…

最热开源静态网站生成器 TOP 20

最热开源静态网站生成器 TOP 20 1、静态站点生成器 Jekyll Jekyll 是一个简单的免费的Blog生成工具&#xff0c;类似WordPress。但是和WordPress又有很大的不同&#xff0c;原因是jekyll只是一个生成静态网页的工具&#xff0c;不需要数据库支持。但是可以配合第三方服务,例如d…

演练 网站的导航栏 0920

演练 网站的导航栏 0920 素材 https://cloud.189.cn/t/qMVJzaAbea63 数据 导航图的宽度 760 150 菜单图的宽高 760 32 制作过程 完成基本架构 制作菜单按钮 使用li>a的方式 效果 去掉样式 让li浮动 让a变为块级元素 去掉链接下划线 水平垂直居中 鼠标经过后效果

【资源】可下载三维模型的网站

可以用于生成仿真数据的三维模型库&#xff0c;持续更新… 1.Free3D 2.Turbosquid 3.三维扫描模型 4.3D SKY 5.3D warehouse 6.ArchiBase 7.机械模型 Dassault Systmes ref: https://www.zhihu.com/question/268392246/answer/426906438 https://zhuanlan.zhihu.com…

10个轻量级CMS网站内容管理系统

这里推荐的10个简单轻量级的网站内容管理系统对于每一个Web设计师和Web开发人员来说&#xff0c;都是简单易用的&#xff0c;是一般小型网站的可选实现方案&#xff0c;10 个CMS系统各有特色。 Wolf CMS Wolf CMS simplifies content management by offering an elegant user …

16个SNS网站常用JS组件

1. Facebook jQuery聊天框。 Facebook本身有 一个不错的IM软件&#xff0c;这个组件教你怎么模仿faceback的样式实现一个在线聊天框。 Demo Download 2. 仿Twitter Ajax搜索 帮你建立以个仿Twitter风格的搜索引擎效果。 Demo Download 3. 仿Facebook Mootools模态…

100种增加网站流量的方法

本文是一篇翻译的文章&#xff0c;文章比较长&#xff0c;但是如果你有网站或者blog的话&#xff0c;很多方法还是很值得借鉴的。 流量 就是网络中的货币。网站流量越大&#xff0c;就越容易达到既定目标&#xff1a;赚钱&#xff0c;传播观点&#xff0c;与其他人联系互动&…

网站开发技巧参考大全 event js

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.…

网站开发技巧参考大全 event js

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.…

一步步构建大型网站架构

有幸接确到了架构这个词的玩意&#xff0c;这几天有时间就网上游离一下相关资料&#xff0c;看到不错就收藏一下&#xff0c;作为以后学习的方向&#xff1a; 之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑 、Flickr的架构 、YouTube的架构…

网站静态化结构

写在前头 静态化是解决减轻网站压力,提高网站访问速度的常用方案,但在强调交互的We2.0 时代,对静态化提出了更高的要求,静态不仅要能静,还要能动,下面我通过一个项目,谈谈网站静态化后的架构设计方案,同时和大家探讨一下,在开源产品大行其道,言架构必称MemberCache, Nginx,的时…