源码讲解 node+mongodb 建站攻略(一期)第二节
源码讲解 node+mongodb 建站攻略(一期)第二节
上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb。
代码http://www.imlwj.com/download/nodejs/demo1.rar
首先给大家看看目录结构。
大家可以比对一下,跟第一节我们加了那些内容。
1,我们新建文件夹schemas,新建文件movie.js,主要提供对数据模型,实例化,对数据的增删改查方法。
var mongoose=require('mongoose');
var MovieSchema=new mongoose.Schema({
doctor:String,
title:String,
language:String,
summary:String,
flash:String,
poster:String,
year:Number,
meta:{
createAt:{
type:Date,
default:Date.now()
},
updateAt:{
type:Date,
default:Date.now()
}
}
});
MovieSchema.pre('save',function(next){
if(this.isNew){
this.meta.createAt=this.meta.updateAt=Date.now();
}else{
this.meta.updateAt=Date.now();
}
next();
});
MovieSchema.statics={
fetch:function(cb){
return this
.find({})
.sort('meta.updateAt')
.exec(cb);
},
findById:function(id,cb){
return this
.findOne({_id:id})
.exec(cb);
}
};
module.exports=MovieSchema;
2,我们新建文件夹schemas,新建文件movie.js ,定义变量
var mongoose=require('mongoose');
var MovieSchema=require('../schemas/movie');
var Movie=mongoose.model('Movie',MovieSchema);
module.exports=Movie;
3,准备工作做好了,开始页面上来操作数据了,还是从入口文件开始
var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var _ = require('underscore');//提供新的支持underscore
var Movie = require("./models/movie");
var port = process.PORT || 3000;
var app = express();
mongoose.connect("mongodb://localhost/demo1");
app.set('views', './views/pages');
app.set('view engine', 'jade');
// app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname,'bower_components')));
app.use(bodyParser.urlencoded({
extended: true
}));
app.locals.moment = require('moment');
app.listen(port);
console.log('demo1 started on port ' + port);
//index page
app.get('/', function(req, res) {
//查询所有数据,调用的是models-->movie.js里面的方法
Movie.fetch(function(err, movies) {
if (err) {
console.log(err);
}
//将查询的数据返回到index.jade页面
res.render('index', {
title: 'demo1 首页',
movies: movies
});
});
});
//detail page
app.get('/movie/:id', function(req, res) {
//详情页面,获取request里面的id,根据id查询一条数据
var id = req.params.id;
Movie.findById(id, function(err, movie) {
res.render('detail', {
title: 'demo1' + movie.title,
id: id,
movie: movie
});
})
});
//admin page
app.get('/admin/movie', function(req, res) {
res.render('admin', {
title: 'demo1 后台录入页',
movie: {
_id: '',
doctor: '',
country: '',
title: '',
year: '',
poster: '',
language: '',
flash: '',
summary: ''
}
});
});
//admin update movie
app.get('/admin/update/:id', function(req, res) {
//获取request里面的id,根据id判断是修改
var id = req.params.id;
if (id) {
Movie.findById(id, function(err, movie) {
res.render('admin', {
title: 'demo1 后台更新页',
movie: movie
});
});
}
});
//admin delete movie
app.delete('/admin/list',function(req,res){
//根据id删除一条数据
var id = req.query.id;
if(id){
Movie.remove({_id:id},function(err,movie){
if(err){
console.log(err);
}else{
res.json({success:1});
}
});
}
})
//admin post movie
app.post('/admin/movie/new', function(req, res) {
console.log(req.body);
console.log(req.body.movie);
//获取数据对象,保存数据,新增。
var id = req.body.movie._id;
var movieObj = req.body.movie;
var _movie;
if (id !== undefined) {
Movie.findById(id, function(err, movie) {
if (err) {
console.log(err);
}
_movie = _.extend(movie, movieObj);
_movie.save(function(err, movie) {
if (err) {
console.log(err);
}
res.redirect('/movie/' + movie._id);
});
});
} else {
_movie = new Movie({
doctor: movieObj.doctor,
title: movieObj.title,
language: movieObj.language,
country: movieObj.country,
year: movieObj.year,
poster: movieObj.poster,
flash: movieObj.flash,
summary: movieObj.summary
});
_movie.save(function(err, movie) {
if (err) {
console.log(err);
}
res.redirect('/movie/' + movie._id);
});
}
});
//list page
app.get('/admin/list', function(req, res) {
//跟首页一样。
Movie.fetch(function(err, movies) {
if (err) {
console.log(err);
}
res.render('list', {
title: 'demo1 列表页',
movies: movies
});
});
});
3,删除数据写的是button,所以要对button写一个事件,在处理删除。
在bower_components下面新建js文件夹,然后新建admin.js。同时在list.jade下面引入 script(src="/js/admin.js"),注意缩进。
$(function(){
$('.del').click(
function(e){
var target = $(e.target);
var id = target.data('id');
var tr = $('.item-id-'+ id);
$.ajax({
type:'DELETE',
url:'/admin/list?id='+id
})
.done(function(reaults){
if(reaults.success===1){
if(tr.length>0){
tr.remove();
}
}
})
}
)
})
最后直接在完整图片预览一下吧
转载本站文章请注明出处:爱开发 http://www.imlwj.com/blog/?p=66
源码讲解 node+mongodb 建站攻略(一期)第二节的更多相关文章
- [慕课笔记] node+mongodb建站攻略
如何利用node+mongodb来快速搭建一个电影网站? 一:后端部分 整个网站的后端是由node.js来驱动的,所以在后端需要安装node.js,以及在这个基础之上的框架express,它能够帮助我 ...
- Vultr VPS建站攻略 – 一键安装LNMP无面板高性能WEB环境
在"Vultr VPS建站攻略 - 一键安装宝塔面板架设LNMP/LAMP Web环境"文章中,VULTR中文网分享到我们常用的可视化面板宝塔面板安装在VULTR VPS主机中建站 ...
- Vultr VPS建站攻略 – 一键安装宝塔面板架设LNMP/LAMP Web环境
我们选择VULTR VPS建站的还是比较多的,其主要原因在于商家的稳定,毕竟我们用来建站选择服务器价格考虑的不是主要的(当然VULTR价格也是比较便宜),最为主要的是因为VULTR商家比较稳定,而且多 ...
- 新花生壳+tomcat(内网映射,无需设置路由器)建站攻略
说明: 1.适用于内网用户(局域网,校园网,或者公司网等无法更改路由器映射的情况) 2.一共花了8块钱…………心疼.不过如果大家有钱的话,8块钱,少吃一顿麻辣烫就好了~总之,这个适用于测试网站,小访问 ...
- Netty源码解读(二)-服务端源码讲解
简单Echo案例 注释版代码地址:netty 代码是netty的源码,我添加了自己理解的中文注释. 了解了Netty的线程模型和组件之后,我们先看看如何写一个简单的Echo案例,后续的源码讲解都基于此 ...
- Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表
Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 一个个人觉得比较简单小巧的软件. 下面就如何编写如何发布打包来介绍一下吧! 先下载mysql的库文件链接:http://files. ...
- 从源码安装Node
[从源码安装Node] Nodejs官网未并提供i686架构的bin,为了在i686架构cpu下使用Nodejs,需要从源码编译. 1../configure 2.make 3.make instal ...
- Category、load、initialize 源码讲解
今天深圳天气有暴风雨,没有事情干,趁着周末和平常晚上写一篇关于Category知识的梳理!可能针对平常只会知道些category基本结论知道的人有些帮助,写这篇博客会按照下面的目录结合实例以及Cate ...
- Netty源码分析第3章(客户端接入流程)---->第4节: NioSocketChannel注册到selector
Netty源码分析第三章: 客户端接入流程 第四节: NioSocketChannel注册到selector 我们回到最初的NioMessageUnsafe的read()方法: public void ...
随机推荐
- Java---hashCode()和equals()
1.hashCode()和equals() API hashCode()和equals()都来自上帝类Object, 所有的类都会拥有这两个方法,特定时,复写它们. 它们是用来在同一类中做比较用的,尤 ...
- Head First设计模式之备忘录模式
一.定义 不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 二.结构 备忘录模式中主要有三类角色: 发起人角色:记录当前时刻的内部状态, ...
- 执行查询“BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\...”失败,错误如下:“无法执行 BACKUP LOG,因为当前没有数据库备份。 BACKUP LOG 正在异常终止。
执行查询"BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\..."失败,错误如下:"无法执行 BACKUP LOG ...
- python编辑器pydev安装
pydev实际上时eclipse的插件 1.安装eclipse(1)eclipse不需要安装,解压文件夹,点击eclipse.exe可使用 2.安装pydev (1) 解压pydev可看到featur ...
- Python:名片管理系统(增加登录功能后出现问题,求教)
我将一个简单的名片管理系统定义成了函数.. 2层. 一个登录界面: 一个名片管理系统使用界面: 逻辑是:登录成功=>跳入名片系统使用界面,同时,跳出登录界面,给出欢迎使用,程序结束. 此时问题来 ...
- Spark 学习笔记大纲
Spark 内核 第28课:Spark天堂之门解密 (点击进入博客)从 SparkContext 创建3大核心对象开始到注册给 Master 这个过程中的源码鉴赏 第29课:Master HA彻底解密 ...
- Go Language 开发环境搭建
[前言] Go语言是Google公司2009年发布的新一代的开发语言,其最大的亮点是原生自带并发,在合适的场合使用合适的代码,我们的系统将会更加完美.下面我们进行go语言的安装和配置. 一.下载安装 ...
- JAVA有哪些数据类型?基本数据类型各占多少个字节
java的数据类型分为:基本数据类型和引用数据类型. 基本数据类型各占多少个字节: 数据类型 字节 默认值 byte 1 0 short 2 0 int 4 0 long 8 0 float 4 0. ...
- C++\virtual 虚函数、纯虚函数
前提摘要: 虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 虚函数定义: 指向基类的指针或引用在操作它的多态类(子类/派生类)对象时,会根据不同的类对象, ...
- NanUI文档 - 如何实现C#与Javascript的相互通信
NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript的相互通信 如何处理NanUI中的下载过 ...