基于express+mongodb+pug的博客系统——pug篇
很久之前就想自己搭一个博客了,最开始用hexo+github,但是换电脑后总是有些麻烦。后来使用WordPress,但是用WordPress总觉得没什么技术含量,前后端都是人家写好的,而且买的垃圾虚拟机老是出问题,动不动就要提交工单解决,所以最后干脆就直接在博客园上写了。
最近比较闲,所以正好抽时间简单看了下node.js,然后看了看express,顺便搭了个博客出来练手。当然也不仅是单纯的练手,更多的算是一种探路或者摸索吧,因为公司虽然有大牛,但更多的是忙于应付业务,基本上是没时间去学学新的东西来尝试解决我们在开发中遇到的各种问题,这其中就包括比如重复书写大量相同代码,后期维护困难等。
在此之前,我也没有真正写过后台项目,虽然在学校用PHP+MySQL写过几个简单的页面,但是毕业快一年了,以前的东西都太久没用,基本都快忘记了。所以现在使用node.js+mongoDB也算是从零开始吧,在写的过程中,有简单的去对项目结构等作出一些优化调整,但越往后,理解也就越深,所以更多的干脆就留着下一版来更改吧。
这一个版本算是初级版本吧,基本功能是全的。不过经过这三个多星期的实际操作和阅读一些别人的博客,从代码结构和工程结构方面,都有更深的理解,所以还有很多能够优化的地方。不过并不打算等到都做好了再写,而是先把这段时间遇到的坑记录下来,要不时间越久,忘的也就越多,早点记录,多少还能留下点什么,也能帮助其他新手朋友更容易入门。
这一个版本所用到的库,包括node框架express4.4X、数据库mongoDB、模板引擎pug(原jade)。
废话不多说,进入正题。
我在项目中使用的pug.js是最新2.0版本的。
1.基础文档
在pug中没有结束标签,需要严格使用缩进来表示父子元素之间的关系。
编译前:
doctype html
html
head
title pug基础 body
p.text 必须严格使用缩进,来表明父子和兄弟元素间的关系
编译后:
<!DOCTYPE html>
<html>
<head>
<title>pug基础 </title>
</head> <body>
<p class="text">必须严格使用缩进,来表明父子和兄弟元素间的关系</p>
</body>
</html>
2.内容渲染(插值)
各个模板引擎渲染方法都差不多,这里主要是给大家展示在pug模板里插值的写法。
方法一:
插入固定字符串,直接在标签后面敲空格输入字符串就行
插入变量时,输出字符使用#{};输出html代码使用!{}
在使用大括号插值时,还支持JavaScript表达式
编译前:
- var string = "string";
- var html = "<span>htmlString</span>"; p 直接写插入字符串,只需在标签后面敲一个空格
p 需要渲染为字符串的变量#{string}
p 大括号插值也支持JavaScript表达式#{string.toUpperCase()}
p 需要渲染为html代码的变量!{html}
编译后:
<p>直接写插入字符串,只需在标签后面敲一个空格</p>
<p>需要渲染为字符串的变量string</p>
<p>需要渲染为字符串的变量STRING</p>
<p>需要渲染为html代码的变量<span>htmlString</span></p>
方法二:
1.使用=插入text
2.使用!=插入html
3.同样也支持JavaScript表达式
编译前:
- var string = "string";
- var html = "<span>htmlString</span>"
p 直接写插入字符串,只需在标签后面敲一个空格
p= '需要渲染为字符串的变量'+string.toUpperCase()
p!= '需要渲染为html代码的变量'+html
编译后:
<p>直接写插入字符串,只需在标签后面敲一个空格</p>
<p>需要渲染为字符串的变量STRING</p>
<p>需要渲染为html代码的变量<span>htmlString</span></p>
3.属性
pug模板中给元素添加属性
简单添加
编译前:
a(class='link' href='www.baidu.com') 百度
编译后:
<a class="link" href="www.baidu.com">百度</a>
三元表达式
编译前:
- var active= true
a(class=active? 'link-active' : '' href="www.baidu.com") 百度
编译后:
<a class="link-active" href="www.baidu.com">百度</a>
class条件
编译前:
- var currentUrl = '/about'
a(class={active: currentUrl === '/'} href='/') Home
a(class={active: currentUrl === '/about'} href='/about') About
编译后:
<a href="/">Home</a>
<a class="active" href="/about">About</a>
属性插值
编译前:
- var btnType = 'info'
- var btnSize = 'lg'
button(type='button' class='btn btn-' + btnType + ' btn-' + btnSize) //- 支持ES6的环境中
button(type='button' class=`btn btn-${btnType} btn-${btnSize}`)
编译后:
<button class="btn btn-info btn-lg" type="button"></button>
<button class="btn btn-info btn-lg" type="button"></button>
4.语句
语句包括编程语言中的for、if、switch这些,只是在pug中,稍微有些不同。
case
case语句和JavaScript中的switch语句类似。
编译前:
- var friends = 10
case friends
when 0
p you have no friends
when 1
p you have a friend
default
p you have #{friends} friends
编译后:
<p>you have 10 friends</p>
if
编译前:
- var user = { name: 'tom' }
- var age = false
#user
if user.description
h2.green 如果user.name为true
p.description= user.name
else if age
h2.blue 如果age为true
p.description= age else
h2.red Description
p.description User has no description
编译后:
<h2 class="green">如果user.name为true</h2>
<p class="description">foo bar baz</p>
each
编译前:
- var arr = ['zero', 'one', 'two'];
- var obj = {name:'tom',age:21,country:'china'}; ul.array
each val, index in arr
li= index + ': ' + val ul.object
each val, key in obj
li= key + ': ' + val
编译后:
<ul class="array">
<li>0: zero</li>
<li>1: one</li>
<li>2: two</li>
</ul> <ul class="object">
<li>name: tom</li>
<li>age: 21</li>
<li>country: china</li>
</ul>
5.include
通过include,你可以在一个pug模板里,引入另外一个pug组件。
编译前:
//- index.pug
doctype html
html
title include用法 body
include components/head.pug p 在index.pug文件中引入了head.pug和footer.pug两个组件 include components/footer.pug
//- components/head.pug
h1 这是head.pug组件
//- components/footer.pug
footer 这是footer.pug组件
编译后:
<!DOCTYPE html>
<html> <head>
<title>include用法</title>
</head> <body>
<h1>这是head.pug组件</h1> <p>在index.pug文件中引入了head.pug和footer.pug两个组件</p> <footer>这是footer.pug组件</footer>
</body>
</html>
6.模板继承
include可以帮我们少写很多重复代码,同时更容易去维护每个组件。而继承则能够使模板更加灵活,进一步减少我们的工作量。
在pug里,我们可以使用extends来继承模板,使用block来定义可能会变化或者可扩展的内容。
编译前:
//- layout.pug
doctype html
html
head
title Template Inheritance用法
//- 这里是可以扩展的link区域
block links
link(rel="stylesheet" href='/main.css') script(src="/jquery.js") body
head 所有页面的公共头部 //- 这里是可以扩展的内容区域
block content
//- 这里是可以扩展的script区域
block scripts
script(src="/bootstrap.js")
//- index.pug
extends layout.pug block links
link(rel="stylesheet" href='/bootstrap.css')
link(rel="stylesheet" href="/index.css") block content
h1 模板继承的用法
p 使用extends来继承模板
p 使用block来自定义模板里的内容 block append scripts
script(src="index.js")
编译后:
<doctype html>
<html>
<head>
<title>Template Inheritance用法</title>
<link rel="stylesheet" href="bootstrap.css">
<link rel="stylesheet" href="index.css">
</head> <body>
<header> 所有页面的公共头部</header> <h1>模板继承的用法</h1>
<p>使用extends来继承模板</p>
<p>使用block来自定义模板里的内容</p> <script src="/index.js"></script>
<script src="/bootstrap.js"></script>
</body>
</html>
7.内联script
我们有时也会在html页面内嵌一些JavaScript代码,在pug中也很简单
编译前:
doctype html
html
head
title 内联script
body
h1 需要在此页面中内联一些脚本 script.
console.log('只需要在script后面加上一个.符号')
编译后:
<doctype html>
<html>
<head>
<title>内联script</title>
</head> <body>
<h1>需要在此页面中内联一些脚本</h1> <script>
console.log('只需要在script后面加上一个.符号')
</script>
</body>
</html>
结语:
以上基本涵盖了pug的95%内容,还剩下一点少用的没有一一赘述,比如过滤器(filters)和注释(comments)等,markdown过滤器是个好东西,不过我觉得一般就个人项目,比如博客这样的会用上。
这些东西也足够你在项目中使用了,对于剩下的那5%,大家可以自己去看看官网,了解一下,都挺简单pug.js。
另外在我使用的时候,发现pug的写法除了缩进以外,也可以按照标准的html书写格式来创建模板,插值什么的,通过#{}方式同样好使。
不过在官网上没看见可以使用这种方式创建模板的说明,这是第一次使用pug(jade),所以不知道会不会是兼容以前的版本,有知道的朋友麻烦告诉我一声,谢谢哈!
基于express+mongodb+pug的博客系统——pug篇的更多相关文章
- NodeJS+Express+MongoDB 简单个人博客系统【Study笔记】
Blog 个人博客系统 iBlog是在学习NodeJs时候一个练手项目Demo 系统支持用户注册/登录,内容文章查看,评论,后台管理(定制显示的分类版块,进行文章内容添加)超级管理员还可进行用户管理等 ...
- 基于express+mongodb+pug的博客系统——后台篇
上一篇介绍了模板引擎pug.js的用法,这一篇就主要写后台逻辑了. 后台的大部分的功能都有了,只是在已经登录的状态下,前台和后台的逻辑处理还不是很完善. 先上几张图吧,仿旧版的简书,改了下UI,因为没 ...
- 基于React服务器端渲染的博客系统
系统目录及源码由此进入 目录 1. 开发前准备 1.1 技术选型1.2 整体设计1.3 构建开发 2. 技术点 2.1 react2.2 redux, react-router2.3 server-r ...
- 分享个基于 Node.js + React 的博客系统
是使用 ES2015+ 特性写的,使用了 ThinkJS 框架,后台使用了 React. 完全使用 Markdown 来写文章,还可以把文章推送到团队博客系统中(团队博客也需要使用该系统). 项目地址 ...
- 基于Koa2+mongoDB的后端博客框架
主要框架:koa2全家桶+mongoose+pm2. 在阅读前建议将项目克隆到本地配合食用,否则将看得云里雾里. 项目地址:https://github.com/YogurtQ/koa-server. ...
- 基于开源博客系统(jpress)搭建网站
基于开源博客系统(jpress)搭建网站 JPress 使用 Java8 开发,基于流行的JFinal和Jboot框架. 目前JPress已经内置的文章和页面其实是两个模块,可以移除和新增其他模块,因 ...
- Asp.net博客系统收集和简单介绍
国内Asp.net博客系统收集和简单介绍 [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于A ...
- 基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统
很久没更新博客,最近也有点忙,然后业余时间搞了一个比较完整基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统的流程系统,希望对 ...
- 项目实战(连载):基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)
本章主要讲什么(一句话)? <项目实战:基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)> -- 基于MongoDB的MyBlog数据库知识技术储备(上 ...
随机推荐
- pl sql 查询显示乱码解决方法——设置环境变量NLS_LANG
用oracle进行查询的时候,有的时候会出现查询结果为乱码的情况,此时要设置一个环境变量NLS_LANG. 此变量的值如何获得呢?运行下面sql语句就可以获得: select userenv('lan ...
- 【Hexo】(一)使用HEXO配置环境,创建Hello World
现场直播,呵呵,就是我完成一步,就记录一下: 一.配置环境 1.安装 Node 下载地址:Node.js 2.安装 Git(win环境下) 下载地址:Git Git 绑定 GitHub账户: ①打开G ...
- 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2
事件要到那里去? 每个事件源处理类都维护着一个自己的事件队列, 在Monkey中叫做CommandQueue,里面装的是每个具体的MonkeyEvent事件.当来自网络的字串命令被翻译成对应的Monk ...
- 老李分享:《Linux Shell脚本攻略》 要点(八)
老李分享:<Linux Shell脚本攻略> 要点(八) 1.打印进程 [root@localhost program_test]# ps -e | head PID TTY ...
- C# Task 源代码(2)
上篇已经讲到Task 的默认的TaskScheduler 为ThreadPoolTaskScheduler. 这时我们回到原来的task 的start方法,在代码最后,调用了 ScheduleAndS ...
- MYSQL数据库导入大数据量sql文件失败的解决方案
1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...
- Git 更新本地代码
先用git remote -v 查看远程仓库的分支: 我分支远程仓库就只有一个分支master 比较本地仓库和远程仓库的不同 我本地仓库和远程仓库的代码是一样的所以没有区别 更新远程代码到本地 合并本 ...
- 极化SAR图像基础知识(2)
本篇主要关注物理含义 1.极化 电磁波在传播时,传播的方向和电场.磁场相互垂直,我们把电波的电场方向叫电波的极化.(i.e.依据电场E的方向来定义电磁波的极化). 如果电场矢量端点随时间变化的轨迹是一 ...
- phpcms 笔记
首先是要把首页分为三个部分 : 导航部分 .尾部和首页中间部分 用了三个不同的文件 header.html ; index.html; footer.html 在使用phpcms之前 首先 ...
- webx request注入单例增强实现
由于在spring中request对象的scope限制导致了request对象无法直接注入到单例bean中,所以webx对其进行了增强实现,达到单例注入的目的. 实现原理大致如下: 1 启动时注册全局 ...