效果图如下:
html和js代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.js"></script>
</head>
<body style="padding: 15px;">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">添加新图书</h3>
</div>
<div class="panel-body form-inline">
<div class="input-group">
<div class="input-group-addon">书名</div>
<input type="text" class="form-control" id="iptBookname" placeholder="请输入书名">
</div>
<div class="input-group">
<div class="input-group-addon">作者</div>
<input type="text" class="form-control" id="iptAuthor" placeholder="请输入作者">
</div>
<div class="input-group">
<div class="input-group-addon">出版社</div>
<input type="text" class="form-control" id="iptPublisher" placeholder="请输入出版社">
</div>
<button id="btnAdd" class="btn btn-primary">添加</button>
</div>
</div>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>Id</th>
<th>书名</th>
<th>作者</th>
<th>出版社</th>
<th>操作</th>
</tr>
</thead>
<tbody id="tb"></tbody>
</table>
<script>
$(function () {
// 获取图书列表数据
function getBookList() {
$.ajax({
type: 'GET',
url: 'http://127.0.0.1:5000/api/getBooks',
success: function (res) {
if (res.status !== 200) return alert('获取数据失败!')
var rows = []
$.each(res.data, (i, item) => {
rows.push(`<tr>
<td>${item.Id}</td>
<td>${item.name}</td>
<td>${item.author}</td>
<td>${item.publisher}</td>
<td><a href="javascript:;" class="del" data-id="${item.Id}">删除</a></td>
</tr>`)
})
$('#tb').empty().append(rows.join(''))
}
})
}
getBookList()
$('#tb').on('click', '.del', function () {
const id = $(this).attr('data-id')
$.ajax({
type: 'GET',
url: 'http://127.0.0.1:5000/api/deleteBookById',
data: { Id: id },
success: function (res) {
alert(res.message)
getBookList()
}
})
})
$('#btnAdd').on('click', function () {
var bookName = $('#iptBookname').val().trim()
var author = $('#iptAuthor').val().trim()
var publisher = $('#iptPublisher').val().trim()
if (bookName.length < 1 || author.length < 1 || publisher.length < 1) return alert('请填写完整的图书信息!')
$.ajax({
type: 'POST',
url: 'http://127.0.0.1:5000/api/addBook',
data: { name: bookName, author: author, publisher: publisher },
success: function (res) {
alert(res.message)
getBookList()
clearInput()
}
})
})
$(document).on('keyup', function (e) {
if (e.keyCode === 13) {
var bookName = $('#iptBookname').val().trim()
var author = $('#iptAuthor').val().trim()
var publisher = $('#iptPublisher').val().trim()
if (bookName.length < 1 || author.length < 1 || publisher.length < 1) return alert('请填写完整的图书信息!')
$.ajax({
type: 'POST',
url: 'http://127.0.0.1:5000/api/addBook',
data: { name: bookName, author: author, publisher: publisher },
success: function (res) {
alert(res.message)
getBookList()
clearInput()
}
})
}
})
function clearInput() {
$('#iptBookname').val('')
$('#iptAuthor').val('')
$('#iptPublisher').val('')
}
})
</script>
</body>
</html>
Node代码如下(有点多,耐心看完可能对你有帮助!):
操作数据库的包db
const mysql = require('mysql')
const db = mysql.createPool({
host:'localhost',
user:'root',
password:'123456',
database:'my_db_01'
})
module.exports = db
router包
## book_router
// 导入expres模块
const express = require('express')
const router = express.Router()
// 导入图书信息路由处理函数模块
const books_handler = require('../router_handler/books')
// 导入图书验证的模块
const {get_user_schema} = require('../schema/books')
// 导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
// 定义路由
// 获取图书列表信息的路由
router.get('/getBooks',books_handler.getBooks)
// 删除图书信息的路由
router.get('/deleteBookById',books_handler.deleteBookById)
// 添加图书的路由
router.post('/addBook',books_handler.addBook)
// 根据Id获取图书的路由
router.get('/getBook',books_handler.getBookById)
// 根据书名获取图书的路由
router.get('/getBookByName',books_handler.getBookByName)
// 根据Id 和 书名获取图书的路由
router.get('/getBookByIdAndName',books_handler.getBookByIdAndName)
// 根据 作者名 获取图书的路由
router.get('/getBookByAuthor',books_handler.getBookByAuthor)
// 共享路由
module.exports = router
router_handler包下所有模块
------------------------------------
## book.js
// 导入数据库操作模块
const db = require('../db/index')
// 导入url模块
const url = require('url')
// 获取图书信息的处理函数
exports.getBooks = (req, res) => {
// 定义查询图书列表的 SQL 语句
const sql = `select * from ev_books where is_delete=0 order by id asc`
// 调用 db.query() 执行 SQL 语句
db.query(sql, (err, results) => {
if (err) return res.cc(err)
if (results.length < 1) return res.cc('未查询到任何图书相关的信息!')
res.send({
status: 200,
message: '获取图书信息成功!',
data: results
})
})
}
// 删除图书信息的处理函数
exports.deleteBookById = (req,res) => {
const parseObj = url.parse(req.url,true)
req.query = parseObj.query
// 定义删除图书信息的 SQL 语句
const sql = `delete from ev_books where Id=?`
// 调用 db.query() 执行 SQL 语句
db.query(sql,req.query.Id,(err,results)=>{
if(err) return res.cc(err)
if(results.affectedRows !== 1) return res.cc('删除图书信息失败!')
res.send({
status:200,
message:'删除图书信息成功!'
})
})
}
// 添加图书的处理函数
exports.addBook = (req,res) => {
// 定义添加图书的 SQL 语句
const sql = `insert into ev_books set ?`
// 调用 db.query() 执行 SQL 语句
db.query(sql,req.body,(err,results)=>{
if(err) return res.cc(err)
if(results.affectedRows !==1) return res.cc('添加图书失败!')
res.send({
status:200,
message:'添加图书成功!'
})
})
}
// 根据Id获取图书信息的处理函数
// 模糊查询
exports.getBookById = (req,res) => {
// 将url地址解析为一个方便操作的对象
// 第二个可选参数指定为true,可将结果的 query 解析为一个对象
var parseObj = url.parse(req.url,true)
req.query = parseObj.query
// 定义根据Id 查询图书信息的 SQL 语句
const sql = `select * from ev_books where Id=?`
// 调用 db.query() 执行 SQL 语句
db.query(sql,req.query.id,(err,results)=>{
if(err) return res.cc(err)
if(results.length !== 1) return res.cc('未获取到任何图书信息')
res.send({
status:200,
message:'获取图书信息成功!',
data:results[0]
})
})
}
// 根据书名获取图书信息的处理函数
exports.getBookByName = (req,res) => {
// 将url地址解析为一个方便操作的对象
// 第二个可选参数指定为true,可将结果的 query 解析为一个对象
var parseObj = url.parse(req.url,true)
req.query = parseObj.query
const bookname = '%'+req.query.bookname+'%'
// 定义根据书名查询图书的 SQL 语句(模糊查询)
const sql = `select * from ev_books where name like ?`
// 调用 db.query() 执行 SQL 语句
db.query(sql,bookname,(err,results)=>{
if(err) return res.cc(err)
if(results.length < 1) return res.cc('未获取到任何图书信息')
res.send({
status:200,
message:'获取图书信息成功!',
data:results
})
})
}
// 根据Id和书名获取图书信息的处理函数
exports.getBookByIdAndName = (req,res) => {
var parseObj = url.parse(req.url,true)
req.query = parseObj.query
const bookname = '%'+req.query.bookname+'%'
// 定义根据Id 和 书名获取图书信息的 SQL 语句
const sql = `select * from ev_books where Id=? and name like ?`
// 调用 db.query() 执行 SQL 语句
db.query(sql,[req.query.id,bookname],(err,results)=>{
if(err) return res.cc(err)
if(results.length !== 1) return res.cc('获取图书信息失败!')
res.send({
status:200,
message:'获取图书信息成功!',
data:results[0]
})
})
}
// 根据作者名获取图书信息的处理函数
exports.getBookByAuthor = (req,res) => {
var parseObj = url.parse(req.url,true)
req.query = parseObj.query
const author = '%'+req.query.author+'%'
// 定义根据作者名查询图书的 SQL 语句
const sql = `select * from ev_books where author like ?`
// 调用 db.query() 执行 SQL 语句
db.query(sql,author,(err,results)=>{
if(err) return res.cc(err)
if(results.length < 1) return res.cc('获取图书信息失败!')
res.send({
status:200,
message:'获取图书信息成功!',
data:results
})
})
}
入口文件
## server.js
const express = require('express')
const app = express()
const path = require('path')
// 配置解析urlencoded格式表单数据的中间件
app.use(express.urlencoded({extended:false}))
// 使用 cors 中间件,解决接口跨域问题
const cors = require('cors')
app.use(cors())
// 一定要在路由之前,封装 res.cc 函数
app.use((req,res,next)=>{
res.cc = function(err,status=1){
res.send({
status,
message: err instanceof Error ? err : err.message
})
}
next()
})
// 导入并使用图书路由模块
const bookRouter = require('./router/book_router')
app.listen(5000,()=>{
console.log('服务器已启动~~~');
})