一、整体思路

主要使用bootstrap框架搭建页面样式
处理模板
配置开放静态资源
配置模板引擎
简单路由,/students渲染静态页面出来
路由设计
提取路由模块
由于一系列业务操作都需要处理文件数据,为了防止代码堆积在router.js文件中,所以需要封装文件student.js
先写好student.js文件结构:
查询所有学生列的API find
findByid
save
updateById
deleteById
实现具体功能
通过路由收到请求
接收请求中的数据(get,post)
req.query
req.body
调用数据操作API处理数据
根据操作结果给客户端发送响应

二、展示图

功能:点击编辑后可以对学生信息进行编辑,点击删除后可以删除学生数据

三、主要文件:router.js,student.js

router.js文件:路由配置

var express=require('express')
var fs=require('fs')var Student= require('./student')
var router=express.Router()router.get('/students',function(req,res){// fs.readFile('./db.json','utf8',function(err,data){//     if(err){//      console.log('文件读取失败')//     }//     //因为需要data数据,所以要放在fs.readfile中//     res.render('index.html',{//      fruits:[//          '苹果',//          '香蕉',//          '西瓜'//      ],//      //data是字符串,须要进行一定的转换,转成对象//      students:JSON.parse(data).students//  })//  })Student.find(function(err,students){if(err){console.log('文件读取失败')}res.render('index.html',{fruits:['苹果','香蕉','西瓜'],students:students})})
})router.get('/students/new',function(req,res){res.render('new.html',{})
})router.post('/students/new',function(req,res){Student.save(req.body,function (err) {if (err) {return res.status(500).send('Server error.')}res.redirect('/students')})
})router.get('/students/edit',function(req,res){// 1. 在客户端的列表页中处理链接问题(需要有 id 参数)// 2. 获取要编辑的学生 id// // 3. 渲染编辑页面//    根据 id 把学生信息查出来//    使用模板引擎渲染页面// replace//    字符串模式//      简单,但是不支持全局和忽略大小写问题//    正则表达式模式//      强大,支持全局和忽略大小写Student.findById(req.query.id.replace(/"/g, ''), function (err, student) {if (err) {console.log(err)return res.status(500).send('Server error.')}res.render('edit.html', {student: student})})
})router.post('/students/edit',function(req,res){// 1. 获取表单数据//    req.body// 2. 更新//    Student.updateById()// 3. 发送响应Student.updateById(req.body, function (err) {if (err) {return res.status(500).send('Server error.')}res.redirect('/students')})
})/** 处理删除学生*/
router.get('/students/delete', function (req, res) {// 1. 获取要删除的 id// 2. 根据 id 执行删除操作// 3. 根据操作结果发送响应数据Student.deleteById(req.body, function (err) {if (err) {return res.status(500).send('Server error.')}res.redirect('/students')})
})module.exports=router

student.js文件:处理数据的各种方法函数,统一封装,防止代码都挤在router.js文件中

/*** student.js* 数据操作文件模块* 职责:操作文件中的数据,只处理数据,不关心业务** 这里才是我们学习 Node 的精华部分:奥义之所在* 封装异步 API*/var fs = require('fs')var dbPath = './db.json'/*** 获取学生列表* @param  {Function} callback 回调函数*/
exports.find = function (callback) {fs.readFile(dbPath, 'utf8', function (err, data) {if (err) {return callback(err)}callback(null, JSON.parse(data).students)})
}/*** 根据 id 获取学生信息对象* @param  {Number}   id       学生 id* @param  {Function} callback 回调函数*/
exports.findById = function (id, callback) {fs.readFile(dbPath, 'utf8', function (err, data) {if (err) {return callback(err)}var students = JSON.parse(data).studentsvar ret = students.find(function (item) {return item.id === parseInt(id)})callback(null, ret)})
}/*** 添加保存学生* @param  {Object}   student  学生对象* @param  {Function} callback 回调函数*/
exports.save = function (student, callback) {fs.readFile(dbPath, 'utf8', function (err, data) {if (err) {return callback(err)}var students = JSON.parse(data).students// 添加 id ,唯一不重复student.id = students[students.length - 1].id + 1// 把用户传递的对象保存到数组中students.push(student)// 把对象数据转换为字符串var fileData = JSON.stringify({students: students})// 把字符串保存到文件中fs.writeFile(dbPath, fileData, function (err) {if (err) {// 错误就是把错误对象传递给它return callback(err)}// 成功就没错,所以错误对象是 nullcallback(null)})})
}/*** 更新学生*/
exports.updateById = function (student, callback) {fs.readFile(dbPath, 'utf8', function (err, data) {if (err) {return callback(err)}var students = JSON.parse(data).students// 注意:这里记得把 id 统一转换为数字类型student.id = parseInt(student.id)// 你要修改谁,就需要把谁找出来// EcmaScript 6 中的一个数组方法:find// 需要接收一个函数作为参数// 当某个遍历项符合 item.id === student.id 条件的时候,find 会终止遍历,同时返回遍历项var stu = students.find(function (item) {return item.id === student.id})// 这种方式你就写死了,有 100 个难道就写 100 次吗?// stu.name = student.name// stu.age = student.age// 遍历拷贝对象for (var key in student) {stu[key] = student[key]}// 把对象数据转换为字符串var fileData = JSON.stringify({students: students})// 把字符串保存到文件中fs.writeFile(dbPath, fileData, function (err) {if (err) {// 错误就是把错误对象传递给它return callback(err)}// 成功就没错,所以错误对象是 nullcallback(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)}// 成功就没错,所以错误对象是 nullcallback(null)})})
}

关键:student.js中的方法函数,通过如exports.update导出,在其他地方如router.js中,先var Student= require(’./student’)引入,再Student.update()使用

源码

node项目---编辑修改学生信息页面相关推荐

  1. python学生信息管理系统项目总结_学生信息管理系统案例小结

    周末拿最近学习的知识 (JDBC, Servlet, JSP) 做一个小案例, 本来周末就应该整理笔记的, 但是打球也不能耽误啊, 所以只好赶着在今天下班的时间, 做下记录. 技术准备 Java 基础 ...

  2. Java实训项目:GUI学生信息管理系统(2017)

    Java实训项目:GUI学生信息管理系统(2017) 实训目的:让学生综合运用J2SE有关知识开发[学生信息管理系统].主要涉及程序控制结构.面向对象编程.图形用户界面.Java数据库应用.MySQL ...

  3. Java项目开发,学生信息管理系统

    Java项目开发,学生信息管理系统 @author:Mr.Gu @date:2020/5/31 开发时间大二年级,数据结构综合实习 文章目录 Java项目开发,学生信息管理系统 开发效果 开发要求 开 ...

  4. c语言学生管理系统之修改学生信息

    void  XiuGaiInformation(LINK head,long x)                                                            ...

  5. Java实训项目:GUI学生信息管理系统(2019)【下】

    Java实训项目:GUI学生信息管理系统(2019)[下] 本篇目录 六.实现步骤 13.应用程序类 14.窗口界面类(JFrame)

  6. Java实训项目:GUI学生信息管理系统(2019)【中】

    Java实训项目:GUI学生信息管理系统(2019)[中] 本篇目录 四.涉及知识点 1.Java基本语法 2.Java流程控制

  7. Java实训项目:GUI学生信息管理系统(2019)【上】

    Java实训项目:GUI学生信息管理系统(2019)[上] 本篇目录 零.实训概述 1.实训目的 2.项目简介

  8. 学生管理系统(添加、查看、删除、修改学生信息)

    1.2 学生管理系统实现思路 定义学生类 主界面的代码编写 添加学生的代码编写 查看学生的代码编写 删除学生的代码编写 修改学生的代码编写 1.3 定义学生类 学生类: Student 成员变量: 学 ...

  9. C++实践项目一:学生信息管理系统(内附完整代码)

    引言 这几乎是任何一门语言的经典案例. 管理信息系统. MIS(管理信息系统--Management Information System)系统 ,是一个由人.计算机及其他外围设备等组成的能进行信息的 ...

最新文章

  1. C/C++ 中访问结构体成员的方法
  2. python画饼状图的包_Python数据可视化:画饼状图、折线图、圈图
  3. WINDOWS系统文件讲解
  4. Python脚本备份数据库
  5. linux关机_强制关机对电脑有什么危害?
  6. extjs5的grid垂直滚动条bug_ExtJS 6.2.1 Classic Grid 滚动条bug解决方案
  7. 春节档电影降价了 最低30元
  8. 互联网反欺诈体系中的常用技术和数据类型
  9. JSON值的类型:数字,字符串,逻辑值,数组,对象,null
  10. C#高级编程 第十五章 反射
  11. LIRe 源代码分析 2:基本接口(DocumentBuilder)
  12. Microsoft JET Database Engine 错误 '80040e09' 解决方法
  13. 为什么房价不能跌,房租必须涨
  14. 简谈【自动化协议逆向工程技术的当前趋势】
  15. 【JAVA】对接苹果授权登录流程
  16. Oracle 三种常与开窗组合使用的方法
  17. 【干货】新一线城市程序员大军崛起
  18. OSGL 工具库 - IO 操作的艺术
  19. centos7部署k8s Cluster
  20. 编译原理——求短语、直接短语(简单短语)、素短语、句柄

热门文章

  1. 物联网智能农业的应用架构(三)【方案篇03】
  2. 操作系统探秘之内存管理
  3. 荣耀V40最新消息汇总
  4. 蚂蚁花呗被盗刷怎么办?
  5. c++ 之JSON 应用示例及源码
  6. 如何用计算机控制电灯,教你用智能手机遥控电灯
  7. 鸿蒙武器排行榜,冰雪传奇:鸿蒙级别首饰你知道哪些
  8. Gitflow有害论
  9. nexus oss私库中 releases和snapshots库的区别?
  10. HBase - 模式创建 | 那伊抹微笑