Node.js(七)MySql+ajax
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的更多相关文章
- Node.js连接Mysql,并把连接集成进Express中间件中
引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...
- 使用node js 操作 Mysql 数据库
使用node js 操作 Mysql 数据库 http://www.nodejs.org/ //node js 数据库操作 MySQL //使用https://github.com/felixge/n ...
- Node.js 连接 MySQL 并进行数据库操作
Node.js 连接 MySQL 并进行数据库操作 按照这篇操作mysql的指引,我远程操作了我另一台电脑的mysql数据库. var mysql = require('mysql'); var c ...
- Node.js连接MySQL数据库及构造JSON的正确姿势
做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...
- APNs功能之Node.js和Mysql应用总结
APNs功能之Node.js和Mysql应用总结 这篇文档主要是总结Node.js和Mysql的学习心得体会.当然也可以看作是此前所写的消息推送服务的续篇. 简单描述下应用背景,我们的应用需要实现苹果 ...
- node.js连接MySQL操作及注意事项
node.js作为服务端的js运行环境已经出现了有几年了,最近我有个朋友也在做这方面的开发,但是也是刚刚接触,遇到了很多坑.前几天他们在操作数据库的时候出现了点问题,后来我们一起看了看,其实都是nod ...
- node.js使用mysql模块的坑
之前用node.js写的订餐系统,很容易挂掉,一直也没想去解决它.今天看了一下,试了试,原因是在连接数据库的时候没有对error事件进行处理,导致程序一直挂在那里,需要重启服务才能正常使用. ...
- 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站
这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...
- node.js链接mysql
node.js连接数据库有很多种,比如:mongoose,oracle,mysql...,我自己玩就选了一个我很熟悉的轻量级的mysql数据库尝试了一把,感觉不错. 首先要把mysql客户端安装好,官 ...
- Node.js之mysql增删改查
1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...
随机推荐
- 记一次删除k8s namespace无法删除的问题
在用longhorn工具做k8s存储卷动态预配的时候,需要修改longhorn.yaml的一个默认参数,修改完成需要重新加载longhorn.yaml,结果重新加载出错了,修改的参数没有生效,于是执行 ...
- 利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标)
现而今,我们纵向的回顾整个大前端的历史,不难发现,人们对前端的审美要求越来越高,越来越严苛,与此同时,人们对追求美的体验是也极致的,从理性到感性,从平面到几何,从现实到虚拟,所以从某种角度来说,作为前 ...
- GitHub 主页美化设置教程
GitHub profile设置教程 早些时候逛GitHub,就发现别人的主页特别的精美,当时没有空研究,前几天得空给安排了一下 先看一下成品 贴一个github上一个男人的主页 下面这个是我的 果然 ...
- 提交代码的其他方式,不单单只有git
1. xftp提交代码至服务器,直接连接服务器(如果使用可以直接到官网下载一个试用版或者家庭教育版的,本人不推荐使用破解版毕竟是直接和公司服务器对接出问题不好交代) // https://www.n ...
- ARC129E Yet Another Minimization 题解 【网络流笔记】
超神的建模,极其有借鉴意义/cy 注:该建模对应于最小割建模 对于 \(n\) 个数,每个数有 \(m\) 种取值的技巧 \(\forall i=1,2,\dots,n\),令 \(S=V_{i,0} ...
- 华为分析&联运活动,助您提升游戏总体付费
ARPU如何提升?付费率如何提升?活动ROI如何提升?这些都是游戏运营人员较常遇到的难题.华为分析与联运活动可以帮助运营提升这些用户付费指标,通过对玩家打标签和用户画像,对目标群体的进行精准推送,实现 ...
- 技术分享 | check(col_name<>'')为何把空格拒之门外
1.问题描述 前两天在群里看到同事反馈一个空格问题,大致现象如下: mysql> select @@version; +-----------+ | @@version | +--------- ...
- Luogu3379 【模板】最近公共祖先(LCA) (倍增LCA)
蒟蒻又来复习模板了.还WA了两次 #include <iostream> #include <cstdio> #include <cstring> #include ...
- TS 泛型推断好难啊,看看你能写出来不
前言 最近做东西都在用ts,有时候写比较复杂的功能,如果不熟悉,类型写起来还是挺麻烦的.有这样一个功能,在这里,我们就不以我们现有的业务来举例了,我们还是已Animal举例,来说明场景.通过一个工厂来 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...