使用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 相关文章推荐
根据json字符串生成Html的一种方式
Jan 09 Javascript
jquery实现表单验证并阻止非法提交
Jul 09 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
BootStrap selectpicker
Jun 20 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
Jul 19 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
详解vue添加删除元素的方法
Jun 30 Javascript
create-react-app安装出错问题解决方法
Sep 04 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
Jan 12 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
根德YB400的电路分析
2021/03/02 无线电
PHP之短标签开启设置
2013/06/17 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
JavaScript中的 new 命令
2019/05/22 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
Django之模板层的实现代码
2019/09/09 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
python内打印变量之%和f的实例
2020/02/19 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
我的老师教学反思
2014/05/01 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
以下牛机,你有几个
2022/04/05 无线电