1.初始化项目:npm init
2.安装项目依赖
cnpm i body-parser ejs express moment morgan --save
3.项目结构
app.js:
const express = require('express')
const bodyParser = require('body-parser')
const morgan = require('morgan')
const moment = require('moment')
const path = require('path')
const 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.use(express.static(path.join(__dirname,'views')))
app.get('/',(req,res)=>{
res.render('index')
})
app.get('/new',(req,res)=>{
res.render('new')
})
//数据提交
app.post('/new',(req,res)=>{
console.log(req.body)
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(3001,()=>{
console.log('服务器已经启动了')
})
index.ejs:
<%- include('header.ejs') -%>
<h2 class="text-center mt-5">留言板</h2>
<div class="text-center">
<a href="/new" class="btn btn-sm btn-danger">
我要留言
</a>
</div>
<div class="container mt-5 mb-5">
<div class="row">
<% if(entries.length) {
%>
<% entries.forEach(function (entry) {
%>
<div class="card mb-3" 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 {
%>
暂无留言!<a href="/new">去添加一条留言</a>
<% } %>
</div>
</div>
<%- include('footer.ejs') -%>
new.ejs
<%- include('header.ejs') -%>
<div class="container">
<h3 class="text-center mt-5 mb-2">
请写下您的留言
</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="content">留言内容:</label>
<textarea rows="5" 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.ejs') -%>
header.ejs
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" >
<title>留言板</title>
<!-- Bootstrap -->
</head>
<body>
footer.ejs
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js" ></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
404.ejs
<%- include('header.ejs') -%>
<div class="container text-center mt-5 pt-5 text-danger">
<h2>404!您访问的页面不存在!</h2>
</div>
<%- include('footer.ejs') -%>