[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( 模板 ):
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') ×
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编辑,删除)的更多相关文章
- [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件
接着这篇文章[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件继续,在这篇文章中实现了采集与静态文件的生成,在实际的采集项目中, 应该是先入库再选择性的生成静态文件.那么我选 ...
- [js高手之路]Node.js+jade抓取博客所有文章生成静态html文件
这个周末,恶补了一下jade模板引擎,就为生成静态html文件,这篇文章需要知道jade以及看过我的上篇文章,我先给出他们的参考链接: [js高手之路]Node.js模板引擎教程-jade速学与实战1 ...
- [js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist
promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习 ...
- [js高手之路]Node.js实现简易的爬虫-抓取博客文章列表信息
抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 ...
- [js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息
抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的h ...
- [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义
一.转义与非转义 jade模板文件代码: doctype html html head meta(charset='utf-8') title jade学习-by ghostwu body h3 转义 ...
- [js高手之路]Node.js模板引擎教程-jade速学与实战1
环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...
- [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法
环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...
- [js高手之路]node js系列课程-图解express+supervisor+ejs用法
上文通过node js自带的http模块搭建了一个简易的服务器,实际在开发中,一般用的是express框架,本文我们就来讲讲项目开发中必备不可少的几样东西: 服务器( express ) 路由( ex ...
随机推荐
- 【CentOS7】yum 软件管理
可选命令 检查 check (检查包错误) check-update(不使用本地缓存检查更新) 安装 install localinstall groupinstall reinstall(重新安装) ...
- 【SVN】手动删除svn元信息
工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...
- 谈谈分布式版本管理工具Git
一.主流的版本管理工具 目前在企业中比较主流的版本管理工具有:GIT.SVN.CVS等等. 二.什么是Git? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.是 L ...
- JavaScript--我发现!原来你是这样的JS(1)
一.前言: 前段时间看红宝书(JavaScript高级程序设计),但没有计划的去看,也没有做详细的笔记,读了之后有点空虚,感觉不对劲啊,学的东西很难记住,印象不深啊,有种挫败感,作前端的js都学不好怎 ...
- ASP.Net Core WebApi几种版本控制对比
版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...
- 阿里 java学习之路
https://maimai.cn/article/detail?fid=96107193&push_id=5603&share_user=http%3A%2F%2Fi9.taou.c ...
- lucene&solr-day1
全文检索课程 Lucene&Solr(1) 1. 计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) ...
- 【Alpha】第三次Daily Scrum Meeting
GIT 一.今日站立式会议照片 二.会议内容 1.确定开发人员负责开发模块 开发人员 开发模块 杨嘉成 注册登陆模块 吴文庆 服务模块 程志铭 个人中心 2.测试人员在开发人员完成该模块后紧跟测试 三 ...
- 201521123091 《Java程序设计》第12周学习总结
Java 第十一周总结 第十一周的作业. 目录 1.本章学习总结 2.Java Q&A 3.码云上代码提交记录及PTA实验总结 4.课后阅读 1.本章学习总结 1.1 以你喜欢的方式(思维导图 ...
- list后台转化为JSON的方法ajax
导入alibaba的fastJson包 后台: protected void doGet(HttpServletRequest request, HttpServletResponse respons ...