源码讲解 node+mongodb 建站攻略(一期)第二节

news/2024/5/20 12:06:08/文章来源:https://blog.csdn.net/weixin_33744141/article/details/86451261

源码讲解 node+mongodb 建站攻略(一期)第二节

上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb。

代码http://www.imlwj.com/download/nodejs/demo1.rar

首先给大家看看目录结构。

QQ截图20150810140831

大家可以比对一下,跟第一节我们加了那些内容。

 

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"),注意缩进。

QQ截图20150810143443


$(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();
}
}
})
}
)
})

最后直接在完整图片预览一下吧

QQ截图20150810143602

QQ截图20150810143624

QQ截图20150810143639

QQ截图20150810143654

转载本站文章请注明出处:爱开发 http://www.imlwj.com/blog/?p=66

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_737816.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

favicon.ico 网站小图标标识

随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favicon.ico,以及各个浏览器对其的不同处理,所以还是新建…

如何让EcStore和微博同步来推广网站

EcStore是创建B2C商城的首选PHP系统,它功能强大、操作方便,安装后马上就能建立起一个自己的B2C商城,但建好后如何推广运营商城却不是件容易的事。 新浪微博用户数量大、传播速度快,互联网上拥有许多微博营销的成功案例如小米、淘宝…

网站美化:CSS3自定义修改浏览器滚动条

滚动条组件 ::-webkit-scrollbar //滚动条整体部分 ::-webkit-scrollbar-thumb //滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条) ::-webkit-scrollbar-track //滚动条的轨道(里…

即使是菜鸟,也能配置出一个网站

2019独角兽企业重金招聘Python工程师标准>>> 对于刚进入IT行业的你,是否会觉得配置出一个像样的公司网站是很大的挑战?如果你有相同的感受,那么今天读过这篇文章之后,你的心情将会舒畅很多,因为我这名技术入…

SEO优化秘诀

为什么80%的码农都做不了架构师?>>> 全都在摘要里面了。 www.vpincha.cc 转载于:https://my.oschina.net/boolls/blog/681206

利用云存储快速实现网站备份

背景 真正运营过网站的人都知道,数据对一个网站来说至关重要,因此,网站数据备份也是日常必做工作。因为误操作,网站被攻击等种种原因都会导致数据丢失,这时,你才会明白“有备无患”的道理。而且由于站点文件…

[记录][python]python爬虫,下载某图片网站的所有图集

随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集,现在还是一个非常简陋的单线程程序。下一步是改写成多线程,…

网站标题、描述、关键词怎么设置?

瞬间感觉回答这个问题真的很头痛,完全回答清楚这个问题要写一两千字的教程,而且还不一定能保证小白能完全理解了,因为有些东西想做到比较好的程度,需要实践,需要对一个网站甚至两三个网站的TDK改改过好几遍之后才能真正…

【我是正义的化身】一个钓鱼网站的社工+渗透之路

昨天在空间看到一个朋友发动态,说自己被骗了2000多,说说里有一个钓鱼链接,于是我就打开来看看。因此而开始了一段社工渗透之旅。 因为这次社的是一个骗子,有些地方就不打码了。钓鱼网站:http://br.hjiu.zhoukouwang.ne…

WordPress再曝流行插件漏洞 影响上千万网站

WordPress的一个最为流行的插件现重大安全漏洞,导致上千万网站面临黑客入侵的危险。 该漏洞由WordPress漏洞扫描器的开发者瑞恩迪赫斯特(Ryan Dewhurst)发现,该插件名为“WordPress SEO by Yoast”,用于网站的搜索引擎优化,是最流…

python正则表达式修复网站文章字体不统一问题

网站的大框架下有定义的字体,包括字体大小和颜色等,用户发布文章的时候可能是从其他网站复制过来的文本,复制的过程也保留了字体描述信息。当文章在页面上显示的时候,默认先会使用文章中定义的字体,如果文章中字体不存…

视频网站使用H265编码能提高视频清晰度吗?

大部分的视频直播点播的流媒体服务使用的都是H264编码,但是更为便捷的H265编码已经得到了发展,越来越多的人更加倾向于H265编码格式了。为什么呢?h265编码压缩率比H264提高了一倍之多,在使用上也比H264更节省空间。大多数的视频行…

高性能建站之前端优化篇

前言: 这算是对前端优化的总结吧,之前零零星星总结和学习,这次做一个完整的总结。 测试网页性能工具 ⑴Page Speed: 谷歌开发的工具,网站管理员和网络开发人员可以使用 Page Speed 来评估他们网页的性能,并…

网站开发的学习交流 -- 系统架构 -- 负载均衡

网站开发的学习交流 自己水平有限,希望大家能批判指导,谢谢。 文章中引用的互联网上的资料的链接放在文章最下面。 一、系统架构: 构建高并发高负载的大型网站一般需要注意一下几个方面: 1、负载均衡:负载均衡&#xf…

TSINGSEE青犀视频开发景区网站如何通过Go语言html生成PDF?

之前我们在某景区开发了一个行人监测系统,系统上线后经过我们不断的调整和优化,一直保持了稳定的运行,现在该景区需要制作一个网站,网站里可以查看一天中的每个时间点统计的人数,并生成PDF,供下载查看。由于…

王子墨网友的基于jQuery的个性个人网站模板

星球飞行效果(需要等待5秒以上) 菜单点击飞行效果 菜单内容页展开式分裂效果 菜单关闭时坠落效果 提示:效果在 Webkit(如Chrome,遨游3,TT6.11 ) 内核的浏览器下效果更佳。原文转自:王子墨网友…

TogetherJS – 酷!在网站中添加在线实时协作功能

TogetherJS是一个免费、开源的 JavaScript 库,来自 Mozilla 实验室,可以实现基于 Web 的在线协作功能。把 TogetherJS 添加到您的网站中,您的用户可以在实时的互相帮助!当然还有很多其它的可以应用的场合,值得一试。 您…

java项目开发实战--使用ssm框架开发众筹网站

www.atguigu.com 一、ssm框架开发众筹网站 1.项目设计 (1)页面设计 (Frontpage, Dreamweaver, 文本编辑器) (2)物理数据模型(PDM) -- 数据库设计 (PowerDesig…

python web开发——django学习(一)第一个连接mysql数据库django网站运行成功

1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message 4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表 6.运行debug发现运行成功