这个留言板是基于express框架,和ejs模板引擎,首先需要在根目录安装express框架,然后安装ejs模块和body-parser(获取用户表单提交的数据);建立项目目录 message,然后依次建立views文件夹 (存放ejs模板文件)、public(存放静态资源css js images,使用express内置中间件static托管静态)、routers(路由文件,创建路由级中间件);
然后建立一个入口文件app.js .
// 项目入口文件 'use strict'; const express = require('express'); const path = require('path'); const app = express(); const bodyParser = require('body-parser'); //引入获取表单的第三方中间件 //托管静态资源 app.use(express.static(path.join(__dirname, 'public'))); //将public的资源全部托管 // 使用bodyparser中间件 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); //实现跟路由;可以通过message二级路由来实现 const message = require('./routers/message'); app.use('/', message); //之后的显示全部在二级路由message中处理 app.listen(3000, () => { console.log('3000 is on!'); });
再在routers文件夹中建立一个message路由如下
const express = require('express'); const router = express.Router(); const path = require('path'); const fs = require('fs'); const app = express(); // 实现载入页面的路由;需要载入的页面中含有静态资源和用户的留言 router.get('/', (req, res) => { // 显示用户的留言 //读取数据 let arr = []; // 渲染ejs页面 if (fs.existsSync('msg.json')) { //判断是否存在这个文件 ,如果存在就直接读取,如果不存在就写入 let str = fs.readFileSync('msg.json', 'utf8'); arr = JSON.parse(str); } res.render('index.ejs', { data: arr }, (err, html) => { if (err) throw err; console.log(html); res.send(html); }); }); // 处理用户的提交留言 router.post('/publish', (req, res) => { let msg = req.body; //提取用户提交的数据 msg.time = new Date().toLocaleString(); let arr = []; // 保存用户的留言 if (fs.existsSync('msg.json')) { // 如果msg.json存在文件就先读取文件再写入 let str = fs.readFileSync('msg.json', 'utf8'); arr = JSON.parse(str); } arr.push(msg); // 将数据写入msg.json中 fs.writeFile('msg.json', JSON.stringify(arr), (err) => { if (err) throw err; res.send('<p>发布成功<a href="/">返回</a></p>'); }); }); module.exports = router;
在views文件夹中放ejs模板文件index.ejs,代码如下;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <link rel="stylesheet" href="style/base.css" type="text/css" /> <link rel="stylesheet" href="style/global.css" type="text/css" /> <title>LD Studio 留言板---很靠谱的留言板</title> </head> <body> <div class="wrapper"> <!-- 公共头部 --> <div class="header"> <h1><a href="">LD Stuido留言板</a></h1> <h2>很靠谱的留言板</h2> <img src="images/hanoi.jpg" alt="" /> <ul> <li><a href="/">首页</a></li> <li><a href="/">关于</a></li> </ul> </div> <div class="main"> <div class="content"> <% for (var i = 0; i < data.length; i++) { %> <div class="msg"> <h2> <%= data[i].title %> </h2> <p>发表于 <a href=""> <%= data[i].time %> </a> 由 <a href=""> <%= data[i].author %> </a> </p> <p> <%= data[i].content %> </p> </div> <% } %> <div class="msg_form"> <h2>发表留言</h2> <form action="/publish" method="post"> <ul> <li> <label for="">标题:</label> </li> <li> <input type="text" name="title" class="txt" /> </li> <li> <label for="">作者:</label> </li> <li> <input type="text" name="author" class="txt" /> </li> <li> <label for="">内容:</label> </li> <li> <textarea name="content" id="" cols="70" rows="5"></textarea> </li> <li> <input type="submit" value="提 交" class="btn" /> </li> </ul> </form> </div> </div> <div class="sidebar"> <h2>最新留言</h2> <ul> <li><a href="">LAMP架构</a></li> <li><a href="">JavaScript程序设计</a></li> <li><a href="">CSS样式</a></li> <li><a href="">XTHML结构</a></li> </ul> </div> </div> <div style="clear:both;"></div> <!-- 公共底部 --> <div class="footer"> <p><a href="">LD Studio</a> © 2009-2012 版权所有</p> </div> </div> </body> </html>
最后启动app.js
留言板实现完成!