nodejs中利用expresss脚手架和bootstrap,数据库mongodb搭建的留言板案例

## 1. 先打开编辑器,创建一个项目

## 2. 再打开cmd命令提示符下载express脚手架

        express   项目名   --view=ejs 或express   -e    项目名

## 3. 在cmd中进入项目名(myapp)下载所需的依赖

         cd myapp  --------->cnpm  install 

## 4. 在下载mongoose(前提你电脑上要安装数据库的插件)

        cn cnpm mongoose  --save

## 5. 在myapp项目中在创建一个文件夹,里面在新建三个文件

         文件夹名  lib    ------->三个文件名  mongoose.js    schema,js     appModel.js

## 6. 在mongoose.js 中连接数据库

           //先引入mongoose模块

         var mongoose=require("mongoose");

          //连接数据库服务器

         mongoose.connect("mongodb://localhost/数据库名(bao)",function(error){

                       if(error){

                                 console.log("数据库连接失败")

                            }else{

                                 console.log("数据库连接成功")

                            }

        })

         //导出

      module.exports=mongoose;

## 7. 在schema.js 文件中定义schema

       //引入mongoose.js文件

     var mongoose=require("./mongoose.js")      //这里的.js可省略不写

     //定义schema

    var   schema=mongoose.Schema({

                 //这里是数据库自己创建的属性名:他的属性类型   如:

id:String,

name:String,

age:Number,

tel:Number

     })

     //导出

      module.exports=schema;

## 8. 在appModel.js 文件中定义模型

             //引入mongoose.js 文件

             var mongoose=require("./mongoose");

              //引入schema.js 文件

             var schema=require("./schema");

             //定义模型

              var appModel=mongoose.model("appModel",schema,"数据库中的集合名(app)");

              //导出

               module.exports=appModel;

## 9. 在views文件夹中找到index.els编辑

                  //先引入bootstrap的css样式,js样式,不过要把jquery的js插件引入在bootstrap.js的前面,bootstrap连接的样式可通过本地下载,也可网上连接地址即可

                         //本地下载    cnpm install bootstrap   --save

                //通过Bootstrap官网找到我们需要的样式直接复制粘贴


content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

留言板练习

.box{

margin: 100px auto;

}

table{

margin: 100px auto;

}

table th{

text-align: center;

}


学号:

姓名:

年龄:

电话:

添加

重置


学号

姓名

年龄

电话

操作

1

张三

20

删除

修改

2

李四

20

删除-->

修改-->

全部删除


×

修改数据

学号:

姓名:

年龄:

电话:

关闭

保存

## 10. 在routes路由文件夹中创建两个文件   

                 index.js 渲染页面的二级路由   users.js增删改查的接口

## 11. 在app.js中引入这两个二级路由文件


var indexRouter = require('./routes/index');

var usersRouter = require('./routes/users');

app.use('/', indexRouter);

app.use('/api', usersRouter);

## 12. 在index.js文件中


//引入express模块

var express = require('express');

//获取路由

var router = express.Router();

//引入model.js文件

var mm=require("../lib/appModel");

//设置渲染页面路由

/* GET home page. */

//主页从数据库找到数据,返回前台,并渲染

router.get('/', function(req, res, next) {

mm.find({},function (err,docs) {

if(err){

console.log("查找数据库数据失败")

}else{

res.render('index', {

data:docs

});

}

})

});

//导出路由

module.exports = router;

## 13. 在index.ejs 文件中渲染的部分

<%for(var i=0;i

<%=data[i].id%>

<%=data[i].name%>

<%=data[i].age%>

<%=data[i].tel%>


" type="button" class="del btn btn-warning">删除

修改

<%}%>

## 14. 在users.js二级路由文件中设置增删改查

//增(也可以说是添加)

//引入express模块

var express=require("express");

//获取路由

var router=express.Router();

//引入model.js文件

var mm=require("../lib/model");

//设置数据接口路由

//添加数据到数据库

router.get("/write",function (req, res,next) {

var da=req.query;//获取前台请求的数据,返回来是一个对象

console.log(da)//{id:xh.name:xm,age:nl,tel:tel}

//实例化

var aa=new mm(da);//mm({id:..,name:..,age:..,tel:...})

//添加

aa.save(function (err) {

if(err){//如果失败就输出

res.send({

code:1,

message:"添加失败"

});

}else{//否则

res.send({

code:0,

message:"添加成功"

})

}

})

});

//导出

module.exprots=router;

## 15. 在index.ejs中的 增 代码

$(".add").click(function () {

//获取学号,姓名,年龄,性别的内容

var xh=$("#xh").val();

var xm=$("#xm").val();

var nl=$("#nl").val();

var tel=$("#tel").val();

// alert(xh); alert(xm); alert(nl); alert(tel)检测获取数据成功

$.ajax({

url:"/api/write",

data:{

id:xh,

name:xm,

age:nl,

tel:tel

},

success:function (ret) {//成功返回数据

console.log(ret)

},error:function (msg) {//失败返回数据

console.log(msg)

}

})

});

## 16. 解决点击添加按钮后,要刷新一次才能把添加的内容显示在页面

//1. 可以是添加完,是整个页面刷新("location.href="/"  "),但是有因为下面的表格式要异步更新的,所以不能整个页面刷新

//2. 我们要让它点击添加按钮后,tbody的里面内容变空$("tbody").html(" "),在通过ajax读取后台数据库里的数据,把他渲染,添加到当前的tbody里

//读取数据库里的数据

//读取数据库中的数据

router.get("/read",function (req, res, next) {

mm.find({},function (err,docs) {

if(err){

res.send({

code:2,

message:"读取数据失败"

});

}else{

res.send({

code:0,

data:docs,

message:"读取数据成功"

})

}

})

});

//通过ajax渲染添加到页面

/*添加数据,,,用ajax*/

$(".add").click(function () {

//获取学号,姓名,年龄,性别的内容

var xh=$("#xh").val();

var xm=$("#xm").val();

var nl=$("#nl").val();

var tel=$("#tel").val();

// alert(xh); alert(xm); alert(nl); alert(tel)检测获取数据成功

$.ajax({

url:"/api/write",

data:{

id:xh,

name:xm,

age:nl,

tel:tel

},

success:function (ret) {//成功返回数据

console.log(ret);

if(ret.code==0){//在这里判断后

//当后台返回数据是写入数据成功,让当前的tbody中的内容变空,

$("tbody").html("");

//在通过ajax读取后台在数据库中的内容,在渲染到tbody中

add(); //封装的函数

}

},error:function (msg) {//失败返回数据

console.log(msg)

}

})

});

//在这里因为后面都需要用到,所以封装到函数里,后面用的话直接调用就可以了

//包装函数

function add(){

$.ajax({

url:"/api/read",

success:function(ret){

if(ret.code==0){

var str="";

var data=ret.data;

for(var i in data){

str+=`

${data[i].id}

${data[i].name}

${data[i].age}

${data[i].tel}

删除

修改

`

}

$("tbody").html(str);

//当渲染后(局部更新后)让当前的学号,姓名,年龄,电话框都为空

$("#xh").val("");

$("#xm").val("");

$("#nl").val("");

$("#tel").val("");

}

},error:function (msg) {

console.log(msg)

}

})

}

## 17. 全部删除   users.js

//全部删除数据

router.get("/delAll",function (req, res, next) {

mm.remove({},function (err) {

if(err){

res.send({

code:3,

message:"全部删除失败"

});

}else{

res.send({

code:0,

message:"全部删除成功"

})

}

})

});

## 18. 全部删除   index.ejs

//全部删除

$(".delAll").click(function () {

$.ajax({

url:"/api/delAll",

success:function (ret) {

console.log(ret);

if(ret.code==0){

add();

}

},error:function (msg) {

console.log(msg);

}

})

});

## 19. 单行删除   users.js

//单行删除

router.get("/del",function (req, res, next) {

//获取前台请求的数据

var data=req.query;

mm.remove(data,function (err) {

if(err){

res.send({

code:4,

message:"单行删除失败"

});

}else{

res.send({

code:0,

message:"单行删除成功"

})

}

})

});

## 20. 单行删除   index.ejs

//单行删除,需要用到事件委托

$("tbody").on("click",".del",function () {

// alert(111)

//获取_id的值,来确定当前行的位置(如:id,name,age,del都可)

var a=$(this).attr("v");

// alert(a);//检测当前弹出的_id是否不同

$.ajax({

url:"/api/del",

data:{

_id:a

},

success:function (ret) {

console.log(ret);

if(ret.code==0){

add();

}

},error:function (msg) {

console.log(msg);

}

})

});

## 21. 修改数据  users.js

//修改数据库内容

router.get("/xg",function (req, res, next) {

//获取前台请求数据

var data=req.query;

console.log(data);

//获取前台的_id

console.log(data.f);

//获取前台的数据请求

console.log(data.da);

//修改数据

mm.update(data.f,data.da,function (err) {

if(err) {

res.send({

code: 5,

message: "修改数据失败"

});

}else{

res.send({

code:0,

message:"修改数据成功"

});

}

})

});

## 22. 修改数据  index.ejs

// 当点击修改时,获取他的兄弟元素删除的_id,渲染的都需要用到事件委托

$("tbody").on("click",".xg",function () {

var a=$(this).siblings().attr("v");

// alert(a)//检测他兄弟删除的_id

$(".bc").attr("v",a);//将他兄弟删除的属性也添加成了自己的属性

});

// 当点击弹框保存时,修改数据,有点问题,一次只能修改一次,下次要刷新

$(".bc").click(function () {

//attr一个参数是获取,两个参数是设置

var _id=$(this).attr("v");

alert(_id)

//获取弹框里的学号,姓名,年龄,性别的内容

//注意:这里要用class名,id名只能用一次

var xh=$(".xh").val();

var xm=$(".xm").val();

var nl=$(".nl").val();

var tel=$(".tel").val();

// alert(xh); alert(xm); alert(nl); alert(tel);

//ajax

$.ajax({

url:"/api/xg",

data:{

f:{

_id:_id

},

da:{

id:xh,

name:xm,

age:nl,

tel:tel

}

},

success:function (ret) {

console.log(ret);

if(ret.code==0){

$("tbody").html("");

add();

}

},error:function (msg) {

console.log(msg)

}

})

});

## 23. 到这里项目就结束了,说明一下:我也是一个刚学的小白,这个修改数据里有点小问题,等你自己去发现哟! 

             有哪位大佬解决了这个bug,请留言告诉我哟,在此不胜感激!!

你可能感兴趣的:(nodejs中利用expresss脚手架和bootstrap,数据库mongodb搭建的留言板案例)