截图:

  

这个项目的数据是根据之前瓜子网爬虫爬的北京区数据

express + mongodb + pug(jade) + flex.css:

项目地址: https://github.com/uustoboy/guazi-pug

项目截图:

目录说明:

  1. |---app.js ----------------------node启动文件
  2. |---gulpfile.js------------------gulp自动化重启
  3. |---models-----------------------mongodbmodels
  4. |---node_modules-----------------node依赖
  5. |---package.json-----------------包描述文件及开发者信息
  6. |---public-----------------------静态文件(css/js/img
  7. |-----c--------------------------css目录
  8. |-----j--------------------------js目录
  9. |---routers----------------------路由
  10. |---schemas----------------------mongodbschemas
  11. |---views------------------------视图模板

package.json:

  1. {
  2. "name": "guazi-pug",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "index.js",
  6. "scripts": {
  7. "test": "echo \"Error: no test specified\" && exit 1"
  8. },
  9. "keywords": [],
  10. "author": "",
  11. "license": "ISC",
  12. "devDependencies": {
  13. "body-parser": "^1.16.0",
  14. "express": "^4.14.1",
  15. "gulp": "^3.9.1",
  16. "gulp-nodemon": "^2.2.1",
  17. "mongoose": "^4.8.1",
  18. "pug": "^2.0.0-beta11"
  19. }
  20. }

node app.js 启动文件

1.加载express 用到的模块

2.设置静态文件的托管、模板的引擎

3.在把路由文件加载到启动页

4.连接已经运行的mongodb

项目启动

  1. "use strict";
  2.  
  3. var express = require('express'); //引入express;
  4. var mongoose = require('mongoose'); //引入mongoose;
  5. var app = express();
  6.  
  7. //加载body-parser,用来处理post提交过来的数据
  8. var bodyParser = require('body-parser');
  9.  
  10. //bodyparser设置
  11. app.use( bodyParser.urlencoded({extended: true}) );
  12.  
  13. //设置静态文件托管
  14. app.use( '/public', express.static( __dirname + '/public') );
  15.  
  16. //设置模板文件存放的目录,第一个参数必须是views,第二个参数是目录
  17. app.set('views', './views');
  18.  
  19. //设置模板引擎
  20. app.set('view engine', 'pug');
  21.  
  22. //加载路由;
  23. app.use('/', require('./routers/api'));
  24. app.use('/', require('./routers/car-routers'));
  25.  
  26. //监听http请求
  27. mongoose.connect('mongodb://localhost/car', function(err) {
  28. if (err) {
  29. console.log('数据库连接失败');
  30. } else {
  31. console.log('数据库连接成功');
  32. app.listen(3000);
  33. }
  34. });

schemas/car-schemas.js 定义这个集合的数据类型:

  1. "use strict";
  2. var mongoose = require('mongoose');
  3.  
  4. //分类的表结构
  5. module.exports = new mongoose.Schema({
  6. info:String, //车;
  7. money:String, //价钱;
  8. phone:String, //电话号码;
  9. time:String, //上牌时间;
  10. mileage:String, //公里数;
  11. gearbox:String, //变速箱;
  12. emission:String, //排放标准;
  13. location:String, //上牌地;
  14. imgs:Array //图片;
  15. });

models/car-models.js 集合和数据库连接起来同时可以操作:

  1. "use strict";
  2. var mongoose = require('mongoose');
  3. var carSchema = require('../schemas/car-schemas.js');
  4.  
  5. module.exports = mongoose.model('sell_carinfos', carSchema);

routers/car-routers.js 请求路径的路由匹配:

1.router.get('/') 匹配index页面

2.router.get('/:id') 匹配详情页是有详情id

3.router.get('*') 匹配的是404错误页

  1. "use strict";
  2. var express = require('express');
  3. var router = express.Router();
  4.  
  5. var carUser = require('../models/car-models');
  6. var data;
  7.  
  8. //匹配 汽车详情
  9. router.get('/:id', function(req, res, next) {
  10.  
  11. var _id = req.params.id || '';
  12.  
  13. //根据id查找数据;
  14. carUser.findOne({ _id : _id},function( err,contents ){
  15.  
  16. if( err ){
  17.  
  18. next();
  19.  
  20. }else{
  21.  
  22. res.render('./info',{
  23. carinfo : contents
  24. });
  25.  
  26. }
  27.  
  28. });
  29.  
  30. });
  31.  
  32. //主页面;
  33. router.get('/', function(req, res, next) {
  34.  
  35. var limit = 8;//查几条;
  36. var skip = 0; //从第几条开始;
  37. //查表
  38. carUser.find({}).limit(limit).skip(skip).then(function( contents ){
  39. res.render('./index',{
  40. carlists : contents
  41. });
  42. });
  43.  
  44. });
  45.  
  46. //
  47. router.get('*', function(req, res){
  48. res.render('./404')
  49. });
  50.  
  51. module.exports = router;

routers/api.js  处理像$.ajax请求 单独的路由:

  1. "use strict";
  2. var express = require('express');
  3. var router = express.Router();
  4. var carModels = require('../models/car-models.js');
  5.  
  6. //统一返回格式
  7. var responseData = {};
  8.  
  9. //翻页;
  10. router.post('/pages', function(req, res, next) {
  11.  
  12. var pages = req.body.pages || 0; //页码;
  13.  
  14. var limit = 8; //取几条数据;
  15. var skip = limit * pages; //从第几条开始;
  16. var totalPages = 0; //总页数;
  17. carModels.find({}).count({},function(err,count){
  18. if(err){
  19. console.log('出错了');
  20. }
  21.  
  22. totalPages = Math.floor( count / limit );
  23.  
  24. });
  25.  
  26. carModels.find({}).limit(limit).skip(skip).then(function(data) {
  27.  
  28. if( pages < totalPages ){
  29. responseData.code = 1;
  30. responseData.message = data;
  31.  
  32. return res.json(responseData);
  33. }else{
  34. responseData.code = 2;
  35. return res.json(responseData);
  36. }
  37.  
  38. });
  39.  
  40. });
  41.  
  42. module.exports = router;

views/layout.pug 公共头文件 提出共同的css和js:

  1. doctype html
  2. html
  3. head
  4. meta(charset="UTF-8")
  5. meta(name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0")
  6. title 瓜子二手车
  7. link(rel="stylesheet" type="text/css" href="/public/c/flex.css")
  8. link(rel="stylesheet" type="text/css" href="/public/c/index.css")
  9. link(rel="stylesheet" type="text/css" href="/public/c/dropload.css")
  10. script(src="/public/j/zepto.min.js" type="text/javascript")
  11. body
  12. block content

views/index.pug 列表页 继承layaout 同时处理传过json绑定在页面上:

  1. extends layout
  2.  
  3. block content
  4. ul.car-ul
  5. each car in carlists
  6. li
  7. a(href=car._id flex)
  8. div(class="car-img" flex-box="1")
  9. img(src=car.imgs[0])
  10. div(class="car-infolist" flex-box="9")
  11. div(class="car-infolist" flex-box="9")
  12. div.car-name.
  13. #{car.info}
  14. div.car-km
  15. span.
  16. #{car.time}年/#{car.mileage}万公里
  17. div.car-price
  18. strong.
  19. #{car.money}万
  20.  
  21. script(src="/public/j/dropload.min.js" type="text/javascript")
  22. script(src="/public/j/index.js" type="text/javascript")

views/info.pug 继承layaout 详情页:

  1. extends layout
  2.  
  3. block content
  4. div.product-head
  5. img(class="product-headImg" src=carinfo.imgs[0])
  6. div
  7. h1.product-title #{carinfo.info}
  8. div.sevser-about
  9. ul(class="mod-sev" flex)
  10. li(flex="main:center cross:center" flex-box="1")
  11. div
  12. p.about-own.
  13. 车主报价
  14. p.about-prize.
  15. #{carinfo.money}万
  16. li(flex="main:center cross:center" flex-box="1")
  17. div
  18. p.about-own.
  19. 贷款首期款
  20. p.about-prize.
  21. ¥#{ Math.floor(parseFloat( carinfo.money.substring(1,carinfo.money.length) ) * 0.3) }万
  22. li(flex="main:center cross:center" flex-box="1")
  23. div
  24. p.about-own.
  25. 服务费
  26. p.about-prize.
  27. #{ Math.floor(parseFloat( carinfo.money.substring(1,carinfo.money.length) ) * 0.03 *10000) }元
  28. div.column
  29. div.column-head.
  30. 基本信息
  31. ul(flex class="column-carul")
  32. li(flex-box="5")
  33. span.info-title.
  34. 表显里程:
  35. span #{carinfo.mileage}万公里
  36. li(flex-box="5")
  37. span.info-title.
  38. 上牌时间:
  39. span #{carinfo.time}
  40. li(flex-box="5")
  41. span.info-title.
  42. 牌照归属:
  43. span #{carinfo.location}
  44. li(flex-box="5")
  45. span.info-title.
  46. 排放标准:
  47. span #{carinfo.emission}
  48. li(flex-box="5")
  49. span.info-title.
  50. 变速箱:
  51. span #{carinfo.gearbox}
  52. li(flex-box="5")
  53. span.info-title.
  54. 看车地址:
  55. span #{carinfo.location}
  56. div.product-img
  57. each imgs in carinfo.imgs
  58. img(src=imgs)

gulp node app.js的自动重启

  1. 'use strict';
  2.  
  3. var gulp = require('gulp');
  4. var nodemon = require('gulp-nodemon');
  5.  
  6. gulp.task('start', function () {
  7. nodemon({
  8. script: 'app.js'
  9. , ext: 'js html'
  10. , env: { 'NODE_ENV': 'development' }
  11. })
  12. })
  13.  
  14. //执行的默认事件;
  15. gulp.task('default',function(){
  16. gulp.run('start');
  17. });

后记:

麻雀虽小五脏俱全~

参考资料:

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 实践的更多相关文章

  1. express实践(一)

    涉及以下这些内容: 主体. cookie.session 数据 模板引擎 服务器基本结构: const express=require('express'); const static=require ...

  2. nodejs 实践:express 最佳实践 (一)

    express 最佳实践 (一) 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色,, 在 web同构 方面, nodejs 的优势 ...

  3. nodejs 实践:express 最佳实践 (一) 项目结构

    express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...

  4. express 最佳实践(二):中间件

    express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...

  5. nodejs 实践:express 最佳实践(四) express-session 解析

    nodejs 实践:express 最佳实践(四) express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs ...

  6. vue实践---vue配合express实现请求数据mock

    mock数据是前端比较常见的技术,这里介绍下vue配合express 实现请求数据mock. 第一步: 安装 express :  npm install express -D 第二步: 简历需要mo ...

  7. nodejs 实践:express 最佳实践系列

    nodejs 实践:express 最佳实践系列 nodejs 实践:express 最佳实践(一) 项目结构 nodejs 实践:express 最佳实践(二) 中间件 nodejs 实践:expr ...

  8. 开始nodejs+express的学习+实践(1)

    开始nodejs+express的学习+实践(1) 开始nodejs+express的学习+实践(2) 开始nodejs+express的学习+实践(3) 开始nodejs+express的学习+实践 ...

  9. nodejs 实践:express 最佳实践(二) 中间件

    express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...

随机推荐

  1. qsort.c源码

    /* 版权所有(C) 1991-2019 自由软件资金会. 该文件属于是GUN C语言函数库,由Douglas C. Schmidt(schmidt@ics.uci.edu)所写. GUN C语言函数 ...

  2. MySQL安装后无法用root用户访问的问题

    今天在换了Ubuntu后装个本地的mysql,安装过程没什么好说的:sudo apt-get install mysql-server 安装好了之后我做了以下一系列常规动作: 1.$sudo mysq ...

  3. 【python 字符串】 字符串的相关方法(三)

    # 将字符串中的每个元素,按照指定分隔符进行拼接 # 空格 .# ._ 等等 不能是反斜杠 test = '你是风儿我是沙' ret = '#'.join(test) print(ret) 你#是#风 ...

  4. SSM框架开发遇到的问题

    request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+re ...

  5. linux命令(方可)

    解压:tar -xvf xxx.tar.gz 查看:rpm -qa | grep xxx卸载:rpm -e --nodeps xxx批量卸载:rpm -qa | grep xxx | xargs rp ...

  6. 使用apidoc生成项目文档

    [1]npm install apidoc -g 全局安装apidoc [2]apidoc -v 查看是否安装成功 [3]apidoc.json apidoc的项目级配置文件,它必须位于整个工程目录顶 ...

  7. kubernetes调度pod运行于master节点上

    应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...

  8. .NET技术-2.0. 操作数据库-EF

    .NET技术-2.0. 操作数据库-EF 项目参见: EF安装配置 参见: https://www.cnblogs.com/1285026182YUAN/p/10772330.html https:/ ...

  9. 目前的.NET 主流的后端ORM框架

    转自:https://www.cnblogs.com/yeminglong/p/9518438.html  推荐一些常用的asp.net ORM框架 SqlSugar (国内) Dos.ORM (国内 ...

  10. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...