该系列文章索引:

[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( 模板 ):

 doctype html
html
head
meta(charset='utf-8')
title todolist-by ghostwu
link(rel="stylesheet", href='./css/bower_components/bootstrap/dist/css/bootstrap.min.css')
script(src="./css/bower_components/jquery/dist/jquery.min.js")
script(src="./css/bower_components/bootstrap/dist/js/bootstrap.min.js")
script(src="./js/index.js")
body
div.container
div.row
div.col-md-offset-2.col-md-8
h3 留言板(node.js+mongodb+mongoose+jade) -by ghostwu
form.form-horizontal(action='/add')
div.form-group
div.col-md-offset-2.col-md-8
textarea.form-control(name='msg',cols=60,rows=5)
div.col-md-offset-2.col-md-8
button.btn.btn-primary 发布留言
div.col-md-offset-2.col-md-8
ul.list-group
- for ( var key in msgList ){
li.list-group-item
span #{msgList[key]['title']}
a(href='/del/id/#{msgList[key]["_id"]}')   删除  | 
input(type='hidden' value='#{msgList[key]["_id"]}')
a(data-toggle='modal',data-target='#editMsg',href='javascript:;') 编辑
- }
div.col-md-offset-2.col-md-8
ul.pagination
- for ( var i = 0; i < page; i++ )
li
a(href='/?p=#{i+1}') #{i+1}
input(id='curP',type='hidden',value='#{curPage}')
div.modal.fade#editMsg
div.modal-dialog
div.modal-content
div.modal-header
button(type='button',class='close',data-dismiss='modal') &times;
h4.modal-title 编辑信息
div.modal-body
textarea.form-control(name='msg-box',cols=60,rows=5)
div.modal-footer
button(type='button',class='btn btn-default',data-dismiss='modal') 关闭
button(type='button',class='btn btn-primary',data-dismiss='modal') 更新

index.js( ajax交互与分页状态选中功能 ):

 $(function(){
/*---------------分页选中判断开始------------*/
var curPage = $( "#curP" ).val();
$( ".pagination a" ).each( function(){
if ( $( this ).text() == curPage ) {
$( this ).parent().addClass( 'active' )
.siblings( "li" ).removeClass( "active" );
}
} );
/*---------------分页选中判断结束------------*/ /*---------------获取编辑信息开始------------*/
$( "li.list-group-item a:last-child" ).on( 'click', function(){
// console.log( $( this ).parent().find( "span" ).text() );
var curId = $( this ).parent().find( "input" ).val();
$( "#editMsg .modal-body textarea" ).val ( $( this ).parent().find( "span" ).text() );
$( "#editMsg" ).find("input").remove();
$( "#editMsg" ).append( "<input type='hidden' value='" + curId + "' />" );
} );
/*---------------获取编辑信息结束------------*/ /*---------------更新信息开始---------------*/
$( ".modal-footer .btn-primary" ).on( "click", function(){
var curId = $( this ).parents( ".modal" ).find( ":hidden" ).val();
var curMsg = $( this ).parents( ".modal" ).find( "textarea" ).val();
$.ajax( {
type : 'GET',
url : '/update',
data : { 'id' : curId, 'content' : curMsg },
success : function( res ){
location.href = 'http://localhost:3000';
},
error : function( res ){
console.log( res );
}
} );
} )
/*---------------更新信息结束---------------*/
});

server.js( 在上文的基础上,增加删除和更新2个路由功能 )

 var express = require('express');
var app = express();
var path = require( 'path' );
var indexRouter = require( './routers/index.js' );
var addRouter = require( './routers/add.js' );
var delRouter = require( './routers/del.js' );
var updateRouter = require( './routers/update.js' ); app.use( '/', indexRouter );
app.use( '/add', addRouter );
app.use( '/del', delRouter );
app.use( '/update', updateRouter );
app.use( express.static( path.join( __dirname, 'public' ) ) ); app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); app.listen( 3000 );
console.log( 'server listening on:' + 3000 );

index.js(在上文的基础上,新增分页和排序查询 )

 var express = require('express');
var router = express.Router();
var Message = require('../db'); function getAllMsg(curPage, pageSize) {
return new Promise(function (resolve, reject) {
Message.find({}, function (err, msgList) {
resolve(msgList);
}).skip( (curPage - 1) * pageSize ).limit( pageSize ).sort({ 'listTime': -1 });
});
} function Page( pageSize ) {
return new Promise((resolve, reject) => {
Message.count({}, (err, nums) => {
resolve( Math.ceil( nums / pageSize ) );
});
});
} router.get('/', function (req, res) {
var p = req.query.p || 1; //当前页
var pageSize = 5; //每页显示5条数据
getAllMsg(p, pageSize).then(function (data) {
Page(pageSize).then((nums) => {
res.render('index', {
msgList: data,
page : nums,
curPage : p
});
});
});
}); module.exports = router;

update.js( 信息更新路由与数据更新操作 )

 var express = require('express');
var router = express.Router();
var Message = require('../db'); function updateMsg(msgInfo) {
return new Promise(function (resolve, reject) {
var condition = { '_id': msgInfo['_id'] };
var data = { 'title': msgInfo['title'], 'listTime': msgInfo['listTime'] };
Message.update(condition, data, function (err, result) {
if (err) {
reject( 'error' );
} else {
resolve( 'ok' );
}
});
});
} router.get('/', function (req, res) {
updateMsg({
title: req.query.content,
listTime: new Date(),
'_id': req.query.id
}).then( function( status ){
res.send( status );
}, function( status ){
res.send( status );
});
}); module.exports = router;

del.js文件(删除信息的路由和数据库操作)

 var express = require( 'express' );
var router = express.Router();
var Message = require( '../db' ); function delMsg( id ){
Message.remove( { '_id' : id }, function( err ){
if( err ){
console.log( err );
}else{
console.log( 'success' );
}
});
}
router.get('/id/:id', function( req, res ) {
delMsg( req.params.id );
res.redirect( '/' );
}); module.exports = router;

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

  1. [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件

    接着这篇文章[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件继续,在这篇文章中实现了采集与静态文件的生成,在实际的采集项目中, 应该是先入库再选择性的生成静态文件.那么我选 ...

  2. [js高手之路]Node.js+jade抓取博客所有文章生成静态html文件

    这个周末,恶补了一下jade模板引擎,就为生成静态html文件,这篇文章需要知道jade以及看过我的上篇文章,我先给出他们的参考链接: [js高手之路]Node.js模板引擎教程-jade速学与实战1 ...

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

    promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习 ...

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

    抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 ...

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

    抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的h ...

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

    一.转义与非转义 jade模板文件代码: doctype html html head meta(charset='utf-8') title jade学习-by ghostwu body h3 转义 ...

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

    环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...

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

    环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...

  9. [js高手之路]node js系列课程-图解express+supervisor+ejs用法

    上文通过node js自带的http模块搭建了一个简易的服务器,实际在开发中,一般用的是express框架,本文我们就来讲讲项目开发中必备不可少的几样东西: 服务器( express ) 路由( ex ...

随机推荐

  1. 一起来学linux:目录与路径

    p { margin-bottom: 0.25cm; line-height: 120% } 首先介绍目录相关的路径的表示法: 1 . 代表此目录 2 .. 代表上一层目录 3 – 代表前一个工作目录 ...

  2. WEB前端规范命名

    头部 header ----------------用于头部 主要内容 main ------------用于主体内容(中部) 左侧 main-left -------------左侧布局 右侧 ma ...

  3. struts2--Action

    HTTP请求 提交 Struts2 StrutsPrepareAndExecuteFilter 核心控制器 -- 请求分发给不同Action Action书写的的三种格式 第一种 Action可以是 ...

  4. javaScript 设计模式系列之三:代理模式

    介绍 代理模式为其他对象提供一种代理以控制对这个对象的访问. 根据代理模式的使用目的不同,代理模式又可以分为多种类型: 远程代理(Remote Proxy) 虚拟代理(Virtual Proxy)如需 ...

  5. hr用法

    定义和用法 <hr> 标签在 HTML 页面中创建一条水平线. 水平分隔线(horizontal rule)可以在视觉上将文档分隔成各个部分. HTML 与 XHTML 之间的差异 在 H ...

  6. C# 根据Excel模版导出文件

    string fileName = Path.Combine(Application.StartupPath, "kfwh_yhxf.xls"); Microsoft.Office ...

  7. Porita详解----Items

    Items(项目) 一个item是指从目标网站上爬取的一条单独的数据.例如从京东网站上爬取的一款小米6手机的信息.大家应该对 item (项目)和 item definition(项目定义)做一个区分 ...

  8. java初步—参数的值传递

    校招季,本人匆匆忙忙地参加各种宣讲会,几次笔试下来都遇到同一个题目,而且全都错在同一想法上,方知自己的基础实在不太牢固,因此特别写在博客上提醒自己要脚踏实地地学习!不多说了,题目如下: public ...

  9. 实现点击后创建div,若对div2秒无操作则将div隐藏,鼠标移上div让它不隐藏,移出div超过两秒则div隐藏

    $('.addLabel').on('click', function () { setTimeout(function(){ if(hoverflag==0){ $(".labelHide ...

  10. 解决:"不再sudoers文件中,此事将不做被报告”的问题

    使用sudo出现问题:不再sudoers文件中,此事将不做被报告 系统:win8.1 +cents 7 问题:在虚拟机中,默认不是root账号,在使用sudo命令时候收到下面警告: sudo命令含义: ...