NodeJS七天课程学习笔记_第8天 Blog综合案例
Blog 综合案例 (包含注册、登录、修改密码、注销、发布、分页列表、评论、个人中心、上传头像等)
课程内容概要:
1. 介绍art-template中的 子模板 与 模板继承
2. 介绍表单同步提交与异步提交的区别
3. 介绍了可视化管理工具MongoBooster
4. 介绍了blueimp/javascript-MD5的配置和使用
5. 介绍express-session的配置与使用
6. 注册、登录 与 退出 功能的实现
7. 介绍 Express 中间件 原理
8. express中的 三大类 中间件
9. express中的 全局统一错误处理
注意: Node中有许多第3方模板引擎,不只有art-template,还有:
ejs (e代表effective高效之意,从json中生成html的一种魔法) 、
jade(因版权问题,后改名pug哈巴狗)、
handlebars(号称logic-less templateheima的manmanmai项目用到)、
nunjucks(是Mozilla开发的一个纯JavaScript编写的模板引擎)
首先讲art-template中的子模板(include) 以及 模板继承(extend)语法
官方文档地址 aui.github.io/art-template/zh-cn/docs/syntax.html
第1步, 新建下面4个文件 作为将来 被包含的子模板
公共的顶部public_top.html、
公共的底部public_footer.html、
公共的左侧边栏public_left.html、
公共的右广告栏public_right.html
第2步,新增 node_51_base_layout.html 作为将来被各个实际页面继承(extend)的母板
母板里面有个完整的骨架,
母板里包含(include)了公共的顶部、底部、左侧边栏、右广告栏
母板里head引入所有页面要用到的公共的css(如bootstrap)、js(如jquery)
同时,母板里,
通过block语法,在head标签中 预留了 实际页面真正要用到的 title、css、 js空间
通过block语法,在body标签中 预留了 实际页面真正要用到的html 空间
node_51_base_layout.html母板完整代码如下:
<!DOCTPYE html>
<html lang="zh">
<head>
<link rel="icon" href="public/img/beyond.jpg" type="image/x-icon"/>
<meta charset="UTF-8">
<meta name="author" content="beyond">
<meta http-equiv="refresh" content="520">
<meta name="description" content="未闻花名-免费零基础教程-beyond">
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" />
<meta name="keywords" content="HTML,CSS,JAVASCRIPT,JQUERY,XML,JSON,C,C++,C#,OC,PHP,JAVA,JSP,PYTHON,RUBY,PERL,LUA,SQL,LINUX,SHELL,汇编,日语,英语,泰语,韩语,俄语,粤语,阿语,魔方,乐理,动漫,PR,PS,AI,AE">
<!--[if lt IE 9]>
<script src="//apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min.js"></script>
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.js">
</script>
<![endif]-->
<!-- 公共的样式 -->
<style type="text/css">
body{
font-size: 100%;
/*声明margin和padding是个好习惯*/
margin: 0;
padding: 0;
background-image: url("public/img/sakura4.png");
background-repeat: no-repeat;
background-position: center center;
}
</style>
<!-- 公共的样式 -->
<link rel="stylesheet" type="text/css" href="public/css/beyondbasestylewhite5.css">
<!-- 绿色按钮的css效果 -->
<link rel="stylesheet" type="text/css" href="public/css/beyondbuttongreen.css">
<!-- 公共的JS特效 -->
<script type="text/javascript" src="public/js/nslog.js"></script>
<!-- jquery -->
<script type="text/javascript" src="public/js/jquery2.1.4.js"></script>
<!-- bootstrap -->
<link rel="stylesheet" type="text/css" href="public/lib/bootstrap/dist/css/bootstrap.css">
<script type="text/javascript" src="public/lib/bootstrap/dist/js/bootstrap.js"></script>
<!-- 这个标题 要留一个坑,给后代去实现自己的title -->
<title>
{
{ block 'block_1_title'}}
beyond心中の动漫神作
{
{ /block }}
</title>
<!-- 这个head中要 要留一个坑,给后代去链接自己的css或js-->
{
{ block 'block_2_head_css_js'}}
{
{ /block }}
</head>
<body>
<!-- include进来公共的顶部、底部、左侧边栏、右广告栏 -->
{
{ include './public_top.html' }}
{
{ include './public_left.html' }}
<!-- 这个body最后要 要留一个坑,给后代去实现自己的content-->
{
{ block 'block_3_body_content'}}
这是母板默认的正文<br/>
{
{ /block }}
{
{ include './public_right.html' }}
{
{ include './public_footer.html' }}
<!-- 这个body最后要 要留一个坑,给后代去实现自己的js-->
{
{ block 'block_4_body_js'}}
{
{ /block }}
</body>
</html>
第3步,现在就可以新建首页node_51_index.html了 ,
该首页 继承(extend) 自 base_layout.html母板
node_51_index.html完整代码如下:
<!-- 第0步,继承母板 -->
{
{ extend './node_51_base_layout.html' }}
<!-- 第1步,自己的标题 -->
{
{ block 'block_1_title'}}
自己的标题_首页
{
{ /block }}
<!-- 第2步,自己的head中的css或js -->
{
{ block 'block_2_head_css_js'}}
<style type="text/css">
body{
background-color: rgba(166,166,166,0.1);
}
</style>
<script type="text/javascript">
alert('我是index的head中的js')
</script>
{
{ /block }}
<!-- 第3步,自己的正文 -->
{
{ block 'block_3_body_content'}}
自己的正文<br/>
{
{ /block }}
<!-- 第4步,自己的正文最后的js代码 -->
{
{ block 'block_4_body_js'}}
<script type="text/javascript">
alert('我是index的body最后的js')
</script>
{
{ /block }}
入口文件node_51_index.js代码如下:
function NSLog(loli,needLogo=true) {console.log(loli);if(needLogo){console.log('\nCopyright © 2018 Powered by beyond')};}
// 导入框架
var express = require('express')
var path = require('path')
// 创建服务器对象
var appServer = express()
// 监听端口,并启动服务
appServer.listen(5267,function (error) {
if (error) {
return NSLog('启动失败: ' + error)
}
NSLog('服务启动成功')
})
// -----------------------------------
// 静态资源请求时的 staticFileUrlPrefix
var staticFileUrlPrefix = '/public/'
// var staticFileUrlPrefix = '/public'
// 访问也只能使用 localhost:5267/public/img/beyond.jpg
// 磁盘上的静态资源目录
var staticFilePath = './public/'
// var staticFilePath = 'public'
var callbackFunction = express.static(staticFilePath)
appServer.use(staticFileUrlPrefix,callbackFunction)
// 再开一个静态资源目录
appServer.use('/uploads/',express.static(path.join(__dirname,'uploads')))
// -----------------------------------
// 指明:对于 所有后缀为html 的模板文件 使用模板引擎
var templateFileSuffix = 'html'
appServer.engine(templateFileSuffix,require('express-art-template'))
// 下面这一句参数配置,可有可无
appServer.set('view options',{
debug: process.env.NODE_ENV !== 'production'
})
// 注意:如果不想把模板文件放在默认的views目录下,则可以通过下面代码更改设置
// appServer.set('views','其他目录')
// -----------------------------------
// 使用middleware中间件body-parser进行post请求体中数据解析
var bodyParser = require('body-parser')
// 设置解析 application/x-www-form-urlencoded
appServer.use(bodyParser.urlencoded({extended: false}))
// 设置解析 application/json
appServer.use(bodyParser.json())
// -----------------------------------
// 自定义路由设计的目的是:
// 1.让主入口程序的职责更加单一,代码更加简洁
// 1.1 创建服务
// 1.2 做一些服务相关的配置,比如:
// 1.2.1 静态资源配置
// 1.2.2 模板引擎配置
// 1.2.3 body-parse 解析表单
// 1.2.4 挂载自定义路由
// 1.2.5 监听端口,启动服务
// 使用自定义的路由模块 必须使用./
// 注意: 配置模板引擎和body-parser, 一定要在挂载路由之前
var beyondRouter = require('./node_51_router')
appServer.use(beyondRouter)
路由文件node_51_router.js代码如下:
function NSLog(loli) {console.log(loli);return 'Copyright © 2018 Powered by beyond';};
/*
自定义路由模块的职责是:
专门处理所有的路由
根据不同的请求方式和路径,采取相应的处理方法
*/
// express 专门提供了路由的处理方法
var express = require('express')
// ---------------使用formidable解析上传的图片--------------------
var formidable = require('formidable')
// var util = require('util')
var path = require('path')
// -----------------------------------
// 1.使用express专门提供的路由器处理路由
var router = express.Router()
// -----------------------------------
// 时间格式化
// var BeyondDateFormatFunction = require('./BeyondDateFormat')
// ----------------首页-------------------
router.get('/',function (request,response) {
response.render('index/node_51_index.html')
})
// 3.在模块文件最后,导出router
module.exports = router
通过node_51_index.js入口 加载 node_51_router.js路由之后
启动服务器,渲染效果如下:
Blog项目开始
第1步. 项目初始化
首先npm init -y ,生成package.json
然后git init,然后手动新建.gitignore文件
第2步. npm 安装 mongoose和express和art-template和express-art-template
第3步. 项目目录
public目录下有img和css和js和lib目录
views目录下放着html模板, 分成了登录注册模块、文章模块
第4步. 路由设计
请求路由 | 方法 | GET参数 | POST参数 | 是否需要登录权限(没用到) | 备注 |
/ | GET | 首页index.html即文章列表 | |||
/register | GET | 注册页面register.html | |||
/register | POST | email,password,username | 处理注册的POST请求 | ||
/login | GET | 登录页面login.html | |||
/login | POST | email,password | 处理登录POST请求 |
首先处理的路由是 / , 渲染首页node_52_index.html
由于数据库内暂时还没有数据,所以首页只用几个假的数据先填充,以保证样式正常
首页的渲染效果如下:
首页node_52_index.html代码(暂未使用模板引擎渲染)如下:
<!-- 第0步,继承母板 -->
{
{ extend './node_52_base_layout.html' }}
<!-- 第1步,自己的标题 -->
{
{ block 'block_1_title'}}
未闻花名_多用户博客系统_首页
{
{ /block }}
<!-- 第2步,自己的head中的css或js -->
{
{ block 'block_2_head_css_js'}}
<style type="text/css">
body{
background-color: rgba(166,166,166,0.1);
}
</style>
<script type="text/javascript">
// alert('我是index的head中的js')
</script>
{
{ /block }}
<!-- ||||||||||||||||||||||||||||||||| -->
<!-- 第3步,自己的正文 -->
{
{ block 'block_3_body_content'}}
<section class="container">
<ul class="media-list">
<li class="media">
<div class="media-left">
<a href="#">
<img width="40" height="40" class="media-object" src="public/img/beyond.jpg" alt="...">
</a>
</div>
<div class="media-body">
<h4 class="media-heading"><a href="/topics/123">未闻花名</a></h4>
<p>面码 发起了话题 • 1314 人关注 • 32 个回复 • 1992 次浏览 • 2006-06-07 22:20</p>
</div>
</li>
<li class="media">
<div class="media-left">
<a href="#">
<img width="40" height="40" class="media-object" src="public/img/beyond.jpg" alt="...">
</a>
</div>
<div class="media-body">
<h4 class="media-heading"><a href="/topics/123">龙与虎</a></h4>
<p>逢坂大河 发起了话题 • 520 人关注