Rumah  >  Artikel  >  hujung hadapan web  >  Gunakan node.js untuk mencipta bahagian hadapan dan belakang laman web_node.js

Gunakan node.js untuk mencipta bahagian hadapan dan belakang laman web_node.js

WBOY
WBOYasal
2016-05-16 16:31:331286semak imbas

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. 

Salin kod Kod adalah seperti berikut:

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:

Salin kod Kod adalah seperti berikut:

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):

Salin kod Kod adalah seperti berikut:

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).

Salin kod Kod adalah seperti berikut:

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).

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn