首頁 >web前端 >js教程 >使用node.js 製作網站前台後台_node.js

使用node.js 製作網站前台後台_node.js

WBOY
WBOY原創
2016-05-16 16:31:331309瀏覽

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('資料庫', '使用者名稱', '密碼', {
  // sqlite!現在!
  方言:'sqlite',
  // sqlite
的儲存引擎   // - 預設 ':memory:'
  儲存:config.sqlitePath,
  定義:{
    類別方法:{
      pageOffset:函數(pageNum){
        if(isNaN(pageNum) || pageNum           頁數 = 1; 
        }
        return (pageNum - 1) * this.pageLimit();
      },
      pageLimit:function(){
        返回10; // 每頁顯示10條
      },
      總頁數:函數(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', {
      title: '文章管理',
      文章清單: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, fields,files){
    var //iconPath = files.icon.path,
        //index = iconPath.lastIndexOf('/')         icon = path.basename(files.icon.path), // iconPath.substr(index 1,iconPath.length - index),
        iconname = 檔案.icon.name;
    var title = fields.title;
        id = fields.articleId;
        標題 = fields.title,
        內容 = fields.content,
        mincontent = fields.mincontent,
        排序=字段.排序== 0? 0 : 1,
        分類 = fields.category;
       文章.sync();  //如果不存在就建立表格。
      Category.find(category).success(function(c){
        var 文章 = Article.build({
          標題:標題,
          內容:內容,
          最小內容:最小內容,
          圖標:圖標,
          圖示名稱:圖示名稱,
          定序:定序
        });
        文章.save()
        .success(函數(a){
          a.setCategory(c);
          return res.redirect('/admin/article');
        });
      }); //結束類別
  });
}

路徑.basename:

複製程式碼程式碼如下:

//iconPath = files.icon.path,
//index = 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.Category 🎜>             redis.set('articles_getCountAll',JSON.stringify(row));
            objFun(row);
          });
        }else{
          objFun(reply);
        }
      });

    這個方法定義在了 model層。 因為是express,所以盡可能的 用mvc方式開發。 其實是route實作了controller層功能(route資料夾,應該命名為controller)。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn