[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;
时间: 2024-12-29 06:42:53

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

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

promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习封装一个简易的异步队列 中的一道面试题( 页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ) ). promise的小实例: 1 function next1(){ 2 return new P

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

抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 第三方库:cheerio,这个库就是用来处理dom节点的,他的用法几乎跟jquery用法一模一样,所以有了这个利器,写一个爬虫就非常简单 准备工作: 1,npm init --yes 初始化package.json 2,安装cheerio:npm install cheerio --sav

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

一.转义与非转义 jade模板文件代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title jade学习-by ghostwu 6 body 7 h3 转义与非转义 8 - var userName = 'ghostwu' 9 - var str = '<script>alert("ghostwu");</script>' 10 div #{userName} 11 div #{str} 1

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

环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade的命令行用法 一.在项目目录下新建index.jade文件 inde.jade代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title 6 body 7 h3 欢迎学习jade 语法规则: 1, 标签按照html的缩进格式写 2

[js高手之路]node js系列课程-创建简易web服务器与文件读写

web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3.要能够处理基本的请求:如get, post 在node js中创建一台服务器非常的简单,因为node自带http模块,该模块可以帮助我们非常快速搭建一台web服务器,来处理一个简单的请求. 1 const http = require("http"); 2 var server = ht

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

一.block 模块复用 把需要复用的模块用block定义 block后面跟上模块的名字,引用一次block 内容就会被复用一次 编译之后的结果: 二,继承模板(extends) 在实际开发中,网站的头部,尾部一般都是公用的,我们可以通过jade的模板继承( extends ) 功能,把公共部分抽象出来,然后让不同的页面继承这些公共部分, 而且继承过来之后还可以重写 新建一个layout.jade模板 这是一个公共的模板,如果我们的首页需要这个公共模板,同时首页需要修改这个公共模板的布局部分(

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

强大的mixin mixin类似于函数的功能,可以达到模块复用的效果 mixin show: 定义一个类似函数的功能,名字叫show,里面的就是他的内容 +show: 调用show,每调用一次执行一次里面的内容 编译之后的结果: mixin也可以传递参数 编译之后的结果: mixin支持嵌套调用 编译之后的结果: mixin支持传递模块 编译之后的结果: mixin还可以传递属性 编译之后的结果: mixin支持传递不定参数 编译之后

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

关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下promise的常见用法. 为什么会有promise,他的作用是什么? promise主要是为了解决js中多个异步回调难以维护和控制的问题. 什么是promise? 从图中,我们可以看出,Promise是一个函数,这个函数上有在项目中常用的静态方法:all, race, reject,resolve等,原

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯