模式
原型版本的dataservice使用的是transaction script模式,对于rest api,其实存在两种模式
一种如 /user/1/add_to_roles, /user/1/remove_from_roles
通常就是类似如下
user=User.findById(1);
user.add_to_roles(params);
类似于 /users , 则被映射到User的静态方法,如User.find(params)
对于transaction script 则是
/user/add_to_roles
userService.add_to_roles(params); //params.user_id 在其中
在c3版本 中,使用的是第二种模式,但未来 可能 会切换 到第一种,第二种简单,有性能 ,但不够oo,类似java中通常的模式,只是没有dao
查询表达式
为了便于extjs 前端的store.load方法调用,允许使用contains,startswith等参数后缀进行查询,目前支持的有
__contains like %?%
__startswith like ?%
__endswith like %?
__gt >
__lt <
__gte >=
__lte <=
__is_null is null
__is_not_null is not null
__in in (x,x,x)
__not_in not in (x,x,x)
比方按部门过滤员工并且按名称包含搜索就是
employees.load({params:{department_id:xxx,name__contains:xxx}});
以下仅仅(select/group/order/joins)为了快速创建原型程序 ,正式版本 在settings.js关闭这些功能
select 参数支持
替换 select中的字段列表
group
生成group by
order
extjs是sort/dir ,仅仅单一排序
生成order by 子句,不考虑 extjs
joins 参数支持
注意,仅仅用于不注意安全的场合,例子根据产品类别 ,名称 过滤,产品类别是多级的
Ext.getCmp('tree').on('click',function(node){
var params={'name__contains':Ext.getCmp('search_key').getValue()};
if (node!=tree.root && node.attributes.code){
params.joins=" left outer join product_types on products.product_type_id=product_types.id"
params['product_types.lcode__startswith']=node.attributes.code;
}
products.loadFix({params:params});
});
规范
1. 所有服务类均存放在services 子目录 ,系统在启动时自动导入
//load data services;
require('fs').readdir('./services', function(err, files) {
files.forEach(function(js) {
require('./services/' + js);
});
});
2. 文件命令复数,小写,如deparmtents.js/roles.js/currencies.js
3. 例子
var client=require('../settings.js').client;
var register_data_service=require('../ds.js').register_data_service;
var DataService=require('../ds.js').DataService;
function DepartmentDataService() {
DataService.call(this, "departments");
}
require('util').inherits(DepartmentDataService, DataService);
register_data_service('deparmtents', DepartmentDataService);
DepartmentDataService.prototype.tree=function(params,callback){
}
注意require 相对位置