使用node.js 制作网站前台后台


Posted in Javascript onNovember 13, 2014

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('database', 'username', 'password', {

  // sqlite! now!

  dialect: 'sqlite',

  // the storage engine for sqlite

  // - default ':memory:'

  storage: config.sqlitePath,

  define:{

    classMethods:{

      pageOffset:function(pageNum){

        if(isNaN(pageNum) || pageNum < 1){

          pageNum = 1;  

        }

        return (pageNum - 1) * this.pageLimit();

      },

      pageLimit:function(){

        return 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;

      }

    },

    instanceMethods:{

    }

  }

});

使用:

Article.findAndCountAll({include:[Category],offset:Article.pageOffset(req.query.pageNum), limit:Article.pageLimit()}).success(function(row){

    res.render('article_list', { 

      title: '文章管理', 

      articleList : row.rows,  

      pages:{

        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, fields,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 = fields.title;

        id = fields.articleId;

        title = fields.title,

        content = fields.content,

        mincontent = fields.mincontent,

        sequencing=fields.sequencing == 0 ? 0 : 1,

        category = fields.category;

       Article.sync();  //如果不存在就创建表。

      Category.find(category).success(function(c){

        var article = Article.build({

          title : title, 

          content:content,

          mincontent:mincontent,

          icon:icon,

          iconname:iconname,

          sequencing:sequencing

        });

        article.save()

        .success(function(a){

          a.setCategory(c);

          return res.redirect('/admin/article');

        });

      }); //end category

  });

}

path.basename:

//iconPath = files.icon.path,

//index = iconPath.lastIndexOf('/') <= 0 ? iconPath.lastIndexOf('\\') : iconPath.lastIndexOf('/') ,

icon = <strong>path.basename</strong>(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.CategoryId ', function(err,row){

            redis.set('articles_getCountAll',JSON.stringify(row));

            objFun(row);

          });

        }else{

          objFun(reply);

        }

      });

    这个方法定义在了 model层。 因为是express,所以尽可能的 用mvc方式开发。 其实是route实现了controller层功能(route文件夹,应该命名为为controller)。

Javascript 相关文章推荐
JQuery从头学起第三讲
Jul 06 Javascript
jQuery点击tr实现checkbox选中的方法
Mar 19 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
Dec 07 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 Javascript
JavaScript禁止用户多次提交的两种方法
Jul 24 Javascript
jQuery zTree树插件动态加载实例代码
May 11 jQuery
bootstrap table使用入门基本用法
May 24 Javascript
浅谈JS中的常用选择器及属性、方法的调用
Jul 28 Javascript
使用原生js+canvas实现模拟心电图的实例
Sep 20 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
前端路由&amp;webpack基础配置详解
Jun 10 Javascript
JavaScript 作用域链解析
Nov 13 #Javascript
jQuery $命名冲突解决方案汇总
Nov 13 #Javascript
js获取字符串最后一位方法汇总
Nov 13 #Javascript
实现js保留小数点后N位的代码
Nov 13 #Javascript
详谈jQuery中的this和$(this)
Nov 13 #Javascript
FF(火狐)浏览器无法执行window.close()解决方案
Nov 13 #Javascript
jquery checkbox 勾选的bug问题解决方案与分析
Nov 13 #Javascript
You might like
一个程序下载的管理程序(二)
2006/10/09 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
js表头排序实现方法
2015/01/16 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
Python中字符串的格式化方法小结
2016/05/03 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
python贪吃蛇游戏代码
2020/04/18 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
python集合删除多种方法详解
2020/02/10 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
产品售后服务承诺书
2014/05/21 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
python中的plt.cm.Paired用法说明
2021/05/31 Python