node.js では何ができるのでしょうか?このようなプロジェクトに触れる機会がありませんが、どこで広く使われているのかはまだわかりません。好きだから、暇なときにウェブサイトとバックエンドを作りました。テクノロジーが好きであれば、それを使って遊ぶことはできますが、それをプロジェクトで使用するには、多くの問題を解決するのに時間を費やさなければならないという真実を私は深く理解しています。
使用されているテクノロジー:
特急+翡翠
sqlite + 続編
レディス
1. 翡翠について
サポートが含まれます。例: include ./includes/header ヘッダーは部分ビューであり、asp.net ユーザー コントロールと同様です。
サポートが延長されます。 例: extends ../layout はマスター ページ レイアウトを使用します。
for ループもとてもシンプルです。
userList の各項目 (サーバーによってフロントエンドに渡される userList 変数)
tr
td #{アイテム.ユーザー名}
td #{item.telephone}
td #{item.email}
追加を優先します:
../admin_layout
を拡張します
ヘッドを追加
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')
コンテンツをブロック
追加は、すべてのステップとスタイルをマスター ページのヘッダーの後ろに置きます。
2.sequelize は ORM フレームワークを実装します。 sqlite mysql mongodb をサポート
定義モデル (記事):
var Article = sequelize.define('記事',{
タイトル:{
タイプ: Sequelize.STRING、
検証:{}
}、
コンテンツ:{タイプ:Sequelize.STRING、検証:{}}、
アイコン:{タイプ:Sequelize.STRING、検証:{}}、
アイコン名:{タイプ:Sequelize.STRING}、
シーケンス:{タイプ:Sequelize.STRING、検証:{}}
}、{
クラスメソッド:{
//記事カテゴリ
GetCountAll:function(objFun){
}//end getCountAll
}//クラスメソッドを終了
});
Article.belongsTo(カテゴリ);
Article.belongsTo(Category); 各記事にはカテゴリがあります。
Sequelize の初期化時にページング関連のメソッドを書きました。このように、各モデルを定義するとこのメソッド(pageOffset、pageLimit)が存在することになります。
var sequelize = new Sequelize('データベース', 'ユーザー名', 'パスワード', {
// スクライト!今すぐ!
方言: 'sqlite'、
// sqlite のストレージ エンジン
// - デフォルトの ':memory:'
ストレージ: config.sqlitePath,
定義:{
クラスメソッド:{
pageOffset:function(pageNum){
if(isNaN(pageNum) || pageNum
ページ番号 = 1;
}
return (pageNum - 1) * this.pageLimit();
}、
pageLimit:function(){
10 を返します。 //每页显表示10条
}、
totalPages:function(totalNum){
var total =parseInt((totalNum this.pageLimit() - 1) / this.pageLimit()),
arrayTotalPages = [];
for(var i=1; i
arrayTotalPages.push(i);
}
arrayTotalPages を返す;
}
}、
インスタンスメソッド:{
}
}
});
使用:
Article.findAndCountAll({include:[Category],offset:Article.pageOffset(req.query.pageNum),limit:Article.pageLimit()}).success(function(row){
res.render('article_list', {
タイトル: '文章管理'、
記事リスト : row.rows,
ページ:{
totalPages:Article.totalPages(row.count),
currentPage:req.query.pageNum,
ルーター:'記事'
}
});
});
保存モデル:
exports.add = function(req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname, '../files');
form.keepExtensions = true;
form.parse(req, function(err, フィールド,ファイル){
var //iconPath = files.icon.path,
//index = iconPath.lastIndexOf('/')
icon = path.basename(files.icon.path), // iconPath.substr(index 1,iconPath.length -index),
アイコン名 = files.icon.name;
var title = フィールド.タイトル;
id = フィールド.記事ID;
タイトル = フィールド.タイトル,
コンテンツ = フィールド.コンテンツ,
mincontent = フィールド.mincontent,
sequencing=fields.sequencing == 0 ? 0 : 1、
カテゴリ = フィールド.カテゴリ;
Article.sync(); //存在しない場合はテーブルを作成します。
カテゴリ.find(カテゴリ).success(function(c){
vararticle = Article.build({
タイトル : タイトル、
コンテンツ:コンテンツ、
mincontent:mincontent,
アイコン:アイコン、
アイコン名:アイコン名、
シーケンス:シーケンス
});
Article.save()
.success(function(a){
a.setCategory(c);
return res.redirect('/admin/article');
});
}); //カテゴリ終了
});
}
パス.ベース名:
//iconPath = files.icon.path,
//index = iconPath.lastIndexOf('/')
icon = path.basename(files.icon.path), // iconPath.substr(index 1,iconPath.length -index),
获取文件名、比如:/a/b/aa.txt =>ああ.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.categoryID = カテゴリ.id でグループ化します。articles.CategoryId ', function(err,row){
redis.set('articles_getCountAll',JSON.stringify(row));
objFun(row);
});
}その他{
objFun(返信);
}
});
このメソッドはモデル層で定義されます。 Expressなので極力MVCを使って開発しています。 実際、ルートはコントローラー層の機能を実装します (ルート フォルダーの名前はコントローラーにする必要があります)。