基于nodejs+express+mysql+webstorm+html的 增删改查
一、工具准备
Nodejs框架,WebStorm、Mysql服务、Navicat。此篇文章只讲项目的搭建过程,至于Nodejs,WebStorm、Mysql的下载、安装与配置网上资源很多,请自行查阅,本文重点讲述 增删改查,此文为学习笔记,我也是初学者,很多代码没有做过多解释,以免误导他人。
Github 地址:https://github.com/Spqin/Nodejs_Websto_Mysql_CRUD
二、打开WebStorm创建项目-项目名称自定义,这里我按年月日做项目名称。
1、选怎File-->New-->Project
2、选择nodejs框架、输入项目名称、选择前端模版的引擎(后面会修改为Html)、点击创建。
3、创建的项目目录如下图所示
4、打开app.js,找到模版引擎设置并进行修改
三、上述过程都是准备工作,接下来开始增删改查的讲述,这里我采用数据库、路由、视图的顺序讲解
此处为了方便下面文章的阅读,先给出一个完成后的项目目录截图。
1、数据库 创建数据库的连接
1.1 在routes目录下创建 db.js,此模块负责数据库的连接
//db.js
// 连接MySQL
var mysql = require('mysql');
var pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '1qaz2wsx',
database: 'nodejs'
}); function query(sql, callback) {
pool.getConnection(function (err, connection) {
// Use the connection
connection.query(sql, function (err, rows) {
callback(err, rows);
connection.release();//释放链接
});
});
}
exports.query = query;
1.2 创建数据库表(person)
/*
Navicat MySQL Data Transfer Source Server : nodejs
Source Server Version : 50717
Source Host : localhost:3306
Source Database : nodejs Target Server Type : MYSQL
Target Server Version : 50717
File Encoding : 65001 Date: 2017-09-05 16:18:45
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`professional` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of person
-- ----------------------------
INSERT INTO `person` VALUES ('', '武大', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '王二', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '张三', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '李四', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '孙五', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '钱六', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '赵七', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '刘八', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '张九', '', '计算机科学与技术');
INSERT INTO `person` VALUES ('', '郑十', '', '计算机科学与技术');
SET FOREIGN_KEY_CHECKS=1;
2、路由(就是映射地址,做过编程开发的都懂,简单举例 "/business/person/getPersonById.do")
在routes目录下创建 person.js,此模块负责映射地址的注册,简言之就相当MVC的Controller层,这里并不是传统的MVC模式,此处只做了功能实现。
var express = require('express');
var router = express.Router();
//引入数据库包
var db = require("./db.js"); /* GET listing. */
// router.get('/', function(req, res, next) {
// res.send('respond with a resource');
// }); /**
* 查询列表页
*/
router.get('/', function (req, res, next) {
db.query('select * from person', function (err, rows) {
console.log(rows);
if (err) {
res.render('persons', {title: '人员管理', datas: []}); // this renders "views/persons.html"
} else { res.render('persons', {title: '人员管理', datas: rows});
}
})
});
/**
* 新增页面跳转
*/ router.get('/add', function (req, res) {
res.render('add');
});
router.post('/add', function (req, res) {
var name = req.body.name;
var age = req.body.age;
var professional = req.body.professional;
db.query("insert into person(name,age,professional) values('" + name + "'," + age + ",'" + professional + "')", function (err, rows) {
if (err) {
res.end('新增失败:' + err);
} else {
res.redirect('/persons');
}
})
}); /**
* 删
*/
router.get('/del/:id', function (req, res) {
var id = req.params.id;
db.query("delete from person where id=" + id, function (err, rows) {
if (err) {
res.end('删除失败:' + err)
} else {
res.redirect('/persons')
}
});
});
/**
* 修改
*/
router.get('/toUpdate/:id', function (req, res) {
var id = req.params.id;
console.log(id);
db.query("select * from person where id=" + id, function (err, rows) {
if (err) {
res.end('修改页面跳转失败:' + err);
} else {
res.render("update", {datas: rows}); //直接跳转
}
});
});
router.post('/update', function (req, res) {
var id = req.body.id;
var name = req.body.name;
var age = req.body.age;
var professional = req.body.professional;
db.query("update person set name='" + name + "',age='" + age + "',professional= '" + professional + "' where id=" + id, function (err, rows) {
if (err) {
res.end('修改失败:' + err);
} else {
res.redirect('/persons');
}
});
});
/**
* 查询
*/
router.post('/search', function (req, res) {
var name = req.body.s_name;
var age = req.body.s_age;
var professional = req.body.s_professional; var sql = "select * from person"; if (name) {
sql += " and name like '%" + name + "%' ";
}
if (age) { sql += " and age=" + age + " ";
}
if (professional) {
sql += " and name like '%" + professional + "%' ";
}
sql = sql.replace("and","where");
db.query(sql, function (err, rows) {
if (err) {
res.end("查询失败:", err)
} else {
res.render("persons", {title: '人员管理', datas: rows, s_name: name, s_age: age});
}
});
}); module.exports = router;
3、视图 删除views下的.ejs文件,创建项目截图中的对应html文件,此处只有对persons.html、add.html、update.html 做讲述。
3.1 persons.html 这个文件是人员管理列表页面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= title %></title>
<style>
div{width:800px;margin: 0 auto;}
table {border-collapse:collapse;border-spacing:0;width:800px;}
table tr td ,table tr th {border-top:solid 1px #ccc;border-left:solid 1px #ccc;line-height: 40px;text-align: center;}
table tr td:last-child, table tr th:last-child {border-right:solid 1px #ccc;}
table tr:last-child td{border-bottom:solid 1px #ccc;}
a{text-decoration: none;font-size: 14px;}
.text{width:150px;}
</style>
</head>
<body>
<div>
<div style="">
<div style="float: left;width:10%;">
<a href="/persons/add">新增</a>
</div>
<div style="float: right;width:90%;">
<form action="/persons/search" method="post">
姓名:<input type="text" name="s_name" value="" class="text">
年龄:<input type="text" name="s_age" value="" class="text">
职业:<input type="text" name="s_professional" value="" class="text">
<input type="submit" value="查询">
</form>
</div>
</div> <table style="">
<tr>
<th width="10%">编号</th>
<th width="15%">操作</th>
<th width="15%">姓名</th>
<th width="10%">年龄</th>
<th width="50%">职业</th>
</tr>
<% if (datas.length) { %>
<% datas.forEach(function(person){ %>
<tr>
<td><%= person.id %></td>
<td><a href="/persons/del/<%= person.id %>">删除</a> <a href="/persons/toUpdate/<%= person.id %>">修改</a></td>
<td><%= person.name %></td>
<td><%= person.age %></td>
<td><%= person.professional %></td>
</tr>
<% }) %>
<% } %>
</table>
</div> </body>
</html>
3.2 add.html 添加人员的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>新增页面</title>
</head>
<body>
<div style="width: 800px;margin: auto;">
<form action="/persons/add" method="post">
姓名:<input type="text" name="name">
年龄:<input type="text" name="age">
职业:<input type="text" name="professional">
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
3.3 update.html 更新人员信息的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改页面</title>
</head>
<body>
<div style="width: 800px;margin: auto;">
<form action="/persons/update" method="post">
<input type="hidden" value="<%= datas[0].id %>" name="id">
姓名:<input type="text" name="name" value="<%= datas[0].name %>">
年龄:<input type="text" name="age" value="<%= datas[0].age %>">
职业:<input type="text" name="professional" value="<%= datas[0].professional %>">
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
四、仅有上述文件,项目还是不能运行起来的,最终要的一个文件app.js,此文件事node.js服务的总配置文件,它告诉框架文件模块的加载顺序。
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var index = require('./routes/index');
var persons= require('./routes/person'); var app = express(); // view engine setup
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'ejs'); //注释掉默认的,自己手动修改默认引擎
app.set('views', path.join(__dirname, 'views'));
app.engine('.html', require('ejs').__express);
app.set('view engine', 'html'); // uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index);
app.use('/persons',persons ); // catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); // error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page
res.status(err.status || 500);
res.render('error');
}); module.exports = app;
五、经过上述步骤之后,点击运行,可能会报错模块缺失的错误,这个问题很容易解决,只需要使用node自带的npm下载对应的模块到 node_modules,至此项目配置结束。
浏览器地址栏输入:http://localhost:3000/persons,地址中的persons是在app.js中配置的。
app.use('/', index);
app.use('/persons',persons );
运行界面如下图所示:
1、列表页/查询页(支持姓名和职业的模糊查询、年龄的精确查询)
2、新增页面,这里只做了简单的功能,没有注意太多的样式。
3、更新页面
基于nodejs+express+mysql+webstorm+html的 增删改查的更多相关文章
- 使用 NodeJS+Express+MySQL 实现简单的增删改查
关于node.js暂时记录如下,以后有时间一定学习 文章来自简书,作者:sprint,2016-07 使用 Node.js + Express+MySQL 实现简单的增删改查 https://www. ...
- 利用Express+MySQL进行简单的增删改查
前言: 随着JavaScript语言的快速发展,其功能越来越强大,能做的事情也越来越多. 目前,web前端工程师能够利用NodeJS搭建服务,也成为了越来越多互联网公司对前端开发的硬性要求. 本文主要 ...
- NodeJs+Express实现简单的Web增删改查
前一段时间,公司组织了一次NodeJs的技术分享,自己有幸去听了听,第一次接触NodeJs,后来经过自己学习和探索,完成了一个很简单的Web演示项目,在这里和初学者做以分享,开发工具:WebStorm ...
- 应用node+express+mysql 实现简单的增删改查
记录下来备忘 1.准备好webstrom编辑器,编辑器调整字体大小等在file->settings->editor下设置 注册码 来源网上: 2017.2.27更新 选择“license ...
- Vc数据库编程基础MySql数据库的表增删改查数据
Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...
- python操作三大主流数据库(2)python操作mysql②python对mysql进行简单的增删改查
python操作mysql②python对mysql进行简单的增删改查 1.设计mysql的数据库和表 id:新闻的唯一标示 title:新闻的标题 content:新闻的内容 created_at: ...
- mysql 的基本操作总结--增删改查
本文只是总结一下mysql 的基本操作,增删改查,以便忘记的时候可以查询一下 1.创建数据库 语法:CREATE DATABASES 数据库名; 例子: CREATE DATABASES studen ...
- Mysql数据表的增删改查
---恢复内容开始--- Mysql数据表的增删改查 1.创建表 语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
随机推荐
- Java——理解面向对象
1.程序设计的三种基本结构 顺序结构 顺序结构表示程序中的各操作是按照它们在源代码中的排列顺序依次执行的 选择结构 选择结构表示程序的处理需要根据某个特定的条件选择其中的一个分支执行.选择结构有单选择 ...
- 用js写出一个漂亮的单选框选中效果
一般的input框比较简单,我们可以用JavaScript配合css背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...
- Java种sleep和wait的区别
1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 2,sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时 ...
- 常用中文分词工具分词&词性标注简单应用(jieba、pyhanlp、pkuseg、foolnltk、thulac、snownlp、nlpir)
1.jieba分词&词性标注 import jieba import jieba.posseg as posseg txt1 =''' 文本一: 人民网华盛顿3月28日电(记者郑琪)据美国约翰 ...
- abp web.mvc项目中的菜单加载机制
abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样,它是在编写代码的时候配置,而我们一般写的通用权限管理系统中,是后期在后台界面中添加的.这一点有很大不同.abp关于菜单的定义及管理 ...
- 3-JVM垃圾回收算法和垃圾收集器
垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就- ...
- 风扇转速通过FPGA采样
1.风扇最大转速16000RPM,那么每一转需要时间60S/16000=0.00375S=375*10^4ns=T=T1+T2+T3+T4: 2.采样0.6S内的风扇detect信号的上升沿个数:0. ...
- Mockito如何mock一条链式调用
在写单元测试的时候,不免可能需要mock一些对象出来,并且mock一些方法调用去返回一个自己想要的对象.一般的使用是这样的: FinalPumpkin pumpkin = mock(FinalPump ...
- python监听、操作键盘鼠标库pynput详细教程
§ 0.0.0 前言 监听.操作鼠标.键盘是实现自动化的捷径,比如我实现自动化签到用到了模拟键盘操作. pynput是监听.操控鼠标和键盘的跨平台第三方python库. 你可以通过pip insnal ...
- Docker & k8s 系列三:在k8s中部署单个服务实例
本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例. 在上面的篇幅中,我们了解了docker,并制作.运行了docker镜像,然后将镜像发布至中央仓库了.然后又搭建了本机的k8s环境 ...