[js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)

Posted ghostwu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)相关的知识,希望对你有一定的参考价值。

该系列文章索引:

[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\') &times;
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;

以上是关于[js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)的主要内容,如果未能解决你的问题,请参考以下文章

[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist

[js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用

[js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin

[js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义

[js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

[js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息