ホームページ >ウェブフロントエンド >jsチュートリアル >node.js を使用して、website_node.js のフロントエンドとバックエンドを作成します。

node.js を使用して、website_node.js のフロントエンドとバックエンドを作成します。

WBOY
WBOYオリジナル
2016-05-16 16:31:331311ブラウズ

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を使って開発しています。 実際、ルートはコントローラー層の機能を実装します (ルート フォルダーの名前はコントローラーにする必要があります)。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。