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. spring security 之自定义表单登录源码跟踪

    ​ 上一节我们跟踪了security的默认登录页的源码,可以参考这里:https://www.cnblogs.com/process-h/p/15522267.html 这节我们来看看如何自定义单表认 ...

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

    开发环境:    Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MySql数据库 运行效果图 源码及原文链接:https://javadao.xyz/forum.php?mo ...

  3. jquery表单验证源码

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

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

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

  5. JS表单验证源码(带错误提示及密码等级)

    先晒图 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  6. antd4 源码学习 :表单

    Evernote Export 首先.vue 的数据流是双向的,而 react 的数据流是单向的. 这意味着什么? 这意味着,vue 中,子组件可以用 emit 把数据更新传给父组件.而 react ...

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

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

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

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

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

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

随机推荐

  1. C与C# socket 跨平台通讯传输结构体

    最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象.也就是在C#端的Receive() ...

  2. iOS:xCode7版本运行xCode8.0的代码

    怎么在xCode7版本上运行xCode8.0的代码? 1.右键你的"LaunchScreen.sb"文件并用编辑器打开sb 2.删掉"<capability nam ...

  3. (转)__cdecl __fastcall与 __stdcall

    原帖 http://blog.sina.com.cn/s/blog_6b7c56870100l8rf.html __cdecl   __fastcall与   __stdcall 调用约定:  __c ...

  4. JS组件系列——封装自己的JS组件

    前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ...

  5. less 里面 opacity的写法

    今天写了个opacity, 竟然less编译不过,上网搜了一个写法 .opacity (@opacity) { @opacityPercentage: @opacity * 100; opacity: ...

  6. Highchart使用json格式数据lineDemo

    <html> <head> <title>Highcharts Example</title> <script type="text/j ...

  7. 浅论ViewController的加载 -- 解决 viewDidLoad 被提前加载的问题(pushViewController 前执行)

    一个ViewController,一般通过init或initWithNibName来加载.二者没有什么不同,init最终还是要调用initWithNibName方法(除非这个ViewControlle ...

  8. CAD2012安装错误

    安装CAD2012总是会出现各种错误,不能安装,特别是.NET Framework Runtime 4.0安装错误. 单独安装dotNetFx40_Full_x86_x64.exe会提示更高级的版本已 ...

  9. gruntJs篇之connect+watch自动刷新

    grunt很强大,可以帮我我们解决很多繁琐的操作,虽然刚接触不久,但依然感受到其强大之处,这篇记录一下通过grunt.js实现事实刷新页面, 省去了编码 -> 保存 -> F5..F5.. ...

  10. eclipse/myeclipse sublime 实时更新文件改变

    情形: 在使用eclipse/myeclipse开发的时候, 像JS 或者HTML 以及一些操作时,sublime 的效率比eclipse/myeclipse要快,所以我们就可以使用这两者一起开发. ...