视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用node.js制作网站前台后台_node.js
2020-11-27 21:28:43 责编:小采
文档


node.js 能做什么?我至今也不清楚,他在哪方面应用比较广泛,我没有机会接触到那样的项目。只是因为喜欢,业余时间做了一个网站和后台。深刻领悟到一个道理那就是如果你喜欢一项技术可以玩玩,但是如果用到项目中就必须花些时间去解决很多问题。

使用到的技术:

express + jade

sqlite + sequelize

redis

1. 关于jade

支持include。 比如: include ./includes/header header 是一个局部视图,类似asp.net 用户控件。

支持extends。 比如: extends ../layout 使用母版页layout。

for循环也是如此简单。

代码如下:
each item in userList (userList 服务器传给前端的变量)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}

  比较喜欢append:

代码如下:
extends ../admin_layout
append head
link(rel='stylesheet', href='/stylesheets/font-awesome.css')
script(src='/javascripts/bootstrap.js')
script(src='/javascripts/bootstrap-wysiwyg.js')
script(src='/javascripts/jquery.hotkeys.js')
block content

append 会把脚步和样式全部放在 母版页面head后面。

2.sequelize 实现ORM的框架。 支持sqlite mysql mongodb

定义模型(文章):

代码如下:
var Article = sequelize.define('Article',{
title:{
type:Sequelize.STRING,
validate:{}
},
content:{type:Sequelize.STRING,validate:{}},
icon:{type:Sequelize.STRING,validate:{}},
iconname:{type:Sequelize.STRING},
sequencing:{type:Sequelize.STRING,validate:{}}
},{
classMethods:{
//文章分类
getCountAll:function(objFun){
}//end getCountAll
}//end classMethods
});
Article.belongsTo(Category);

Article.belongsTo(Category); 每一篇文章都有一个分类。

我把分页相关方法写到了初始化sequelize时候。这样每个模型定义时候,都会有这个方法(pageOffset、pageLimit)。

代码如下:
var sequelize = new Sequelize('database', 'username', 'password', {
// sqlite! now!
dialect: 'sqlite',
// the storage engine for sqlite
// - default ':memory:'
storage: config.sqlitePath,
define:{
classMethods:{
pageOffset:function(pageNum){
if(isNaN(pageNum) || pageNum < 1){
pageNum = 1;
}
return (pageNum - 1) * this.pageLimit();
},
pageLimit:function(){
return 10; //每页显示10条
},
totalPages:function(totalNum){
var total =parseInt((totalNum + this.pageLimit() - 1) / this.pageLimit()),
arrayTotalPages = [];
for(var i=1; i<= total; i++){
arrayTotalPages.push(i);
}
return arrayTotalPages;
}
},
instanceMethods:{
}
}
});

使用:

代码如下:
Article.findAndCountAll({include:[Category],offset:Article.pageOffset(req.query.pageNum), limit:Article.pageLimit()}).success(function(row){
res.render('article_list', {
title: '文章管理',
articleList : row.rows,
pages:{
totalPages:Article.totalPages(row.count),
currentPage:req.query.pageNum,
router:'article'
}
});
});

保存模型:

代码如下:
exports.add = function(req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname, '../files');
form.keepExtensions = true;
form.parse(req, function(err, fields,files){
var //iconPath = files.icon.path,
//index = iconPath.lastIndexOf('/') <= 0 ? iconPath.lastIndexOf('\\') : iconPath.lastIndexOf('/') ,
icon = path.basename(files.icon.path), // iconPath.substr(index + 1,iconPath.length - index),
iconname = files.icon.name;
var title = fields.title;
id = fields.articleId;
title = fields.title,
content = fields.content,
mincontent = fields.mincontent,
sequencing=fields.sequencing == 0 ? 0 : 1,
category = fields.category;
Article.sync(); //如果不存在就创建表。
Category.find(category).success(function(c){
var article = Article.build({
title : title,
content:content,
mincontent:mincontent,
icon:icon,
iconname:iconname,
sequencing:sequencing
});
article.save()
.success(function(a){
a.setCategory(c);
return res.redirect('/admin/article');
});
}); //end category
});
}

path.basename:

代码如下:
//iconPath = files.icon.path,
//index = iconPath.lastIndexOf('/') <= 0 ? iconPath.lastIndexOf('\\') : iconPath.lastIndexOf('/') ,
icon = path.basename(files.icon.path), // iconPath.substr(index + 1,iconPath.length - index),

获取文件名,比如:/a/b/aa.txt => aa.txt. 最初时候我使用截取字符串,也能实现,但是操作系统不一样的话就会有问题。mac使用'/' . window下面是'\\',我也是部署完成之后才发现的问题 。 后来发现path.basename 直接替换(文档阅读的少,就吃亏啊)。对node.js的好感在加1分。:)

3. redis 缓存经常查询,而且很少变化的数据。

代码如下:
getCountAll:function(objFun){
redis.get('articles_getCountAll', function(err,reply){
if(err){
console.log(err);
return;
}
if(reply === null){
db.all('SELECT count(articles.CategoryId) as count,categories.name,categories.id FROM articles left join categories on articles.categoryID = categories.id group by articles.CategoryId ', function(err,row){
redis.set('articles_getCountAll',JSON.stringify(row));
objFun(row);
});
}else{
objFun(reply);
}
});

这个方法定义在了 model层。 因为是express,所以尽可能的 用mvc方式开发。 其实是route实现了controller层功能(route文件夹,应该命名为为controller)。

下载本文
显示全文
专题