图书管理系统(基于 Node.js 实现)

 效果图如下:

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('服务器已启动~~~');
})

  • 4
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值