npm init -y(初始化项目)

npm install express(引入express)

npx express-generator -e(自动生成模板。添加对 ejs 模板引擎的支持)

npm i --save lodash(引入lodash)

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

//获取路由
var indexRouter = require('./routes/index');//模板自带
var usersRouter = require('./routes/users');//模板自带
var studentRouter = require('./routes/student'); var app = express(); // view engine setup //获取视图路径,_dirname是lodash里的获取文件目录
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs'); app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

//绑定路由
app.use('/index', indexRouter);
app.use('/users', usersRouter);
app.use('/', studentRouter); // catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
}); // error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page
res.status(err.status || 500);
res.render('error');
}); module.exports = app;

student.js

var express = require('express');
var router = express.Router();
const _=require("lodash"); let stus=[
{id:202201,name:"tom",age:18},
{id:202202,name:"rose",age:16},
{id:202203,name:"jack",age:20},
{id:202204,name:"lili",age:15},
{id:202205,name:"lucy",age:15}
]; /* GET home page. */
router.get('/', function(req, res, next) {
res.render('student', {stus,msg: '',stu:{id:"",name:"",age:""}});
}); router.get('/delete/:id', function(req, res, next) {
//查找选中id的索引
let index=_.findIndex(stus,{id:req.params.id})
//删除
stus.splice(index,1);
res.render('student', {stus,msg: '删除成功!',stu:{id:"",name:"",age:""}});
}); //添加
router.post('/add', function(req, res, next) {
//查找选中id的索引
let stu=req.body;
stus.push(stu);
//根据编号排序
let stus2=_.orderBy(stus,["id"]);
stu.id=_.last(stus2).id+1;
res.render('student', {stus,msg: '添加成功',stu:{id:"",name:"",age:""}});
}); //修改
router.get('/edit/:id', function(req, res, next) {
//查找选中id的索引
let stu=_.find(stus,{id:parseInt(req.params.id)})
console.log(stus);
res.render('student', {stus,msg: '',stu});
}); //更新
router.post('/update', function(req, res, next) {
//查找选中id的索引
let stuSubmit=req.body;
let stu=_.find(stus,{id:parseInt(stuSubmit.id)})
stu.name=stuSubmit.name;
stu.age=stuSubmit.age;
//重新渲染页面
res.render('student', {stus,msg: '更新成功',stu:{id:"",name:"",age:""}});
}); module.exports = router;

student.ejs

<!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>学生管理系统</title>
</head>
<body>
<h1>学生管理系统</h1>
<table width="100%" border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<% for(let i=0;i<stus.length;i++){ %>
<tr>
<td><%=stus[i].id%></td>
<td><%=stus[i].name%></td>
<td><%=stus[i].age%></td>
<td>
<a href="/delete/<%=stus[i].id%>" class="del">删除</a>
<a href="/edit/<%=stus[i].id%>">修改</a>
</td>
</tr>
<%} %>
</table>
<fieldset>
<legend>添加学生</legend>
<form method="post">
<p>
<label>姓名:</label>
<input type="text" name="name" value="<%=stu.name%>">
</p>
<p>
<label>年龄:</label>
<input type="text" name="age" value="<%=stu.age%>">
</p>
<input type="hidden" name="id" id="studentId" value="<%=stu.id%>">
<button formaction="/add">添加</button>
<button formaction="/update">更新</button>
</form>
</fieldset> <h4><%=msg%></h4> <script>
let dels=document.querySelectorAll(".del");
for(let i=0;i<dels.length;i++){
dels[i].onclick=function(){
return confirm("您确定要删除吗?");
}
}
</script>
</body>
</html>

Node.js(五)学生管理CRUD的更多相关文章

  1. 4.Node.js 微信消息管理

    一.写在前面的话   当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应.   消息推送也是 ...

  2. Node.js的安装以及Node.js的模块管理

    索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...

  3. Node.js的进程管理

    众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进 ...

  4. 使用yarn代替npm作为node.js的模块管理器

    使用yarn代替npm作为node.js的模块管理器 转 https://www.jianshu.com/p/bfe96f89da0e     Fast, reliable, and secure d ...

  5. 90%的人都不知道的Node.js 依赖关系管理(下)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/node-dependency-manage ...

  6. Node.js 安装与管理

    一.node安装 Windows下,官网下载 Node.js 安装包,运行安装即可, 安装成功后,可查看版本号 node -v 二.npm npm 是 node 包管理工具,随同node一起安装,安装 ...

  7. 90%的人都不知道的Node.js 依赖关系管理(上)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...

  8. 关于node.js的进程管理

    如果是单纯的运行一个node进程,那会比较简单,例如: node ./example.js 但是一般来说,当我们运行一个node进程之后,我们可能希望对这个进程进行更多的管理,例如,当node程序是一 ...

  9. [Web 前端] 使用yarn代替npm作为node.js的模块管理器

    cp from : https://www.jianshu.com/p/bfe96f89da0e     Fast, reliable, and secure dependency managemen ...

随机推荐

  1. 【高并发】通过源码深度分析线程池中Worker线程的执行流程

    大家好,我是冰河~~ 在<高并发之--通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程>一文中我们深度分析了线程池执行任务的核心流程,在ThreadPool ...

  2. 使用Huggingface在矩池云快速加载预训练模型和数据集

    作为NLP领域的著名框架,Huggingface(HF)为社区提供了众多好用的预训练模型和数据集.本文介绍了如何在矩池云使用Huggingface快速加载预训练模型和数据集. 1.环境 HF支持Pyt ...

  3. C# 委托/事件本质详解

    委托 一.什么是委托 IL层面1>委托的本质就是一个类2>继承自System.MulticastDelegate3>委托里面内置了3个方法:Invoke(),BeginInvoke( ...

  4. nginx的高级用法

    一.根据url中的参数来确定缓存的key set_by_lua_block $dataArg { local enc = ngx.req.get_uri_args()["enc"] ...

  5. 自定义注解_格式&本质和自定义注解_属性定义

    自定义注解: 格式: public @interface 注解名称{} 本质:注解本质上就是一个接口,该接口默认继承Annotation接口 public interface MyAnno exten ...

  6. 零基础学Java(13)方法参数

    前言 首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语.按值调用表示方法接收的是调用者提供的值.而按引调用表示方法接收的是调用者提供的变量地址.方法可以修改按引用传递的变量的值,而不 ...

  7. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  8. Apache Dolphinscheduler 1.3.x 系列配置文件指南

    前言 本文档为dolphinscheduler配置文件指南,针对版本为 dolphinscheduler-1.3.x 版本. 考虑公众号对markdown文件格式支持不那么友好的问题,建议大家在PC端 ...

  9. MyBatis 02 配置

    导入jar包 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</a ...

  10. Vim配置文件-详解(.vimrc)

    Vim配置文件的作用 Vim启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim Vim分类 系统Vim配置文件/etc/vimrc 所有系统用户在启动 ...