ddms是基于express的一个表单管理系统,今天抽时间看了下它的代码,其实算不上源码学习,只是对它其中一些小的开发技巧做一些记录,希望以后在项目开发中能够实践下。

  • 数据层封装

    • 模块只对外暴露model,由业务层完成具体数据操作;
    • 利用mongoose的schema的static属性,扩展常用、基础的操作
var form = new Schema({
  user: {type: ObjectId, ref: 'User'},
  project: {type: ObjectId, ref: 'Project'},
  sid: {type: String, unique: true,'default': shortid.generate },
  title: {
    type: String,
    required: true,
    default: 'New Form'
  },
  desc: String,
  createDateTime: {
    type: Date,
    default: Date.now
  },
  updateDateTime: {
    type: Date,
    default: Date.now
  },
  schemata: Mixed
});

form.static({
  list: function (callback) {
    return this.find()
      .populate('user',{_id: 1,name: 1,email: 1,role: 1})
      .populate('project',{_id: 1,name: 1,desc: 1})
      .sort({_id: -1})
      .exec(callback)
  },
  listByProjectId: function (projectid,callback) {
    return this.find({project: projectid})
      .populate('user',{_id: 1,name: 1,email: 1,role: 1})
      .populate('project',{_id: 1,name: 1,desc: 1})
      .sort({_id: -1})
      .exec(callback);
  }
});

module.exports = mongoose.model('Form', form);
  • 充分利用schema type特性

    • 充分利用schema type的例如getter\setter\validate等 参考:http://mongoosejs.com/docs/2.7.x/docs/schematypes.html。可以将原本业务层的很多处理直接交给mongodb.
var userSchema = new Schema({
  email: {
    type: String,
    required: true, //需要校验  //给字段存储前线全部小写处理
    set: function (value) {
      return value.trim().toLowerCase()
    },  //校验的方法
    validate: [
      function (email) {
        return (email.match(/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i) != null)
      },
      'Invalid email'
    ]
  },
 //。。。。
  twitter: Mixed
});
  • 利用ref来实现join,可以存在多个,如下:
var form = new Schema({
  user: {type: ObjectId, ref: 'User'},
  project: {type: ObjectId, ref: 'Project'},
  sid: {type: String, unique: true,'default': shortid.generate },
form.static({
  list: function (callback) {
    return this.find()
      .populate('user',{_id: 1,name: 1,email: 1,role: 1})
      .populate('project',{_id: 1,name: 1,desc: 1})
      .sort({_id: -1})
      .exec(callback)
  },
  listByProjectId: function (projectid,callback) {
    return this.find({project: projectid})
      .populate('user',{_id: 1,name: 1,email: 1,role: 1})
      .populate('project',{_id: 1,name: 1,desc: 1})
      .sort({_id: -1})
      .exec(callback);
  }
});
  • 充分利用app.use

    • app.use在express中类似servlet里的filter,属于一种过滤器,它会在每个http请求中被调用
    • ddms通过app.use向req对象中添加model
//app.js中
app.use(function (req, res, next) {
  if (!models.User) return next(new Error("No models."));
  req.models = models;
  return next();
});

//route.js中
exports.showListByProjectId = function (req, res, next) {
  var pid = req.params.projectid;
  var pp = Promise.resolve( req.models.Project.findOne({_id: pid}) );
  var fp = Promise.resolve( req.models.Form.listByProjectId(pid) );

  Promise.all([pp,fp])
    .then(function(docs){
      res.render('forms/list', {project: docs[0],forms: docs[1]});
    }).catch(function (error) {
      return next(error);
    });
};
  • 采用bluebird的promise库做同步

之前一直用async,看了下promise,感觉非常清爽,同上例代码

  • 利用app.get的多callback实现中间件的效果,如下:
app.get('/formdatas/:formid', authorize.editor, routes.formData.showList);
app.get('/formdatas/create/:formid', authorize.editor, routes.formData.showCreateData);
app.post('/formdatas/create/:formid', writeLog, authorize.editor, routes.formData.createData);
app.get('/formdatas/update/:id', authorize.editor, routes.formData.showUpdateData);
app.post('/formdatas/update/:id', writeLog, authorize.editor, routes.formData.updateData);
app.get('/formdatas/delete/:id', writeLog, authorize.editor, routes.formData.deleteData);
app.get('/formdatas/csv/:formid', writeLog, authorize.editor, routes.formData.getCSV);

ddms(基于 Express 的表单管理系统)源码学习的更多相关文章

  1. jquery表单验证源码

    /**数据验证完整性**/$.fn.Validform = function () {    var Validatemsg = "";    var Validateflag = ...

  2. 基于Struts2开发学生信息管理系统 源码

    开发环境:    Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: 联系博主-Q:782827013

  3. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  4. 基于JDK1.8版本的hashmap源码笔记(二)

    这一篇是接着上一篇写的, 上一篇的地址是:基于JDK1.8版本的hashmap源码分析(一)     /**     * 返回boolean类型的值,当集合中包含key的键值,就返回true,否则就返 ...

  5. 基于jdk1.8的HashMap源码学习笔记

    作为一种最为常用的容器,同时也是效率比较高的容器,HashMap当之无愧.所以自己这次jdk源码学习,就从HashMap开始吧,当然水平有限,有不正确的地方,欢迎指正,促进共同学习进步,就是喜欢程序员 ...

  6. 基于nopCommerce的开发框架(附源码)

    .NET的开发人员应该都知道这个大名鼎鼎的高质量b2c开源项目-nopCommerce,基于EntityFramework和MVC开发,拥有透明且结构良好的解决方案,同时结合了开源和商业软件的最佳特性 ...

  7. 基于单层决策树的AdaBoost算法源码

    基于单层决策树的AdaBoost算法源码 Mian.py # -*- coding: utf-8 -*- # coding: UTF-8 import numpy as np from AdaBoos ...

  8. Net 通用权限管理系统源码 带数据库设计文档,部署说明文档

    Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389

  9. 基于Eclipse IDE的Ardupilot飞控源码阅读环境搭建

    基于Eclipse IDE的Ardupilot飞控源码阅读环境搭建 作者:Awesome 日期:2017-10-21 需准备的软件工具 Ardupilot飞控源码 PX4 toolchain JAVA ...

随机推荐

  1. [收集]MVC3 HTML辅助方法集录

    1.跳转链接 @Html.ActionLink("linkText","actionName",routeValues,htmlAttributes) e.g& ...

  2. vijos2001 xor-sigma

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. linux——基本配置

    环境:Ubuntu 12.04.2 LTS (GNU/Linux 3.5.0-23-generic i686) 网络配置 #临时改变 #修改IP和子网掩码 sudo ifconfig eth0 192 ...

  4. 一个工程两个target

    有很多的应用有两个版本,可能只是ui上有一些不同,维护两份代码是很麻烦的,这时候我们可以在已有的工程target上copy这个target来达到一份代码两个应用版本的需求 duplicate就可以co ...

  5. C#简单windows服务

    因为做后台比较多,所以经常需要写一些后台服务.一般的流程是先创建一个服务项目,加入代码.然后打包一个安装程序或者直接用dos命令安装服务.下面是详细内容:    1. 创建windows服务项目.  ...

  6. 20151215jqueryUI--dialog代码备份

    $(function () { $('#search_button').button(); /*$('#reg_a').click(function() { $('#reg').dialog(); } ...

  7. 微信JS-SDK分享接口示例中jsapi_ticket.php和access_token.php说明

    关于如何使用微信JS-SDK,可以查看官方介绍说明:查看链接 在使用分享接口的过程中,查看了示例代码,其中包含两个文件jsapi_ticket.php和access_token.php,记录一下这两个 ...

  8. 针对双系统ubuntu16.04卡死及系统没有声音解决方法

    楼主电脑系统状况:win10主系统,128固态为ubuntu系统       安装一共为两次. 第一次出现ubuntu安装成功后没有声音,主系统win10有声音,Ubuntu上检测不到声卡,说明ubu ...

  9. 编写JsonResult封装JSON返回值(模板参阅)

    编写JsonResult封装JSON返回值 package cn.tedu.note.util; import java.io.Serializable; import cn.tedu.note.se ...

  10. 修改MYSQL的默认连接时长

    show global variables like 'wait_timeout'; 设置成10小时; set global wait_timeout=36000;