Api.js

const express=require("express");
const router=express.Router();
const mysql = require('mysql')
const mysqlutil=require("./mysql"); let pool=mysql.createPool({
host:"localhost", //主机
user:"root", //用户名
password:"123456", //密码
database:"gomall" //数据库,port可以省去
});
function add(bookList){
let sql="insert into book set ?";
pool.getConnection((connErr,conn)=>{ //获取连接对象
pool.query(sql,bookList,(err,results)=>{//执行添加,指定参数对象
if(err) throw err; //如果有错误,则抛出异常
console.log(results); //输出结果
conn.release(); //释放连接
//process.exit(1); //关闭应用
});
});
} //查询所有
router.get("/",(req,res,next)=>{
pool.getConnection((connErr,conn)=>{ //获取连接对象
pool.query("select * from book",(err,results)=>{//执行查询
if(err) throw err; //如果有错误,则抛出异常
console.log(JSON.parse(JSON.stringify(results))); //转换并输出查询结果
conn.release(); //释放连接
res.json({status:"ok","data":results})
});
});
}); //添加
router.post("/",(req,res,next)=>{
let book=req.body;
console.log(book);
let msg="";
let sql="insert into book set ?";
pool.getConnection((connErr,conn)=>{ //获取连接对象
pool.query(sql,book,(err,results)=>{//执行添加,指定参数对象
if(results.affectedRows>0){
msg="添加成功!";
}else{
msg="添加失败!";
}
res.json({status:"ok","data":msg})
conn.release(); //释放连接
});
});
}) //Delete
router.delete("/:id",(req,res,next)=> {
let id=parseInt(req.params.id);
let sql="delete from book where id=?";
pool.getConnection((connErr,conn)=>{ //获取连接对象
pool.query(sql,id,(err,results)=>{//执行查询
if(err) throw err; //如果有错误,则抛出异常
if(results.affectedRows===1){ //如果影响行数为1
console.log("删除成功");
res.json({status:"ok","data":"删除成功"})
}
else{
console.log("删除失败");
}
conn.release(); //释放连接
});
});
}) //修改
router.post("/edit/:id",(req,res,next)=>{
let book=req.body;
let id=parseInt(req.params.id);
console.log(book);
console.log(id);
let sql="update book set ? where id=?";
pool.getConnection((connErr,conn)=>{ //获取连接对象
pool.query(sql,[book,id],(err,results)=>{//执行更新,指定参数
if(err) throw err; //如果有错误,则抛出异常
if(results.affectedRows===1){ //如果影响行数为1
console.log("修改成功");
res.json({status:"ok","data":"修改成功"})
}
else{
console.log("修改失败");
}
conn.release(); //释放连接
});
});
}) module.exports = router;

book.js

var express=require('express');
var router=express.Router(); router.get('/',function (req,res,next){
res.render("book",{});
}) module.exports = router;

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan'); var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var apiRouter = require('./routes/bookApi');
var bookRouter = require('./routes/book'); var app = express(); // view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs'); app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); app.use('/index', indexRouter);
app.use('/users', usersRouter);
app.use('/api',apiRouter);
app.use('/', bookRouter); // catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
}); // 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;

book.ejs

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>图书管理系统</title>
</head>
<body>
<h1>图书管理系统</h1>
<div id="app">
<table width="800" border="1" style="margin: 0 auto">
<tr>
<th>编号</th>
<th>书名</th>
<th>封面</th>
<th>价格</th>
<th>作者</th>
<th>操作</th>
</tr>
<tr style="text-align: center" v-for="(book,i) in bookInfo">
<td>{{book.id}}</td>
<td>{{book.name}}</td>
<td>{{book.img}}</td>
<td>{{book.price}}</td>
<td>{{book.author}}</td>
<td>
<a href="" @click.stop.prevent="del(book)">删除</a>
<a href="" @click.stop.prevent="update(book)">编辑</a>
</td>
</tr>
</table>
<fieldset>
<legend>添加图书</legend>
<p>
<label>
书名
<input type="text" v-model="books.name">
</label>
</p>
<p>
<label>
封面
<input type="text" v-model="books.img">
</label>
</p>
<p>
<label>
价格
<input type="text" v-model="books.price">
</label>
</p>
<p>
<label>
作者
<input type="text" v-model="books.author">
</label>
</p>
<input type="hidden" v-model="id">
<p>
<button @click="save" type="button" id="btnadd">添加</button>
<button @click="edit" type="button" disabled id="btnsubmit">保存</button>
</p>
</fieldset>
</div>
</body>
<script src="/javascripts/vue/vue.min.js"></script>
<script src="/javascripts/axios/axios.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
state:0,
bookInfo: [],
id:"",
books: {name: "", img: "", price: "", author: ""},
},
methods: {
del(book) {
let id = (book.id);
if (confirm("你确定要删除吗?")) {
axios.delete("http://127.0.0.1:3000/api/"+id)
.then(res => {
console.log("删除成功!");
this.BookInfo();
})
.catch(err => {
console.log("删除失败!");
})
}
},
BookInfo() {
axios.get("http://127.0.0.1:3000/api", {})
.then(data => {
this.bookInfo = data.data.data;
}).catch(error => {
console.log(error);
});
},
save() {
axios.post("http://127.0.0.1:3000/api", this.books)
.then(res => {
console.log("添加成功!");
this.BookInfo();
app.books={name:"",img:"",price:"",author:""};
})
.catch(err => {
console.log("添加失败!");
})
},
update(book){
var btn=document.getElementById("btnsubmit");
var btnadd=document.getElementById("btnadd");
btn.removeAttribute('disabled');
btnadd.disabled=true;
this.id=book.id;
this.books.name=book.name;
this.books.img=book.img;
this.books.price=book.price;
this.books.author=book.author;
},
edit(){
axios.post("http://127.0.0.1:3000/api/edit/"+this.id, this.books)
.then(res => {
console.log("修改成功!");
this.BookInfo();
var btn=document.getElementById("btnsubmit");
var btnadd=document.getElementById("btnadd");
btn.disabled=true;
btnadd.removeAttribute('disabled');
app.books={name:"",img:"",price:"",author:""};
})
.catch(err => {
var btn=document.getElementById("btnsubmit");
var btnadd=document.getElementById("btnadd");
console.log("添加失败!");
btn.disabled=true;
btnadd.removeAttribute('disabled');
})
}
},
created: function () {
this.BookInfo();
}
})
</script>
</html>

Node.js(七)MySql+ajax的更多相关文章

  1. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  2. 使用node js 操作 Mysql 数据库

    使用node js 操作 Mysql 数据库 http://www.nodejs.org/ //node js 数据库操作 MySQL //使用https://github.com/felixge/n ...

  3. Node.js 连接 MySQL 并进行数据库操作

    Node.js 连接 MySQL 并进行数据库操作  按照这篇操作mysql的指引,我远程操作了我另一台电脑的mysql数据库. var mysql = require('mysql'); var c ...

  4. Node.js连接MySQL数据库及构造JSON的正确姿势

    做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...

  5. APNs功能之Node.js和Mysql应用总结

    APNs功能之Node.js和Mysql应用总结 这篇文档主要是总结Node.js和Mysql的学习心得体会.当然也可以看作是此前所写的消息推送服务的续篇. 简单描述下应用背景,我们的应用需要实现苹果 ...

  6. node.js连接MySQL操作及注意事项

    node.js作为服务端的js运行环境已经出现了有几年了,最近我有个朋友也在做这方面的开发,但是也是刚刚接触,遇到了很多坑.前几天他们在操作数据库的时候出现了点问题,后来我们一起看了看,其实都是nod ...

  7. node.js使用mysql模块的坑

      之前用node.js写的订餐系统,很容易挂掉,一直也没想去解决它.今天看了一下,试了试,原因是在连接数据库的时候没有对error事件进行处理,导致程序一直挂在那里,需要重启服务才能正常使用.   ...

  8. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  9. node.js链接mysql

    node.js连接数据库有很多种,比如:mongoose,oracle,mysql...,我自己玩就选了一个我很熟悉的轻量级的mysql数据库尝试了一把,感觉不错. 首先要把mysql客户端安装好,官 ...

  10. Node.js之mysql增删改查

    1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...

随机推荐

  1. Sharding-jdbc + Seata + Nacos整合

    前置条件 先了解Sharding-jdbc.Seata.Nacos这三样东西各自的作用以及单独使用时的配置. 整合代码已放在github,详细步骤章节请搭配此项目看,欢迎start 思路 如果已经做过 ...

  2. 零基础学Java(11)自定义类

    前言   之前的例子中,我们已经编写了一些简单的类.但是,那些类都只包含一个简单的main方法.现在来学习如何编写复杂应用程序所需要的那种主力类.通常这些类没有main方法,却有自己的实例字段和实例方 ...

  3. 搞懂前端二进制系列(一):🍇 认识Blob对象

    参考资料: https://juejin.cn/post/6844904183661854727 [你不知道的Blob] https://juejin.cn/post/6844904144453517 ...

  4. 膜 社论(egg drop)

    题面 \(n\) 楼 \(m\) 个鸡蛋,从 \(k\) 楼及以上扔下去会碎,不能再测试 . 问至少需要扔几次确定 \(k\) . \(n\le 10^{18}\),\(m\le 64\) . 题解 ...

  5. IDEA自定义liveTemplates(方法模板、类模板)

    IDEA自定义liveTemplates(方法模板.类模板) 前言,搞这个模板有何意义? 降低大家写方法注释的成本,统一风格.有时候不是开发同学不爱写注释,而是没有合适的载体和空间. IDEA模板设置 ...

  6. Yii项目知识搜集

    [['rId','advertiser_id','image_file'], 'unique','targetAttribute'=>['rId','advertiser_id','image_ ...

  7. 小白之Python基础(一)

    一.数字类型: 1.整形 十进制:默认为十进制:(如:99,100.......) 十六进制: 0x,0X开头的表示16进制数 二进制:0b,0B开头的表示2进制数 八进制: 0o,0O开头的表示8进 ...

  8. 如何仿造websocket请求?

    之前两次singnalr. websocket实时推送相关: .NET WebSockets 核心原理初体验 SignalR 从开发到生产部署避坑指南 tag: 浏览器--->nginx--&g ...

  9. 【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。

    不记得是怎么接触并最终研究这个课题的了,认识我的人都知道我是没有固定的研究对象的,一切看运气和当时的兴趣.本来研究完了就放在那里了,一直比较懒的去做总结,但是想一想似乎在网络上就没有看到关于这个方面的 ...

  10. 造数字(数位DP)

    题面 JZM 想要创造两个数字 x 和 y,它们需要满足 x or y = T,且Lx ≤ x ≤ Rx, Ly ≤ y ≤ Ry,JZM 想知道 x and y 有多少种可能的不同的取值.若有多组 ...