主要用node.js和express实现数据的增删改查
一:安装包
需要的包如图所示:
"dependencies": {
"art-template": "^4.13.2",
"bootstrap": "^5.1.3",
"express": "^4.18.1",
"express-art-template": "^1.0.1"
}
二:项目文件
三:项目文件具体内容
1.public公共文件
源码:https://gitee.com/shao-mu/node-js-express/tree/master/crud-node/public
2.views可视化文件
源码:https://gitee.com/shao-mu/node-js-express/tree/master/crud-node/views
3.app.js
//1、导包
var express = require('express')
//路由5、导入router文件
var router = require('./router')
var fs = require('fs')
//2、创建服务
var app = express()
//配置模板引擎
app.engine( 'html' , require ( 'express-art-template' ));
//开放静态资源
app.use('/public/',express.static('./public/'))
app.use('/node_modules/',express.static('./node_modules/'))
//配置body-parser
//parse application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }))
// parse application/json
app.use(express.json())
//路由6、把路由挂载到app中
app.use(router)
//4、监听端口
app.listen(80,function(){
console.log('run http://127.0.0.1')
})
4.db.json 数据信息可以自行编辑
{"students":[{"id":1,"name":"赵云","zi":"子龙","age":"30","gender":1,"like":"骑马"},{"id":2,"name":"黄忠","zi":"汉升","age":"60","gender":1,"like":"射箭"},{"id":3,"name":"马超","zi":"孟起","age":"40","gender":1,"like":"跑"},{"name":"蒋丞","zi":"丞儿","gender":"1","age":"20","like":"学习","id":5},{"name":"曹操","zi":"曹操","gender":"1","age":"40","like":"打架","id":6}]}
5.router.js
/**
* 路由文件,业务文件,处理事务!! 业务员
* 职责:只关心业务 不做具体的数据处理!!
*/
//路由1、导入express框架
var express = require('express')
//导入student文件
var Student = require('./student')
//路由2、使用框架中的router容器
var router = express.Router()
var fs = require('fs')
var comments = [
{
name: '刘备',
zi: '玄德',
img: '../public/img/liubei.jpg'
}, {
name: '关羽',
zi: '云长',
img: '../public/img/guanyu.jpg'
}, {
name: '张飞',
zi: '翼德',
img: '../public/img/zhangfei.jpg'
}]
//路由3、把所有的业务挂载到router容器中
//查询所有学生信息
router.get('/students', function(req, res) {
//调用student.find方法
Student.find(function(err,students){
//没数据的话
if(err){
return resp.status(500).send('server error!!')
}
//有数据的话
res.render('index.html',{
comments,
students
})
})
})
//添加学生信息----页面渲染
router.get('/students/new', function(req, res) {
res.render('new.html')
})
//添加学生信息----业务处理
router.post('/students/new', function(req, res) {
console.log('执行form表单提交事务处理...')
//1、接收请求数据
console.log(req.body)
//2、处理数据
//将post提交来的数据保存到db.json文件中
Student.save(req.body,function(err){
if(err){
//3、响应结果
return res.status(500).send('server error!!')
}
//3、响应结果 重定向(get请求) 跳转到首页
res.redirect('/students')
})
})
//修改学生信息----页面渲染
router.get('/students/edit', function(req, res) {
var id = parseInt(req.query.id)
Student.findById(id,function(err,student){
if(err){
//3、响应结果
return res.status(500).send('server error!!')
}
//3、响应结果 重定向到页面
// resp.redirect('edit.html')
res.render('edit.html',{
student
})
})
})
//修改学生信息----业务处理
router.post('/students/edit', function(req, res) {
//1、获取客户端发送来的请求数据 req.body
//2、处理数据
//调用student中的方法
Student.updateById(req.body, function (err) {
if (err) {
return res.status(500).send('server error!!')
}
//3、响应结果 重定向(get请求) 跳转到首页
res.redirect('/students')
})
})
//删除学生信息----业务处理
router.get('/students/delete', function(req, res) {
Student.deleteById(req.query.id, function (err) {
if (err) {
res.status(500).send('Server error')
}
res.redirect('/students')
})
})
//路由4、把router导出
module.exports = router
6.students.js
/**
* 数据操作文件模块 车间
* 职责:进行文件中的数据处理,只做数据处理,不关心业务
* 该处才是咱们程序员主要负责的部分
* 在该模块中设计不同业务处理方法
* 只作为被业务调用
* 这些方法需要被暴露出来
*/
var fs = require('fs')
var dbPath = './db.json'
/**
* 获取所有学生列表
* 设置成具有回调函数的方法
* ajax jquery
* 回调的意义:在操作处,将各种情况都处理,在调用出进行判断处理
* callback 两个参数
* 第一个参数:err
* 成功 null
* 错误 错误信息
* 第二个参数 data
* 成功 data数据
* 错误 undefined
*/
exports.find = function(callback){
//异步方法
fs.readFile(dbPath,'utf-8',function(err,data){
if(err){
return callback
}
callback(null,JSON.parse(data).students)//数组
})
}
/**
* 根据id获取学生的所有信息
* @param {Number} id 学生id
* @param {function} callback 回调函数
*/
exports.findById = function(id,callback){
fs.readFile(dbPath,'utf-8',function(err,data){
if(err){
return callback(err)
}
var students = JSON.parse(data).students
var ret = students.find(function(item){
return item.id === parseInt(id)
})
callback(null,ret)
})
}
/**
* 添加学生
* @param {Object} student 学生信息
* @param {Object} callback 回调函数
*/
exports.save = function(student,callback){
fs.readFile(dbPath,'utf-8',function(err,data){
if(err){
return callback(err)
}
var students = JSON.parse(data).students
//添加id 0 1 2 3 4
student.id = students[students.length - 1].id +1
//保存对象到数组
students.push(student)
//把对象数据转换成字符串形式
var fileData = JSON.stringify({
students
})
//将fileData写入到db.json中
fs.writeFile(dbPath,fileData,function(err){
if(err){
return callback
}
callback(null)//成功 err为null
})
})
}
/**
* 修改学生
*/
exports.updateById = function (student, callback) {
fs.readFile(dbPath, 'utf-8', function (err, data) {
if (err) {
return callback(err)
}
//拿到学生数组信息
var students = JSON.parse(data).students
//find:es6操作数组的方法,通过ID来判断,用来查询满足条件的一条数据
var stu = students.find(function (item) {
return item.id == parseInt(student.id)
})
//将传来的对象中的数据拷贝到db.json的students中对应的对象中去
//{ id: 1, name: '赵雷', zi: '子凤', age: '35', gender: 1, like: '骑马' }
//{"id":1,"name":"赵雷","zi":"子凤","age":"35","gender":1,"like":"骑马"}
for (var key in student) {
stu[key] = student[key]
}
//把对象数据转换成字符串形式
var fileData = JSON.stringify({
students
})
//将fileData写入到db.json中
fs.writeFile(dbPath, fileData, function (err) {
if (err) {
return callback(err)
}
callback(null)//成功 err为null
})
})
}
/**
* 删除学生
*/
exports.deleteById = function (id, callback) {
fs.readFile(dbPath, 'utf8', function (err, data) {
if (err) {
return callback(err)
}
var students = JSON.parse(data).students
// findIndex 方法专门用来根据条件查找元素的下标
var deleteId = students.findIndex(function (item) {
return item.id === parseInt(id)
})
// 根据下标从数组中删除对应的学生对象
students.splice(deleteId, 1)
// 把对象数据转换为字符串
var fileData = JSON.stringify({
students: students
})
// 把字符串保存到文件中
fs.writeFile(dbPath, fileData, function (err) {
if (err) {
// 错误就是把错误对象传递给它
return callback(err)
}
// 成功就没错,所以错误对象是 null
callback(null)
})
})
}