vesh-vj
Version:
VESH's JavaScript Framework
1,059 lines (1,058 loc) • 65.7 kB
JavaScript
(function(V, $) {
V.ni = {};
var N = V.ni;
//依托Middler框架完成对数据类型文件的处理,包括ajax jsonp localStorage sessionStorage Sqlite ObjectDB(即自定义function) WebSocket等等数据源类型的操作
//实现对如下格式文件的处理 分别定义ajax
/*
Ni:{
ajaxtest2:{command:'http://localhost/VESHTest/Module/help/test.tjsonp?_n=recorder',dbtype:'tjson',params:{limit:11},template:'template1'},
ajaxtest1:{command:'http://localhost/KDAPI/Module/GetOrderTrackItems.tjsonp?_n=Order',dbtype:'tjson',params:{},template:'template1'},
'ajaxtest1.Cache':{command:function(res,params){return res[params.cacheKey];不写即使用默认值},dbtype:'json',params:{},template:'template2'},
'ajaxtest1.Set':{command:function(res,params){res[params.cacheKey] = params.cacheValue;不写即使用默认值},dbtype:'json',params:{timeout1:{interval:'s',number:50}},template:'template2'},
sqlinsert:{command:'create table if not exists table1(name Text,message text,time integer);insert into table1 values(?,?,?);',dbtype:'json',params:{data:[]},template:'sqltemp'},
sqlselect:{command:'select * from table1;',dbtype:'json',params:{data:[]},template:'sqltemp'},
sqlselect2:{command:'select * from table1 where name=?',dbtype:'json',params:{data:[]},template:'sqltemp'},
Name1:{command:'',params:{},dbtype:'json/tjson',template:'仅在Middler中调用NiMultiTemplateDecorator时启用'},
wstest1: { command: 'abc.json', dbtype: 'json', params: {}, template: 'ws' },
wstest2: { command: 'bcd.json?_n=MT, dbtype: 'json', params: {}, template: 'ws' }
}
*/
/*
var t = middler.getObjectByAppName('Ni','templatename');
var res = t.excute('aaa.GetProductDetail',{ProductID:111},function(result){
var res = result.last();
});
middler.setObjectByAppName('Ni','templatename',t);
*/
//分离NiDataConfig完成Ni格式文件处理
//分离NiDataConfigConvert完成对Ni格式转成Config
//用于处理 Ni文件定义
{
V.config.Configs = V.merge(V.config.Configs, { ConfigConverts: { Ni: { type: 'VJ.ni.NiDataConfigConvert' } } });
N.NiDataConfig = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [V.config.Config, []]);
__.getValue = _.getValue;
_.getValue = function() { var ret = __.getValue.apply(this, arguments); if (ret) { ret.merge = V.getValue(ret.merge, V.merge); } return ret; };
}
};
N.NiDataConfigConvert = function() {
var _ = this,
__ = {}; { V.inherit.apply(_, [V.config.ConfigConvert, []]); }
_.toConfig = function(val) {
var ret = new N.NiDataConfig();
if (val) {
if (typeof(val) == 'object') {
for (var i in val) {
if (val[i]) {
ret.data[i] = VJ.merge({ params: {} }, val[i]);
}
}
}
}
return ret;
};
_.toStrings = function(config) { V.showException('VJ.ni.NiDataConfigConvert不支持此功能'); };
};
}
//分离NiTemplate进行连续事务提交和顺序操作
{
/**
*
* @param {数据源} res
* @param {ni对象configManager对象} cm
* @param {转换URL地址的后缀 默认'.tjson?_n=MT'} defExt
*/
N.NiTemplate = function(res, cm, defExt, merge) {
var _ = this,
__ = this; {
_.lstCmd = [];
_.KEY = 'Ni';
_.result = new N.NiDataResult();
_.transaction = false;
_.res = res;
_.cm = cm;
_.defExt = defExt || '.tjson?_n=MT';
_.dbtype = _.defExt.split('?')[0].trim('.');
_.jsonp = _.dbtype.indexOf('p') >= 0 ? '_bk' : false;
_.dbtype = _.dbtype.indexOf('tjson') >= 0 ? 'tjson' : 'json';
_.merge = merge || function() {
var ret = VJ.merge.apply(this, arguments);
//mysql特有
if (!ret.hasMarge && ret.PageIndex) { ret.hasMarge = true, ret.PageIndex = ret.PageIndex * ret.PageSize; }
return ret;
};
}
};
N.NiTemplate.inherit2 = true;
V.merge(N.NiTemplate.prototype, {
_addCommand: function(name, params, func) {
var _ = this;
var cmd = _.cm.getConfigValue(_.KEY, name);
if (cmd) {
_.lstCmd.push(V.merge(cmd, {
name: cmd.command,
params: (cmd.merge || _.merge)(cmd.params, V.getValue(params, {})),
func: func,
key: name,
jsonp: cmd.jsonp || _.jsonp,
dbtype: cmd.dbtype || _.dbtype
}));
} else {
//如果没有覆盖那么采用默认路径转换
_.lstCmd.push({
name: (name.indexOf('http') < 0 || name.startWith('/')) ? (name.replace(/[\.\/\\]/g, '/') + _.defExt) : (name || ''),
params: _.merge(V.getValue(params, {})),
func: func,
key: name,
jsonp: _.jsonp,
dbtype: _.dbtype
})
}
},
_excute: function() {
var _ = this,
__ = this;
var _cms = _.lstCmd;
_.lstCmd = [];
if (_cms.length > 0) {
V.tryC(function() {
var conn = _.res.getDBConnection();
if (_cms.length > 1) { conn.transaction = true; }
var cmd = _.res.getDBCommand();
cmd.connection = conn;
var i = 0;
V.whileC2(function() { return _cms[i++]; }, function(v, next) {
cmd.command = v.name;
cmd.params = v.params;
cmd.dbtype = v.dbtype;
cmd.jsonp = v.jsonp;
var _func = v.func;
cmd.excute(_.result, function(data) {
_.result.add((!data || (V.isArray(data) && data.length == 0)) ? false : data, v.key);
V.tryC(function() { _func(_.result); });
next();
});
}, function() {
if (conn.transaction && conn.commit) { conn.commit(); }
_.res.backDBConnection(conn);
});
});
} else { V.showException('不能调用空的命令对象!'); }
return _.result;
},
excute: function(name, params, func) {
var _ = this;
_._addCommand(name, params, func);
if (!_.transaction) {
_.commit();
}
return _.result;
},
commit: function() {
var _ = this;
return _._excute();
}
}, true);
N.NiTemplateManager = function(cm, appName) {
var _ = this,
__ = this; {
_.KEY = V.getValue(appName, 'Ni');
__.middler = new V.middler.Middler(cm);
}
};
N.NiTemplateManager.prototype.excute = function(tempName, name, params, func) {
var _ = this,
__ = this;
var temp = __.middler.getObjectByAppName(_.KEY, tempName);
if (temp) {
temp.excute(name, params, function(data) {
V.tryC(function() { func(data); });
__.middler.setObjectByAppName(_.KEY, tempName, temp);
});
} else { throw new Error('没有找到Template:' + tempName); }
};
//获取json对象 使得不管json还是tjson都按照最终结果进行使用
//分离NiDataResult完成获取数据工作
N.NiDataResult = function() {
var _ = this,
__ = this; {
__.data = {};
__.kv = {};
__.datas = [];
}
};
V.merge(N.NiDataResult.prototype, {
get: function(key) {
var _ = this,
__ = this;
return __.data[key] ? __.data[key] : __.kv[key] ? __.kv[key][1] : null;
},
add: function(data, name) {
var _ = this,
__ = this;
if (data && !__.kv[name]) {
__.data[__.datas.length] = data;
__.kv[name] = [__.datas.length, data];
__.datas.push(data);
} else if (__.kv[name]) {
var id = __.kv[name][0];
__.data[id] = data;
__.kv[name] = [__.datas.length, data];
__.datas[id] = data;
}
},
single: function() {
var _ = this,
__ = this;
return (_.hasData()) ? (function() {
var data = _.get(__.datas.length - 1);
return (data[0] && data[0][0]) ? data[0][0] : {};
})() : null;
},
last: function() {
var _ = this,
__ = this;
return _.get(__.datas.length - 1);
},
each: function(key, func) {
var _ = this,
__ = this;
var val = _.get(key);
if (val && V.isArray(val)) {
V.each(val, func);
}
},
clear: function() {
var _ = this,
__ = this;
__.datas = [];
__.data = {};
__.kv = {};
},
hasData: function(key) {
var _ = this,
__ = this;
return key ? (function() {
var v = _.get(key);
if (v) { for (var k in v) return true; }
return false;
})() : (__.datas.length > 0 && (function() {
var hasData = false;
__.datas.forEach(function(v) {
if (!hasData && v) {
for (var k in v) hasData = true;
}
});
return hasData;
})());
}
}, true);
}
//分离NiDataResource完成static instance pool各种调用方式
{
N.NiDataResource = function(factory, params) {
var _ = this,
__ = {}; {
_.fac = factory;
_.params = V.getValue(params, {});
}
_.getDBConnection = function() {
var conn = _.fac.createDBConnection();
conn.params = V.merge(conn.params, _.params);
conn.params.resource = V.getValue(_.params.resource, conn.params.resource);
if (!conn.isOpen) {
conn.open();
}
return conn;
};
_.backDBConnection = function(conn) { _.fac.backDBConnection(conn); }
_.getDBCommand = function() { return _.fac.createDBCommand(); }
};
N.NiInstanceDataResource = function(factory, params) {
var _ = this; {
V.inherit.apply(_, [N.NiDataResource, [factory, params]]);
}
};
N.NiStaticDataResource = function(factory, params) {
var _ = this,
__ = {}; {
__.conn = null;
V.inherit.apply(_, [N.NiDataResource, [factory, params]]);
__.getDBConnection = _.getDBConnection;
}
_.getDBConnection = function() {
if (!__.conn) {
__.conn = __.getDBConnection();
}
return __.conn;
};
_.backDBConnection = function(conn) { if (conn != __.conn) { if (conn.isOpen && conn.close) { conn.close(); } } };
};
N.NiPoolDataResource = function(factory, params, size) {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataResource, [factory, params]]);
__.getDBConnection = _.getDBConnection;
size = V.getValue(size, 50);
__.pool = new VJ.collection.Pool(size, function() {
var conn = __.getDBConnection();
conn.dispose = conn.close;
return conn;
});
}
_.getDBConnection = function() {
var val = __.pool.getValue();
return val;
};
_.backDBConnection = function(conn) {
__.pool.setValue(conn);
};
};
}
//DataFactory常用基类
{
N.NiDataFactory = function() {
var _ = this,
__ = {}; {}
_.createDBConnection = function() { return new NiDataConnection(); };
_.createDBCommand = function() { return new N.NiDataCommand(); }
_.backDBConnection = function(conn) {
if (conn.isOpen) {
conn.close();
}
};
};
N.NiDataConnection = function() {
var _ = this,
__ = {}; {
_.isOpen = false;
_.params = {};
}
_.open = function() { _.isOpen = true; };
_.close = function() { _.isOpen = false };
_.invoke = function(cmd, func) { func(false); };
};
N.NiDataCommand = function() {
var _ = this,
__ = {}; {
_.connection = null;
_.command = '';
_.params = { dbtype: 'json' };
}
_.excute = function(result, func) {
if (!_.connection || !_.connection.isOpen) {
V.showException('数据库未连接');
if (func) { func(false); }
return;
} else {
_.connection.invoke(_, function(data) {
try {
var hasFalse = false;
switch (typeof(data)) {
case "string":
data = data.replace(/[\r\n]+/g, '');
if (data.startWith('{')) {
_.dbtype = 'json';
data = '[[' + data + ']]'
};
if (data.replace(/^(\[+\]+)/g, '').length === 0) {
hasFalse = true;
} else {
hasFalse = (data.toLowerCase().indexOf('[false') >= 0 ?
(data.toLowerCase().indexOf('[false:') >= 0 ? (function() {
var _data = data.toLowerCase().match(/\[false:[^\]]+\]/g);
if (_data && _data.length > 0) {
return _data[0].substr(7, _data[0].length - 8);
} else return true;
})() : true) :
false);
}
if (!hasFalse) {
//如何判断tjson
try {
data = eval('(' + data.replace(/[\r\n]+/g, '') + ')');
} catch (e) { console.log(data); }
}
break;
case "object":
if (data) {
$(data).each(function(i, v) {
v = v + '';
hasFalse = (hasFalse || v == 'False' || v == 'false');
});
} else hasFalse = true;
break;
case 'undefined':
default:
V.showException('V.NiDataCommand success方法 name:typeof错误 type:' + data);
hasFalse = true;
break;
}
if (hasFalse) {
data = (hasFalse == true ? false : hasFalse);
} else {
switch (_.dbtype) {
default:
case 'json':
break;
case 'tjson':
data = V.evalTJson(data);
break;
}
}
if (func) { func(data); }
} catch (e) {
V.showException('V._ajaxOption success方法', e);
if (func) { func(false); }
}
});
}
};
};
}
//NiTemplateDecorator NiMultiTemplateDecorator 装饰类 使得TemplateDecorator可以添加缓存,NiMultiTemplateDecorator可以根据Ni文件中定义的template进行操作
{
N.NiTemplateDecorator = function(res, cacheres, cm, params, defExt, merge) {
var _ = this,
__ = this; {
N.NiTemplate.apply(_, [res, cm, defExt, merge]);
_.KEY = 'Ni';
_.lstCmd2 = {};
__.params = V.getValue(params, {});
_.cacheres = cacheres;
}
};
V.inherit2(N.NiTemplateDecorator, N.NiTemplate, {
setCommand: function(res, params) {
var _ = this,
__ = this;
params = V.merge(__.params, params);
//兼容localStorage不可用的状态
try {
if (res.setItem) {
res.setItem(params.cacheKey, V.toJsonString({
data: params.cacheValue,
date: (params.timeout ? new Date().add(params.timeout.interval, params.timeout.number).getTime() : false)
}));
} else {
res[params.cacheKey] = V.toJsonString({
data: params.cacheValue,
date: (params.timeout ? new Date().add(params.timeout.interval, params.timeout.number).getTime() : false)
});
}
} catch (error) {
console.log('localStorage/sessionStorage可能不被支持或者跨域:' + e.message);
}
return null;
},
//可以根据业务逻辑改为根据某个公共字段进行删除
clearCommand: function(res, params) {
try {
if (res.removeItem) {
res.removeItem(params.cacheKey, null);
} else if (res[params.cacheKey]) {
delete res[params.cacheKey];
}
return null;
} catch (error) {
console.log('localStorage/sessionStorage可能不被支持或者跨域:' + e.message);
}
},
cacheCommand: function(res, params) {
try {
var val = null;
if (res.getItem) {
val = V.json(res.getItem(params.cacheKey));
} else {
if (res[params.cacheKey]) {
val = V.json(res[params.cacheKey]);
}
}
if (val) {
if (val.date) {
if (parseFloat(val.date) < new Date().getTime()) {
delete res[params.cacheKey];
return null;
}
}
return val.data;
} else return null;
} catch (error) {
console.log('localStorage/sessionStorage可能不被支持或者跨域:' + e.message);
}
},
_addCommand: function(name, params, func) {
var _ = this,
__ = this;
var index = _.lstCmd.length;
N.NiTemplateDecorator._addCommand.apply(_, [name, params, func]);
if (_.lstCmd.length != index) {
var command = null;
var cmd = _.cm.getConfigValue(_.KEY, name + '.Cache');
if (!cmd) {
cmd = _.cm.getConfigValue(_.KEY, name + '.Clear');
if (cmd) {
command = cmd.command || _.clearCommand;
}
} else {
command = cmd.command || _.cacheCommand;
}
if (cmd) {
_.lstCmd2[index] = {
name: command,
key: name,
params: cmd.merge(_.lstCmd[_.lstCmd.length - 1].params, { cacheKey: V.hash(name + '.Set.' + V.toJsonString(_.lstCmd[_.lstCmd.length - 1].params)) })
}
}
}
},
_excute: function() {
var _ = this,
__ = this;
var _cms = _.lstCmd;
_.lstCmd = [];
if (_cms.length > 0) {
V.tryC(function() {
var conn = _res.getDBConnection();
var cmd = _.res.getDBCommand();
cmd.connection = conn;
var func = function(v, next) {
cmd.command = v.name;
cmd.params = v.params;
cmd.dbtype = v.dbtype;
cmd.jsonp = v.jsonp;
var _func = v.func;
cmd.excute(_.result, function(data) {
V.tryC(function() {
_.result.add(data ? data : false, v.key);
if (_func) {
V.tryC(function() {
_func(_.result);
});
}
});
if (data && data.length > 0 && !(data.length == 1 && data[0].length == 0)) {
//新增缓存
var _nicmd = cm.getConfigValue(_.KEY, v.key + '.Set');
if (_nicmd) {
var _conn = _.cacheres.getDBConnection();
var _cmd = _.cacheres.getDBCommand();
_cmd.connection = _conn;
_cmd.command = V.getValue(_nicmd.command, _.setCommand);
_cmd.params = _nicmd.merge(_nicmd.params, cmd.params, {
cacheKey: V.hash(v.key + '.Set.' + V.toJsonString(cmd.params)),
cacheValue: data
});
_cmd.excute(_.result, function(data) {
V.tryC(function() { _.cacheres.backDBConnection(_conn); });
});
}
}
i++;
next();
});
};
var i = 0;
V.whileC2(function() { return _cms.shift(); }, function(v, next) {
var _nicmd = _.lstCmd2[i];
//准备处理缓存
if (_nicmd) {
i++;
var _conn = _.cacheres.getDBConnection();
var _cmd = _.cacheres.getDBCommand();
_cmd.connection = _conn;
_cmd.command = _nicmd.name;
_cmd.params = V.merge(_nicmd.params, v.params);
_cmd.excute(_.result, function(data) {
V.tryC(function() {
try { _.cacheres.backDBConnection(_conn); } catch (e) {}
if (data) {
_.result.add(data, v.key);
if (v.func) {
V.tryC(function() {
v.func(_.result);
});
}
next();
} else {
func(v, next);
}
});
});
} else {
i++;
func(v, next);
}
}, function() {
_.res.backDBConnection(conn);
});
});
} else { V.showException('不能调用空的命令对象!'); }
return _.result;
}
});
/**
* 使用一致的缓存命令和设置命令 继承自NiTemplateDecorator
* @param {*} res
* @param {*} cacheres
* @param {*} cm
* @param {*} params
* @param {*} defExt
* @param {*} merge
* @param {*} cachecommand
* @param {*} setcommand
*/
N.NiTemplateCacheDecorator = function(res, cacheres, cm, params, defExt, merge, cachecommand, setcommand) {
N.NiTemplateDecorator.apply(_, [res, cacheres, cm, defExt, merge]);
_.cachecommand = cachecommand;
_.setcommand = setcommand;
};
V.inherit2(N.NiTemplateCacheDecorator, N.NiTemplateDecorator, {
_addCommand: function(name, params, func) {
var _ = this,
__ = this;
var index = _.lstCmd.length;
N.NiTemplate._addCommand.apply(_, [name, params, func]);
if (_.lstCmd.length != index) {
var command = null;
var cmd = _.cm.getConfigValue(_.KEY, _.cachecommand);
if (cmd) {
command = cmd.command || _.cacheCommand;
_.lstCmd2[index] = {
name: command,
key: name,
params: cmd.merge(_.lstCmd[_.lstCmd.length - 1].params, { cacheKey: V.hash(name + '.Set.' + V.toJsonString(_.lstCmd[_.lstCmd.length - 1].params)) })
}
}
}
},
_excute: function() {
var _ = this,
__ = this;
var _cms = _.lstCmd;
_.lstCmd = [];
if (_cms.length > 0) {
V.tryC(function() {
var conn = _res.getDBConnection();
var cmd = _.res.getDBCommand();
cmd.connection = conn;
var func = function(v, next) {
cmd.command = v.name;
cmd.params = v.params;
cmd.dbtype = v.dbtype;
cmd.jsonp = v.jsonp;
var _func = v.func;
cmd.excute(_.result, function(data) {
V.tryC(function() {
_.result.add(data ? data : false, v.key);
if (_func) {
V.tryC(function() {
_func(_.result);
});
}
});
if (data && data.length > 0 && !(data.length == 1 && data[0].length == 0)) {
//新增缓存
var _nicmd = cm.getConfigValue(_.KEY, _.setcommand);
if (_nicmd) {
var _conn = _.cacheres.getDBConnection();
var _cmd = _.cacheres.getDBCommand();
_cmd.connection = _conn;
_cmd.command = V.getValue(_nicmd.command, _.setCommand);
_cmd.params = _nicmd.merge(_nicmd.params, cmd.params, {
cacheKey: V.hash(v.key + '.Set.' + V.toJsonString(cmd.params)),
cacheValue: data
});
_cmd.excute(_.result, function(data) {
V.tryC(function() { _.cacheres.backDBConnection(_conn); });
});
}
}
i++;
next();
});
};
var i = 0;
V.whileC2(function() { return _cms.shift(); }, function(v, next) {
var _nicmd = _.lstCmd2[i];
//准备处理缓存
if (_nicmd) {
i++;
var _conn = _.cacheres.getDBConnection();
var _cmd = _.cacheres.getDBCommand();
_cmd.connection = _conn;
_cmd.command = _nicmd.name;
_cmd.params = V.merge(_nicmd.params, v.params);
_cmd.excute(_.result, function(data) {
V.tryC(function() {
try { _.cacheres.backDBConnection(_conn); } catch (e) {}
if (data) {
_.result.add(data, v.key);
if (v.func) {
V.tryC(function() {
v.func(_.result);
});
}
next();
} else {
func(v, next);
}
});
});
} else {
i++;
func(v, next);
}
}, function() {
_.res.backDBConnection(conn);
});
});
} else { V.showException('不能调用空的命令对象!'); }
return _.result;
}
});
//用于先读取缓存同步请求真实数据的情况
N.NiLazyTemplateDecorator = function(res, cacheres, cm, params, defExt, merge) {
var _ = this,
__ = this; {
__.lazyExp = V.getValue(params.lazyExp, function(p) { return true; });
params = V.merge({}, params);
if (params && params.lazyExp) { delete params.lazyExp; }
N.NiTemplateDecorator.apply(_, [res, cacheres, cm, params, defExt, merge]);
}
};
V.inherit2(N.NiLazyTemplateDecorator, N.NiTemplateDecorator, {
_excute: function() {
var _ = this,
__ = this;
var _cms = _.lstCmd;
_.lstCmd = [];
if (_cms.length > 0) {
V.tryC(function() {
var conn = _.res.getDBConnection();
var cmd = _.res.getDBCommand();
cmd.connection = conn;
var i = 0;
var func = function(v) {
cmd.command = v.name;
cmd.params = v.params;
cmd.dbtype = v.dbtype;
cmd.jsonp = v.jsonp;
var _func = v.func;
cmd.excute(_.result, function(data) {
V.tryC(function() {
if (!data) {
data = false;
}
_.result.add(data, v.key);
if (_func) {
V.tryC(function() {
_func(_.result);
});
}
});
if (data && data.length > 0 && !(data.length == 1 && data[0].length == 0) && __.lazyExp(v.params)) {
//新增缓存
var _nicmd = _.cm.getConfigValue(_.KEY, v.key + '.Set');
if (_nicmd) {
var _conn = _.cacheres.getDBConnection();
var _cmd = _.cacheres.getDBCommand();
_cmd.connection = _conn;
_cmd.command = V.getValue(_nicmd.command, _.setCommand);
_cmd.params = _nicmd.merge(_nicmd.params, cmd.params, {
cacheKey: V.hash(v.key + '.Set.' + V.toJsonString(cmd.params)),
cacheValue: data
});
_cmd.excute(_.result, function(data) {
V.tryC(function() { cacheres.backDBConnection(_conn); });
});
}
}
});
};
V.whileC2(function() { return _cms.shift(); }, function(v, next) {
var _nicmd = _.lstCmd2[i];
//准备处理缓存
if (_nicmd && __.lazyExp(v.params)) {
i++;
var _conn = _.cacheres.getDBConnection();
var _cmd = _.cacheres.getDBCommand();
_cmd.connection = _conn;
_cmd.command = _nicmd.name;
_cmd.params = V.merge(_nicmd.params, v.params);
_cmd.excute(_.result, function(data) {
V.tryC(function() {
try { _.cacheres.backDBConnection(_conn); } catch (e) {}
if (!data) {
data = false;
}
if (data) {
_.result.add(data, v.key);
if (v.func) {
V.tryC(function() {
v.func(_.result);
});
}
}
func(v, next);
});
});
} else {
i++;
func(v, next);
}
}, function() {
_.res.backDBConnection(conn);
});
});
} else { V.showException('不能调用空的命令对象!'); }
return _.result;
}
});
/**
* 使用很多Template来完成相关操作,否则就使用默认值进行处理
* @param {真实数据源} res
* @param {ni.js的ConfigManager} cm
* @param {config.js的ConfigManager} relcm
* @param {config.js的AppName} appName
* @param {自动扩展后缀} defExt
* @param {参数过滤方法} merge
* @param {默认模板 如果不设置 那么使用真实数据源} template
*/
N.NiMultiTemplateDecorator = function(res, cm, relcm, appName, defExt, merge, template) {
var _ = this,
__ = this; {
N.NiTemplate.apply(_, [res, cm, defExt, merge]);
_.KEY = V.getValue(appName, 'Ni');
__.ni = new N.NiTemplateManager(relcm, _.KEY);
//__._addCommand = _._addCommand;
//__._excute = _._excute;
__.lstCmd2 = {};
_.template = template || false;
}
};
V.inherit2(N.NiMultiTemplateDecorator, N.NiTemplate, {
_addCommand: function(name, params, func) {
var _ = this,
__ = this;
var index = _.lstCmd.length;
N.NiMultiTemplateDecorator._addCommand.apply(_, [name, params, func]);
if (_.lstCmd.length != index) {
var cmd = _.lstCmd[_.lstCmd.length - 1];
cmd.template = cmd.template || _.template;
if (cmd.template) {
//调用templdate优先 复用其次
__.lstCmd2[index] = true;
}
}
},
_excute: function() {
var _ = this,
__ = this;
var _cms = _.lstCmd;
_.lstCmd = [];
if (_cms.length > 0) {
V.tryC(function() {
var conn = _.res.getDBConnection();
var cmd = _.res.getDBCommand();
cmd.connection = conn;
var func = function(v, next) {
cmd.command = v.name;
cmd.params = v.params;
cmd.dbtype = v.dbtype;
cmd.jsonp = v.jsonp;
var _func = v.func;
cmd.excute(_.result, function(data) {
V.tryC(function() {
_.result.add(data ? data : false, v.key);
if (_func) {
_func(_.result);
}
});
next();
});
};
var i = 0;
var _cms2 = __.lstCmd2;
__.lstCmd2 = {};
V.whileC2(function() { return _cms.shift(); }, function(_v, next) {
var v = _v;
//准备处理缓存
if (_cms2[i]) {
i++;
__.ni.excute(v.template, v.key, v.params, function(result) {
V.tryC(function() {
_.result.add((result && result.get(v.key)) ? result.get(v.key) : [], v.key);
v.func(_.result);
});
next();
});
} else {
i++;
func(v, next);
}
}, function() {
_.res.backDBConnection(conn);
_cms2 = null;
});
});
} else { V.showException('不能调用空的命令对象!'); }
return _.result;
}
})
}
//分离NiDBFactory产生NiDBConnection(Invoke) ajax localStorage sessionStorage js jsonp/getScript websocket Sqlite ObjectDB等各种资源
{
//ajax jsonp/getScript 构造参数可修改ajax默认参数并新增host(../|http://www.abc.con)与dbtype(json/tjson)两个属性。
//默认dbtype为json js 建议static
N.NiAjaxDataFactory = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataFactory, []]);
__.AjaxConnection = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataConnection, []]);
_.params = V.merge({ host: '', dbtype: 'json' }, _.params);
}
_.invoke = function(cmd, func) {
V.ajax(V.merge(_.params, {
url: ((cmd.command.indexOf('http:') >= 0 || cmd.command.indexOf('https:') >= 0) ? '' : _.params.host) + cmd.command,
data: cmd.params,
jsonp: cmd.jsonp,
success: function(data, status) {
try {
if (func) { func(data); }
} catch (e) {
V.showException('V._ajaxOption success方法', e);
}
},
error: function(request, status, error) {
V.showException('V._ajaxOption error方法 status:' + status, error);
if (func) { func(false); }
}
}));
}
};
}
_.createDBConnection = function() { return new __.AjaxConnection(); };
_.backDBConnection = function() { console.log('back conn'); };
};
//localStorage sessionStorage js ObjectDB
N.NiObjectDataFactory = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataFactory, []]);
__.ObjectConnection = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataConnection, []]);
_.params = V.merge({ resource: {} }, _.params);
__.open = _.open;
__.close = _.close;
}
_.open = function() {
switch (typeof(_.params.resource)) {
case 'string':
_.params.resource = eval('(' + _.params.resource + ')');
break;
case 'object':
if (V.isArray(_.params.resource)) {
throw new Error('不能使用数组作为资源');
}
break;
default:
throw new Error('N.NiObjectDataFactory 无法找到<' + _.params.resource + '>对象');
}
__.open();
};
_.close = function() {
if (_.params.resource) {
delete _.params.resource;
}
__.close();
};
_.invoke = function(cmd, func) {
//如何区分Insert还是select
//针对 localStorage,sessionStorage,JS对象 function(res,params){res[params.key] = params.value; return 0;}
//function(res,params){return res[params.key];}
//function(res,p){return res.func(p);}
try {
var data = null;
if (typeof(cmd.command) == 'function') {
data = cmd.command(_.params.resource, cmd.params);
} else {
data = eval('(' + cmd.command + ')(_.params.resource,cmd.params)');
}
if (typeof(data) == 'function') {
V.tryC(function() { if (func) { data(func); } });
} else {
V.tryC(function() { if (func) { func(data); } });
}
} catch (e) {
V.showException('V._ajaxOption success方法', e);
if (func) { func(false); }
}
}
};
}
_.createDBConnection = function() { return new __.ObjectConnection(); };
};
//webSocket {url:''} totest
N.NiSocketDataFactory = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataFactory, []]);
var ws = window.WebSocket || window.MozWebSocket;
if (!ws) {
throw new Error(V.userAgent.name + '不支持WebSocket!');
}
__.SocketConnection = function() {
var _ = this,
__ = {}; {
V.inherit.apply(_, [N.NiDataConnection, []]);
_.params = V.merge({ url: '', veshurl: '' }, _.params);
__.open = _.open;
__.close = _.close;
__.conn = null;
__.datas = [];
__.senddatas = [];
__.calls = {};
//处理接受
__.addData = function(data) {
__.datas.push(data);
__.callback();
};
__.callback = function() {
if (__.datas.length > 0) {
V.whileC(function() { return __.datas.shift(); }, function(val) {
if (typeof(val) == 'string') {
val = eval('(' + val + ')');
}
if (val._id && val.response) {
if (__.calls[val._id]) {
__.calls[val._id].datas.push(val.response);
} else {
__.calls[val._id] = { datas: [], func: null, index: val._id };
__.calls[val._id].datas.push(val.response);
}
__.callfunc(val._id);
} else {
V.showException('未找到消息处理者' + V.toJsonString(val));
}
return false;
});
}
};
__.callfunc = function(index) {
var oCall = __.calls[index];
if (oCall && oCall.datas.length > 0 && oCall.func) {
V.whileC(function() { return oCall.datas.shift(); }, function(val) {
oCall.func(val, oCall.index);
return false;
}, function() { //delete __.calls[index];
});
}
};