基于Node.js实现简单的图书管理系统(二)

399 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

上一篇文章实现了该图书管理系统的一部分内容,接下来实现处理具体业务的模块

6. 创建业务模块 service.js,完成页面图书信息的渲染,图书数据的增添、修改及删除操作

页面渲染(后端渲染), 是在后端将页面渲染完成后再将页面发送给前端展示。

入口文件index.js已经规定了art-template会去views目录下寻找模板, 在业务模块中只要规定对于哪个页面需要发送哪个模板就好了; 找到模板后发送给前端使用方法res.render()。

1. 引入所需的依赖包
const data = require('./data.json');
// 需要进行文件存取操作,引入path和fs模块
const path = require('path');
const fs = require('fs');

说明:项目中使用的图书数据data.json,是之前文章中爬虫获取的豆瓣图书信息

2. 把图书数据写入文件、渲染主页面
let writeDataToFile = (res) => {
    // fs.writeFile(写入路径,写入内容(因为data是文本文件,所以需要把data转换成字符串))
    fs.writeFile(path.join(__dirname,'data.json'),JSON.stringify(data,null,4),(err)=>{
        if(err){
            res.send('server error');
        }
        // 文件写入成功之后重新跳转到主页面
        res.redirect('/');
    });
}
// 渲染主页面
exports.showIndex=(req,res)=>{
    // express中将数据渲染到页面的语法 
    // 参数一:模板名称;参数二:渲染模板的数据
    res.render('index',{list:data});
}
3. 添加图书保存数据

a. 获取添加图书的表单数据 req.body, 并把值赋给定义的book对象
b. 执行maxBookCode函数,获取到当前图书数据中图书编号最大的id,加一后,赋给新增的图书数据对象的id,成为新增图书的编号,把数据存入内存data里面
c. 执行图书数据写入文件函数

let maxBookCode = ()=>{
    let arr = [];
    // 遍历循环数据的每一项,取出编号id
    data.forEach((item)=>{
        arr.push(item.id);
    });
    // 返回编号id的最大值  
    // Math.max.apply获取数组中的最大值
    return Math.max.apply(null,arr);
}
// 跳转到添加图书的页面
exports.toAddBook=(req,res)=>{
    res.render('addBook',{});
}

//添加图书保存数据
exports.addBook=(req,res)=>{
    // 获取表单数据
    let info = req.body;
    let book={};
    for(let key in info){
        book[key]=info[key];
    }
    book.id= maxBookCode()+1;
    // 将表单的图书信息保存到数据中
    data.push(book);
    // 把内存中的数据写入文件
    writeDataToFile(res);
}
4. 编辑图书更新数据

a. 先查询出对应的数据并渲染到页面上
b. 然后再提交表单,重新保存,写入文件

注:编辑的时候要告诉服务器编辑的是哪条数据,编辑图书editBook.art文件中加上该input框 <input type="hidden" name="id" value="{{id}}">

// 跳转到修改图书的页面 
exports.toEditBook=(req,res)=>{
    // 获取当前需要修改图书记录的编号
    let id = req.query.id;
    let book = {};
    data.forEach((item)=>{
        if(id == item.id){
            book = item;
            return;
        }
    });
    // 将获取到的图书信息渲染到页面
    res.render('editBook',book);
}

// 编辑图书更新数据
exports.editBook = (req,res) =>{
    let info = req.body;

    data.forEach((item)=>{
        if(info.id == item.id){
            for(let key in info){
                item[key] = info[key];
            }
            return;
        }
    });
    // 把内存中的数据写入文件
    writeDataToFile(res);
}
5. 删除图书信息
exports.deleteBook = (req,res) =>{
    let id = req.query.id;
    data.forEach((item,index)=>{
        if(id == item.id){
            // 删除数组的一项数据
            data.splice(index,1);
        }
        return;
    });
    // 把内存中的数据写入文件
    writeDataToFile(res);
}

7. 在终端输入命令 node .,显示runing …,在浏览器输入localhost:7000就可以成功显示页面了

image.png

image.png

image.png