开启掘金成长之旅!这是我参与「掘金日新计划 · 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);
}