Heim > Web-Frontend > js-Tutorial > Verwenden Sie node.js, um das Front- und Backend von website_node.js zu erstellen

Verwenden Sie node.js, um das Front- und Backend von website_node.js zu erstellen

WBOY
Freigeben: 2016-05-16 16:31:33
Original
1309 Leute haben es durchsucht

Was kann node.js? Ich weiß immer noch nicht, wo es weit verbreitet ist. Ich habe keine Chance, mit solchen Projekten in Kontakt zu kommen. Nur weil es mir gefällt, habe ich in meiner Freizeit eine Website und ein Backend erstellt. Ich verstehe zutiefst, dass man mit einer Technologie experimentieren kann, wenn man sie mag, aber wenn man sie in einem Projekt verwendet, muss man einige Zeit damit verbringen, viele Probleme zu lösen.

Verwendete Technologie:

Express + Jade

sqlite + sequelize

Redis

1. Über Jade

Support inklusive. Beispiel: Der Header include ./includes/header ist eine Teilansicht, ähnlich der Benutzersteuerung von asp.net.

Der Support wird verlängert. Beispiel: „extends ../layout“ verwendet das Layout der Masterseite.

Die for-Schleife ist auch so einfach. 

Code kopieren Der Code lautet wie folgt:

jedes Element in userList (userList-Variable, die vom Server an das Frontend übergeben wird)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}

Bevorzugt anhängen:

Code kopieren Der Code lautet wie folgt:

erweitert ../admin_layout
Kopf anhängen
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')
Inhalte blockieren

Anhängen fügt alle Schritte und Stile hinter den Kopf der Masterseite ein.

2.sequelize implementiert das ORM-Framework. Unterstützt SQLite MySQL Mongodb

Definitionsmodell (Artikel):

Code kopieren Der Code lautet wie folgt:

var Article = sequelize.define('Article',{
Titel:{
Typ:Sequelize.STRING,
validieren:{}
},
Inhalt:{type:Sequelize.STRING,validate:{}},
icon:{type:Sequelize.STRING,validate:{}},
iconname:{type:Sequelize.STRING},
Sequenzierung:{type:Sequelize.STRING,validate:{}}
},{
classMethods:{
//Artikelkategorie
GetCountAll:function(objFun){
}//end getCountAll
}//end classMethods
});
Article.belongsTo(Category);

Article.belongsTo(Category); Jeder Artikel hat eine Kategorie.

Ich habe die Paging-bezogenen Methoden bei der Initialisierung von sequelize geschrieben. Auf diese Weise gibt es bei der Definition jedes Modells diese Methode (pageOffset, pageLimit).

Code kopieren Der Code lautet wie folgt:

var sequelize = new Sequelize('database', 'username', 'password', {
  // sqlite! jetzt!
  Dialekt: 'sqlite',
  // die Speicher-Engine für SQLite
  // - Standard ':memory:'
  Speicher: config.sqlitePath,
  definieren:{
    classMethods:{
      pageOffset:function(pageNum){
        if(isNaN(pageNum) || pageNum < 1){
          Seitennummer = 1; 
        }
        return (pageNum - 1) * this.pageLimit();
      },
      pageLimit:function(){
        Rückkehr 10; //每页显示10条
      },
      totalPages:function(totalNum){
        var total =parseInt((totalNum this.pageLimit() - 1) / this.pageLimit()),
            arrayTotalPages = [];
        for(var i=1; i<= total; i ){
          arrayTotalPages.push(i);
        }
        return arrayTotalPages;
      }
    },
    Instanzmethoden:{
    }
  }
});

使用:

复制代码 代码如下:

Article.findAndCountAll({include:[Category],offset:Article.pageOffset(req.query.pageNum), limit:Article.pageLimit()}).success(function(row){
    res.render('article_list', {
      Titel: '文章管理',
      Artikelliste: row.rows, 
      Seiten:{
        totalPages:Article.totalPages(row.count),
        currentPage:req.query.pageNum,
        router:'article'
      }
    });
  });

保存模型:

复制代码 代码如下:

exports.add = function(req, res) {
  var form = new formidable.IncomingForm();
  form.uploadDir = path.join(__dirname, '../files');
  form.keepExtensions = true;
  form.parse(req, function(err, field,files){
    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 = field.title;
        id = field.articleId;
        Titel = Felder.Titel,
        content = field.content,
        mincontent = field.mincontent,
        sequencing=fields.sequencing == 0 ? 0 : 1,
        Kategorie = Felder.Kategorie;
       Article.sync();  //如果不存在就创建表.
      Category.find(category).success(function(c){
        var Article = Article.build({
          Titel: Titel,
          Inhalt:Inhalt,
          mincontent:mincontent,
          icon:icon,
          Symbolname:Symbolname,
          Sequenzierung:Sequenzierung
        });
        Article.save()
        .success(function(a){
          a.setCategory(c);
          return res.redirect('/admin/article');
        });
      }); //Kategorie beenden
  });
}

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.   Mac使用'/' . window下面是'\',我也是部署完成之后才发现的问题 。  后来发现path.basename  直接替换(文档阅读的少,就吃亏啊)。对node.js的好感在加加1分。:)

3. redis 缓存经常查询,而且很少变化的数据.

复制代码 代码如下:

getCountAll:function(objFun){
redis.get('articles_getCountAll', function(err,reply){
          if(err){
console.log(err);
           zurück;
}
            if(reply === null){
db.all('SELECT count(articles.CategoryId) as count,categories.name,categories.id FROM Articles Left Join-Kategorien auf Articles.categoryID = Kategorien.id Group by Articles.CategoryId ', function(err,row){
                redis.set('articles_getCountAll',JSON.stringify(row));
                objFun(row);
           });
         }sonst{
           objFun(reply);
}
});

Diese Methode ist in der Modellebene definiert. Da es sich um Express handelt, wird es so weit wie möglich mit MVC entwickelt. Tatsächlich implementiert Route die Controller-Layer-Funktion (der Routenordner sollte Controller heißen).

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage