Apa yang boleh dilakukan oleh node.js? Saya masih tidak tahu di mana ia digunakan secara meluas. Saya tidak mempunyai peluang untuk berhubung dengan projek sedemikian. Hanya kerana saya menyukainya, saya membuat laman web dan bahagian belakang pada masa lapang saya. Saya amat memahami kebenaran bahawa jika anda menyukai teknologi, anda boleh bermain dengannya, tetapi jika anda menggunakannya dalam projek, anda mesti meluangkan sedikit masa untuk menyelesaikan banyak masalah.
Teknologi yang digunakan:
ekspres + jed
sqlite + sekuel
redis
1. Mengenai jed
Sokongan termasuk. Contohnya: sertakan ./includes/header header ialah paparan separa, serupa dengan kawalan pengguna asp.net.
Sokongan dilanjutkan. Contohnya: extends ../layout menggunakan susun atur halaman induk.
Gelung for juga sangat mudah.
setiap item dalam userList (pembolehubah senarai pengguna diluluskan oleh pelayan ke bahagian hadapan)
tr
td #{item.username}
td #{item.telefon}
td #{item.email}
Lebih suka tambahkan:
memanjangkan ../admin_layout
tambah kepala
pautan(rel='stylesheet', href='/stylesheets/font-awesome.css')
skrip(src='/javascripts/bootstrap.js')
skrip(src='/javascripts/bootstrap-wysiwyg.js')
skrip(src='/javascripts/jquery.hotkeys.js')
kandungan sekat
tambah akan meletakkan semua langkah dan gaya di belakang kepala halaman induk.
2.sequelize melaksanakan rangka kerja ORM. Sokong sqlite mysql mongodb
Model definisi (artikel):
var Artikel = sequelize.define('Artikel',{
tajuk:{
Jenis:Sequelize.STRING,
sahkan:{}
},
kandungan:{type:Sequelize.STRING,sah:{}},
ikon:{type:Sequelize.STRING,sah:{}},
nama ikon:{type:Sequelize.STRING},
penjujukan:{type:Sequelize.STRING,sah:{}}
},{
classMethods:{
//Kategori Artikel
GetCountAll:function(objFun){
}//end getCountAll
}//end classMethods
});
Article.belongsTo(Kategori);
Artikel.belongsTo(Kategori); Setiap artikel mempunyai kategori.
Saya menulis kaedah berkaitan paging semasa memulakan sekuel. Dengan cara ini, apabila setiap model ditakrifkan, akan ada kaedah ini (pageOffset, pageLimit).
var sequelize = new Sequelize('pangkalan data', 'nama pengguna', 'kata laluan', {
// sqlite! sekarang!
dialek: 'sqlite',
// enjin storan untuk sqlite
// - lalai ':memory:'
storan: config.sqlitePath,
takrifkan:{
classMethods:{
pageOffset:function(pageNum){
if(isNaN(pageNum) || pageNum < 1){
pageNum = 1;
}
pulangkan (halamanNombor - 1) * this.pageLimit();
},
pageLimit:function(){
pulangan 10; //每页显示10条
},
totalPages:function(totalNum){
var total =parseInt((totalNum this.pageLimit() - 1) / this.pageLimit()),
arrayTotalPages = [];
untuk(var i=1; i<= jumlah; i ){
arrayTotalPages.push(i);
}
kembalikan arrayTotalPages;
}
},
instanceMethods:{
}
}
});
使用:
Article.findAndCountAll({include:[Category],offset:Article.pageOffset(req.query.pageNum), had:Article.pageLimit()}).success(function(row){
res.render('article_list', {
tajuk: '文章管理',
Senarai artikel : row.rows,
halaman:{
totalPages:Article.totalPages(row.count),
Halaman semasa:req.query.pageNum,
penghala:'artikel'
}
});
});
保存模型:
exports.add = function(req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname, '../files');
form.keepExtensions = benar;
form.parse(req, function(err, fields,fail){
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;
tajuk = fields.title,
kandungan = fields.content,
kandungan min = fields.mincontent,
sequencing=fields.sequencing == 0 ? 0 : 1,
kategori = fields.category;
Article.sync(); //如果不存在就创建表。
Category.find(category).success(function(c){
var article = Article.build({
tajuk : tajuk,
kandungan:kandungan,
isi kandungan:min kandungan,
ikon:ikon,
nama ikon:nama ikon,
jujukan:jujukan
});
artikel.simpan()
.kejayaan(fungsi(a){
a.setCategory(c);
return res.redirect('/admin/article');
});
}); //tamat kategori
});
}
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. 最初时候我使用截取字符串,也能实现,但是操作系统不一样的话就会有问题。 window下面是'\',我也是部署完成之后才发现的问题 。 后来发现path.basename 直接替换C中文小啊)。对node.js的好感在加1分。:)
3. redis 缓存经常查询,而且很少变化的数据。
getCountAll:function(objFun){
redis.get('articles_getCountAll', function(err,reply){
jika(err){
console.log(err);
kembali;
}
jika (balas === batal){
db.all('SELECT count(articles.CategoryId) as count,categories.name,categories.id DARI artikel yang tinggal sertai kategori pada articles.categoryID = categories.id kumpulan mengikut artikel.CategoryId ', function(err,row){
redis.set('articles_getCountAll',JSON.stringify(row));
objFun(baris);
});
}lain{
objFun(reply);
}
});
Kaedah ini ditakrifkan dalam lapisan model. Kerana ia adalah Express, ia dibangunkan menggunakan MVC sebanyak mungkin. Malah, laluan melaksanakan fungsi lapisan pengawal (folder laluan harus dinamakan pengawal).