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. H5移动端实现一键复制或长摁复制

    今天接到了一个新的需求,要求我们对表单中的某一个字段进行复制,这个表单是不可选的,拿到需求的时候有点懵,不清楚下手点在哪,后来网上找了找,终于有了点眉目,感觉网上有些是实现不了的,特地在这里记录下进行 ...

  2. python opencv图像识别(相同大小图片)

    简介 由于项目需要对比两张相同图片的相似度,因此采用opencv将图片转为灰阶数组,然后对比相应的数组来取相似度,此方法只适用于大小相同的图片,较为局限 # -*- coding: utf-8 -*- ...

  3. linux常用命令和快捷键收集

    find / -name php #查找根目录下所有包含 php 字符的文件和目录 find / -ctime 1 #查找最近一天下载的文件和目录 yum install lrzsz #安装上传下载组 ...

  4. 秋季招聘季如何制作一款“秀色可餐”的简历?由ShareLatex和Python3打造

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_161 秋招季还有两个月就到了,即所谓的"金九银十".疫情因素导致市场环境不太理想,所以我们更应该未焚而徙薪,未 ...

  5. .NET静态代码织入——肉夹馍(Rougamo) 发布1.1.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  6. EB和Varuxn的单字聊天

    持续更新! 本文已经征得\(Varuxn\)同意,仅当做记录网课的趣事和"深厚"的友情 原标题<ErB和Varuxn的单字聊天> 原标题来源: 这个想法来源是 \(Va ...

  7. PowerPoint 母版与版式

    母版 使用母版可以对幻灯片进行统一的样式编辑,让幻灯片具有相同的外观效果,这样无须在多张幻灯片上重复输入相同的信息.母版分为幻灯片母版.讲义母版和备注母版. 幻灯片母版 幻灯片母版决定着幻灯片的外观, ...

  8. 网络编程与socket套接字

    网络编程与socket套接字 传输层 PORT协议 port是一种接口,数据通过它在计算机和其他设备(比如打印机,鼠标,键盘或监视器)之间,网络之间和其他直接连接的计算机之间传递 TCP协议 ​ 传输 ...

  9. Stringboot中@Autowired加了static就属性值就为null

    //错误 @Autowired private static DepartmentDao departmentDao; @Autowired注入,将bean注入进来 @Autowired通过sprin ...

  10. 手写tomcat——编写一个echo http服务器

    核心代码如下: public class DiyTomcat1 { public void run() throws IOException { ServerSocket serverSocket = ...