nodejs中利用expresss腳手架和bootstrap,數(shù)據(jù)庫(kù)mongodb搭建的留言板案例

## 1. 先打開(kāi)編輯器赦颇,創(chuàng)建一個(gè)項(xiàng)目

## 2. 再打開(kāi)cmd命令提示符下載express腳手架

? ? ? ? express? ?項(xiàng)目名? ?--view=ejs 或express? ?-e? ? 項(xiàng)目名

## 3. 在cmd中進(jìn)入項(xiàng)目名(myapp)下載所需的依賴

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

## 4. 在下載mongoose(前提你電腦上要安裝數(shù)據(jù)庫(kù)的插件)

? ? ? ? cn cnpm mongoose? --save

## 5. 在myapp項(xiàng)目中在創(chuàng)建一個(gè)文件夾滥壕,里面在新建三個(gè)文件

? ? ? ? ?文件夾名? lib? ? ------->三個(gè)文件名? mongoose.js? ? schema,js? ? ?appModel.js

## 6. 在mongoose.js 中連接數(shù)據(jù)庫(kù)

? ? ? ? ? ?//先引入mongoose模塊

? ? ? ? ?var mongoose=require("mongoose");

? ? ? ? ? //連接數(shù)據(jù)庫(kù)服務(wù)器

? ? ? ? ?mongoose.connect("mongodb://localhost/數(shù)據(jù)庫(kù)名(bao)",function(error){

? ? ? ? ? ? ? ? ? ? ? ?if(error){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log("數(shù)據(jù)庫(kù)連接失敗")

? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log("數(shù)據(jù)庫(kù)連接成功")

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? })

? ? ? ? ?//導(dǎo)出

? ? ? module.exports=mongoose;

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

? ? ? ?//引入mongoose.js文件

? ? ?var mongoose=require("./mongoose.js")? ? ? //這里的.js可省略不寫(xiě)

? ? ?//定義schema

? ? var? ?schema=mongoose.Schema({

? ? ? ? ? ? ? ? ?//這里是數(shù)據(jù)庫(kù)自己創(chuàng)建的屬性名:他的屬性類(lèi)型? ?如:

id:String,

name:String,

age:Number,

tel:Number

? ? ?})

? ? ?//導(dǎo)出

? ? ? module.exports=schema;

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

? ? ? ? ? ? ?//引入mongoose.js 文件

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

? ? ? ? ? ? ? //引入schema.js 文件

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

? ? ? ? ? ? ?//定義模型

? ? ? ? ? ? ? var appModel=mongoose.model("appModel",schema,"數(shù)據(jù)庫(kù)中的集合名(app)");

? ? ? ? ? ? ? //導(dǎo)出

? ? ? ? ? ? ? ?module.exports=appModel;

## 9. 在views文件夾中找到index.els編輯

? ? ? ? ? ? ? ? ? //先引入bootstrap的css樣式,js樣式,不過(guò)要把jquery的js插件引入在bootstrap.js的前面,bootstrap連接的樣式可通過(guò)本地下載迎膜,也可網(wǎng)上連接地址即可

? ? ? ? ? ? ? ? ? ? ? ? ?//本地下載? ? cnpm install bootstrap? ?--save

? ? ? ? ? ? ? ? //通過(guò)Bootstrap官網(wǎng)找到我們需要的樣式直接復(fù)制粘貼


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

留言板練習(xí)

.box{

margin: 100px auto;

}

table{

margin: 100px auto;

}

table th{

text-align: center;

}


學(xué)號(hào):

姓名:

年齡:

電話:

添加

重置


學(xué)號(hào)

姓名

年齡

電話

操作

1

張三

20

刪除

修改

2

李四

20

刪除-->

修改-->

全部刪除


×

修改數(shù)據(jù)

學(xué)號(hào):

姓名:

年齡:

電話:

關(guān)閉

保存

## 10. 在routes路由文件夾中創(chuàng)建兩個(gè)文件? ?

? ? ? ? ? ? ? ? ?index.js 渲染頁(yè)面的二級(jí)路由? ?users.js增刪改查的接口

## 11. 在app.js中引入這兩個(gè)二級(jí)路由文件


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");

//設(shè)置渲染頁(yè)面路由

/* GET home page. */

//主頁(yè)從數(shù)據(jù)庫(kù)找到數(shù)據(jù),返回前臺(tái)浆兰,并渲染

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

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

if(err){

console.log("查找數(shù)據(jù)庫(kù)數(shù)據(jù)失敗")

}else{

res.render('index', {

data:docs

});

}

})

});

//導(dǎo)出路由

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">刪除

修改

<%}%>

</tbody>

## 14. 在users.js二級(jí)路由文件中設(shè)置增刪改查

//增(也可以說(shuō)是添加)

//引入express模塊

var express=require("express");

//獲取路由

var router=express.Router();

//引入model.js文件

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

//設(shè)置數(shù)據(jù)接口路由

//添加數(shù)據(jù)到數(shù)據(jù)庫(kù)

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

var da=req.query;//獲取前臺(tái)請(qǐng)求的數(shù)據(jù)磕仅,返回來(lái)是一個(gè)對(duì)象

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

//實(shí)例化

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:"添加成功"

})

}

})

});

//導(dǎo)出

module.exprots=router;

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

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

//獲取學(xué)號(hào),姓名簸呈,年齡榕订,性別的內(nèi)容

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

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

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

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

// alert(xh); alert(xm); alert(nl); alert(tel)檢測(cè)獲取數(shù)據(jù)成功

$.ajax({

url:"/api/write",

data:{

id:xh,

name:xm,

age:nl,

tel:tel

},

success:function (ret) {//成功返回?cái)?shù)據(jù)

console.log(ret)

},error:function (msg) {//失敗返回?cái)?shù)據(jù)

console.log(msg)

}

})

});

## 16. 解決點(diǎn)擊添加按鈕后,要刷新一次才能把添加的內(nèi)容顯示在頁(yè)面

//1. 可以是添加完蜕便,是整個(gè)頁(yè)面刷新("location.href="/"??"),但是有因?yàn)橄旅娴谋砀袷揭惒礁碌慕俸悖圆荒苷麄€(gè)頁(yè)面刷新

//2. 我們要讓它點(diǎn)擊添加按鈕后,tbody的里面內(nèi)容變空$("tbody").html(" ")轿腺,在通過(guò)ajax讀取后臺(tái)數(shù)據(jù)庫(kù)里的數(shù)據(jù)两嘴,把他渲染,添加到當(dāng)前的tbody里

//讀取數(shù)據(jù)庫(kù)里的數(shù)據(jù)

//讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)

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

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

if(err){

res.send({

code:2,

message:"讀取數(shù)據(jù)失敗"

});

}else{

res.send({

code:0,

data:docs,

message:"讀取數(shù)據(jù)成功"

})

}

})

});

//通過(guò)ajax渲染添加到頁(yè)面

/*添加數(shù)據(jù)族壳,憔辫,,用ajax*/

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

//獲取學(xué)號(hào)仿荆,姓名螺垢,年齡,性別的內(nèi)容

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

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

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

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

// alert(xh); alert(xm); alert(nl); alert(tel)檢測(cè)獲取數(shù)據(jù)成功

$.ajax({

url:"/api/write",

data:{

id:xh,

name:xm,

age:nl,

tel:tel

},

success:function (ret) {//成功返回?cái)?shù)據(jù)

console.log(ret);

if(ret.code==0){//在這里判斷后

//當(dāng)后臺(tái)返回?cái)?shù)據(jù)是寫(xiě)入數(shù)據(jù)成功赖歌,讓當(dāng)前的tbody中的內(nèi)容變空,

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

//在通過(guò)ajax讀取后臺(tái)在數(shù)據(jù)庫(kù)中的內(nèi)容功茴,在渲染到tbody中

add(); //封裝的函數(shù)

}

},error:function (msg) {//失敗返回?cái)?shù)據(jù)

console.log(msg)

}

})

});

//在這里因?yàn)楹竺娑夹枰玫铰耄苑庋b到函數(shù)里,后面用的話直接調(diào)用就可以了

//包裝函數(shù)

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);

//當(dāng)渲染后(局部更新后)讓當(dāng)前的學(xué)號(hào)坎穿,姓名展父,年齡返劲,電話框都為空

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

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

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

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

}

},error:function (msg) {

console.log(msg)

}

})

}

## 17. 全部刪除? ?users.js

//全部刪除數(shù)據(jù)

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) {

//獲取前臺(tái)請(qǐng)求的數(shù)據(jù)

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的值,來(lái)確定當(dāng)前行的位置(如:id,name,age,del都可)

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

// alert(a);//檢測(cè)當(dāng)前彈出的_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. 修改數(shù)據(jù)? users.js

//修改數(shù)據(jù)庫(kù)內(nèi)容

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

//獲取前臺(tái)請(qǐng)求數(shù)據(jù)

var data=req.query;

console.log(data);

//獲取前臺(tái)的_id

console.log(data.f);

//獲取前臺(tái)的數(shù)據(jù)請(qǐng)求

console.log(data.da);

//修改數(shù)據(jù)

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

if(err) {

res.send({

code: 5,

message: "修改數(shù)據(jù)失敗"

});

}else{

res.send({

code:0,

message:"修改數(shù)據(jù)成功"

});

}

})

});

## 22. 修改數(shù)據(jù)? index.ejs

// 當(dāng)點(diǎn)擊修改時(shí)栖茉,獲取他的兄弟元素刪除的_id,渲染的都需要用到事件委托

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

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

// alert(a)//檢測(cè)他兄弟刪除的_id

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

});

// 當(dāng)點(diǎn)擊彈框保存時(shí)篮绿,修改數(shù)據(jù),有點(diǎn)問(wèn)題,一次只能修改一次吕漂,下次要刷新

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

//attr一個(gè)參數(shù)是獲取亲配,兩個(gè)參數(shù)是設(shè)置

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

alert(_id)

//獲取彈框里的學(xué)號(hào),姓名惶凝,年齡吼虎,性別的內(nèi)容

//注意:這里要用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. 到這里項(xiàng)目就結(jié)束了苍鲜,說(shuō)明一下:我也是一個(gè)剛學(xué)的小白思灰,這個(gè)修改數(shù)據(jù)里有點(diǎn)小問(wèn)題,等你自己去發(fā)現(xiàn)喲混滔!?

? ? ? ? ? ? ?有哪位大佬解決了這個(gè)bug洒疚,請(qǐng)留言告訴我喲,在此不勝感激E饔臁油湖!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愿伴,隨后出現(xiàn)的幾起案子肺魁,更是在濱河造成了極大的恐慌,老刑警劉巖隔节,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹅经,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怎诫,警方通過(guò)查閱死者的電腦和手機(jī)瘾晃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幻妓,“玉大人蹦误,你說(shuō)我怎么就攤上這事∪饨颍” “怎么了强胰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妹沙。 經(jīng)常有香客問(wèn)我偶洋,道長(zhǎng),這世上最難降的妖魔是什么距糖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任玄窝,我火速辦了婚禮牵寺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恩脂。我一直安慰自己帽氓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布俩块。 她就那樣靜靜地躺著黎休,像睡著了一般。 火紅的嫁衣襯著肌膚如雪典阵。 梳的紋絲不亂的頭發(fā)上奋渔,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音壮啊,去河邊找鬼嫉鲸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛歹啼,可吹牛的內(nèi)容都是我干的玄渗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狸眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼藤树!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拓萌,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岁钓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后微王,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屡限,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年炕倘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钧大。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罩旋,死狀恐怖啊央,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涨醋,我是刑警寧澤瓜饥,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站浴骂,受9級(jí)特大地震影響压固,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靠闭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一帐我、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧膀,春花似錦拦键、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蟀悦,卻和暖如春媚朦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背日戈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工询张, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浙炼。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓份氧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弯屈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜗帜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容