express+jade+bootstrap+mongdb simple CRUD test
1:当前环境
y@y:~$ node --version && express -V && mongo --version
v0.12.2
4.9.
MongoDB shell version: 2.4.
y@y:~$
2:新建工程目录
y@y:express-test$ express demo01
y@y:express-test$ cd demo01 && npm install
使用bower下载bootstrap:
y@y:public$ bower install bootstrap
在package.json中加入mongodb依赖:
{
"name": "demo01",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"express": "~4.9.0",
"body-parser": "~1.8.1",
"cookie-parser": "~1.3.3",
"morgan": "~1.3.0",
"serve-favicon": "~2.1.3",
"debug": "~2.0.0",
"jade": "~1.6.0",
"mongodb": "~2.0.33",
"monk": "~1.0.1"
}
}
再次执行:npm install
3:工程代码结构

(1)app.js
// 加载依赖库
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser'); //mongodb config
//var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/test'); // 加载路由控制
var routes = require('./routes/index');
var users = require('./routes/users'); // 创建项目实例
var app = express(); // 定义jade模板引擎和模板文件位置
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); // 定义网站图标
//app.use(favicon(__dirname + '/public/favicon.ico')); // 定义日志和输出级别
app.use(logger('dev')); // 定义数据解析器
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false })); // 定义cookie解析器
app.use(cookieParser()); // 定义静态文件目录
app.use(express.static(path.join(__dirname, 'public'))); //让db访问路由
app.use(function(req,res,next){
req.db = db;
next();
}); // 匹配路径和路由
app.use('/', routes);
app.use('/user', users); // 404错误处理
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); // 开发环境,500错误处理和错误堆栈跟踪
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
} // 生产环境,500错误处理
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
}); // 输出模型app
module.exports = app;
(2)路由users.js
var express = require('express');
var router = express.Router();
/**
* 用户列表
* http://127.0.0.1:3000/user/list
*/
router.get('/list', function(req, res) {
var db = req.db;
db.get('user').find({},{},function(err,docs){
if(err){
errHandler(res,err);
}else{
res.render('users/list',{
title: '用户列表',
userlist: docs
});
}
});
});
/**
* 添加新用户操作界面
* http://127.0.0.1:3000/user/add
*/
router.get('/add', function(req, res) {
res.render('users/add');
});
/**
* 修改用户信息界面
*/
router.get('/edit/:id', function(req,res){
var db = req.db;
db.get('user').findOne({_id:req.params.id},{},function(err,doc){
if(err){
errHandler(res,err);
}else{
res.render('users/edit', {user: doc});
}
});
});
/**
* 修改用户信息
*/
router.post('/update', function(req,res){
var db = req.db;
var _id = req.body._id;
var name = req.body.name;
var email = req.body.email;
db.get('user').updateById(_id,
{'name':name,'email':email},
function(err,doc){
if(err){
errHandler(res,err);
}else{
res.redirect('list');
}
});
});
/**
* 保存新添加的用户信息
*/
router.post('/save', function(req,res){
var db = req.db;
var name = req.body.name;
var email = req.body.email;
db.get('user').insert(
{
'name': name,
'email': email
},
function(err,doc){
if(err){
errHandler(res,err);
}else{
res.redirect('list');
}
}
);
});
/**
* 根据_id删除
*/
router.get('/delete/:id', function(req,res){
var db = req.db;
db.get('user').remove({_id:req.params.id},function(err,doc){
if(err){
errHandler(res,err);
}else{
res.render('info',{info:'删除成功!',url:'http://127.0.0.1:3000/user/list'});
}
});
});
/**
* 错误处理
* @param res
* @param err
*/
function errHandler(res,err){
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
};
module.exports = router;
(3)users/list.jade
extends ../layout block content
div.container
h3.text-center.text-primary 用户列表
hr
a.btn.btn-primary.btn-sm(href='add') 增加
table.table.table-bordered.table-condensed.table-hover
thead
tr.bg-info
th.text-center.col-xs-4 用户名
th.text-center.col-xs-5 邮箱
th.text-center.col-xs-3 操作
tbody
each user, i in userlist
tr.text-center
td= user.name
td= user.email
td
a.btn.btn-danger.btn-sm.margin-left(href='delete/'+user._id) 删除
a.btn.btn-warning.btn-sm.margin-left(href='edit/'+user._id) 修改
(4)users/add.jade
extends ../layout block content
div.container
h3.text-center.text-primary 添加用户
hr
form(name="addUserForm",method="post",action="/user/save")
div.form-group
label(for='name') 用户名
input#name.form-control(name='name',placeholder='用户名')
div.form-group
label(for='email') 邮箱
input#email.form-control(name='email',type='email',placeholder='邮箱地址')
div.text-center
button.btn.btn-primary.margin-right(type='submit') 保存
button.btn.btn-default.margin-left(type='reset') 重置
(5)users/edit.jade
extends ../layout
block content
div.container
h3.text-center.text-primary 修改用户信息
hr
form(name="editUserForm",method="post",action="/user/update")
input(type='hidden',name='_id',value=user._id)
div.form-group
label(for='name') 用户名
input#name.form-control(name='name',placeholder='用户名', value=user.name)
div.form-group
label(for='email') 邮箱
input#email.form-control(name='email',type='email',placeholder='邮箱地址', value=user.email)
div.text-center
button.btn.btn-primary.margin-right(type='submit') 保存
button.btn.btn-default.margin-left(type='reset') 重置
(6)info.jade
extends layout
block content
div.container.text-center
h1.text-warning=info
a.btn.btn-primary(href=url) 返回
express+jade+bootstrap+mongdb simple CRUD test的更多相关文章
- express框架+jade+bootstrap+mysql开发用户注册登录项目
完整的项目代码(github):https://github.com/suqinhui/express-demo express是基于Node.js平台的web应用开发框架,用express框架开发w ...
- webstorm创建nodejs + express + jade 的web 项目
webstorm创建nodejs + express + jade 的web 项目 前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近 ...
- nodejs+express+jade+mongodb给我baby做个小相册(2)-留言板
上一篇简单的实现了下照片的展现跟浏览功能,这一篇我将给这个程序添加一个留言的功能.那么留言的话肯定要涉及到数据持久了,其实对于这个小功能的话,用个xml就可以,不过为了看起来更加高大上,我决定使用mo ...
- nodejs+express+jade给我baby做个小相册
去年年底迎来了my little star.从此人生多了一个最重要的牵挂.生了宝宝全家人都太忙了.最近宝宝稍微大点了,终于有空可以研究下技术了.这是14年第一帖.废话不多了.开始吧 1.安装NTVS ...
- nodejs+express+jade配置
安装步骤 一.首先可跟着这个网址安装http://jingyan.baidu.com/article/91f5db1b2bb6941c7f05e33c.html,路径可由自己定. 二.同时参考http ...
- nodejs学习篇 (1)webstorm创建nodejs + express + jade 的web 项目
之前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近看到使用jade模板来开发,觉得挺新奇的,于是试了一把,也了解了一些特性,算是个新 ...
- nodeJS+express+Jade写一个局域网聊天应用(node基础)
为了复习一下nodeJS, 而且socketIO这东西听起来就好高端有木有, 而且有人写过了open, 也可以作为自己的参考有木有, 点击下载源代码: express是4.x的版本, 跟以前的配置有些 ...
- [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站
原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...
- nodejs+express+jade安装备忘
安装步骤 1.安装nodejs,比如安装在E:\nodejs. 确保有两个环境变量 用户环境变量:C:\Users\Administrator\AppData\Roaming\npm 系统环境变量:e ...
随机推荐
- 深入剖析Java中的自动装箱和拆箱过程
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- Git git rebase 使用
原文:http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin ...
- Qt Quick 事件处理之信号与槽
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...
- Codeforces 112B-Petya and Square(实现)
B. Petya and Square time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Adblock Plus完美过滤视频网站广告、无黑屏!及屏蔽非本站脚本的Adblock Plus过滤器语法之探讨
测试用浏览器:Firefox 24.订阅的Adblock Plus过滤规则有默认的 ChinaList + EasyList,和国内视频广告规则[Yge.me],其网址:http://i.yge.me ...
- Android(java)学习笔记217:开发一个多界面的应用程序之清单文件
清单文件的重要参数: <intent-filter> 代表的应用程序的入口界面 <action android:name=&quo ...
- Android四大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比
四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用. Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所 ...
- Day12 - 堡垒机开发
Python之路,Day12 - 那就做个堡垒机吧 本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多 ...
- 一些 Windows 系统不常见的 鼠标光标常数
一些 Windows 系统不常见的 鼠标光标常数 Private Declare Function SetCursor Lib "user32" (ByVal hCursor A ...
- C#之—委托
(1)定义委托:(百度百科样例,只有写了才有收获) namespace Entrust { public delegate void GreetingDelegate(string name); // ...