express 实践
截图:

这个项目的数据是根据之前瓜子网爬虫爬的北京区数据
express + mongodb + pug(jade) + flex.css:
项目地址: https://github.com/uustoboy/guazi-pug
项目截图:

目录说明:
|---app.js ----------------------node启动文件
|---gulpfile.js------------------gulp自动化重启
|---models-----------------------mongodb的models
|---node_modules-----------------node依赖
|---package.json-----------------包描述文件及开发者信息
|---public-----------------------静态文件(css/js/img)
|-----c--------------------------css目录
|-----j--------------------------js目录
|---routers----------------------路由
|---schemas----------------------mongodb的schemas
|---views------------------------视图模板
package.json:
{
"name": "guazi-pug",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"body-parser": "^1.16.0",
"express": "^4.14.1",
"gulp": "^3.9.1",
"gulp-nodemon": "^2.2.1",
"mongoose": "^4.8.1",
"pug": "^2.0.0-beta11"
}
}
node app.js 启动文件
1.加载express 用到的模块
2.设置静态文件的托管、模板的引擎
3.在把路由文件加载到启动页
4.连接已经运行的mongodb
项目启动
"use strict";
var express = require('express'); //引入express;
var mongoose = require('mongoose'); //引入mongoose;
var app = express();
//加载body-parser,用来处理post提交过来的数据
var bodyParser = require('body-parser');
//bodyparser设置
app.use( bodyParser.urlencoded({extended: true}) );
//设置静态文件托管
app.use( '/public', express.static( __dirname + '/public') );
//设置模板文件存放的目录,第一个参数必须是views,第二个参数是目录
app.set('views', './views');
//设置模板引擎
app.set('view engine', 'pug');
//加载路由;
app.use('/', require('./routers/api'));
app.use('/', require('./routers/car-routers'));
//监听http请求
mongoose.connect('mongodb://localhost/car', function(err) {
if (err) {
console.log('数据库连接失败');
} else {
console.log('数据库连接成功');
app.listen(3000);
}
});
schemas/car-schemas.js 定义这个集合的数据类型:
"use strict";
var mongoose = require('mongoose'); //分类的表结构
module.exports = new mongoose.Schema({
info:String, //车;
money:String, //价钱;
phone:String, //电话号码;
time:String, //上牌时间;
mileage:String, //公里数;
gearbox:String, //变速箱;
emission:String, //排放标准;
location:String, //上牌地;
imgs:Array //图片;
});
models/car-models.js 集合和数据库连接起来同时可以操作:
"use strict";
var mongoose = require('mongoose');
var carSchema = require('../schemas/car-schemas.js'); module.exports = mongoose.model('sell_carinfos', carSchema);
routers/car-routers.js 请求路径的路由匹配:
1.router.get('/') 匹配index页面
2.router.get('/:id') 匹配详情页是有详情id
3.router.get('*') 匹配的是404错误页
"use strict";
var express = require('express');
var router = express.Router(); var carUser = require('../models/car-models');
var data; //匹配 汽车详情
router.get('/:id', function(req, res, next) { var _id = req.params.id || ''; //根据id查找数据;
carUser.findOne({ _id : _id},function( err,contents ){ if( err ){ next(); }else{ res.render('./info',{
carinfo : contents
}); } }); }); //主页面;
router.get('/', function(req, res, next) { var limit = 8;//查几条;
var skip = 0; //从第几条开始;
//查表
carUser.find({}).limit(limit).skip(skip).then(function( contents ){
res.render('./index',{
carlists : contents
});
}); }); //
router.get('*', function(req, res){
res.render('./404')
}); module.exports = router;
routers/api.js 处理像$.ajax请求 单独的路由:
"use strict";
var express = require('express');
var router = express.Router();
var carModels = require('../models/car-models.js'); //统一返回格式
var responseData = {}; //翻页;
router.post('/pages', function(req, res, next) { var pages = req.body.pages || 0; //页码; var limit = 8; //取几条数据;
var skip = limit * pages; //从第几条开始;
var totalPages = 0; //总页数;
carModels.find({}).count({},function(err,count){
if(err){
console.log('出错了');
} totalPages = Math.floor( count / limit ); }); carModels.find({}).limit(limit).skip(skip).then(function(data) { if( pages < totalPages ){
responseData.code = 1;
responseData.message = data; return res.json(responseData);
}else{
responseData.code = 2;
return res.json(responseData);
} }); }); module.exports = router;
views/layout.pug 公共头文件 提出共同的css和js:
doctype html
html
head
meta(charset="UTF-8")
meta(name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0")
title 瓜子二手车
link(rel="stylesheet" type="text/css" href="/public/c/flex.css")
link(rel="stylesheet" type="text/css" href="/public/c/index.css")
link(rel="stylesheet" type="text/css" href="/public/c/dropload.css")
script(src="/public/j/zepto.min.js" type="text/javascript")
body
block content
views/index.pug 列表页 继承layaout 同时处理传过json绑定在页面上:
extends layout block content
ul.car-ul
each car in carlists
li
a(href=car._id flex)
div(class="car-img" flex-box="1")
img(src=car.imgs[0])
div(class="car-infolist" flex-box="9")
div(class="car-infolist" flex-box="9")
div.car-name.
#{car.info}
div.car-km
span.
#{car.time}年/#{car.mileage}万公里
div.car-price
strong.
#{car.money}万 script(src="/public/j/dropload.min.js" type="text/javascript")
script(src="/public/j/index.js" type="text/javascript")
views/info.pug 继承layaout 详情页:
extends layout block content
div.product-head
img(class="product-headImg" src=carinfo.imgs[0])
div
h1.product-title #{carinfo.info}
div.sevser-about
ul(class="mod-sev" flex)
li(flex="main:center cross:center" flex-box="1")
div
p.about-own.
车主报价
p.about-prize.
#{carinfo.money}万
li(flex="main:center cross:center" flex-box="1")
div
p.about-own.
贷款首期款
p.about-prize.
¥#{ Math.floor(parseFloat( carinfo.money.substring(1,carinfo.money.length) ) * 0.3) }万
li(flex="main:center cross:center" flex-box="1")
div
p.about-own.
服务费
p.about-prize.
#{ Math.floor(parseFloat( carinfo.money.substring(1,carinfo.money.length) ) * 0.03 *10000) }元
div.column
div.column-head.
基本信息
ul(flex class="column-carul")
li(flex-box="5")
span.info-title.
表显里程:
span #{carinfo.mileage}万公里
li(flex-box="5")
span.info-title.
上牌时间:
span #{carinfo.time}
li(flex-box="5")
span.info-title.
牌照归属:
span #{carinfo.location}
li(flex-box="5")
span.info-title.
排放标准:
span #{carinfo.emission}
li(flex-box="5")
span.info-title.
变速箱:
span #{carinfo.gearbox}
li(flex-box="5")
span.info-title.
看车地址:
span #{carinfo.location}
div.product-img
each imgs in carinfo.imgs
img(src=imgs)
gulp node app.js的自动重启
'use strict';
var gulp = require('gulp');
var nodemon = require('gulp-nodemon');
gulp.task('start', function () {
nodemon({
script: 'app.js'
, ext: 'js html'
, env: { 'NODE_ENV': 'development' }
})
})
//执行的默认事件;
gulp.task('default',function(){
gulp.run('start');
});
后记:
麻雀虽小五脏俱全~
参考资料:
express : http://www.expressjs.com.cn/
pug : https://pugjs.org/api/getting-started.html
mongodb : http://www.runoob.com/mongodb/mongodb-tutorial.html
mongoose: http://www.nodeclass.com/api/mongoose.html
------------------------------------------------------------------------------------------------------------------
scott : http://www.imooc.com/learn/259 (jade模板讲解)
scott : http://www.imooc.com/learn/75 || http://www.imooc.com/learn/197 (express建站)
狼族小狈 : https://github.com/lzxb/flex.css (flex.css)
西门 : https://github.com/ximan/dropload (滑动下拉加载JS插件)
express 实践的更多相关文章
- express实践(一)
涉及以下这些内容: 主体. cookie.session 数据 模板引擎 服务器基本结构: const express=require('express'); const static=require ...
- nodejs 实践:express 最佳实践 (一)
express 最佳实践 (一) 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色,, 在 web同构 方面, nodejs 的优势 ...
- nodejs 实践:express 最佳实践 (一) 项目结构
express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...
- express 最佳实践(二):中间件
express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...
- nodejs 实践:express 最佳实践(四) express-session 解析
nodejs 实践:express 最佳实践(四) express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs ...
- vue实践---vue配合express实现请求数据mock
mock数据是前端比较常见的技术,这里介绍下vue配合express 实现请求数据mock. 第一步: 安装 express : npm install express -D 第二步: 简历需要mo ...
- nodejs 实践:express 最佳实践系列
nodejs 实践:express 最佳实践系列 nodejs 实践:express 最佳实践(一) 项目结构 nodejs 实践:express 最佳实践(二) 中间件 nodejs 实践:expr ...
- 开始nodejs+express的学习+实践(1)
开始nodejs+express的学习+实践(1) 开始nodejs+express的学习+实践(2) 开始nodejs+express的学习+实践(3) 开始nodejs+express的学习+实践 ...
- nodejs 实践:express 最佳实践(二) 中间件
express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...
随机推荐
- 通过keepalived实现多主集群方案
一. 环境说明:1.服务器列表:proxy01: eth0: 192.168.56.11 eth2: 192.168.156.11 proxy02: eth0: 192.168.56.12 eth2: ...
- mysql数据库连接语句一定要加传参的编码格式
jdbc:mysql://localhost:3306/pachong?useUnicode=true&characterEncoding=UTF-8 不然可能会出现从源代码传出的中文参数到m ...
- vue 修改数据界面没有及时更新nextTick
使用场景:有些时候,我们使用vue修改了一些数据,但是页面上的DOM还没有更新,这个时候我们就需要使用到nextTick. vm.$nextTick( [callback] ) 说明: 将回调延迟到下 ...
- AOP - 2 实例(SpringBoot 注解方式)
1.创建Spring Boot项目 创建一个Spring Boot 项目,然后pom中引入web 模块与AOP相关依赖. <dependency> <groupId>org.s ...
- IIS7下设置https主机名灰色无法修改
打开iis绑定域名时,点击绑定弹出绑定框,在选择类型为“https”的时候,主机名为灰色的无法填写 解决方法: 1. 选择https,在选择相应的SSL证书,点击确定 2. 打开C:\Windows\ ...
- 关于Oracle使用管理员账号登录失败的问题
我在本地建的Oracle数据库在调试自己写的存储过程的时候提示缺少 debug connect session 权限,一般情况下根据这个提示直接用管理员账号登录进去,执行 grant debug co ...
- leanote使用本地账户时,去掉待同步的小红点
切换开发者工具,如下图,点击左上角的箭头图标,选取元素,直接选择小红点. 然后会看到小红点来自于resources/app/public/themes/default.css文件中2092行: .it ...
- python并发编程之协程知识点
由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ...
- Mysql高性能笔记(一):Schema与数据类型优化
1.数据类型 1.1.几个参考优化原则 a. 更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...
- Vim内直接使用p粘贴系统剪切板
解决方法 set clipboard=unnamed