使用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 相关文章推荐
JScript 脚本实现文件下载 一般用于下载木马
Oct 29 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
Dec 06 Javascript
js实现表单多按钮提交action的处理方法
Oct 24 Javascript
ES6中非常实用的新特性介绍
Mar 10 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 Javascript
Angular2 环境配置详细介绍
Sep 21 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 Javascript
jQuery中库的引用方法
Jan 06 jQuery
小程序开发基础之view视图容器
Aug 21 Javascript
vue中轮训器的使用
Jan 27 Javascript
详解JavaScript作用域 闭包
Jul 29 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
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
坏狼php学习 计数器实例代码
2008/06/15 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
javascript 写类方式之十
2009/07/05 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
2019/07/19 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
NumPy统计函数的实现方法
2020/01/21 Python
QML用PathView实现轮播图
2020/06/03 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
建议书标准格式
2014/03/12 职场文书
数学系毕业生求职信
2014/05/29 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
在职证明范本
2015/06/15 职场文书
休假证明书
2015/06/24 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
理解python中装饰器的作用
2021/07/21 Python