ddms(基于 Express 的表单管理系统)源码学习
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 的表单管理系统)源码学习的更多相关文章
- spring security 之自定义表单登录源码跟踪
上一节我们跟踪了security的默认登录页的源码,可以参考这里:https://www.cnblogs.com/process-h/p/15522267.html 这节我们来看看如何自定义单表认 ...
- 基于SSM开发学生信息管理系统源码
开发环境: Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MySql数据库 运行效果图 源码及原文链接:https://javadao.xyz/forum.php?mo ...
- jquery表单验证源码
/**数据验证完整性**/$.fn.Validform = function () { var Validatemsg = ""; var Validateflag = ...
- 基于Struts2开发学生信息管理系统 源码
开发环境: Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: 联系博主-Q:782827013
- JS表单验证源码(带错误提示及密码等级)
先晒图 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- antd4 源码学习 :表单
Evernote Export 首先.vue 的数据流是双向的,而 react 的数据流是单向的. 这意味着什么? 这意味着,vue 中,子组件可以用 emit 把数据更新传给父组件.而 react ...
- Java开源生鲜电商平台-订单表的设计(源码可下载)
Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...
- 基于JDK1.8版本的hashmap源码笔记(二)
这一篇是接着上一篇写的, 上一篇的地址是:基于JDK1.8版本的hashmap源码分析(一) /** * 返回boolean类型的值,当集合中包含key的键值,就返回true,否则就返 ...
- 基于jdk1.8的HashMap源码学习笔记
作为一种最为常用的容器,同时也是效率比较高的容器,HashMap当之无愧.所以自己这次jdk源码学习,就从HashMap开始吧,当然水平有限,有不正确的地方,欢迎指正,促进共同学习进步,就是喜欢程序员 ...
随机推荐
- MVC中的常见问题
1. The model backing the 'MusicStoreDBContext' context has changed since the database was created. ...
- jdk1.8下载安装
jdk8环境变量 jdk8图解安装 java8安装 1 2 3 4 5 6 7 分步阅读 JDK8 是JDK的最新版本,加入了很多新特性,如果我们要使用,需要下载安装: JDK8在windows ...
- 数字与字母 随机数小demo
public String generateRandomId(){ String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHI ...
- DUT Star Round2
A.Zeratu的军训游戏 Problems: 开灯问题,问无数次操作之后第n盏灯的状态 Analysis: cj:平方数有奇数个约数 Tags: Implementation B.Zeratud的完 ...
- 【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树
线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE #include<cstdio> #include<algorithm> #include<ext/p ...
- jsQunit
1:什么是单元测试? 1.1:单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.单元测试主要是用来检验程式的内部逻辑,也称为个体测试.结构测试或逻辑驱动测试.通常 ...
- 编译nginx时,编译参数注意点
--prefix=/usr/local/nginx-1.3.1 有利于统一放置nginx的所有文件,方便管理,强烈建议设置 --with-http_stub_status_module 支 ...
- Python项目:扇贝网小组查卡助手
扇贝网是一个非常棒的英语学习网站,大家还可以加入一些小组,一起交流学习.共同进步.但是,小组管理起来非常辛苦,尤其是在0点前踢出不打卡的成员,因此考虑利用程序来实现小组查卡自动化. 登录 操作 扇贝网 ...
- 了解及使用IPV6
1. 什么是 IPv6 IPv6指互联网协议(IP)第6版.目前大家上网主要使用互联网协议第四版,即IPv4. 在全球互联网高度发展的今天,IPv4 地址资源已经枯竭,互联网正在经历从IPv4网络向I ...
- 升级到win8.1右键响应慢
网上很多资料都是在显卡上做文章,试了N次确定不是这个问题. 后来查到这个好用了.以管理员身份运行 下面代码保存bat即可 regsvr32 /u /s igfxpph.dll reg delete H ...