基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析

这章的目的是为了把前面所学习的内容整合一下,这个示例完成一个简单图书管理模块,因为中间需要使用到Bootstrap这里先介绍Bootstrap。

示例名称:天狗书店

功能:完成前后端分离的图书管理功能,总结前端学习过的内容。

技术:NodeJS、Express、Monk、MongoDB、AngularJS、BootStrap、跨域

效果:

一、Bootstrap

Bootstrap是一个UI框架,它支持响应式布局,在PC端与移动端都表现不错。

Bootstrap是Twitter推出的一款简洁、直观、强悍的前端开发框架。

Bootstrap中包含了丰富的Web组件,根据这些组件,可以快速的搭建一个漂亮、功能完备的网站。

在线可视布局:http://www.ibootstrap.cn/

演示: http://expo.bootcss.com/

中文网:http://www.bootcss.com/

官网:http://getbootstrap.com/

安装:npm install bootstrap@3

1.1、添加引用

也可使用包管理器也可以去官网下载后添加引用。

1.2、在页面中使用BootStrap

添加CSS引用:

<link rel="stylesheet" type="text/css" href="js/bootstrap/dist/css/bootstrap.min.css" />

添加JavaScript引用:

 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="js/bootstrap/dist/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>

在页面中引用BootStrap定义好的样式

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>bootstrap</title>
  <link rel="stylesheet" type="text/css" href="js/bootstrap/dist/css/bootstrap.min.css" />
 </head>
 <body>
  <div class="container-fluid">
   <div class="row">
    <div class="jumbotron">
     <h1>Hello, world!</h1>
     <p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information</p>
     <p>
      <a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a>
     </p>
    </div>
   </div>
   <div class="row">
    <div class="col-md-6">
     <button type="button" class="btn btn-default">默认</button>
     <button type="button" class="btn btn-primary">主要</button>
     <button type="button" class="btn btn-success">成功</button>
     <button type="button" class="btn btn-info">信息</button>
     <button type="button" class="btn btn-warning">警告</button>
     <button type="button" class="btn btn-danger">错误</button>
     <button type="button" class="btn btn-link">链接</button>
    </div>
    <div class="col-md-6">
     <button type="button" class="btn btn-default btn-lg">默认</button>
     <button type="button" class="btn btn-default">默认</button>
     <button type="button" class="btn btn-default btn-sm">默认</button>
     <button type="button" class="btn btn-default btn-xs">默认</button>
    </div>
   </div>
  </div>
  <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  <script src="js/bootstrap/dist/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
 </body>
</html>

运行结果:

1.3、可视化布局

如果想快速高效的布局可以使用一些在线辅助工具,如:

http://www.ibootstrap.cn/

点击下载可以获得生成的HTML脚本。

二、使用MongoDB创建数据库

2.1、启动MongoDB数据库

数据库的具体安装、配置在前面的章节中已经讲解过,可以参考。

如果服务与配置都没有完成的话可以启动:C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe

2.2、启动数据库GUI管理工具

2.3、创建数据库与集合

在localhost上右键“create database”创建名称为BookStore的数据库。

创建一个用于存放图书的集合名称为books。

在集合中添加5本图书。

db.getCollection('books').insert({id:201701,title:"使用AlarJS开发下一代应用程序",picture:"b1.jpg",price:55.0,author:"brad green"});

三、创建一个Express项目

这里使用Eclipse(HBuilder)为开发工具,添加Nodeclipse插件,新增一个Express项目:

3.1、创建app.js

/**
 * Module dependencies.
 */
var express = require('express')
 , routes = require('./routes')
 , books = require('./routes/books')
 , http = require('http')
 , path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
 app.use(express.errorHandler());
}
app.get('/', books.list);
app.get('/books', books.list);
http.createServer(app).listen(app.get('port'), function(){
 console.log('Express server listening on port ' + app.get('port'));
});

四、Monk访问MongoDB数据库

monk是NodeJS平台下访问MongoDB数据库的一个模块。monk访问MongoDB更加方便比NodeJS直接访问。

git仓库地址:https://github.com/Automattic/monk

文档:https://automattic.github.io/monk/

安装:npm install --save monk

4.1、创建连接

const monk = require('monk')
// Connection URL
const url = 'localhost:27017/myproject';
const db = monk(url);
db.then(() => {
 console.log('Connected correctly to server')
})

4.2、插入数据

const url = 'localhost:27017/myproject'; // Connection URL
const db = require('monk')(url);
const collection = db.get('document')
collection.insert([{a: 1}, {a: 2}, {a: 3}])
 .then((docs) => {
 // docs contains the documents inserted with added **_id** fields
 // Inserted 3 documents into the document collection
 }).catch((err) => {
 // An error happened while inserting
 }).then(() => db.close())
users.insert({ woot: 'foo' })
users.insert([{ woot: 'bar' }, { woot: 'baz' }])

4.3、更新数据

const url = 'localhost:27017/myproject'; // Connection URL
const db = require('monk')(url);
const collection = db.get('document')
collection.insert([{a: 1}, {a: 2}, {a: 3}])
 .then((docs) => {
 // Inserted 3 documents into the document collection
 })
 .then(() => {
 return collection.update({ a: 2 }, { $set: { b: 1 } })
 })
 .then((result) => {
 // Updated the document with the field a equal to 2
 })
 .then(() => db.close())
users.update({name: 'foo'}, {name: 'bar'})

4.4、删除数据

const url = 'localhost:27017/myproject'; // Connection URL
const db = require('monk')(url);
const collection = db.get('document')
collection.insert([{a: 1}, {a: 2}, {a: 3}])
 .then((docs) => {
 // Inserted 3 documents into the document collection
 })
 .then(() => collection.update({ a: 2 }, { $set: { b: 1 } }))
 .then((result) => {
 // Updated the document with the field a equal to 2
 })
 .then(() => {
 return collection.remove({ a: 3})
 }).then((result) => {
 // Deleted the document with the field a equal to 3
 })
 .then(() => db.close())
users.remove({ woot: 'foo' })

4.5、查找数据

const url = 'localhost:27017/myproject'; // Connection URL
const db = require('monk')(url);
const collection = db.get('document')
collection.insert([{a: 1}, {a: 2}, {a: 3}])
 .then((docs) => {
 // Inserted 3 documents into the document collection
 })
 .then(() => collection.update({ a: 2 }, { $set: { b: 1 } }))
 .then((result) => {
 // Updated the document with the field a equal to 2
 })
 .then(() => collection.remove({ a: 3}))
 .then((result) => {
 // Deleted the document with the field a equal to 3
 })
 .then(() => {
 return collection.find()
 })
 .then((docs) => {
 // docs === [{ a: 1 }, { a: 2, b: 1 }]
 })
 .then(() => db.close())
users.find({}).then((docs) => {})
users.find({}, 'name').then((docs) => {
 // only the name field will be selected
})
users.find({}, { fields: { name: 1 } }) // equivalent
users.find({}, '-name').then((docs) => {
 // all the fields except the name field will be selected
})
users.find({}, { fields: { name: 0 } }) // equivalent
users.find({}, { rawCursor: true }).then((cursor) => {
 // raw mongo cursor
})
users.find({}).each((user, {close, pause, resume}) => {
 // the users are streaming here
 // call `close()` to stop the stream
}).then(() => {
 // stream is over
})
//创建的数据库
var monk = require('monk')
var db = monk('localhost:27017/bookstore')
//读取数据:
var monk = require('monk')
var db = monk('localhost:27017/monk-demo')
var books = db.get('books')
 books.find({}, function(err, docs) {
 console.log(docs)
})
//插入数据:
books.insert({"name":"orange book","description":"just so so"})
//查找数据:
books.find({"name":"apple book"}, function(err, docs) {
 console.log(docs)
})
复制代码
五、创建Rest后台服务
在routes目录下增加的books.js文件内容如下:
复制代码
/*
 * 使用monk访问mongodb
 * 以rest的方式向前台提供服务
 */
//依赖monk模块
var monk = require('monk');
//连接并打开数据库
var db = monk('localhost:27017/BookStore');
//从数据库中获得books集合,类似表,并非所有数据, key
var books = db.get('books');
//列出所有的图书json
exports.list = function(req, res) {
 //无条件查找所有的图书,then是当查找完成时回调的异步方法
 books.find({}).then((docs) => {
  //返回json给客户端
  res.json(docs);
 }).then(() => db.close()); //关闭数据库
};
//获得最大id
exports.getMax=function(req,res){
 //找一个,根据id降序排序,
 books.findOne({}, {sort: {id: -1}}).then((bookObj)=>{
  res.json(bookObj);
 }).then(() => db.close());;
}
//添加图书
exports.add = function(req, res) {
 //先找到最大的图书编号
 books.findOne({}, {sort: {id: -1}}).then((obj)=>{
  //从客户端发送到服务器的图书对象
  var book=req.body;
  //设置图书编号为最大的图书编号+1
  book.id=(parseInt(obj.id)+1)+"";
  //执行添加
  books.insert(book).then((docs) => {
  //返回添加成功的对象
   res.json(docs);
  }).then(() => db.close());
 });
};
//删除图书
exports.del = function(req, res) {
 //从路径中取参数id,/:id
 var id=req.params.id;
 //移除编号为id的图书
 books.remove({"id":id}).then((obj)=>{
  //返回移除结果
  res.json(obj);
 }).then(() => db.close());
};
//更新
exports.update = function(req, res) {
 //获得提交给服务器的json对象
 var book=req.body;
 //执行更新,第1个参数是要更新的图书查找条件,第2个参数是要更新的对象
 books.update({"id":book.id}, book).then((obj)=>{
  //返回更新完成后的对象
  res.json(obj);
  }).then(() => db.close());
};

为了完成跨域请求,修改http头部信息及路径映射,app.js文件如下:

var express = require('express'),
 routes = require('./routes'),
 books = require('./routes/books'),
 http = require('http'),
 path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.all('*', function(req, res, next) {
 res.header("Access-Control-Allow-Origin", "*");
 res.header("Access-Control-Allow-Headers", "content-type");
 res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
 res.header("X-Powered-By", ' 3.2.1')
 res.header("Content-Type", "application/json;charset=utf-8");
 if(req.method == "OPTIONS") {
  res.send("200");
 } else {
  next();
 }
});
// development only
if('development' == app.get('env')) {
 app.use(express.errorHandler());
}
app.get('/', books.list);
//获得所有的图书列表
app.get('/books', books.list);
//最大的编号
app.get('/books/maxid', books.getMax);
//添加
app.post('/books/book', books.add);
//删除
app.delete('/books/id/:id', books.del);
//更新
app.put('/books/book', books.update);
http.createServer(app).listen(app.get('port'), function() {
 console.log('Express server listening on port ' + app.get('port'));
});

查询所有:

其它服务的测试可以使用Fiddler完成。

六、使用AngularJS调用后台服务

这里的UI使用BootStrap完成,前端使用AngularJS调用NodeJS发布的服务,将数据存放在MongoDB中。

index.js页面如下:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>天狗书店</title>
  <link rel="shortcut icon" href="favicon.ico" />
  <link rel="bookmark" href="favicon.ico" />
  <link rel="stylesheet" type="text/css" href="js/bootstrap/dist/css/bootstrap.min.css" />
  <style type="text/css">
   .cover {
    height: 40px;
    width: auto;
   }
   .addBook {
    padding-top: 10px;
   }
   .w100 {
    width: 50px
   }
   .w200 {
    width: 200px;
   }
   .w300 {
    width: 300px
   }
  </style>
 </head>
 <body ng-app="bookApp">
  <div class="container" ng-controller="BookController">
   <div class="row clearfix">
    <div class="col-md-12 column">
     <nav class="navbar navbar-default" role="navigation">
      <div class="navbar-header">
       <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>
       <a class="navbar-brand" href="#">天狗书店</a>
      </div>
      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
       <ul class="nav navbar-nav">
        <li class="active">
         <a href="#">前端</a>
        </li>
        <li>
         <a href="#">Java</a>
        </li>
        <li>
         <a href="#">.Net</a>
        </li>
        <li class="dropdown">
         <a href="#" class="dropdown-toggle" data-toggle="dropdown">更多类型<strong class="caret"></strong></a>
         <ul class="dropdown-menu">
          <li>
           <a href="#">Action</a>
          </li>
          <li>
           <a href="#">Another action</a>
          </li>
          <li>
           <a href="#">Something else here</a>
          </li>
          <li class="divider">
          </li>
          <li>
           <a href="#">Separated link</a>
          </li>
          <li class="divider">
          </li>
          <li>
           <a href="#">One more separated link</a>
          </li>
         </ul>
        </li>
       </ul>
       <form class="navbar-form navbar-left" role="search">
        <div class="form-group">
         <input type="text" class="form-control" />
        </div> <button type="submit" class="btn btn-default">搜索</button>
       </form>
      </div>
     </nav>
     <div class="row clearfix">
      <div class="col-md-12 column">
       <div class="carousel slide" id="carousel-519027">
        <ol class="carousel-indicators">
         <li class="active" data-slide-to="0" data-target="#carousel-519027">
         </li>
         <li data-slide-to="1" data-target="#carousel-519027">
         </li>
         <li data-slide-to="2" data-target="#carousel-519027">
         </li>
        </ol>
        <div class="carousel-inner">
         <div class="item active">
          <img alt="" src="img/adv3.jpg" />
          <div class="carousel-caption">
          </div>
         </div>
         <div class="item">
          <img alt="" src="img/adv2.jpg" />
          <div class="carousel-caption">
          </div>
         </div>
         <div class="item">
          <img alt="" src="img/adv1.jpg" />
          <div class="carousel-caption">
           <h4>
          Third Thumbnail label
         </h4>
           <p>
            Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.
           </p>
          </div>
         </div>
        </div>
        <a class="left carousel-control" href="#carousel-519027" data-slide="prev"><span class="glyphicon glyphicon-chevron-left"></span></a>
        <a class="right carousel-control" href="#carousel-519027" data-slide="next"><span class="glyphicon glyphicon-chevron-right"></span></a>
       </div>
      </div>
     </div>
    </div>
   </div>
   <div class="row clearfix">
    <div class="col-md-12 column">
     <div class="addBook">
      <a id="modal-234446" href="#modal-container-234446" role="button" class="btn btn-sm btn-primary" data-toggle="modal"><span class="glyphicon glyphicon-plus"></span> 新书上架</a>
      <div class="modal fade" id="modal-container-234446" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
       <div class="modal-dialog">
        <div class="modal-content">
         <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
          <h4 class="modal-title" id="myModalLabel">
        添加/编辑图书
       </h4>
         </div>
         <div class="modal-body">
          <form class="form-horizontal" role="form">
           <div class="form-group">
            <label for="id" class="col-sm-2 control-label">编号</label>
            <div class="col-sm-10">
             <input type="text" class="form-control w100" id="id" ng-model="book.id" ng-readonly="true" />
            </div>
           </div>
           <div class="form-group">
            <label for="title" class="col-sm-2 control-label">书名</label>
            <div class="col-sm-10">
             <input type="text" class="form-control w300" id="title" ng-model="book.title" />
            </div>
           </div>
           <div class="form-group">
            <label for="picture" class="col-sm-2 control-label">图片</label>
            <div class="col-sm-10">
             <input type="text" class="form-control w200" id="picture" ng-model="book.picture" />
            </div>
           </div>
           <div class="form-group">
            <label for="price" class="col-sm-2 control-label">价格</label>
            <div class="col-sm-10">
             <input type="text" class="form-control w200" id="price" ng-model="book.price" />
            </div>
           </div>
           <div class="form-group">
            <label for="author" class="col-sm-2 control-label">作者</label>
            <div class="col-sm-10">
             <input type="text" class="form-control w200" id="author" ng-model="book.author" />
            </div>
           </div>
          </form>
         </div>
         <div class="modal-footer">
          <button type="button" ng-click="save()" class="btn btn-primary">
          <span class="glyphicon glyphicon-floppy-disk"></span>
           保存</button>
          <button type="button" class="btn btn-success" ng-click="clear()" data-dismiss="modal">
           <span class="glyphicon glyphicon-refresh"></span>
           清空</button>
          <button type="button" class="btn btn-danger" data-dismiss="modal">
           <span class="glyphicon glyphicon-remove"></span>
           关闭</button>
         </div>
        </div>
       </div>
      </div>
     </div>
     <table class="table">
      <thead>
       <tr>
        <th>
         序号
        </th>
        <th>
         编号
        </th>
        <th>
         书名
        </th>
        <th>
         图片
        </th>
        <th>
         价格
        </th>
        <th>
         作者
        </th>
        <th>
         操作
        </th>
       </tr>
      </thead>
      <tbody>
       <tr ng-repeat="b in books" ng-class="{'info':$odd}">
        <td>
         {{$index+1}}
        </td>
        <td>
         {{b.id}}
        </td>
        <td>
         {{b.title}}
        </td>
        <td>
         <img ng-src="img/{{b.picture}}" class="cover" />
        </td>
        <td>
         {{b.price | number:1}}
        </td>
        <td>
         {{b.author}}
        </td>
        <td>
         <button type="button" class="btn btn-danger btn-xs" ng-click="del(b.id,$index)">删除</button>
         <button href="#modal-container-234446" role="button" class="btn btn-xs btn-primary" data-toggle="modal" ng-click="edit(b)">编辑</button>
        </td>
       </tr>
      </tbody>
     </table>
    </div>
   </div>
  </div>
  <!--引入angularjs框架-->
  <script src="js/angular146/angular.min.js" type="text/javascript" charset="utf-8"></script>
  <script src="js/jQuery1.11.3/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
  <script src="js/bootstrap/dist/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
  <script type="text/javascript">
   //定义模块,指定依赖项为空
   var bookApp = angular.module("bookApp", []);
   //定义控制器,指定控制器的名称,$scope是全局对象
   bookApp.controller("BookController", ['$scope', '$http', function($scope, $http) {
    $scope.books = [];
    $scope.save = function() {
     $http({
       url: "http://127.0.0.1:3000/books/book",
       data: $scope.book,
       method: $scope.book.id ? "PUT" : "POST"
      })
      .success(function(data, status, headers, config) {
       if($scope.book.id) {
        alert("修改成功");
       } else {
        $scope.books.push(data);
       }
      })
      .error(function(data, status, headers, config) {
       alert(status);
      });
    }
    $scope.edit = function(b) {
     $scope.book = b;
    }
    $scope.clear = function() {
     $scope.book = {};
    }
    //初始化加载
    $http.get("http://127.0.0.1:3000/")
     .success(function(data, status, headers, config) {
      $scope.books = data;
     })
     .error(function(data, status, headers, config) {
      alert(status);
     });
    $scope.del = function(id, index) {
     $http.delete("http://127.0.0.1:3000/books/id/" + id)
      .success(function(data, status, headers, config) {
       $scope.books.splice(index, 1);
      })
      .error(function(data, status, headers, config) {
       alert(status);
      });
    }
   }]);
  </script>
 </body>
</html>

运行结果:

新书上架:

编辑图书

添加成功后:

七、示例下载

前端:https://github.com/zhangguo5/AngularJS04.git

后台:https://github.com/zhangguo5/AngularJS04_BookStore.git

以上所述是小编给大家介绍的基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 详解nodejs操作mongodb数据库封装DB类

    这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关于mongoose的安装就是 npm install -g mongoose 这个DB类的数据库配置是基于auth认证的,如果您的数据库没有账号与密码则留空即可. /** * mongoose操作类(封装mongodb) */ var fs = require('fs'); var path = r

  • NodeJS中的MongoDB快速入门详细教程

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.MongoDB必须理解的概念 1.数据库:每个数据库都有自己的权限和集合. 2.文档:一个键值对. 3.集合:一组文档,即一组键值对.当第一个文档插入时,集合就会被创建. 二.Mac下的MongoDB安装和启动 1.使用brew进行安装:brew ins

  • windows下安装mongodb以及node.js连接mongodb实例

    一.MongoDB 下载 下载地址  https://www.mongodb.com/download-center#community  选择windows版下载,然后安装. 二.安装完毕后创建数据目录. MongoDB将数据目录存储在 db 目录下.但是这个数据目录不会主动创建,我们在安装完成后需要创建它.请注意,数据目录应该放在根目录下((如: C:\ 或者 D:\ 等 ).可以选择命令行创建,也可以手动创建. 最后生成这样的目录 c:>data>db 三.命令行下运行 MongoDB

  • NodeJS连接MongoDB数据库时报错的快速解决方法

    今天第一次尝试连接MongoDB数据库,具体步骤也很简单. 首先,通过NodeJS运行环境安装MongoDB包,进入要安装的目录,执行语句 npm install mongodb安装成功后,通过如下语句测试与数据库建立连接几关闭数据库 var mongo = require('mongodb'); var host = "localhost"; var port = mongo.Connection.DEFAULT_PORT; //创建MongoDB数据库所在服务器的Server对象

  • NodeJS学习笔记之MongoDB模块

    一,开篇分析 这篇属于扩展知识篇,因为在下面的文章中会用到数据库操作,所以今天就来说说它(Mongodb模块). (1),简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bj

  • nodejs连接mongodb数据库实现增删改查

    准备 1.通过npm命令安装mongodb 2.安装mongodb数据库,这里不详细介绍了,安装网址:http://www.jb51.net/article/82522.htm CRUD操作 在此之前应对MongoDB数据库有所了解,知道它的一些增删查改命令. 1.增加 var MongoClient = require("mongodb").MongoClient; var DB_URL = "mongodb://localhost:27017/chm"; fun

  • nodejs中使用monk访问mongodb

    安装mongodb 我觉得还是用mannual install靠谱一点儿:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/ 启动mongodb $ mongod 连接mogodb $ mongo mongo> use monk-app mongo> db.products.insert({"name":"apple juice", "description"

  • 基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析

    这章的目的是为了把前面所学习的内容整合一下,这个示例完成一个简单图书管理模块,因为中间需要使用到Bootstrap这里先介绍Bootstrap. 示例名称:天狗书店 功能:完成前后端分离的图书管理功能,总结前端学习过的内容. 技术:NodeJS.Express.Monk.MongoDB.AngularJS.BootStrap.跨域 效果: 一.Bootstrap Bootstrap是一个UI框架,它支持响应式布局,在PC端与移动端都表现不错. Bootstrap是Twitter推出的一款简洁.直

  • vue 中基于html5 drag drap的拖放效果案例分析

    事情是这样的,右边有各种控件,可以拖动到右边自由区,在自由区内可以随意拖动. 案例一: 开始的我,so easy! 通过绑定元素的mousedown 事件,监听鼠标的mousemove,和mouseup 事件,于是我轻松实现了同一区域内元素可以拖着跑,上代码! move (e) { let odiv = e.target // 获取目标元素 // 算出鼠标相对元素的位置 let disX = e.clientX - odiv.offsetLeft let disY = e.clientY - o

  • NodeJs实现简单的爬虫功能案例分析

    1.爬虫:爬虫,是一种按照一定的规则,自动地抓取网页信息的程序或者脚本:利用NodeJS实现一个简单的爬虫案例,爬取Boss直聘网站的web前端相关的招聘信息,以广州地区为例: 2.脚本所用到的nodejs模块 express     用来搭建一个服务,将结果渲染到页面 swig          模板引擎 cheerio      用来抓取页面的数据 requests    用来发送请求数据(具体可查:https://www.npmjs.com/package/requests) async 

  • JS工厂模式开发实践案例分析

    本文实例讲述了JS工厂模式开发.分享给大家供大家参考,具体如下: 基于JS工厂模式的H5应用,实现了轮播图功能与滑屏功能,并且实现了文字大小的自适应功能,基于SASS样式开发. 核心的JS代码如下: index.js define(function(){ var self = null, start = null, move = null, end = null, handle = null, timer = null, left = 0, x = 0, startX = 0, baseWidt

  • 基于NodeJS的前后端分离的思考与实践(一)全栈式开发

    前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了"前后端"的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式. 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻

  • 基于nodejs+express(4.x+)实现文件上传功能

    Nodejs是一个年轻的编程框架,充满了活力和无限激情,一直都在保持着快速更新.基于Nodejs的官方Web开发库Express也在同步发展着,每年升级一个大版本,甚至对框架底层都做了大手术.在Express4时,替换掉中件间库connect,而改用多个更细粒度的库来取代.带来的好处是明显地,这些中间件能更自由的更新和发布,不会受到Express发布周期的影响:但问题也是很的棘手,不兼容于之前的版本,升级就意味着要修改代码. 通过一段时间的查阅资料.摸索,我发现实现上传的方式有:1.expres

  • 基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码

    Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工DOM操作. AngularJs 就是一个函数库,算不上一个框架,源码2万2千多行,提供了前端MVC的开发方式,有双向绑定,指令等特性,这是具有革命性的.我是多么反感jQuery 用选择器 选择元素 ,绑定事件,进行一大堆DOM操作,一旦代码过多,非常不好维护,html结构改变,又要重写js代码,不过 jQuery  对 ajax的

  • 基于NodeJS开发钉钉回调接口实现AES-CBC加解密

    钉钉小程序后台接收钉钉开放平台的回调比较重要,比如通讯录变动的回调,审批流程的回调都是在业务上十分需要的.回调接口时打通钉钉平台和内部系统的重要渠道. 但是给回调的接口增加了一些障碍,它需要支持回调的服务器的接口支持AES-CBC加解密.不然无法成功注册或解析内容. 钉钉官方文档中给出了JAVA,PHP,C#的后台SDK和demo,但是却没有Node服务器的代码支持,这让占有率很高的node服务器非常尴尬,难道node就不能作为钉钉平台的回调服务器么 好在钉钉已经开放了其加密算法,可以通过加密流

  • AngularJS+Bootstrap实现多文件上传与管理

    最近一个项目中需要实现多文件上传与管理,而项目是基于bootstrap开发的,所以查了一些bootstrap文件上传插件,最后发现还是bootstrap-fileinput最美观,该插件可以实现多文件的上传与管理(插件官方地址:http://plugins.krajee.com/file-input),具体的效果如下: (bootstrap-fileinput不局限于图片上传,也可以实现文件上传,但图片的缩略图容易辨识,这里就以图片上传为例) 该插件基本的操作可以参考:JS文件上传神器boots

  • Springboot整合MongoDB的Docker开发教程全解

    1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. 2 把Springboot打包成Docker镜像 Springboot的Web开发非常简单,本次使用之前讲解过的Springboot整合MongoDB的项目,请参考 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式,文章中有源码:MongoDB的安装请参考:用Docker安装

随机推荐