Node.js-day04

  • 模板引擎
  • art-template模板引擎
  • 案例介绍 – 学生档案管理

模板引擎

模板引擎可以让将数据和HTML模板更加友好的结合,省去繁琐的字符串拼接,使代码更加易于维护。

art-template模板引擎

高性能 JavaScript 模板引擎,使用 npm install art-template 命令下载。
入门使用
创建 js 文件,引入 art-template

 const trempalte = require('art-template');

引入拼接的数据源

 // 引入path库const path = require('path');// 拼接路径,这里最好用绝对路径const views = path.join(_dirName,'views','index.art');// 关联到 template里面const html = template(views,{name: '马超'});

创建 .art 渲染模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><!--标准语法--><p>{{ name }}</p><!--原生语法--><p><%= age%></p>
</body>
</html>

模板语法
通过模板引擎提供的特殊语法,告知模板引擎数据和模板具体的拼接细节。

插值表达式
即{{}},用来显式数据,将数据变量放入双大括号之中即可。

原始语法
<% %>

标准语法用 {{}}

在大括号里面可以进行逻辑运算

    <p>{{ 1 + 1 }}</p><p>{{ 1 + 1 == 2 ? '相等' : '不相等' }}</p><p>{{ content }}</p>

如果说需要解析html标签,需要在变量前面加 @ 符号

    <p>{{@ content }}</p>

原生语法 <%= %>

可以进行逻辑运算

    <p><%= 1 + 2%></p><p><%= 1 + 1 == 2 ? '相等' : '不相等' %></p><p><%= content%></p>

如果说需要解析html标签,需要在变量前面加 - 符号

    <p><%- content%></p>

条件判断
**标准语法 {{if 条件}} … {{/if}} **

    {{if age > 18}}年龄大于18{{else if age < 15 }}年龄小于15{{else}}年龄不符合要求{{/if}}

原生语法 <% if (value) { %> … <% } %>

    <% if (age > 18) { %>年龄大于18<% } else if (age < 15) { %>年龄小于15<% } else { %>年龄不符合要求<% } %>

循环
标准语法 {{each 数据}} {{/each}}

    <ul>{{each users}}<li>{{$value.name}}{{$value.age}}{{$value.sex}}</li>{{/each}}</ul>

原生语法 <% for() { %> <% } %>

    <ul><% for (var i = 0; i < users.length; i++) { %><li><%=users[i].name %><%=users[i].age %><%=users[i].sex %></li><% } %></ul>

子模版
使用子模板可以将网站公共区块(头部、底部)抽离到单独的文件中

标准语法 {{include ‘模板’}}

    {{ include './common/header.art' }}...{{ include './common/footer.art' }}

原生语法 <%include(‘模板’) %>

    <% include('./common/header.art') %>...<% include('./common/footer.art') %>

模板继承
使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件

但是在html骨架中,有一些内容是不一样的,例如引入的css不同,引入的js脚本不同,所以我们可以通过在骨架中先预留几个位置,让其它功能页面在继承的使用,引入相应自己的文件即可

使用

现在骨架标签中设定预留位置

      <!doctype html><html><head><meta charset="utf-8"><title>HTML骨架模板</title><!-- 预留位置,打上标记为 head-->{{block 'head'}}{{/block}}</head><body><!-- 预留位置,打上标记为 content-->{{block 'content'}}{{/block}}</body></html>

在另外的 模板文件中利用 extends 来进行引入

      <!--index.art 首页模板--><!--extend 进行继承, 后面跟需要继承的文件路径-->{{extend './layout.art'}}{{block 'head'}} <link rel="stylesheet" href="custom.css"> {{/block}}{{block 'content'}} <p>{{name}}</p> {{/block}}

在js文件里面输入内容,利用art-templare 进行模板渲染

   //引入 template 库const template = require('art-template');//引入 path 库,用来处理路径const path = require('path');//生成路径const views = path.join(_dirName,'views','index.art');//利用template 进行渲染const html = template(views,{name: '马超'});

模板配置
在模板引擎中,如果想使用第三方模块的一些方法,默认我们是不能直接使用的,必须要通过template模块给我们提供的方法,把第三方模块的对象当作变量传递进入

下载第三方模块 npm install dateformat
语法:

template.defaults.imports.自定义变量名 = 第三方模板对象;

示例代码

    //1. 需要先 下载第三方模块  npm install dateformat//2. 模板引擎第三方库const template = require('art-template');//3. 处理路径的第三方模块const path = require('path');const views = path.join(__dirname, 'views', 'index.art');//4. 格式化日期的第三方模块const dateFormart = require('dateformat');//5. 不能直接使用,需要通过 template进行模板配置template.defaults.imports.dateFormart = dateFormart;const html = template(views, {time: new Date(),})console.log(html);

渲染模板

 {{extend './common/layout.art'}}{{block 'css'}}<link href='style.css' />{{/block}}{{block 'content'}}<p>{{ dateFormart(time,'yyyy-MM-dd hh:mm:ss') }}</p>{{/block}}

输出结果

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><link href='style.css' /></head><body><p>2019-22-16 01:04:17</p></body></html>

设置模板根目录
有的时候我们引入模板会比较多,如果一个一个去进行引入比较麻烦,所以我们可以通过引入模板根目录的形式去进入,这样当我们引入模板文件的时候,它会根据我们传递的名字自动匹配

语法:

    template.defaults.root = path.join(__dirname, 模板文件夹名称);

设置模板默认后缀

可以去设置默认的后缀名,这样我们引入文件省略后缀名

语法:

    template.defaults.extname = '.html';

案例介绍 – 学生档案管理

效果图

制作流程

  • 建立项目文件夹并生成项目描述文件
  • 创建网站服务器实现客户端和服务器端通信
  • 连接数据库并根据需求设计学员信息表
  • 创建路由并实现页面模板呈递
  • 实现静态资源访问
  • 实现学生信息添加功能
  • 实现学生信息展示功能

    model 放置数据库相关代码
    pulic 静态资源代码
    router 路由代码
    views 模板文件
    app.js 入口主要文件

app.js 入口主要文件

// 引入 http 模块
const http = require('http');
// 引入模板引擎
const template = require('art-template');
// 引入path模块
const path = require('path');
const router = require('./router/index');
// 引入静态资源访问模块
const serveStatic = require('serve-static');
// 引入处理日期的第三方模块
const dateFormat = require('dateformat');
// 实现静态资源访问服务
const serve = serveStatic(path.join(__dirname, 'public'));
// 配置模板的根目录
template.defaults.root = path.join(__dirname, 'views');
// 处理日期格式的方法
template.defaults.imports.dateFormat = dateFormat;// 数据库连接
require('./model/connect');
// 创建网站服务器
const app = http.createServer();
// 当客户端访问服务端的时候
app.on('request', (req, res) => {// 启用路由功能router(req, res, () => {})// 启用静态资源访问服务功能serve(req, res, () => {})});
// 监听80端口
app.listen(80);
console.log('服务器启动成功');

model 放置数据库相关代码

// connect.js 文件
const mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://localhost/mc', { useNewUrlParser: true }).then(() => console.log('数据库连接成功')).catch(() => console.log('连接数据库失败'))
// user.js 文件
const mongoose = require('mongoose');
// 创建学生集合规则
const studentsSchema = new mongoose.Schema({name: {// 类型type: String,// 是否是必须要填写required: true,// 最小长度minlength: 2,// 最大长度maxlength: 16},age: {type: Number,// 最小值min: 18,// 最大值max: 30},sex: {type: String},email: String,// 爱好,数组形式hobbies: [String],collage: String,enterDate: {type: Date,// 默认时间是当前时间default: Date.now}
});
// 创建学生信息集合
const Student = mongoose.model('Student', studentsSchema);
// 将学生信息集合进行导出
module.exports = Student;

router 路由代码

// 引用router模块
const getRouter = require('router');
// 获取路由对象
const router = getRouter();
// 引入模板引擎
const template = require('art-template');
// 引入queryatring模块
const querystring = require('querystring');
// 学生信息集合
const Student = require('../model/user');
// 呈现学生档案信息页面
router.get('/add', (req, res) => {let html = template('index.art', {});res.end(html);
});
/ 呈现学生档案信息列表页面
router.get('/list', async(req, res) => {let students = await Student.find()let html = template('list.art', {students: students})res.end(html);
});//用户提交数据的处理
router.post('/add', (req, res) => {// 接收用户提交信息let formData = '';// 正在接收数据req.on('data', parem => {formData += parem;})// post参数接收完毕req.on('end', async() => {// 利用 querystring来进行数据的解析// 将用户提交的信息添加到数据库中await Student.create(querystring.parse(formData));// 301 代表重定向// location 跳转地址res.writeHead(301, {Location: '/list'});res.end()})
});
module.exports = router;

views 模板文件

// index.art 文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>学生档案</title><link rel="stylesheet" href="./css/main.css">
</head>
<body><form action="/add" method='post'><fieldset><legend>学生档案</legend><label>姓名: <input class="normal" type="text" autofocus placeholder="请输入姓名" name='name'></label><label>年龄: <input class="normal"  type="text" placeholder="请输入年龄" name='age'></label><label>性别: <input type="radio" value="0" name='sex'> 男<input type="radio" value="1" name='sex'> 女</label><label>邮箱地址: <input class="normal" type="text" placeholder="请输入邮箱地址" name='email'></label><label>爱好: <input type="checkbox" value="敲代码" name='hobbies'> 敲代码<input type="checkbox" value="打篮球" name='hobbies'> 打篮球<input type="checkbox" value="睡觉" name='hobbies'> 睡觉</label><label>所属学院: <select class="normal" name='collage'><option value="前端与移动开发">前端与移动开发</option><option value="PHP">PHP</option><option value="JAVA">JAVA</option><option value="Android">Android</option><option value="IOS">IOS</option><option value="UI设计">UI设计</option><option value="C++">C++</option></select></label><label>入学日期: <input type="date" class="normal" name='enterDate'></label><label class="btn"><input type="submit" value="提交" class="normal"></label></fieldset></form>
</body>
</html>
// liat .art 文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>学员信息</title><link rel="stylesheet" href="./css/list.css">
</head>
<body><table><caption>学员信息</caption><tr><th>姓名</th><th>年龄</th><th>性别</th><th>邮箱地址</th><th>爱好</th><th>所属学院</th><th>入学时间</th></tr>{{each students}}<tr><th>{{$value.name}}</th><th>{{$value.age}}</th><th>{{$value.sex=='0'?'男':'女'}}</th><th>{{$value.email}}</th><th>{{each $value.hobbies}}<span>{{$value}}</span>{{/each}}</th><th>{{$value.collage}}</th><th>{{dateFormat($value.enterDate,'yyyy-mm-dd')}}</th></tr>{{/each}}</table>
</body>
</html>

案例相关第三方模块

router
根据路由功能来进行请求路径的分发,我们如果去进行路由的编写比较的繁琐,这里利用到一个第三方的库,来帮我们做路由的分发 router

 // 1. 下载对应的第三方模块 npm install router// 2. 通过 require来进行模块的引入const getRouter = require('router');// 3. 通过 getRouter() 方法获取路由对象     const router = getRouter();  // 4. 在我们监听的请求函数里面开启路由功能server.on('request', (req, res) => {//第三个参数必须要带上router(req,res,()=>{//这个函数是我们路由分发完毕后,再会调用此函数});});//5. 进行代码编写,第三方库里面帮我们定义好了 get方式请求的处理和post方式请求的处理router.get('/index', (req, res) => {console.log('index 请求成功');res.end('index 请求成功');})router.get('/list', (req, res) => {console.log('list 请求成功');res.end('list 请求成功');})

使用静态资源第三方库 serve-static

此时还没有完成,因为在html里面进行了css的引入,这里我们需要需要把一些静态资源引入进来,我们可以通过第三方模块来实现 serve-static

1.下载第三方模块 npm install serve-static
2.引入 serve-static 模块获取创建静态资源服务功能的方法
3.调用方法创建静态资源服务并指定静态资源服务目录
4.启用静态资源服务功能

    //1.引入静态资源加载的模块 const serveStatic = require('serve-static');//2.得到静态资源加载对象 传递静态资源的路径,方便后续使用const static = serveStatic(path.join(__dirname, 'public'));server.on('request', (req, res) => {...//3.开启静态资源static(req, res, () => {});});

art-template模板引擎和其它第三方模块搭配使用相关推荐

  1. Spring Boot 使用 Kotlin Script Template 模板引擎kts 开发web应用

    Spring Boot 使用 Kotlin Script Template 模板引擎kts 开发web应用 在 Spring Framework 5.0 M4 中引入了一个专门的Kotlin支持. K ...

  2. template模板引擎的使用例子

    背景:使用模板引擎可以避免复杂的数据操作,例如数据很多时,把数据渲染到表单中是特别麻烦的事情.如果使用模板引擎可以很方便的帮助我们完成这些繁琐的操作. 模板引擎有很多种,但是每种模板引擎的使用方式都是 ...

  3. JavaScript中template模板引擎

    这篇文章主要为大家详细介绍了JavaScript模板引擎Template.js使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 template.js 一款 JavaScript 模板引擎, ...

  4. art template 模板渲染数据

    客户端 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8& ...

  5. html中模板引擎—前端与后端

    模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的 ...

  6. java 前端模板_前端模板引擎入门

    模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的 ...

  7. if laytpl 非_laytpl : 一款非常轻量的JavaScript模板引擎

    //假设你得到了这么一段数据 var data = { title: '前端圈', intro: '一群码js的骚年,幻想改变世界,却被世界改变.', list: [{name: '贤心', city ...

  8. 前端与后端的模板引擎

    模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的 ...

  9. Form表单及模板引擎

    Form表单及模板引擎 什么是Form表单 Form表单的一些属性 表单的同步提交及优缺点 通过Ajax提交表单数据 JQuery的监听表单提交事件 取消表单默认提交行为 快速获取表单中的数据 模板引 ...

  10. js模板引擎art template数组渲染的方法

    转载:js模板引擎art template数组渲染的方法 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,模板引擎种类也是五花八门,我就说几个安全性高.错误处理调 ...

最新文章

  1. Ubuntu13.10:[3]如何开启SSH SERVER服务
  2. [美文欣赏]清华胡宇迪教授谈
  3. 确定一组矩形是否有两个重叠的算法
  4. android 开源 数据库,Android开源数据库框架-LitePal的使用
  5. T1042/T2080芯片工控主板对比
  6. 关于framework4.5的相关介绍
  7. C++异常处理(一) - iStack
  8. nginx配置高可用的集群
  9. 题解【luogu P2421 bzoj P1407 [NOI2002]荒岛野人】
  10. linux+模块与设备关系,《Linux内核设计与实现》读书笔记 第十七章 设备与模块...
  11. web端项目展开测试步骤
  12. DataTable数据集动态构造Table表结构
  13. (附源码)计算机毕业设计java宠物领养饲养交流管理平台
  14. Android 拼音搜索中文,包含多音字
  15. 关于在电脑单机上面运行魔兽世界的方法
  16. 微信公众号里面使用定位
  17. e3 v3服务器芯片组,E3 V5专用主板特别在哪?华硕E3 PRO GAMING评测-太平洋电脑网
  18. 苏宁易购,淘宝网,京东商城,百万级价格数据海量抓取
  19. dCas9-ROS1——靶向去甲基化的捷径
  20. 野火多功能调试助手】-摄像头调试助手通讯协议

热门文章

  1. Android应用商店——项目介绍
  2. 合唱队形(c++DP)
  3. Python3从搜狐国际新闻抓取---完整版
  4. Numpy中take的用法
  5. html点击出现对勾,css伪类 右下角点击出现 对号角标表示选中的示例代码
  6. C/C++游戏项目教程:《雷霆战机》
  7. 【地平线旭日X3派试用体验】基于MIPI Camera的目标检测 web 端展示,全流程(第三节)
  8. matlab里newc,Matlab超简单教程
  9. python嗅探器_Python中的简单原始数据包嗅探器
  10. 软件系统 - 网址大全