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. 在docker容器中如何自动生成配置文件(以nginx配置为例)

    应用场景类似于多个域名要起多个容器,有些参数有些域名需要,有些域名不需要,或者参数的值不太一样,需要去对应的配置文件修改,不太灵活,如果通过变量的方式直接定义在Dockerfile文件中,需要哪些参数 ...

  2. linux 安装redis及问题收集

    contos 7 下安装redis教程可参照https://www.cnblogs.com/hxun/p/11075755.html值得注意的是在第6步方法一(所以建议使用方法二),如果直接使用xft ...

  3. 2507-AOP- springboot中使用-使用注解方式

    Springboot中使用aop,与SSM中使用AOP,整体配置与编写方式都是类似的.但是Springboot简化了很多xml配置,切点的表达式可以直接进行javaconfig. 记录一些示例 spr ...

  4. sql语句实现每日资格设置

    CREATE TABLE 'iDayAuth'( 'openid' VARCHAR(16) NOT NULL , 'iStamp' INT(10) NOT NULL, 'iDayAuth' SMALL ...

  5. 提交代码的其他方式,不单单只有git

    1.  xftp提交代码至服务器,直接连接服务器(如果使用可以直接到官网下载一个试用版或者家庭教育版的,本人不推荐使用破解版毕竟是直接和公司服务器对接出问题不好交代) // https://www.n ...

  6. 1.2 Hadoop快速入门

    1.2 Hadoop快速入门 1.Hadoop简介 Hadoop是一个开源的分布式计算平台. 提供功能:利用服务器集群,根据用户定义的业务逻辑,对海量数据的存储(HDFS)和分析计算(MapReduc ...

  7. 1. MGR简介 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 为什么是MGR MGR是MySQL Group Replication的缩写,即MySQL组复制. 在以往,我们一般 ...

  8. Jittered采样类定义和测试

    抖动采样算法测试,小图形看不出什么明显区别,还是上代码和测试图吧. 类声明: #pragma once #ifndef __JITTERED_HEADER__ #define __JITTERED_H ...

  9. RocketMQ 详解系列

    什么是RocketMQ RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等.主要功能是异步解耦和流量削峰:. 常见的MQ主要有 ...

  10. 总结-一本通提高篇&算竞进阶记录

    当一个人看见星空,就再无法忍受黑暗 为了点亮渐渐沉寂的星空 不想就这样退役 一定不会鸽の坑 . 一本通提高篇 . 算竞进阶 . CDQ & 整体二分 . 平衡树 . LCT . 字符串 . 随 ...