该系列文章索引:
[js高手之路]node js系列课程-创建简易web服务器与文件读写
[js高手之路]node js系列课程-图解express+supervisor+ejs用法
[js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息
[js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法
[js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义
[js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin
[js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用
[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件
[js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件
[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist
本文,接着这篇文章[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist继续,在这篇文章中实现的发布信息,取出信息列表的功能,本文,继续实现上文预留下的3个功能:
1,删除
2,编辑( ajax交互 )
3,分页与状态状态选中
实现后的效果:
CURD操作是比较简单的,稍微要费点精力的是分页和状态选中,以及弹窗+ajax实现信息更新.
index.jade( 模板 ):
1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title todolist-by ghostwu 6 link(rel="stylesheet", href='./css/bower_components/bootstrap/dist/css/bootstrap.min.css') 7 script(src="./css/bower_components/jquery/dist/jquery.min.js") 8 script(src="./css/bower_components/bootstrap/dist/js/bootstrap.min.js") 9 script(src="./js/index.js") 10 body 11 div.container 12 div.row 13 div.col-md-offset-2.col-md-8 14 h3 留言板(node.js+mongodb+mongoose+jade) -by ghostwu 15 form.form-horizontal(action='/add') 16 div.form-group 17 div.col-md-offset-2.col-md-8 18 textarea.form-control(name='msg',cols=60,rows=5) 19 div.col-md-offset-2.col-md-8 20 button.btn.btn-primary 发布留言 21 div.col-md-offset-2.col-md-8 22 ul.list-group 23 - for ( var key in msgList ){ 24 li.list-group-item 25 span #{msgList[key]['title']} 26 a(href='/del/id/#{msgList[key]["_id"]}') 删除 | 27 input(type='hidden' value='#{msgList[key]["_id"]}') 28 a(data-toggle='modal',data-target='#editMsg',href='javascript:;') 编辑 29 - } 30 div.col-md-offset-2.col-md-8 31 ul.pagination 32 - for ( var i = 0; i < page; i++ ) 33 li 34 a(href='/?p=#{i+1}') #{i+1} 35 input(id='curP',type='hidden',value='#{curPage}') 36 div.modal.fade#editMsg 37 div.modal-dialog 38 div.modal-content 39 div.modal-header 40 button(type='button',class='close',data-dismiss='modal') × 41 h4.modal-title 编辑信息 42 div.modal-body 43 textarea.form-control(name='msg-box',cols=60,rows=5) 44 div.modal-footer 45 button(type='button',class='btn btn-default',data-dismiss='modal') 关闭 46 button(type='button',class='btn btn-primary',data-dismiss='modal') 更新
index.js( ajax交互与分页状态选中功能 ):
1 $(function(){ 2 /*---------------分页选中判断开始------------*/ 3 var curPage = $( "#curP" ).val(); 4 $( ".pagination a" ).each( function(){ 5 if ( $( this ).text() == curPage ) { 6 $( this ).parent().addClass( 'active' ) 7 .siblings( "li" ).removeClass( "active" ); 8 } 9 } ); 10 /*---------------分页选中判断结束------------*/ 11 12 /*---------------获取编辑信息开始------------*/ 13 $( "li.list-group-item a:last-child" ).on( 'click', function(){ 14 // console.log( $( this ).parent().find( "span" ).text() ); 15 var curId = $( this ).parent().find( "input" ).val(); 16 $( "#editMsg .modal-body textarea" ).val ( $( this ).parent().find( "span" ).text() ); 17 $( "#editMsg" ).find("input").remove(); 18 $( "#editMsg" ).append( "<input type='hidden' value='" + curId + "' />" ); 19 } ); 20 /*---------------获取编辑信息结束------------*/ 21 22 /*---------------更新信息开始---------------*/ 23 $( ".modal-footer .btn-primary" ).on( "click", function(){ 24 var curId = $( this ).parents( ".modal" ).find( ":hidden" ).val(); 25 var curMsg = $( this ).parents( ".modal" ).find( "textarea" ).val(); 26 $.ajax( { 27 type : 'GET', 28 url : '/update', 29 data : { 'id' : curId, 'content' : curMsg }, 30 success : function( res ){ 31 location.href = 'http://localhost:3000'; 32 }, 33 error : function( res ){ 34 console.log( res ); 35 } 36 } ); 37 } ) 38 /*---------------更新信息结束---------------*/ 39 });
server.js( 在上文的基础上,增加删除和更新2个路由功能 )
1 var express = require('express'); 2 var app = express(); 3 var path = require( 'path' ); 4 var indexRouter = require( './routers/index.js' ); 5 var addRouter = require( './routers/add.js' ); 6 var delRouter = require( './routers/del.js' ); 7 var updateRouter = require( './routers/update.js' ); 8 9 app.use( '/', indexRouter ); 10 app.use( '/add', addRouter ); 11 app.use( '/del', delRouter ); 12 app.use( '/update', updateRouter ); 13 app.use( express.static( path.join( __dirname, 'public' ) ) ); 14 15 app.set('views', path.join(__dirname, 'views')); 16 app.set('view engine', 'jade'); 17 18 app.listen( 3000 ); 19 console.log( 'server listening on:' + 3000 );
index.js(在上文的基础上,新增分页和排序查询 )
1 var express = require('express'); 2 var router = express.Router(); 3 var Message = require('../db'); 4 5 function getAllMsg(curPage, pageSize) { 6 return new Promise(function (resolve, reject) { 7 Message.find({}, function (err, msgList) { 8 resolve(msgList); 9 }).skip( (curPage - 1) * pageSize ).limit( pageSize ).sort({ 'listTime': -1 }); 10 }); 11 } 12 13 function Page( pageSize ) { 14 return new Promise((resolve, reject) => { 15 Message.count({}, (err, nums) => { 16 resolve( Math.ceil( nums / pageSize ) ); 17 }); 18 }); 19 } 20 21 router.get('/', function (req, res) { 22 var p = req.query.p || 1; //当前页 23 var pageSize = 5; //每页显示5条数据 24 getAllMsg(p, pageSize).then(function (data) { 25 Page(pageSize).then((nums) => { 26 res.render('index', { 27 msgList: data, 28 page : nums, 29 curPage : p 30 }); 31 }); 32 }); 33 }); 34 35 module.exports = router;
update.js( 信息更新路由与数据更新操作 )
1 var express = require('express'); 2 var router = express.Router(); 3 var Message = require('../db'); 4 5 function updateMsg(msgInfo) { 6 return new Promise(function (resolve, reject) { 7 var condition = { '_id': msgInfo['_id'] }; 8 var data = { 'title': msgInfo['title'], 'listTime': msgInfo['listTime'] }; 9 Message.update(condition, data, function (err, result) { 10 if (err) { 11 reject( 'error' ); 12 } else { 13 resolve( 'ok' ); 14 } 15 }); 16 }); 17 } 18 19 router.get('/', function (req, res) { 20 updateMsg({ 21 title: req.query.content, 22 listTime: new Date(), 23 '_id': req.query.id 24 }).then( function( status ){ 25 res.send( status ); 26 }, function( status ){ 27 res.send( status ); 28 }); 29 }); 30 31 module.exports = router;
del.js文件(删除信息的路由和数据库操作)
1 var express = require( 'express' ); 2 var router = express.Router(); 3 var Message = require( '../db' ); 4 5 function delMsg( id ){ 6 Message.remove( { '_id' : id }, function( err ){ 7 if( err ){ 8 console.log( err ); 9 }else{ 10 console.log( 'success' ); 11 } 12 }); 13 } 14 router.get('/id/:id', function( req, res ) { 15 delMsg( req.params.id ); 16 res.redirect( '/' ); 17 }); 18 19 module.exports = router;