运行效果




运行步骤

  1. 安装所需依赖npm install
  2. 运行app.js后即可访问http://localhost:3000/

知识点

  1. 执行npm init 初始化包

  2. 安装所需依赖>npm i body-parser ejs express moment morgan --save

  3. 格式化时间moment(new Date()).format('YYYY-MM-DD HH:mm:ss')

  4. ejs 模板引擎的运用

    // 注册模板引擎
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
  5. 设置用户表单提交数据的接收中间件

    // 设置用户表单提交数据的接收中间件,所有提交的信息都会保存在req.body
    app.use(bodyParser.urlencoded({extended:false}));
    
  6. 界面重定向

    // 回到主界面 重定向
    res.redirect('/');
    
  7. 设置全局变量,运用于服务器整个生命周期。

    let entries = [];
    app.locals.entries = entries;
    

代码

app.js

const express = require('express');
const bodyParser = require('body-parser');
const morgan = require('morgan');
const moment = require('moment');
const path = require('path');let app = express();// 注册模板引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');// 设置全局变量,运用于服务器整个生命周期
let entries = [];
app.locals.entries = entries;// 设置用户表单提交数据的接收中间件,所有提交的信息都会保存在req.body
app.use(bodyParser.urlencoded({extended:false}));app.get('/', (req, res) => {res.render('index');
});app.get('/new',(req,res)=>{res.render('new');
});
// 处理数据提交
app.post('/new',(req,res,next)=>{// 判断if(!req.body.title || !req.body.content){res.status(400).send('留言内容必须要有内容和标题!');return;}// 保留用户留言entries.push({title:req.body.title,content:req.body.content,published:moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),});// 回到主界面 重定向res.redirect('/');
});
// 渲染404界面
app.use((req,res)=>{res.status(404).render('404');
});
app.listen(3000,()=>{console.log('服务器已经启动');
});

header.ejs

<!doctype html>
<html lang="zh-cn">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"><title>留言板</title>
</head>
<body>

footer.ejs

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
</body>
</html>

index.ejs

<%- include('header'); -%><h2 class="text-center mt-5 mb-2">留言板</h2>
<div class="text-center"><a href="/new" class="btn btn-sm btn-danger">留言</a>
</div>
<div class="container mt-2 mb-2"><div class="row"><% if(entries.length){%><%entries.forEach(function (entry) {%><div class="card mb-2" style="width: 100%;"><div class="card-body"><h5 class="card-title"><%=entry.title%></h5><h6 class="card-subtitle mb-2 text-muted"><%=entry.published%></h6><p class="card-text"><%=entry.content%></p></div></div><%})%><%} else{%><span class="p-2">暂无留言!</span><a class="p-2"href="/new">去添加一条留言</a><%}%></div>
</div>
<%- include('footer'); -%>

404.ejs

<%- include('header'); -%>
<div class="container text-center mt-5 mp-5 text-danger"><h2>提示:404!您访问的页面不存在</h2>
</div>
<%- include('footer'); -%>

new.ejs

<%- include('header'); -%><div class="container"><h3 class="text-center mt-4 mb-3">请写下留言:</h3><form method="post" role="form"><div class="form-group"><label for="title">留言的标题:</label><input type="text" class="form-control" id="title" name="title" placeholder="请输入标题" required></div><div class="form-group"><label for="title">留言的内容:</label><textarea rows="5" style="resize: none" class="form-control" id="content" name="content" placeholder="请输入内容" required></textarea></div><div class="form-group"><input type="submit" value="提交留言" class="btn btn-danger float-right"></div></form>
</div><%- include('footer'); -%>

实战Node:Node实现留言板相关推荐

  1. 朴素贝叶斯实战(Python屏蔽留言板的侮辱性言论)

    项目概述 构建一个快速过滤器来屏蔽留言板上的侮辱性言论.如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当.对此问题建立两个类别: 侮辱类和非侮辱类,使用 1 和 0 分别表示. 准 ...

  2. Vue实战篇二十九:模拟一个简易留言板

    系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...

  3. android中留言板功能,js 实现简易留言板功能

    无标题文档 li{list-style:none;} li{position:relative;width:500px;} a{position:absolute;right:10px;} var c ...

  4. PHP初级练习实战之公司留言板(原生)

    PHP初级练习实战之留言板 初学者做的东西,有的地方写的不好,哈哈哈! 一.知识重点 1.三目运算 $page= empty($_GET['p']) ? 1: $_GET['p']; 2.数据库的操作 ...

  5. 机器学习实战4.2 朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论

    机器学习实战4.2 朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论 参考地址:https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html 一.引子 很久没更新 ...

  6. React实战:留言板

    留言板 一.展示 留言板功能:"增加留言","删除留言","修改留言" 二.组件设计 CommentBox是顶层组件,里面包含 Commen ...

  7. Thinkphp5实战之留言板

    本节主要通过Thinkphp5来实现简易留言板的基本功能.麻雀虽小,五脏俱全.从以下几个方面来进一步认识Thinkphp5,包括:目录布局.MCV的运用.对数据的增删改查.留言板功能逻辑等.打牢基础, ...

  8. python+Mysql+flask架构的在线留言板实战

    在线留言板实战项目说明文档 用python操作mysql完成一个在线留言板系统 1.设计留言板表 2.通过python语言实现 1 项目基本功能 留言板系统主要功能:(要求使用类实现) 1.显示留言板 ...

  9. php实战:html+php+mysql实现留言板功能

    功能描述: 1)实测链接的是远程数据库 2)打开留言板加载留言 3)新添加的留言显示在下方 css代码,用于设置弹框和新添加的留言样式等 <style type="text/css&q ...

  10. phpstudy简单项目实战——留言板之第一弹

    跟着PHP中文网学做留言板-- 一.数据库的创建 1.首先打开你电脑中已经下载完成的phpstudy(没有下载的可自行去下载) 2.点击MySQL管理器->phpMyAdmin->执行(用 ...

最新文章

  1. 2022-2028年中国二次供水产业发展动态及投资战略规划报告
  2. JavaScript sync and async(同步和异步)
  3. Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign
  4. 阿里8亿加持B端智能化后,本地生活服务更好做了吗?
  5. python中options设置_如何在AngularJS的ng-options中设置value属性?
  6. java 微信jssdk签名_JAVA生成微信JSSDK接口签名
  7. system.img解包打包工具_好程序员云计算学习路线分享文件打包及压缩
  8. pg 定时删除_PostgreSQL的时间函数使用整理
  9. jsf标签p:ajax_JSF简单Ajax示例
  10. 2万8千张图片如何用python组成一张(简洁明了附源码)
  11. 50元打造双网卡负载均衡服务器
  12. MFC初探 —— 设置软件开机自启
  13. python元祖组成字典_Python之旅第四天(列表、元祖、字典和习题)
  14. 关于IplImage中widthstep的大小与width,nchanne
  15. MySQL可视化工具HeidiSQL安装与使用
  16. JavaScript自动切换并播放视频 | Tampermonkey
  17. 用计算机用语说唯美的话,100句唯美说说qq空间句子合集
  18. 趣味点名软件_网传川大教授用刷脸软件点名 无人逃课
  19. 轴承剥离型故障对应的特征频率
  20. Python如何判断一个数据的小数点后面首个非零数字位于小数点后面第几位

热门文章

  1. 10. Browser 对象 - Location 对象(2)
  2. html 可换行属性,html里title属性换行的方法
  3. css3中的perspective与perspective-origin
  4. onchange与oninput的区别
  5. 绝对定位的图 说明初始包含块是viewport 而不是body/html
  6. python 装饰器(复杂一点的)
  7. PAT乙级1005. 继续(3n+1)猜想 (25)
  8. Counting Bits -leetcode
  9. 电商网站主动取消客户已支付成功订单感想
  10. 【贪心】【AOJ-5】渊子赛马