extjs6 基础组件扩展和自定义组件封装--03全局方法、变量介绍

时间:2020-12-05 05:30:33

最先讲解全局方法,因为在后续的讲解中会常用。

Config.js  :  全局变量 cfg  ,系统的基础配置变量  systemname(系统名称) 、sub(登录人员信息)、language(语言)、theme(主题风格)、crossdomain(是否跨域)。

CommonUtils.js   : 全局变量 CU,js中辅组类,主要方法有getUUID 、 getBoolean、getRandomColor、getDate、getBeforeDateString 。

Loader.js  :全局变量 Loader,JS、CSS加载器 ,使用 Loader.request(url); 即可加载需要的js或css。

localStorage.js :全局变量 local,项目永久存储信息服务类。 因为 localStorage只能存储字符串。此类把对象转字符串存储和根据key取数据为对象。

sessionStorage.js :  全局变量 session,项目临时存储信息,浏览器关闭自动清除。使用方式,session.get(key); session.set(key,object);

ExtUtils.js :  全局变量 EU ,ext服务类,主要方法:redirectTo(全局路由) 、toastInfo(系统提醒)、RS(数据交互ajax、jsonp)、RSView(试图读取,包含缓存机制)

ProjectUtils.js :全局变量 PU ,框架服务类,主要方法:openTabModule(在框架中tabPanel增加tab页签)、openModule(系统弹出窗口)、openAttachWindow(附件上传/下载组件)  download(文件下载)


全局变量

Ext.Panel                    主窗口ViewController对象

Ext.Viewport                    主窗口ViewporExt.FramePanel              

Ext.FramePanel            业务Panel面板

Ext.lockPanel                 锁屏Panel面板

Ext.SystemTabPanel           当前业务Panel面板中TabPanel对象

Ext.SystemTabPanelAutoOpens  当前业务Panel面板中TabPanel对象自动打开菜单窗口Map对象{menuid:obj}  //系统菜单加载时候提取数据

Ext.SystemFavorites          我的收藏菜单Map对象{menuid:obj}   //系统菜单加载时候提取数据

Ext.SystemLimits        我的界面权限Map对象  //执行PU.openTabModule时候创建新的tab,判断当前界面modelurl在SystemLimits是否存在,如果没有且加载并且保存在SystemLimits中


/**
* 辅组方法
*/
Ext.define('app.utils.ExtUtils', {
	alternateClassName: 'EU',
	statics: {
		redirectTo :function(xtype){
			Ext.Panel.redirectTo(xtype);
		},
		
        toastInfo : function( text, config){ 
    		var param = {title : '提示信息',html : text,border : true,saveDelay : 10,align : 'tr',closable : true,minWidth : 200,useXAxis : false,slideInDuration : 800,slideBackDuration : 1500,iconCls : 'ux-notification-icon-smile',autoCloseDelay : 4000,slideInAnimation : 'elasticIn',slideBackAnimation : 'elasticIn'};
			Ext.apply(param, config);Ext.toast(param);
        },
        
        toastWarn :function(text, config){
        	var param = {title : '警告信息',html : text,border : true,saveDelay : 10,align : 'tr',closable : true,minWidth : 200,useXAxis : false,slideInDuration : 800,slideBackDuration : 1500,iconCls : 'ux-notification-icon-warn',autoCloseDelay : 4000,slideInAnimation : 'elasticIn',slideBackAnimation : 'elasticIn'};
			Ext.apply(param, config);
			Ext.toast(param);
        },
        
        toastErrorInfo :function(text, config){
        	var param = {title : '错误信息',html : text,border : true,saveDelay : 10,align : 'tr',closable : true,minWidth : 200,useXAxis : false,slideInDuration : 800,slideBackDuration : 1500,iconCls : 'ux-notification-icon-error',autoCloseDelay : 5000,slideInAnimation : 'elasticIn',slideBackAnimation : 'elasticIn'};
			Ext.apply(param, config);
			Ext.toast(param);
        },
        
        /**
         * 弹出消息框
         * prompt 缺省:false   true:可以输入 false不可以输入
         */
        showMsg:function(config){
        	config = config || {};
        	config.title = config.title || "消息";
        	config.message = config.message|| config.msg || "";
        	config.option = config.option || -1;
        	config.fn = config.callback;
			if (Ext.isEmpty(config.buttons)) {
				switch (config.option) {
					case 1 :{
						config.icon = Ext.MessageBox.QUESTION;
						config.buttons = Ext.MessageBox.YESNO;
						break;
					}
					case 2 :config.buttons = Ext.MessageBox.YESNOCANCEL;break;
					case 3 :config.buttons = Ext.MessageBox.OKCANCEL;break;
					default :config.buttons = Ext.MessageBox.OK;break;
				}
			}
        	Ext.Msg.show(config);
        },
        
        /**
         * 远程访问
         * @param {} config
         */
        RS:function(config){
        	var thiz = this;
        	if(config.service && config.method){
        		config.url = CU.getURL(config.service,config.method);
        		delete config.method;
        	}
			var params = Ext.isEmpty(config.params)?{}:config.params;
			for (var key in params){var data=params[key];if(Ext.isArray(data))params[key] = CU.toString(data);}//转换为spring @RequestList接受的转码格式
			config.params = CU.toParams(params);//转换为spring mvc参数接受方式
        	config.async = Ext.isEmpty(config.async)?true:config.async; // true=异步 , false=同步
        	config.scope = config.scope || thiz;
        	config.dataType = config.dataType || "json"; 
        	config.timeout = config.timeout || 30000;
        	config.method  = 'POST';
        	var msg = Ext.isEmpty(config.msg)? config.async :config.msg;
        	config.message = config.message || '正在访问服务器, 请稍候...';
        	config.target =  config.target || Ext.Viewport;
        	thiz.myMask = null;
			if (msg){
				thiz.myMask = new Ext.LoadMask({msg:config.message,target:config.target,removeMask:true}); //,style:'background-color: rgba(208, 208, 208, 0.5);'
				thiz.myMask.show();
			}
			var caller_callback = config.callback;
			var caller_errorcallback = config.errorcallback;
			var result = null;
			
			var callback = function(type,scope,success,result,response, options){
				if(msg)thiz.myMask.hide();
				if(success){
					if (Ext.isFunction(caller_callback)) {
					 	Ext.callback(caller_callback,config.scope,[result]);
					}
				}else{
					if(type=='json' && response.status=="999")return;
					if(Ext.isFunction(caller_errorcallback)){ 
					 	Ext.callback(caller_errorcallback,config.scope,[response,options]);
					}else{
						thiz.toastErrorInfo("访问远程服务器失败!");
					}
				}
			}
			if(cfg.crossdomain){
				config.url =  cfg.requestUrl + config.url;
				config.callback = function(success, result,errortype) {
					Ext.callback(callback,this,['jsonp',config.scope,success,result])
				}
				Ext.data.JsonP.request(config);
			}else{
				config.callback = function(options, success, response) {
					var text = response.responseText;
					var result = CU.toObject(text);
					Ext.callback(callback,this,['json',config.scope,success,result,response,options])
				};
				Ext.Ajax.request(config);
			}
			return result;
        },
        
        /**
         * 常用的view转码数据查询(带缓存机制)。
         * @param {} config 对象或viewname
         * @return {}
         */
        RSView:function(config,callback){
        	var thiz = this;
        	if(Ext.isString(config))config = {params:{viewname:config}};
        	var cache = Ext.isEmpty(config.cache)?true:config.cache;//是否缓存,缺省true
        	var key = config.params.viewname;
        	var data = cache?session.get(key):null;
        	callback = callback || config.callback;
        	var scope = config.scope || thiz;
        	if(!Ext.isEmpty(data) && Ext.isArray(data)){
        		if(Ext.isFunction(callback))Ext.callback(callback,scope,[data]);
        		return data;
        	}
        	var url = "platform/basecode/getviewlist.do";
        	var params = {viewname:config.params.viewname,ids:config.ids,idfield:config.idfield,orderbyfield:config.orderbyfield};
        	thiz.RS({url:url,params:params,callback:function(result){
        		if(cache)session.set(key,result);
        		data = result;
        		if(Ext.isFunction(callback))Ext.callback(callback,scope,[data]);
        	}});
        	return data;
        },
        
        /**
         * 查询配置文件列表信息
         * @param {} config
         * @param {} callback
         * @return {}
         */
        RScfgList:function(config,callback){
        	var params = {};
        	if(Ext.isString(config))config = {params:{type:config}};
        	config.msg = false;
        	config.url = "platform/systemcfg/getlist.do";
        	if(Ext.isFunction(callback))config.callback = callback;
        	return this.RS(config);
        },
        
        /**
         * 获取系统配置文件信息
         * @param {} config  对象或主键id
         * @param {} callback
         * @return {}
         */
        RScfgInfo:function(config,callback){
        	var params = {};
        	if(Ext.isString(config))config = {params:{id:config}};
        	config.msg = false;
        	config.url = "platform/systemcfg/getinfo.do";
        	if(Ext.isFunction(callback))config.callback = callback;
        	return this.RS(config);
        },
        
        /**
         * 删除系统配置文件信息
         * @param {} config 对象或主键id
         * @param {} callback
         * @return {}
         */
        RScfgDel:function(config,callback){
        	var params = {};
        	if(!Ext.isObject(config))config = {params:{id:config}};
        	config.msg = false;
        	config.url = "platform/systemcfg/delete.do";
        	if(Ext.isFunction(callback))config.callback = callback;
        	return this.RS(config);
        },
        
        /**
         * 新增系统配置文件信息
         * @param {} config
         * @param {} callback
         * @return {}
         */
        RScfgSave:function(config,callback){
        	var params = {};
        	config.msg = false;
        	config.url = "platform/systemcfg/saveorupdate.do";
        	if(Ext.isFunction(callback))config.callback = callback;
        	return this.RS(config);
        }
	}
});


/**
* 辅组方法
*/
Ext.define('app.utils.ProjectUtils', {
	 alternateClassName: 'PU',
	 requires: [
        'app.view.platform.systemattach.FileBatchUpload',
        'app.view.platform.systemattach.FileBatchPreview'
     ],
	 statics: {
	 	wins:{},
	 	
	 	operateLimits:{},
        
        getHeight:function(){
        	return Ext.FramePanel.getEl().getHeight()
        },
        
        getWidth:function(){
        	return Ext.FramePanel.getEl().getWidth()
        },
        
        openTabModule:function(config,tabcfg){
    		if(Ext.isEmpty(config.type) || config.type =='00')return;
        	var tabcfg = tabcfg || {}
        	var contentPanel = Ext.SystemTabPanel;
        	if(Ext.isEmpty(contentPanel) || !(contentPanel instanceof Ext.tab.Panel)){
        		EU.toastErrorInfo("TabPanel为空,请与管理员联系。");
        		return;
        	}
     		var id = config.id;
        	var tabPanel = contentPanel.getComponent("TAB_"+id);
        	if(Ext.isEmpty(tabPanel)){
	     	 	if(config.type=='02'){
		     	 	var html = '<iframe src ="'+config.url+'" scrolling="auto" frameborder="0" width="100%" height="100%"></iframe>';
		     	 	tabPanel = {id:"TAB_"+id,title:config.text,border:false,closable: true,html:html};
	     	 	}else {
	     	 		tabPanel = Ext.create(config.url,{id:"TAB_"+id,title:config.text,closable:true,margin: '1 0 0 0'});
	     	 	}
	     	 	tabPanel.menuid = id;
	     	 	if(!Ext.isEmpty(config.glyph))tabPanel.glyph = config.glyph;
	     	 	if(!Ext.isEmpty(config.iconCls))tabPanel.iconCls = config.iconCls;
		     	tabPanel = contentPanel.add(tabPanel);
		     	tabPanel.tab.setClosable(!(tabcfg.checked === false));
		     	this.systemLimits(tabPanel);
	     	}
	     	return contentPanel.setActiveTab(tabPanel);
        },
	 	
	 	openModule:function(config){
	 		var me = this;
	 		if(Ext.isEmpty(config)){EU.toastErrorInfo("错误请求!");return;}
	 		if(Ext.isEmpty(config.url)&&Ext.isEmpty(config.xtype)){EU.toastWarn("url和xtype不能同时为null!");return;}
			config.modal = Ext.isEmpty(config.modal)?true:config.modal;
			config.layout = Ext.isEmpty(config.layout)?"fit":config.layout;
			var xtype = config.xtype; delete config.xtype;
			var url = config.url; delete config.url;
			Ext.apply(config,{maximizable: true});
			var item = null;
			var pscope = config.scope;
			config.resizable = Ext.isEmpty(config.resizable)?false:config.resizable;
			config.closable = false;
			config.height = config.height>me.getHeight()?me.getHeight():config.height;
			config.width = config.width>me.getWidth()?me.getWidth():config.width;
			var dialog = Ext.create('Ext.window.Window',config);
			if(!Ext.isEmpty(url)){
	     	 	item = Ext.create("Ext.ux.IFrame",{src:url});
				//item.iframeEl.dom.contentWindow = iframe对象
     	 	}else {
     	 		item = Ext.create(xtype,{params:config.params,pscope:pscope,callback:config.callback,fn:config.fn});
     	 	}
     	 	dialog.add(item);
     	 	dialog.show();
     	 	dialog.on("close",function(panel, eOpts ){delete me.wins[dialog.id];}, this);
     	 	dialog.addTool({xtype:'tool',type:'close',tooltip:'关闭窗口',scope:this,handler:function(){
				if(Ext.isFunction(item.closeWindowVerify)){
					item.closeWindowVerify();
				}else{
					dialog.close();
				}
			}});
			me.wins[dialog.id] = dialog;
			return dialog;
	 	},
	 	
	 	/**
		 * 附件上传/下载组件
		 * @param {} config
		 * @param disabeld 是否不可上传 缺省false
		 *
		 */
	 	openAttachWindow : function(config){
			config.disabeld = Ext.isEmpty(config.disabeld)?false:config.disabeld;
			config.scope = config.scope || this;
			config.title = config.title || (config.disabeld?"附件预览":"附件上传");
			config.modal = Ext.isEmpty(config.modal) ? true : config.modal;
			if(Ext.isEmpty(config.tablename)){
				EU.toastErrorInfo("参数:tablename不能为空!");return;
			}else if(Ext.isEmpty(config.fieldname)){
				EU.toastErrorInfo("参数:fieldname不能为空!");return;
			}else if(Ext.isEmpty(config.fieldvalue)){
				EU.toastErrorInfo("参数:fieldvalue不能为空!");return;
			}
			var xtype='FileBatchUpload',width=1000,height=600;
			if(config.disabeld){width = 800;xtype = 'FileBatchPreview';}
			this.openModule({xtype:xtype,title:config.title,width:width,height:height,params:config,modal:config.modal,scope:config.scope,callback:config.callback});
		},
		
		download : function(cfg,timeout){ 
			var me = this;
			var params = Ext.isEmpty(cfg.params)?{}:cfg.params;
			var url = Ext.isEmpty(cfg.url)?"platform/fileattach/downloadfile.do":cfg.url;
			for (var key in params){var data=params[key];if(Ext.isArray(data))params[key] = CU.toString(data);}//转换为spring @RequestList接受的转码格式
            params = CU.toParams(params);//转换为spring mvc参数接受方式
            url+= (url.indexOf("?")>0?"&":"?")+CU.parseParams(params);
			var width = Ext.isEmpty(cfg.width)?650:cfg.width; //350
            var height = Ext.isEmpty(cfg.height)?500:cfg.height; //300
			var bodyWidth =Ext.getBody().getWidth()
            var bodyHeight = Ext.getBody().getHeight();
            var iLeft = bodyWidth/2-(width/2);
            var iTop = bodyHeight/2-(height/2);
            window.open(url,'fullscreen=0,menubar=0,toolbar=0,location=0,scrollbars=0,resizable=0,status=1,left='+iLeft+',top='+iTop+',width='+width+',height='+height);
            if(Ext.isFunction(cfg.callback))cfg.callback();
        },
		
		/**
		 * 系统刷新
		 * @param {} xtype
		 */
        onAppUpdate:function(xtype){
        	Ext.Msg.confirm('应用更新', '应用程序有一个更新,是否重新加载界面?',
	            function (choice) {
	                if (choice === 'yes') {
	                    if(xtype){
	                    	EU.redirectTo(xtype);
	                    }else{
	                   		window.location.reload();
	                    }
	                }
	            }
	        );
        },
        
        /**
         * 退出系统
         * @param {} btn
         */
        onLogout:function(btn){
	    	EU.showMsg({title:"退出系统",message:"您确定要退出吗?",animateTarget:btn,option:1,callback:function(result){
	    		if(result != 'yes')return;
	        	EU.RS({url:"login/logout.do",callback:function(result){
	        		if(CU.getBoolean(result)){
	        			session.remove("isLogin");
	        			EU.redirectTo(cfg.xtypeLogin);
	        		}
	        	}});
	    	}});
	    },
	    
	    /**
	     * 获取系统全部的url连接
	     * @param {} callback
	     * @param {} scope
	     */
	    createUrlFunction:function(systemurls){
	    	if(Ext.isEmpty(systemurls))return;
	    	for(key in systemurls){
        		var rec = systemurls[key];
        		if(EU[rec.beanname] == null)EU[rec.beanname] = {};
        		EU[rec.beanname][rec.methodname] = new Function("cfg","cfg.url='"+rec.url+"';return EU.RS(cfg);");
        	}
	    },
	    
	    /**
	     * 系统按钮权限控制
	     * @param {} panel 获取reference的容器
	     * @param {} xtype 权限获取的父容器
	     */
	    systemLimits:function(panel,modulurl,callback){
	    	if(!Ext.isFunction(panel.lookupReference))return;
	    	modulurl  = modulurl || panel.$className;
	    	var url = "platform/systemframe/getsystemlimits.do";
	    	var operateLimits = cfg.sub.systemlimits[modulurl];
	    	if(!Ext.isArray(operateLimits))return;
     		Ext.each(operateLimits,function(rec){
     			if(rec.islimit > 0)return;
     			var object = panel.lookupReference(rec.operatecode);
     			if(Ext.isEmpty(object))return;
     			object.hide();
     		});
     		if(Ext.isFunction(callback))Ext.callback(callback)
	    }
	 }
});


/**
* 辅组方法
*/
Ext.define('app.utils.CommonUtils', {
	 alternateClassName: 'CU',
	 statics: {
	 	/**
	 	 * 获取UUID
	 	 * @param {} len
	 	 * @param {} radix
	 	 * @return {}
	 	 */
		getUUID : function(len, radix){var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); var chars = CHARS, uuid = [], i;radix = radix || chars.length;if (len){for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];} else { var r; uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4'; for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random()*16; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}} return uuid.join(''); }, 
		
		/**
		 * 转换为boolean类型
		 * @param {} v
		 * @return {}
		 */
		getBoolean : function(v){return v==true||v=='1'||v==1||v=='true'},
		
	    /**
		 * 数据对象转换为string值(url参数)
		 * @param paramsobj  数据对象{a:1,b=2}
		 * @return string(&a=1&b=2)
		 */
	    parseParams:function(paramsobj){var paramsstr = "";for(var key in paramsobj) {var value = paramsobj[key];if(Ext.isEmpty(value, true)) continue;if(Ext.isArray(value)) {for(var i=0; i<value.length; i++) {paramsstr += "&" + key + "=" + value[i];}}else {paramsstr += "&" + key + "=" + value;}}return paramsstr;},
	    
	    /**
	     * 字符串转对象
	     * @param {} v 字符串
	     * @return {}
	     */
	    toObject : function(v) {return Ext.isEmpty(v)?v:Ext.decode(v);},
	    
	    /**
	     * 对象转字符串
	     * @param {} v 对象
	     * @return {}
	     */
	    toString:function(v){return Ext.encode(v)},
	    
	    /**
	     * 数据为{user:{name:"111"}};转换数据为{"user.name": "111"}。
	     * @param {} obj
	     * @param {} name
	     * @param {} map
	     * @return {}
	     */
	    toParams : function(obj,name,map) {if(!Ext.isObject(obj))return obj;map = map?map:{};for(key in obj){var o = obj[key];if(Ext.isObject(o)){CU.toParams(o,key,map);}else{if(Ext.isEmpty(name)){map[key] = o;}else{map[name+"."+key] = o;}}}return map;},
	    
	    /**
	     * 对象日志
	     * */
	    log:function(obj){console.log(obj);},
	    
	    /**
	     * 根据类和方法获取url
	     */
	    getURL:function(service,method){var key = service+"_"+method;return cfg.urls[key.toUpperCase()].url},
	    
	    /**
		* 将数值四舍五入后格式化. 
		* @param num 数值(Number或者String)
		* @param cent 要保留的小数位(Number)
		* @param isThousand 是否需要千分位 0:不需要,1:需要(数值类型);
		* @return 格式的字符串,如'1,234,567.45'
		* @type String
		*/
		formatNumber:function(num,cent,isThousand) {num = num.toString().replace(/\$|\,/g,'');if(isNaN(num))num = "0";if(isNaN(cent))cent = 0;cent = parseInt(cent);cent = Math.abs(cent);if(typeof isThousand == 'boolean')isThousand = isThousand?"1":"0";if(isNaN(isThousand))isThousand = 0;isThousand = parseInt(isThousand);if(isThousand < 0)isThousand = 0;if(isThousand >=1)isThousand = 1;sign = (num == (num = Math.abs(num)));num = Math.floor(num*Math.pow(10,cent)+0.50000000001);cents = num%Math.pow(10,cent);num = Math.floor(num/Math.pow(10,cent)).toString();cents = cents.toString();while(cents.length<cent) cents = "0" + cents;if(isThousand == 0)return (cent==0)?(((sign)?'':'-') + num):(((sign)?'':'-') + num + '.' + cents);for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));return (cent==0)?(((sign)?'':'-') + num):(((sign)?'':'-') + num + '.' + cents);},
		
		/**
	     * 获取中位数
	     */
	    getMd:function(datas){Ext.Array.sort(datas);var index = parseInt((datas.length+1)/2);return datas[index];},
	    
	    /**
	     * 获取众数
	     */
	    getMo:function(datas){var countArray = [datas.length];for (var i = 0; i < datas.length; i++) {var val = datas[i];var num = 0;for (var j = 0; j < datas.length; j++) {if(datas[j]==val)num++;}countArray[i] = num;}var count=0,val = "";for(var i = 0;i<countArray.length;i++){if(countArray[i]>1 && countArray[i]>count){count = countArray[i];val = datas[i];}}return val;},
	    
	    /**
	     * 获取平方差
	     * @param {} datas 数据数组
	     * @param {} format 小数位 缺省:0.00
	     * @return {}
	     */
	    getS2:function(datas,format){format = format||'0.00';var m = Ext.Array.mean(datas);var val = 0,n=datas.length;for (var i = 0; i < n; i++) {var x = datas[i];val+=Math.pow(x-m,2);}return Ext.util.Format.number(val/n,format);},
	    
	    /**
	     * 获取标准差
	     * @param {} datas 数据数组
	     * @param {} format 小数位 缺省:0.00
	     * @return {}
	     */
	    getSd:function(datas,format){format = format||'0.00';var m = Ext.Array.mean(datas);var val = 0,n=datas.length;for (var i = 0; i < n; i++) {var x = datas[i];val+=Math.pow(x-m,2);}return Ext.util.Format.number(Math.sqrt(val/n),format);},
	    
	    /**
	     * 替换字符串
	     * @param {} str 字符串
	     * @param {} s1  替换字符串 
	     * @param {} s2  替换为
	     * @return {}
	     */
	    replaceAll: function (str,s1,s2){return str.replace(new RegExp(s1,"gm"),s2);},
		
	    /**
	     * 获取数字型数据
	     * @param {} value
	     * @return {}
	     */
	    getNumber:function(value){return Ext.isNumber(value)?value:isNaN(Number(value))?0:Number(value);},
	    
		/**
		 * 获取随机颜色
		 * @return {}
		 */
		getRandomColor : function (){return "#"+("00000"+((Math.random()*16777215+0.5)>>0).toString(16)).slice(-6);},
		
		/**
		 * 获取当前客户端日期
		 * @return 日期格式(yyyy-MM-dd)
		 */
		getDate : function() {return CU.toDateString(new Date());},
		
		/**
		 * 获取当前客户端时间
		 * @return 时间格式(yyyy-MM-dd hh:mm:ss)
		 */
		getTime : function() {return CU.toTimeString(new Date());},
		
		/**
		 * 自动补全日期字符串格式
		 * @param {} value  2015=2015-01-01、2015-02 = 2015-02-01
		 * @return {}
		 */
		toDateStringSupply : function(value) {value = value+"";var length = value.length;value = length == 4 ? value += "-01-01" : length == 7? value += '-01': value;return value;},
		
		/**
		 * 字符串转换为日期格式
		 * @param value 字符串数据(例如:2013-02-27)
		 * @return 日期对象
		 */
		toDate : function(value) {return new Date(CU.toDateStringSupply(value).replace(/-/g,"/"));},
		
		/**
		 * 日期转换为字符串
		 * @param date 日期
		 * @return 字符串日期(2013-02-27)
		 */
		toDateString : function(date) {var y = date.getFullYear();var m = date.getMonth()+1;if(m < 10) m = "0"+m;var d = date.getDate();if(d < 10) d = "0"+d;return y+"-"+m+"-"+d;},
		
		/**
		 * 日期转换为字符串
		 * @param  date 日期 
		 * @return 字符串时间(2013-02-27 17:10:00)
		 */
		toTimeString : function(date) {var y = date.getFullYear();var m = date.getMonth()+1;if(m < 10) m = "0"+m;var d = date.getDate();if(d < 10) d = "0"+d;var h = date.getHours();if(h < 10) h = "0"+h;var mi = date.getMinutes();if(mi < 10) mi = "0"+mi;var s = date.getSeconds();if(s < 10) s = "0"+s;return y+"-"+m+"-"+d+" "+h+":"+mi+":"+s;},
		
		/**
		 * 获取日期差异
		 * @param small  开始日期long
		 * @param big    结束日期long
		 * @return 天
		 */
		getDateDiff : function(small, big) {return (big-small)/1000/60/60/24;},
		
		/**
		 * 几天以前的日期
		 * @param day 天数
		 * @return 日期对象
		 */
		getBeforeDate : function(date,day) {date == date || new Date(); return new Date(date.getTime()-1000*60*60*24*day);},
		
		/**
		 * 几天以前的日期
		 * @param day 天数
		 * @return 字符串(2013-02-27)
		 */
		getBeforeDateString : function(date,day) {var date = CU.getBeforeDate(date,day);var y = date.getFullYear();var m = date.getMonth()+1;var d = date.getDate();if(m < 10) m = "0"+m;if(d < 10) d = "0"+d;return y+"-"+m+"-"+d;},
		
		/**
		 * 几天以后的日期
		 * @param day 天数
		 * @return 日期对象
		 */
		getAfterDate : function(day) {return new Date(new Date().getTime()+1000*60*60*24*day);},
		
		/**
		 * 几天某日期以后几天的日期
		 * @param data 日期对象
		 * @param day 天数
		 * @return 日期对象
		 */
		getAfterDate : function(date,day) {date = date || new Date(); return new Date(date.getTime()+1000*60*60*24*day);},
		
		/**
		 * 几天以后的日期
		 * @param day 天数
		 * @return 字符串(2013-02-27)
		 */
		getAfterDateString : function(date,day) {var date = CU.getAfterDate(date,day);var y = date.getFullYear();var m = date.getMonth()+1;var d = date.getDate();if(m < 10) m = "0"+m;if(d < 10) d = "0"+d;return y+"-"+m+"-"+d;},
		
		/**
		 * 获取某年某月的天数
		 * @param year 年份
		 * @param month 月份
		 * @return Number 天数
		 */
		getDaysInMonth : function(year, month) {switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12: return 31;case 4:case 6:case 9:case 11: return 30;case 2: return ((year%4==0 && year%100!=0) || (year%400==0)) ? 29 : 28;default: return -1;}},
		
		/**
		 * 获取当前(指定)日期的月份 
		 * @param  date 日期格式
		 * @return 字符串 (2013-03)
		 */
		getYearMonth : function(date){date = Ext.isEmpty(date)?date = new Date():date;var y = date.getFullYear();var m = date.getMonth()+1;if(m < 10) m = "0"+m; return y+"-"+m;}, 
		
		/**
		 * 获取指定日期几个月以后的时间
		 * @param  date 日期格式
		 * @param  count 月数
		 * @return 字符串 (2013-03)
		 */
		getAfterYearMonth : function(date,count){date = Ext.isEmpty(date)?date = new Date():date;var y = date.getFullYear();var m = date.getMonth()+1;count = Ext.isEmpty(count)?1:count;m = m+count;if(m%12==0){y+=m/12-1;m=12;}else if(m>12){y+= parseInt(m/12);m=m%12;}if(m < 10) m = "0"+m;return y+"-"+m;},
		
		/**
		 * 获取指定日期几个月以前的时间
		 * @param  date  日期格式
		 * @param  count 月数
		 * @return 字符串 (2013-03)
		 */
		getBeforeYearMonth : function(date,count){date = Ext.isEmpty(date)?date = new Date():date;var y = date.getFullYear();var m = date.getMonth()+1;var sum = (y*12+m) -count;if(sum%12==0){y = parseInt(sum/12)-1;m = 12;}else{y = parseInt(sum/12);m = sum%12;}if(m < 10) m = "0"+m;return y+"-"+m;},
		
		/**
		 * 根据文件类型获取iconCls图标
		 * @param {} v
		 * @return {}
		 */
		getFileTypeIconCls : function(v){var iconCls = "x-fa fa-file";v = Ext.isEmpty(v)?"":v;switch(v.toUpperCase()){case 'DOC':case 'DOCX':iconCls = 'x-fa fa-file-word-o';break;case 'TXT':iconCls = 'x-fa fa-file-text';break;case 'PDF':iconCls = 'x-fa fa-file-pdf-o';break;case 'MP3':iconCls = 'x-fa fa-file-audio-o';break;case 'XLS':case 'XLSX': iconCls = 'x-fa fa-file-excel-o';break;case 'ZIP':case 'RAR': iconCls = 'x-fa fa-file-archive-o';break;case 'JPG':case 'GIF': case 'PNG' : iconCls = 'x-fa fa-file-image-o';break;}return iconCls;},
		
		/**
		 * 获取文件后侧名
		 * @param {} file
		 * @return {}
		 */
		getFileSuffix:function(file){if(Ext.isEmpty(file))return "";var beginIndex  = file.lastIndexOf(".");return file.substring(beginIndex+1,file.length);},
		
		/**
		 * 递归读取全部数据
		 * @param {} datas  数据集合
		 * @param {} callback  回调方法
		 * @param {} scope  
		 * @param {} childname  子节点名称 缺省children
		 */
		eachChild:function(datas,callback,scope,childname){scope = scope || this;var child = childname || 'children';var nextChildNode  = function(nodes){Ext.each(nodes,function(data){Ext.callback(callback,scope,[data]);var children = data[child];if(Ext.isArray(children) && children.length>0){nextChildNode(children,callback,scope,child);}});};nextChildNode(datas,callback,scope,child);}
	 }
});