到位App_jQuery_art-template
- 不写 node 服务器,本地模拟 ajax 获取 json 数据
- 源代码 ---- 参见 ---- 使用 webstorm 运行 index.html
- 本地静态的 data.json
- 前端 index.js
- 写 node 服务器,真实模拟实际情况 获取 json 数据
1. 新建 npm 包管理器 - 服务器名: dao-wei-app
npm init
会产生一个 package.json
2. 下载并导入 express 模块
npm install express
3. /dao-wei-app/下新建 index.js 服务器入口文件
/dao-wei-app/index.js ---- 关于路由 route 参见
const express = require('express'); const app = express(); app.get('/', (request, response)=>{
console.log(request.query);
response.send('Hello Node Express!');
}); app.listen(3000, err=>console.log(err?err:'服务器启动成功: http://localhost:3000'));node index.js
- 注意: 当代码被改动时,运行的脚本不会被终止,需要手动终止,然后重新启动
4. npm install -g supervisor 或者 yarn global add supervisor
在 package.json 添加 start 启动命令
/**** index.js ****/
const express = require('express'); const app = express(); /*
将该文件夹下所有静态资源暴露出去
接受请求,通过分析参数,找到了 public 对应资源就返回响应
*/
app.use(express.static('./public')); //默认调用next /* 解析请求体数据,结果数据挂载到 req.body 上 */
app.use(express.urlencoded({extended: true})); //默认调用next /*
中间件默认能接收并处理所有请求
需要调用 next() 方法,才会接下来处理下面的中间件或者路由,否则卡住了
*/
app.use((request, response, next)=>{
next(); // 调用下一个中间件或者路由
}); app.get('/', (request, response)=>{
console.log(request.querya);
response.send('Hello Node Express!');
}); app.listen(3000, err=>console.log(err?err:'服务器启动成功: http://localhost:3000'));
6.路由器中间件 Router ---- 模块化管理 路由 ---- 参见
- /router/index_router.js ----定义、暴露
/**** index_router.js ****/
const express = require('express');
const {resolve} = require('path'); const indexRouter = new express.Router(); // 实例化一个 路由器 /*************************/
indexRouter.get('/', (request, response)=>{
response.sendFile(resolve(__dirname, '../public/index.html'));
}); /*************************/
module.exports = indexRouter; // 暴露 路由器- /index.js ---- 引入、使用 router 中间件
/**** index.js ****/
const express = require('express');
const indexRouter = require('./router/index_router.js'); // 引入路由器 const app = express(); /*
将该文件夹下所有静态资源暴露出去
接受请求,通过分析参数,找到了 public 对应资源就返回响应
*/
app.use(express.static('./public')); //默认调用next /* 解析请求体数据,结果数据挂载到 req.body 上 */
app.use(express.urlencoded({extended: true})); //默认调用next /*
中间件默认能接收并处理所有请求
需要调用 next() 方法,才会接下来处理下面的中间件或者路由,否则卡住了
*/
app.use((request, response, next)=>{
next(); // 调用下一个中间件或者路由
}); app.use(indexRouter); // 使用路由器 app.listen(3000, err=>console.log(err?err:'服务器启动成功: http://localhost:3000'));
7. Need to konw
响应返回一个页面 response.sendFile(resolve(__dirname, '../../templates/login.html'));
响应数据: response.send({"error":'用户名已被注册'});
页面跳转: response.redirect('/login'); // http://localhost:3000/login
8. 关于 stylus 在 express 中使用 (这一步没必要做,直接用 webstorm 内置的 file watcher 设置一下 stylus 就好)
npm install nib
npm install express-stylus
/index.js
/**** index.js ****/
const express = require('express');
const indexRouter = require('./router/index_router.js'); // 引入路由器 let stylus = require('express-stylus');
let nib = require('nib');
let join = require('path').join;
let publicDir = join(__dirname, '/public'); const app = express(); /*
将该文件夹下所有静态资源暴露出去
接受请求,通过分析参数,找到了 public 对应资源就返回响应
*/
// app.use(express.static('./public')); //默认调用next
app.use(express.static(publicDir)); //默认调用next /* 解析请求体数据,结果数据挂载到 req.body 上 */
app.use(express.urlencoded({extended: true})); //默认调用next /*
中间件默认能接收并处理所有请求
需要调用 next() 方法,才会接下来处理下面的中间件或者路由,否则卡住了
*/
app.use((request, response, next)=>{
next(); // 调用下一个中间件或者路由
}); app.use(stylus({
src: publicDir,
use: [nib()],
import: ['nib']
})); app.use(indexRouter); // 使用路由器 app.listen(3000, err=>console.log(err?err:'服务器启动成功: http://localhost:3000'));
/public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title></title>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<meta name="viewport"
content="user-scalable=no,
width=device-width,
initial-scale=1.0,
minimum-scale=1.0,
maximum-scale=1.0"/>
<link rel="stylesheet" href="http://127.0.0.1:3000/stylus/index.css">
</head> <body> <script type="text/javascript" src="./js/index.js"></script>
<script type="text/javascript" src="./js/template-web.js"></script>
</body>
</html>
10. jQuery 知识点复习
注意:
$ele[1] 需要包裹才能使用 jQuery 方法: $($ele[1]).addClass("active")
11. 关于 cors 官方跨域解决方案
配置成 "*" 绝对可以
关于这个 配置,非常严格,浏览器显示的地址是什么,就必须配置成什么
一开始我配置 http://127.0.0.1:3000 都不行,但是 http://localhost:3000 又可以了
如果配置成 "*" 还不行,那就重启下服务器,当时我 node 服务器还卡住了,以为是我自己的问题。
12. 关于 art-template 模版引擎 ---- 参见
建议先将静态样式搞定,然后再使用 art-template 将数据动态实现
1) 上面的 11. 是在 node 服务器定义的一个 路由,用于返回 首页的数据
2) 前端利用 jQuery 发送 ajax 请求数据
/public/js/index.js
$(function () {
/**** ajax 获取首页所有 json 数据 ****/
$.get("http://127.0.0.1:3000/home_data", function(data){
console.log(data)
});
});
3) 使用 art-template 渲染到模板,在将生成的 html ,渲染到页面上
有两种语法,{{}} 和 <% %>
各有也优缺,{{}} 更简洁,<% %> 更强大
注意:
<% for(var i=0; i < data.length; i++){%> 记得在 < 和 > 两边加一个空格,否则可能异常
关于 template 中遇到 img 时,编辑器警告没关系: <img src=" {{$value.imgUrl}}" alt="Service">
- /public/js/index.js
$(function () {
console.log("jQuery--> DOMContentLoaded!"); /**** ajax 获取首页所有 json 数据 ****/
$.get("http://127.0.0.1:3000/home_data", function(response){
if(response.code === "200"){
console.log(response.data);
$(".banner_box .banner_nav1").html(template("banner_nav",{data: response.data}));
}
});
});- /public/index.html
... ...
<ul class="banner_nav1 clearfix">
<!--<li >-->
<!--<p><span class="nav1_title">家庭保洁</span><span class="iconfont icon-jiantou"></span></p>-->
<!--<ul class="banner_nav2">-->
<!--<li>空调清洗</li>-->
<!--<li>油烟机清洗</li>-->
<!--<li>洗衣机清洗</li>-->
<!--<li>空调清洗</li>-->
<!--<li>油烟机清洗</li>-->
<!--<li>洗衣机清洗</li>-->
<!--<li>空调清洗</li>-->
<!--<li>油烟机清洗</li>-->
<!--<li>洗衣机清洗</li>-->
<!--</ul>-->
<!--</li>-->
</ul> <script id="banner_nav" type="text/html">
<% for(var i=0; i < data.length; i++){ %>
<li>
<p>
<span class="nav1_title">
<%= data[i].serviceIndex %>
</span>
<span class="iconfont icon-jiantou"></span>
</p>
<ul class="banner_nav2">
<% for(var j=0; j < data[i].serviceType.length; j++){ %>
<li><%= data[i].serviceType[j]%></li>
<% } %>
</ul>
</li>
<% } %>
</script>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="./js/template-web.js"></script>
<script type="text/javascript" src="./js/index.js"></script>
</body>
13. art-template定义模板方法
// 时间格式化
template.defaults.imports.dateFormat = function(time) {
return dateFormat(time)
}
// 4.0之前用的是这种方式
template.helper('formatPrice', function(price, type) {});
// 使用 - 函数定义了参数就一定要传参,否则报错
<%= $imports.formatDate($value.timeStamp) %>
/**
* 对日期进行格式化,
* @param date 要格式化的日期
* @param format 进行格式化的模式字符串
* 支持的模式字母有:
* y:年,
* M:年中的月份(1-12),
* d:月份中的天(1-31),
* h:小时(0-23),
* m:分(0-59),
* s:秒(0-59),
* S:毫秒(0-999),
* q:季度(1-4)
* @return String
* @author yanis.wang
* @see http://yaniswang.com/frontend/2013/02/16/dateformat-performance/
*/
function dateFormat(date, format) {
date = new Date(date);
var map = {
"M": date.getMonth() + 1, //月份
"d": date.getDate(), //日
"h": date.getHours(), //小时
"m": date.getMinutes(), //分
"s": date.getSeconds(), //秒
"q": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
format = format.replace(/([yMdhmsqS])+/g, function(all, t){
var v = map[t];
if(v !== undefined){
if(all.length > 1){
v = '0' + v;
v = v.substr(v.length-2);
}
return v;
}
else if(t === 'y'){
return (date.getFullYear() + '').substr(4 - all.length);
}
return all;
});
return format;
};
// ---------------------
// 作者:luckystar2008
// 来源:CSDN
// 原文:https://blog.csdn.net/qincidong/article/details/82252298
// 版权声明:本文为博主原创文章,转载请附上博文链接!
14. art-template 内置默认变量: $value 和 $index 是 {{ each xxx}} ......{{ /each }} 循环中中的变量
到位App_jQuery_art-template的更多相关文章
- c++ 设计模式3 (重构技法 Template Method)
1. 重构 面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指的是那些可以满足 “应对变化,提高复用”的设计. 设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而更好地理解 ...
- 为.NET Core项目定义Item Template
作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...
- jQuery.template.js 简单使用
之前看了一篇文章<我们为什么要尝试前后端分离>,深有同感,并有了下面的评论: 我最近也和前端同事在讨论这个问题,比如有时候前端写好页面给后端了,然后后端把这些页面拆分成很多的 views, ...
- 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- tornado template
若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- C++泛型编程:template模板
泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础. 所谓template,是针对“一个或多个尚未明确的类型”所编写的函数或类. 使用template时,可以显示的或隐示的将 ...
- 新手入门Underscore.js 中文(template)
Underscore.js是一个很精干的库,压缩后只有4KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了javaScript的编程.MVC框架Backbone.js就将这个库作为自 ...
- knockoutjs如何动态加载外部的file作为component中的template数据源
玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmodel和template, 比如下面这样: ko.compon ...
随机推荐
- 手写代码 - java.util.List 相关
1-ArrayList 访问元素,不能使用ArrayList[0]形式!!!! 必须使用ArrayList.get(0);
- Visual Studio 2013 SDK 扩展之简介
Release Notes:[发行说明]启动记事本的扩展,以管理员身份运行验证通过. Getting Started Guide:[入门]使用[Ctrl + 1]更快捷打开记事本 More Info ...
- Windows XP 的最高版本 .net framework 安装
注意: Windows XP 系统已于2014年4月8日停止维护.出于安全.性能及新设备支持考虑,应立即停止使用. 安装 Windows XP SP3 所支持的最高.net framework 版本为 ...
- 【转载】npm查看全局安装过的包
在使用node的时候,用npm安装了很多软件,过一段时间没有使用就会忘记,怎么查看自己全局安装过的包,用命令 npm list -g --depth 在百度里搜不到结果的,我在google里老外的文章 ...
- 高可用Redis(二):字符串类型
1.Redis字符串结构 对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset 比如下面的 键值对的value还可以更加复杂,比如可以是js ...
- docker环境下elasticsearch安装ik和拼音分词
elasticsearch拼音分词地址:https://github.com/medcl/elasticsearch-analysis-pinyin/releases 在elasticsearch下面 ...
- java项目----衣服购买
执行bat文件:注意t_temp.properties保存的文件是否为utf8编码native2ascii -encoding UTF-8 t_temp.properties r.properties ...
- J2EE_Maven_POM文件配置的详解(转)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- plsql developer 中文乱码(???)解决办法
添加环境变量 变量名称: NLS_LANG 内容: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 再次新插入的数据就不会乱码了
- wxpy使用
一 简介 wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计等功能. 总而言之,可用来实 ...