使用nunjucks代替原来的ejs,因为这个更强大,是node中主流的模板引擎

nunjucks官网

配置使用 nunjucks 模板引擎

nunjucks 模板引擎没有对模板文件名的后缀名做特定限制

如果文件名是 a.html 则渲染的时候就需要传递 a.html

如果文件名是 b.nujs 则传递 b.nujs

import express from 'express'
import config from './config'
import nunjucks from 'nunjucks'
const app = express()
import router from './router' nunjucks.configure(config.viewPath, {
autoescape: true,
express: app
}) app.use(router) app.listen(3000, () => {
console.log('server is running at port 3000...')
})

config.js

import { join } from 'path'

export default {
viewPath: join(__dirname, '../views'),
node_modules_path: join(__dirname, '../node_modules'),
public_path: join(__dirname, '../public')
}

处理路由

import express from 'express'

// 创建一个路由容器,将所有的路由中间件挂载给路由容器
const router = express.Router() router.get('/', (req, res, next) => {
res.render('index.html')
}) // 通过 export default 暴露的接口成员不能定义的同时直接暴露
// 最好先定义,再暴露
// export default 可以直接暴露字面量 {} 123
export default router

以上是配置引擎模板,模板语法如下:

模板语法

{% extends "layout.html" %}表示继承layout.html这个文件,可以使用公公的部分,然后自己加入特殊的部分,比如这里的布局页面就是公共的

{% block style %}
{% endblock %}

这个代表,萝卜填坑,一个落不一个坑,一个个文件写这个,另一个文件记性填,也可以只引入不填,不过没有什么效果

{% include "header.html" %}这个表示引入文件代替这个位置

这里header和sidebar都是布局中公共的部分

具体看下面的代码吧!!!

index.html

{% extends "layout.html" %}

{% block style %}
{% endblock %} {% block body %}
<!-- 其它页面自已调整吧 -->
<div class="container-fluid">
<!-- 个人资料 -->
<div class="body teacher-profile">
<div class="profile">
<div class="row survey">
<div class="col-md-3">
<div class="cell money">
<i class="fa fa-money"></i>
<span>我的收入</span>
<h5>¥11.11</h5>
</div>
</div>
<div class="col-md-3">
<div class="cell th">
<i class="fa fa-th"></i>
<span>课程数量</span>
<h5>12</h5>
</div>
</div>
<div class="col-md-3">
<div class="cell user">
<i class="fa fa-user"></i>
<span>用户数量</span>
<h5>236</h5>
</div>
</div>
<div class="col-md-3">
<div class="cell eye">
<i class="fa fa-eye"></i>
<span>浏览量</span>
<h5>22435</h5>
</div>
</div>
</div>
<div class="chart">
<div id="main" style="width: 600px;height:400px;"></div>
</div>
</div>
</div>
</div>
{% endblock %} {% block script %}
<script src="node_modules/echarts/dist/echarts.js"></script>
<script>
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main')); // 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
}; // 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
{% endblock %}

layout.html

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>学IT - 后台管理系统</title>
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.css">
<link rel="stylesheet" href="node_modules/font-awesome/css/font-awesome.css">
<link rel="stylesheet" href="node_modules/nprogress/nprogress.css">
<link rel="stylesheet" href="public/less/index.css">
{% block style %}
{% endblock %}
</head> <body>
{% include "header.html" %}
<!-- 主体 -->
<div class="main">
{% include "sidebar.html" %}
{% block body %}
{% endblock %}
</div>
<script src="node_modules/jquery/dist/jquery.js"></script>
<script src="node_modules/bootstrap/dist/js/bootstrap.js"></script>
<script src="node_modules/nprogress/nprogress.js"></script>
<script src="public/js/common.js"></script>
{% block script %}
{% endblock %}
</body> </html>

header.html

<!-- 头部 -->
<div class="header">
<nav class="navbar navbar-custom">
<div class="navbar-header">
<a href="javascript:;" class="navbar-brand">
<i class="fa fa-navicon"></i>
</a>
</div>
<ul class="nav navbar-nav navbar-right">
<li>
<a href="javascript:;">
<i class="fa fa-bell"></i>
<span class="badge">8</span>
</a>
</li>
<li>
<a href="./settings.html">
<i class="fa fa-user"></i> 个人中心
</a>
</li>
<li>
<a href="javascript:;">
<i class="fa fa-sign-out"></i> 退出
</a>
</li>
<li>
<a href="javascript:;">
<i class="fa fa-tasks"></i>
</a>
</li>
</ul>
</nav>
</div>

sidebar.html

<!-- 侧边栏 -->
<div class="aside">
<!-- 个人资料 -->
<div class="profile">
<!-- 头像 -->
<div class="avatar img-circle">
<img src="public/uploads/avatar.jpg">
</div>
<h4>布头儿</h4>
</div>
<!-- 导航菜单 -->
<div class="navs">
<ul class="list-unstyled">
<li>
<a href="./index.html" class="active">
<i class="fa fa-home"></i> 仪表盘
</a>
</li>
<li>
<a href="./user_list.html">
<i class="fa fa-bell"></i> 用户管理
</a>
</li>
<li>
<a href="./teacher_list.html">
<i class="fa fa-bell"></i> 讲师管理
</a>
</li>
<li>
<a href="javascript:;">
<i class="fa fa-cog"></i> 课程管理
<i class="arrow fa fa-angle-right"></i>
</a>
<ul class="list-unstyled">
<li>
<a href="./course_add.html">
课程添加
</a>
</li>
<li>
<a href="./course_list.html">
课程列表
</a>
</li>
<li>
<a href="./course_category.html">
课程分类
</a>
</li>
<li>
<a href="./course_topic.html">
课程专题
</a>
</li>
</ul>
</li>
<li>
<a href="./advert_list.html">
<i class="fa fa-bell"></i> 广告管理
</a>
</li>
<li>
<a href="javascript:;">
<i class="fa fa-cog"></i> 系统设置
<i class="arrow fa fa-angle-right"></i>
</a>
<ul class="list-unstyled">
<li>
<a href="javascript:;">
网站设置
</a>
</li>
<li>
<a href="javascript:;">
权限管理
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>

nunjucks模板设计一个页面的更多相关文章

  1. 19 01 17 Django 模板 返回一个页面

    模板 问题 如何向请求者返回一个漂亮的页面呢? 肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为HttpResponse()的参数吗?这样定义 ...

  2. 在APP开发中,如何优雅的设计APP页面

    1.明确页面设计在整个产品设计中的位置 互联网产品设计的流程大致是:产品定位——需求分析——信息架构设计——流程设计——页面框架设计——设计说明——输出设计文档.可以看到页面设计是处于整个流程的后期, ...

  3. 如何优雅的设计APP页面?

    页面框架设计只是整个产品设计中的一环,不要把眼界局限在这一环,也不要只站需求.只站在交互.只站在视觉上思考问题,从多个角度看问题,你才会学会成长. 产品设计是一个系统工程,单独拧出来其中一个流程来讲, ...

  4. JavaWeb页面静态化之使用freemarker模板生成一个html静态页面

    题外话:       页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术   从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言(使 ...

  5. JavaScript网站设计实践(七)编写最后一个页面 改进表单

    一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检 ...

  6. Div里面载入另一个页面的实现(取代框架)(AJax)(转)

    随着框架越来越不火了,HTML5就不对框架支持了,iframe也只有url了,Div就担当了此大任 DIV+CSS在页面部局确实也很让人满意,使用也更方便 今天突然遇到一个问题,那就是需要导入另一个页 ...

  7. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  8. Div里面载入另一个页面的实现(取代框架)(AJax)

    随着框架越来越不火了,HTML5就不对框架支持了,iframe也只有url了,Div就担当了此大任 DIV+CSS在页面部局确实也很让人满意,使用也更方便 今天突然遇到一个问题,那就是需要导入另一个页 ...

  9. 为 .NET Core 设计一个 3D 图形渲染库

    原文地址:https://mellinoe.wordpress.com/2017/02/08/designing-a-3d-rendering-library-for-net-core/ 作者:ERI ...

随机推荐

  1. [python]locals内置函数

    locals() Update and return a dictionary representing the current local symbol table. Free variables ...

  2. 计算机网络 & 网络编程 期末总结与测评题

      第一部分:网络编程部分的相关知识 Socket套接字定义: 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序 ...

  3. socket实现文件上传(客户端向服务器端上传照片示例)

    本示例在对socket有了基本了解之后,可以实现基本的文件上传.首先先介绍一下目录结构,server_data文件夹是用来存放客户端上传的文件,client_data是模拟客户端文件夹(目的是为了测试 ...

  4. 用赋值表达式作为bool值

    enum Status { stOk, stQuit, stError }; int main() { Status status; int n; bool b1 = (status = stOk); ...

  5. 05-Spring02-AOP

    今日知识 1. AOP 2. AspectJ 3. JdbcTemplate AOP 1. AOP :Aspect Oriented Programming,意为面向切面编程,通过预编译方式和运行期动 ...

  6. 《自拍教程5》Python自动化测试学习思路

    前提:熟悉测试业务及流程 任何Python自动化测试的前提,都是必须先熟悉实际测试业务. 任何脱离实际测试业务的自动化都是噱头且无实际意义! 测试的基本流程基本是: 测试需求分析,测试用例设计与评审, ...

  7. php 安装扩展插件实例-ftp.so

    工作记录一下   1.首先进入原始php包安装文件(不是安装后的文件,是下载php安装压缩包,解压后的那个文件)安装包里有个扩展文件夹ext,进入 #cd /home/php-5.3.3/ext/#l ...

  8. [CentOS7]sed 指定字符前后添加内容

    指定字符前面添加 sed -i 's/指定的字符/需要添加的字符&/' 文件名称 修改Linux启动配置 将 GRUB_CMDLINE_LINUX="rd.lvm.lv=centos ...

  9. Xcode如何集成Pod教程

    一般开发都会用到很多第三方的框架,利用好他们可以加快开发进度,为了更方便将第三方的框架集成到我们的项目中,Pod是个很好的选择,现在说一下该怎么将Pod集成到我们的Xcode中 第一种方法 命令行的方 ...

  10. JavaScript——event事件详解

    1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给这个元 ...